Store in ESD mip Q as pTrk->SetRICHnclusters(100000*Q+nphots)
[u/mrichter/AliRoot.git] / RICH / api.txt
5b919694 1How to open session:
9a221675 2 use static method AliRunLoader::Open("galice.root","AlicE","update") or just AliRunLoader::Open() for defaults.
3 Returns pointer to AliRunLoader on success or fatal termination on error
8493d0aa 4How to get total number of events in galice.root:
9a221675 5 AliRunLoader::GetNumberOfEvents() (or AliRun::GetEventsPerRun() using f.e. gAlice depricated)
6How to get pointer to RICH:
7 AliRunLoader()->GetAliRun()->GetDetector("RICH") but before one needs to AliRunLoade()->Set
8493d0aa 8How to avoid using gAlice:
9 detector->GetLoader()->GetRunLoader()->GetAliRun() returns gAlice global pointer.
d3eb6079 10How to retrieve pointer to alice run loader:
11 use pRICH->GetLoader()->GetRunLoader() (all detector classes inherit from AliDetector which has GetLoader())
12 use method AliRun::GetRunLoader for gAlice (deprecated)
998b831f 13How to get pointers to different root trees:
ab6b554e 14 TreeE belongs to AliRunLoader, available after AliRunLoader::LoadHeader()
15 TreeK belongs to AliRunLoader, available after AliRunLoader::LoadKinematics()
16 TreeH belongs to AliLoader , available after AliLoader::LoadHits()
17 TreeS belongs to AliLoader , available after AliLoader::LoadSDigits()
18 TreeD belongs to AliLoader , available after AliLoader::LoadDigits()
19 TreeR belongs to AliLoader , available after AliLoader::LoadRecPoints()
d3eb6079 20 all methods return 0 on success.
21How to get event of interest:
22 AliRunLoader::GetEvent(event_number) returns 0 on success
5b919694 23How to deal with the stack of particles?
998b831f 24 - first of all, the stack includes primary as well as secondary particles
5b919694 25 - pointer to the stack is taken:
d3eb6079 26 AliRun::Stack() (global gAlice of type AliRun - deprecated way to do)
5b919694 27 AliRunLoader::Stack() but before one needs to load event header by AliRunLoader::LoadHeader() otherwise both methods return 0.
28 Moreover loading header gives the information about number of particles only.
d3eb6079 29 To retrieve the list of particle one also needs to load kinematics by AliRunLoader::LoadKinematics()
5b919694 30 - total amount of particles in stack for a given event:
31 AliStack::GetNtrack()
32 AliRun::GetEvent() (after LoadHeader())
33 - total amount of primary particles in stack for a given event (after LoadHeader()):
34 AliStack::GetNprimary()
d3eb6079 35How to retrieve hits:
36 Hits are stored on primary by primary basis. Hits for the given primary is TClonesArray.
37 To retrieve all hits one needs to do:
38 -initialize the root tree and containers: pRich->GetLoader()->LoadHits(); (AliLoader::LoadHits() returns 0 on success)
39 -read number of entries in TreeH: pRich->GetLoader()->TreeH()->GetEntries()
40 -then for each entry: pRich->GetLoader()->TreeH()->GetEntry(i)
41How to retrieve sdigits?
09c52ebc 42 Sdigits stored in tree S with the branch of TClonesArray, all sdigits in a single TClonesArray
43 So the tree has only one entry.
44 One needs to say:
8493d0aa 45 -pRich->GetLoader()->LoadSDigits(); this one open file, get the tree and invoke AliRICH::SetTreeAddress()
d3eb6079 46How to retrieve digits?
47 Digits stored in tree D with the 7 branches of TClonesArray, one per chamber, all digits of a given chamber in a single TClonesArray
48 So the tree has only one entry.
49 -One needs to say:
50 pRich->GetLoader()->LoadDigits(); this one opens file, gets the tree and invoke AliRICH::SetTreeAddress() which in turn corresponds
51 branches of the tree to the digits containers in memory. There are 7 containers, one per chamber, all of them belong to AliRICH.
52 -Then one needs to take the tree entry (only one) to the memory:
53 pRich->GetLoader()->TreeD()->GetEntry(0)
54 -Finally pRich->Digits(chamber_number) returns the pointer to TClonesArray of AliRICHdigit
55What are the debug methods avail:
8493d0aa 56 AliLog::SetGlobalDebugLevel(AliLog::kDebug)
5b919694 57How to get info for a given particle number:
d3eb6079 58 Header and Kinematics trees must be loaded, then possible to retrieve pointer to Stack of particles
09c52ebc 59 Int_t AliRunLoader::LoadHeader(); Int_t AliRunLoader::LoadKinematics()
60 AliStack *AliRunLoader::Stack()
61 TParticle *AliStack::Particle(tid)
62 TParticle::Print()
5b919694 63How to deal with AliRunDigitizer:
09c52ebc 64 AliRunDigitizer::Exec() just call AliRunDigitizer::Digitize()
8493d0aa 65What are the meanings of different VMC flags:
5b919694 66 gMC->IsTrackAlive()
67 gMC->IsTrackStop()
68 gMC->IsTrackDisappeared()
5b919694 69How to get pad number for a local position:
d3eb6079 70 use static TVector AliRICHParam::Loc2Pad(TVector2 position);
5b919694 71Why list of chambers belongs to AliRICHParam:
8493d0aa 72
73How to check if a given stack particle is primary:
74 Stack is TClonesArray of TParticle. TParticle::GetMother(0) returns -1 if it's primary (no mother)
75How to loop over all possible object:
76 for(Int_t iEventN=0;iEventN < GetLoader()->GetRunLoader()->GetAliRun()->GetEventsPerRun();iEventN++){//events loop
77 for(Int_t iEntryN=0;iEntryN < GetLoader()->TreeH()->GetEntries();iEntryN++){//TreeH loop
78 GetLoader()->TreeH()->GetEntry(iEntryN);//get current entry (prim)
79 for(Int_t iHitN=0;iHitN<Hits()->GetEntries();iHitN++){//hits loop
80 AliVHMPIDHit *pHit=(AliVHMPIDHit*)Hits()->At(iHitN);//get current hit
5b919694 81
8493d0aa 82 }//hits loop
83 }//TreeH loop
84 }//events loop
0422a446 85
87RICH full simulation-reconstruction sequence
90 Responsible method is AliRICH::Hits2SDigits
91 One hit may affect one or more pads.
92 Hit position is taken on the anode wires plane as the most of avalanche is developed there.
93 This position is not directly available, track intersections with entrance and exit of amplification gap are only stored.
94 So the position in the middle of the gap is calculated as average out of pHit->In() and pHit->Out() positions.
95 Then, total charge collected for this hit is calculated by AliRICHParam::Hit2Qdc.
96 Area of disintegration is a list of pads affected by current hit. This is a parameter of Mathienson
db910db9 98 The necessety of sdigits is dictated by the fact that trasport engine transports tracks in a continious sequence track by track.
99 It means that it may happen that the same pad is affected by few tracks. But this might be known only after the trasport of full event is finished.
102 A set of neighbouring digits compose cluster. The aim of this trasformation is to construct a list of clusters out of digits list.
103 The calling sequence is:
104 AliReconstruction::Run()
106 AliRICHReconstructor::Reconstruct() creates an empty clusters list, loops on chambers, retrives a list of digits for a given chamber, gives it to the methode Dig2Clu() and finally serializes
107 the list
109 AliRICHReconstructor::Dig2Clu() which knows no details about
112clusters+tracks->theta cerenkov
0422a446 123
124Generalized structure of AliReconstruction:
db910db9 128 if(there is galice.root) <-|
129 AliRunLoader::Open(....) |
130 else | this is done in InitRunLoader()
0422a446 131 if(raw data process requested) |
db910db9 132 create galice.root on the base of AliRawReader::NextEvent <-|
0422a446 133
db910db9 134 for(all detectors){ <-|
135 if(detector not selected to run) skip this detector | this is done in RunLocalReconstruction()
136 reconstructor=get detector's reconstructor |
137 |
0422a446 138 if(detector HasLocalReconstruction) skip this detector | IMPORTANT! if HasLocalReconstruction() returns YES use RunLocalEventReconstruction instead
139 if(run upon raw data) |
140 reconstructor->Reconstruct(fRunLoader, fRawReader); |
db910db9 141 else | <- this approach is currently used by RICH as all branches are mounted in AliRICH.cxx
0422a446 142 reconstructor->Reconstruct(fRunLoader); |
db910db9 143 } <-|
0422a446 144
145 for(all events){
147 for(all detectors){ |
148 if(detector not selected to run) skip this detector |
149 reconstructor=get detector's reconstructor |
150 loader=get detector's loader | this is done in RunLocalEventReconstruction()
151 if(raw data process requested and detector HasDigitConversion){ |
152 loader->LoadDigits("update"); | open file and invoke detector->SetTreeAddress();
153 loader->CleanDigits(); |
154 loader->MakeDigitsContainer(); | create tree
155 reconstructor->Reconstruct(fRawReader,loader->TreeD()); | expected to fill TreeD out of raw reader
156 loader->WriteDigits("overwrite"); |
157 loader->UnloadDigits(); |
158 } |
159 if(detector do not HasLocalReconstruction) skip this detector | IMPORTANT! assumed that this detector is already processed in RunLocalReconstruction()
160 loader->LoadRecPoints("update"); |
161 loader->CleanRecPoints(); |
162 loader->MakeRecPointsContainer(); |
163 if(fRawReader && reconstructor do not HasDigitConversion()){ |
164 reconstructor->Reconstruct(fRawReader, loader->TreeR()); | expected to fill TreeR out of raw reader
165 }else{ |
166 loader->LoadDigits("read"); |
167 reconstructor->Reconstruct(loader->TreeD(),loader->TreeR()); | the only operations inside are pDigTree->GetEntry(0) and pCluTree->Fill();
168 loader->UnloadDigits(); |
169 } |
170 loader->WriteRecPoints("OVERWRITE"); |
171 loader->UnloadRecPoints(); |
172 }//detectors loop |
174 }//events loop
db910db9 176
178RICH calibration and alignment.
181RICH calibrartion and alignment strategy is described with emphasis put on those aspects of the procedure which are relevant for reconstruction and thus the final detector
182figure of merit. In particulare, the refractive index calibration tecknique based on mass plot shifts analisys and chamber alignment with respect to core detectors
183are explained in details. External sources of calibration and alignment data are aslo mentioned as well as the way RICH intends to handle those data, including initial CDB
187Looking on RICH chamber structure, full description of which is availbale elsewhere (ref RichTDR), easy to compile the table of all possible parameters affecting reconstruction.
188The first one of major importance is a freon refractive index. Although the full optical path visiable by photons includes freon vessel, proximity and amplification gaps filled
189with methane and quartz window seperating above mentioned volumes, only freon refractive index is subject for calibration. Refractive index of SiO2 window is not practically
190affected by any external parameters, while influence of methane temperature to it's refractive index is negligable. So it's enough to measure there optical curves just once.
191In the rest, the only changable parameter is refractive index of freon. Temperature influence on freon refractive index was measured experimentally. The parametrization
192found to be:
193 n=n0-0.0005(T-20) where T is freon temperature in degrees Celsius
194 n0=Sqrt(1+ 0.554*lamda^2/(lamda^2-5796)) where lamda is photon wavelength in nm taken at 20 degress Celsius
195Preliminary, the parametrization itself is considered to be permamnent one. The only parameter to store and retrieve is freon temperature. Since this value is available from
196DCS DB and expected to be served by a SHUTTLE program which is not yet ready, the following temporaroly solution has been adopted.
197In local CDB storage (deafult directory is $ALICE_ROOT) two versions of freon refractive index are written by external macro RichCdb.C :
198Run0_0_v0_s0.root contains DiMauro's parametrization and the temperature is set to 20 degrees. To be used as default for simulation and reconstruction.
199Run0_0_v0_s1.root contains DiMauro's parametrization and the temperature is set to 50 degrees. To be used in special uncalibrated reconstruction to test calibration procedure.
200Both of them are valid in run range from run number 0 to run number 0, thus in no way affecting any normal operations.
202Refractive index of freon (C6F14) is taken in AliRICHRecon for 3 different photon energies by means of 2 methodes: Set
207Information about detector position and orientation is needed during reconstruction phase. This information affects track-cluster matching procedure, the relevant peace of
208code comes to AliRICHTracker::PropogateBack(). Matching precedure consists in prolongation of the track reconstructed in core detectores up to each RICH chamber plane in
209a sequenmce. The plane used is the entrance to RICH radiators. If the intersection exists and inside the sensitive area, the point of intersection is to be tranformed to RICH
210local reference system. Note, that in this check, the dead zones inbetween radiators are not taken into account. This operation requiring MARS to LORS transformations is done
211in AliRICHHelix::RichIntersection(). Plane to be intersected is defined by a point beloging to that plane served by AliRICHParam::Center(ChamberNumber) and a vector normal
212to the plane served by AliRICHParam::Norm(ChamberNumber). Transformations itself are done in AliRICHParam::Mars2Lors() and AliRICHParam::Lors2Mars(). Internaly in AliRICHParam,
213each chamber is reresented by TGeoHMatrix. It's worth to stress again that geometry related operations are needed to be done for 3 different planes per chamber, namly entrance
214to radiator, anod wires plane and photocathode plane. So AliRICHParam sustains 7*3=21 planes. Also important to say, that direct usage of TGeoHMatrix::MasterToLocal()
215and virce versa is not possible due to special nature of RICH LORS. According to the decision made about 3 years ago, RICH local reference system is centered in low left
216hand corner of the chamber if one looks from outside to direction pointing to interection point.
217So the most obvious candidate for alignable objects to be stored are thess 21 TGeoHMatrix objects.
218The approach suggested in AliAlignObj is not quite feasable mainly due to the fact it relays on incrementing procedure using import from geometry.root. RICH geometry is defined
219in a way that there is no volumes exactly corresponding to the RICH planes.
221Geometry of RICH chambers.
222After the decision to rotate the whole RICH setup from 12 o'clock position to 2 o'clock position we have the following situtation:
224Theta = 109.5 degress for chambers 1,3
225Theta = 90.0 degress for chambers 2,4,6
226Theta = 70.5 degress for chambers 5,7
228Phi = 50.0 degress for chambers 6,7
229Phi = 30.0 degress for chambers 3,4,5
230Phi = 10.0 degress for chambers 1,2
233Old parametrisation by AliRICHChamber:
234RICH chamber 1 (454.877118 , 80.207109 , -163.565361)(rho,theta,phi)=(490.0,109.5,10.0)
235RICH chamber 2 (482.555799 , 85.087607 , 0.000000)(rho,theta,phi)=(490.0, 90.0,10.0)
236RICH chamber 3 (400.012224 , 230.947165 , -163.565361)(rho,theta,phi)=(490.0,109.5,30.0)
237RICH chamber 4 (424.352448 , 245.000000 , 0.000000)(rho,theta,phi)=(490.0, 90.0,30.0)
238RICH chamber 5 (400.012224 , 230.947165 , 163.565361)(rho,theta,phi)=(490.0, 70.5,30.0)
239RICH chamber 6 (314.965929 , 375.361777 , 0.000000)(rho,theta,phi)=(490.0, 90.0,50.0)
240RICH chamber 7 (296.899953 , 353.831585 , 163.565361)(rho,theta,phi)=(490.0, 70.5,50.0)
242New parametrization by TGeoHMatrix:
243RICH 1
244 -0.328736 -0.173648 0.928321 Tx = 454.877118
245 -0.057965 0.984808 0.163688 Ty = 80.207109
246 -0.942641 0.000000 -0.333807 Tz = -163.565361
247RICH 2
248 0.000000 -0.173648 0.984808 Tx = 482.555799
249 0.000000 0.984808 0.173648 Ty = 85.087607
250 -1.000000 0.000000 0.000000 Tz = 0.000000
251RICH 3
252 -0.289085 -0.500000 0.816351 Tx = 400.012224
253 -0.166903 0.866025 0.471321 Ty = 230.947165
254 -0.942641 0.000000 -0.333807 Tz = -163.565361
255RICH 4
256 0.000000 -0.500000 0.866025 Tx = 424.352448
257 0.000000 0.866025 0.500000 Ty = 245.000000
258 -1.000000 0.000000 0.000000 Tz = 0.000000
259RICH 5
260 0.289085 -0.500000 0.816351 Tx = 400.012224
261 0.166903 0.866025 0.471321 Ty = 230.947165
262 -0.942641 0.000000 0.333807 Tz = 163.565361
263RICH 6
264 0.000000 -0.766044 0.642788 Tx = 314.965929
265 0.000000 0.642788 0.766044 Ty = 375.361777
266 -1.000000 0.000000 0.000000 Tz = 0.000000
267RICH 7
268 0.214567 -0.766044 0.605918 Tx = 296.899953
269 0.255711 0.642788 0.722105 Ty = 353.831585
270 -0.942641 0.000000 0.333807 Tz = 163.565361