Skip to content

Commit 7b6f306

Browse files
Petra Bilelajose-luis-rs
authored andcommitted
Full ALPIDE alignment: XYZ offsets, rotations, and Hit2Track task
1 parent 97d3918 commit 7b6f306

5 files changed

Lines changed: 267 additions & 6 deletions

File tree

alpide/AlpideLinkDef.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,7 @@
3434
#pragma link C++ class R3BAlpideOnlineSpectra+;
3535
#pragma link C++ class R3BSingleAlpideCorrelationOnlineSpectra+;
3636

37+
#pragma link C++ class R3BAlpideHit2Track+;
38+
3739
#endif
3840

alpide/calibration/R3BAlpideCal2Hit.cxx

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ void R3BAlpideCal2Hit::SetParameter()
101101
R3BLOG(info, "Geometry version: " << fGeoversion);
102102
fNbSensors = fMap_Par->GetNbSensors();
103103
R3BLOG(info, "Nb of sensors: " << fNbSensors);
104-
105104
if (fAlpideGeoPar && fTargetGeoPar)
106105
{
107106
fTargetPos.SetXYZ(fTargetGeoPar->GetPosX(), fTargetGeoPar->GetPosY(), fTargetGeoPar->GetPosZ());
@@ -384,6 +383,26 @@ void R3BAlpideCal2Hit::FindClustersDefault()
384383
}
385384
else if (fGeoversion == 202506)
386385
{
386+
const double Z_alpide1 = -1732.88;
387+
const double Z_alpide2 = -1659.88;
388+
389+
const double z1_off = -0.837843;
390+
const double z2_off = -2.69759;
391+
392+
const double rx = 0.0225419;
393+
const double ry = 0.0137131;
394+
const double rz[12] = { 0.00595207, 0.00815014, 0.0102531, 0.00857714, 0.00909736, 0.0015223,
395+
0.0133541, 0.00969408, 0.0134827, 0.000125173, 0.00982907, 0.021181 };
396+
397+
array<TVector3, 12> pos_offset = {
398+
TVector3(0.231386, 0.18477, z1_off), TVector3(0.03624, 0.0145723, z1_off),
399+
TVector3(-0.162212, -0.217339, z1_off), TVector3(-0.157992, -0.31182, z1_off),
400+
TVector3(0.0596373, -0.07224198, z1_off), TVector3(0.2458, 0.131979, z1_off),
401+
TVector3(0.713162, 0.203712, z2_off), TVector3(0.5620141, -0.18166828, z2_off),
402+
TVector3(0.316365, -0.445912, z2_off), TVector3(0.323927, -0.298097, z2_off),
403+
TVector3(0.5504176, -0.2855743, z2_off), TVector3(0.781553, -0.0369948, z2_off)
404+
};
405+
387406
for (size_t s = 0; s < fNbSensors; s++)
388407
for (size_t i = 0; i < nHits; i++)
389408
if (mult[s][i] > 0)
@@ -396,14 +415,34 @@ void R3BAlpideCal2Hit::FindClustersDefault()
396415
0.0);
397416

398417
TVector3 labpos;
418+
419+
int sensorId = s;
420+
421+
TRotation Rloc;
422+
Rloc.RotateZ(rz[sensorId]);
423+
TVector3 local_rot = Rloc * localpos;
424+
399425
if (s < 3)
400-
labpos.SetXYZ(45. - localpos.X() - 30. * s, -localpos.Y(), 0.0);
426+
labpos.SetXYZ(45. - local_rot.X() - 30. * s, -local_rot.Y(), Z_alpide1);
401427
else if (s < 6)
402-
labpos.SetXYZ(-45. + localpos.X() + 30. * (s - 3), localpos.Y(), 0.0);
428+
labpos.SetXYZ(-45. + local_rot.X() + 30. * (s - 3), local_rot.Y(), Z_alpide1);
403429
else if (s < 9)
404-
labpos.SetXYZ(45. - localpos.X() - 30. * (s - 6), -localpos.Y(), 73.);
430+
labpos.SetXYZ(45. - local_rot.X() - 30. * (s - 6), -local_rot.Y(), Z_alpide2);
431+
else
432+
labpos.SetXYZ(-45. + local_rot.X() + 30. * (s - 9), local_rot.Y(), Z_alpide2);
433+
434+
TVector3 center;
435+
if (sensorId < 6)
436+
center.SetXYZ(0., 0., Z_alpide1);
405437
else
406-
labpos.SetXYZ(-45. + localpos.X() + 30. * (s - 9), localpos.Y(), 73.);
438+
center.SetXYZ(0., 0., Z_alpide2);
439+
440+
TRotation R;
441+
R.RotateX(rx);
442+
R.RotateY(ry);
443+
444+
labpos = R * (labpos - center) + center;
445+
labpos += pos_offset[sensorId];
407446

408447
AddHitData(s + 1,
409448
mult[s][i],

alpide/calibration/R3BAlpideCal2Hit.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class R3BAlpideCal2Hit : public FairTask
8585

8686
R3BTGeoPar* fTargetGeoPar = nullptr;
8787
R3BTGeoPar* fAlpideGeoPar = nullptr;
88-
int fGeoversion = 202505;
88+
int fGeoversion = 202506;
8989
R3BAlpideGeometry* fAlpideGeo = nullptr;
9090
R3BAlpideMappingPar* fMap_Par = nullptr;
9191
TClonesArray* fAlpideCalData = nullptr; // Array with Alpide Cal input data
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
#include "R3BAlpideHit2Track.h"
2+
3+
#include "R3BAlpideHitData.h"
4+
#include "R3BEventHeader.h"
5+
#include "R3BLogger.h"
6+
#include "R3BTrackingParticle.h"
7+
8+
#include <FairLogger.h>
9+
#include <FairRootManager.h>
10+
#include <FairRunAna.h>
11+
#include <FairRuntimeDb.h>
12+
13+
#include <TClonesArray.h>
14+
#include <TMath.h>
15+
#include <TVector3.h>
16+
#include <iostream>
17+
18+
R3BAlpideHit2Track::R3BAlpideHit2Track(const TString& name, int iVerbose)
19+
: FairTask(name, iVerbose)
20+
{
21+
}
22+
23+
R3BAlpideHit2Track::~R3BAlpideHit2Track()
24+
{
25+
if (fAlpideTracks)
26+
delete fAlpideTracks;
27+
}
28+
29+
InitStatus R3BAlpideHit2Track::Init()
30+
{
31+
FairRootManager* rootManager = FairRootManager::Instance();
32+
R3BLOG_IF(fatal, rootManager == nullptr, "FairRootManager not found");
33+
34+
fHeader = dynamic_cast<R3BEventHeader*>(rootManager->GetObject("EventHeader."));
35+
R3BLOG_IF(fatal, NULL == fHeader, "EventHeader. not found");
36+
37+
fAlpideHitData = dynamic_cast<TClonesArray*>(rootManager->GetObject("AlpideHitData"));
38+
R3BLOG_IF(fatal, !fAlpideHitData, "AlpideHitData not found");
39+
40+
fAlpideTracks = new TClonesArray("R3BTrackingParticle");
41+
rootManager->Register("AlpideTrack", "Alpide_tracks", fAlpideTracks, !fOnline);
42+
43+
NEvents = 0;
44+
NEventsWithTrack = 0;
45+
46+
Reset();
47+
48+
R3BLOG(info, "R3BAlpideHit2Track is initialized");
49+
return kSUCCESS;
50+
}
51+
52+
InitStatus R3BAlpideHit2Track::ReInit() { return kSUCCESS; }
53+
54+
void R3BAlpideHit2Track::Exec(Option_t* /*option*/)
55+
{
56+
NEvents++;
57+
58+
Reset();
59+
60+
if (fHeader->GetTrigger() != 1)
61+
return;
62+
63+
const auto nHits = fAlpideHitData->GetEntriesFast();
64+
if (nHits == 0)
65+
{
66+
return;
67+
}
68+
69+
R3BTrackingParticle track;
70+
if (!BuildTrack(track))
71+
{
72+
return;
73+
}
74+
75+
AddTrack(track);
76+
NEventsWithTrack++;
77+
}
78+
79+
Bool_t R3BAlpideHit2Track::BuildTrack(R3BTrackingParticle& outTrack)
80+
{
81+
AlpideBestHit alp1;
82+
AlpideBestHit alp2;
83+
84+
const auto nHits = fAlpideHitData->GetEntriesFast();
85+
for (int i = 0; i < nHits; ++i)
86+
{
87+
auto hit = dynamic_cast<R3BAlpideHitData*>(fAlpideHitData->At(i));
88+
R3BLOG_IF(fatal, !hit, "ERROR in the alpide hit");
89+
90+
const int sensorId = hit->GetSensorId();
91+
const int clusterSize = hit->GetClusterSize();
92+
93+
if (sensorId <= 6)
94+
{
95+
if (clusterSize > alp1.clusterSize)
96+
{
97+
alp1.clusterSize = clusterSize;
98+
alp1.hit = hit;
99+
alp1.index = i;
100+
}
101+
}
102+
103+
if (sensorId >= 7)
104+
{
105+
if (clusterSize > alp2.clusterSize)
106+
{
107+
alp2.clusterSize = clusterSize;
108+
alp2.hit = hit;
109+
alp2.index = i;
110+
}
111+
}
112+
}
113+
114+
if (!alp1.hit || !alp2.hit)
115+
{
116+
return kFALSE;
117+
}
118+
119+
TVector3 p1(alp1.hit->GetX(), alp1.hit->GetY(), alp1.hit->GetZ());
120+
TVector3 p2(alp2.hit->GetX(), alp2.hit->GetY(), alp2.hit->GetZ());
121+
122+
TVector3 startPos = p2;
123+
124+
TVector3 dir = (p2 - p1);
125+
if (dir.Mag() == 0.)
126+
{
127+
return kFALSE;
128+
}
129+
130+
dir = dir.Unit();
131+
dir.SetMag(10.);
132+
133+
outTrack.SetStartPosition(startPos);
134+
outTrack.SetStartMomentum(dir);
135+
136+
outTrack.AddHit("alpide1", alp1.index);
137+
outTrack.AddHit("alpide2", alp2.index);
138+
139+
return kTRUE;
140+
}
141+
142+
R3BTrackingParticle* R3BAlpideHit2Track::AddTrack(const R3BTrackingParticle& track)
143+
{
144+
TClonesArray& clref = *fAlpideTracks;
145+
int size = clref.GetEntriesFast();
146+
return new (clref.ConstructedAt(size)) R3BTrackingParticle(track);
147+
}
148+
149+
void R3BAlpideHit2Track::Reset()
150+
{
151+
R3BLOG(debug, "Clearing AlpideTracks");
152+
if (fAlpideTracks)
153+
{
154+
fAlpideTracks->Clear();
155+
}
156+
}
157+
158+
void R3BAlpideHit2Track::FinishTask()
159+
{
160+
std::cout << "\nN events processed = " << NEvents;
161+
std::cout << "\nN events with Alpide track = " << NEventsWithTrack << "\n";
162+
}
163+
164+
ClassImp(R3BAlpideHit2Track)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#pragma once
2+
3+
#include "R3BAlpideHitData.h"
4+
#include "R3BEventHeader.h"
5+
#include "R3BTrackingParticle.h"
6+
7+
#include <FairTask.h>
8+
9+
#include <Rtypes.h>
10+
11+
class TClonesArray;
12+
13+
class R3BAlpideHit2Track : public FairTask
14+
{
15+
public:
16+
R3BAlpideHit2Track(const TString& name = "R3BAlpideHit2Track", int iVerbose = 1);
17+
18+
~R3BAlpideHit2Track();
19+
20+
void Exec(Option_t* /*option*/) override;
21+
22+
virtual void Reset();
23+
24+
InitStatus Init() override;
25+
26+
InitStatus ReInit() override;
27+
28+
void FinishTask() override;
29+
30+
inline void SetOnline(Bool_t option) { fOnline = option; }
31+
32+
private:
33+
struct AlpideBestHit
34+
{
35+
R3BAlpideHitData* hit = nullptr;
36+
int clusterSize = 0;
37+
int index = -1;
38+
};
39+
40+
Bool_t BuildTrack(R3BTrackingParticle& outTrack);
41+
R3BTrackingParticle* AddTrack(const R3BTrackingParticle& track);
42+
43+
private:
44+
TClonesArray* fAlpideHitData = nullptr;
45+
R3BEventHeader* fHeader = nullptr;
46+
47+
TClonesArray* fAlpideTracks = nullptr;
48+
49+
Bool_t fOnline = kFALSE;
50+
51+
int NEvents = 0;
52+
int NEventsWithTrack = 0;
53+
54+
public:
55+
ClassDefOverride(R3BAlpideHit2Track, 1);
56+
};

0 commit comments

Comments
 (0)