Comics run analizer
[u/mrichter/AliRoot.git] / HMPID / api.txt
1 How to open session:
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
4 How to get total number of events in galice.root:
5         AliRunLoader::GetNumberOfEvents()  (or AliRun::GetEventsPerRun() using f.e. gAlice deprecated)
6 How to get pointer to HMPID:
7         AliRunLoader()->GetAliRun()->GetDetector("HMPID") but before one needs to AliRunLoade()->Set
8 How to avoid using gAlice:
9         detector->GetLoader()->GetRunLoader()->GetAliRun() returns gAlice global pointer.
10 How to retrieve pointer to alice run loader:
11         use pHMPID->GetLoader()->GetRunLoader() (all detector classes inherit from AliDetector which has GetLoader())
12         use method AliRun::GetRunLoader for gAlice (deprecated)
13 How to get pointers to different root trees:
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()
20         all methods return 0 on success. 
21 How to get event of interest:
22         AliRunLoader::GetEvent(event_number) returns 0 on success
23 How to deal with the stack of particles?
24         - first of all, the stack includes primary as well as secondary particles
25         - pointer to the stack is taken:
26                 AliRunLoader::Stack() but before one needs to load event header by AliRunLoader::LoadHeader() otherwise both methods return 0.
27                 Moreover loading header gives the information about number of particles only. 
28                 To retrieve the list of particle one also needs to load kinematics by AliRunLoader::LoadKinematics()        
29         - total amount of particles in stack for a given event:        
30                 AliStack::GetNtrack() 
31         - total amount of primary particles in stack for a given event (after LoadHeader()): 
32                 AliStack::GetNprimary() 
33 How to retrieve hits:
34         Hits are stored on primary by primary basis. Hits for the given primary is TClonesArray.
35         To retrieve all hits one needs to do:
36         -initialize the root tree and containers:   pRich->GetLoader()->LoadHits();  (AliLoader::LoadHits() returns 0 on success)
37         -read number of entries in TreeH:           pRich->GetLoader()->TreeH()->GetEntries()
38         -then for each entry:                       pRich->GetLoader()->TreeH()->GetEntry(i)    
39 How to retrieve sdigits? 
40         Sdigits stored in tree S with the branch of TClonesArray, all sdigits in a single TClonesArray
41         So the tree has only one entry.
42         One needs to say:
43         -pRich->GetLoader()->LoadSDigits(); this one open file, get the tree and invoke AliHMPID::SetTreeAddress()    
44 How to retrieve digits? 
45         Digits stored in tree D with the 7 branches of TClonesArray, one per chamber, all digits of a given chamber in a single TClonesArray
46         So the tree has only one entry.
47         -One needs to say:
48           pRich->GetLoader()->LoadDigits(); this one opens file, gets the tree and invoke AliHMPID::SetTreeAddress() which in turn corresponds 
49           branches of the tree to the digits containers in memory. There are 7 containers, one per chamber, all of them belong to AliHMPID.
50         -Then one needs to take the tree entry (only one) to the memory:
51           pRich->GetLoader()->TreeD()->GetEntry(0) 
52         -Finally pRich->Digits(chamber_number) returns the pointer to TClonesArray of AliHMPIDdigit          
53 What are the debug methods avail:
54         AliLog::SetGlobalDebugLevel(AliLog::kDebug)
55 How to get info for a given particle number:
56         Header and Kinematics trees must be loaded, then possible to retrieve pointer to Stack of particles
57         Int_t AliRunLoader::LoadHeader(); Int_t AliRunLoader::LoadKinematics()
58         AliStack *AliRunLoader::Stack()
59         TParticle *AliStack::Particle(tid)
60         TParticle::Print()
61 How to deal with AliRunDigitizer:
62         AliRunDigitizer::Exec() just call AliRunDigitizer::Digitize()   
63 What are the meanings of different VMC flags:         
64         gMC->IsTrackAlive()
65         gMC->IsTrackStop()
66         gMC->IsTrackDisappeared()
67 How to get pad number for a local position:
68         use static TVector AliHMPIDParam::Loc2Pad(TVector2 position);
69 Why list of chambers belongs to AliHMPIDParam:
70
71 How to check if a given stack particle is primary:
72         Stack is TClonesArray of TParticle. TParticle::GetMother(0) returns -1 if it's primary (no mother)         
73 How to loop over all possible object:         
74   for(Int_t iEventN=0;iEventN < GetLoader()->GetRunLoader()->GetAliRun()->GetEventsPerRun();iEventN++){//events loop
75     for(Int_t iEntryN=0;iEntryN < GetLoader()->TreeH()->GetEntries();iEntryN++){//TreeH loop
76       GetLoader()->TreeH()->GetEntry(iEntryN);//get current entry (prim)  
77       for(Int_t iHitN=0;iHitN<Hits()->GetEntries();iHitN++){//hits loop
78         AliVHMPIDHit *pHit=(AliVHMPIDHit*)Hits()->At(iHitN);//get current hit 
79         
80       }//hits loop
81     }//TreeH loop
82   }//events loop
83
84
85 HMPID full simulation-reconstruction sequence
86
87 hits->sdigit:
88         Responsible method is AliHMPID::Hits2SDigits
89         One hit may affect one or more pads.
90         Hit position is taken on the anode wires plane as the most of avalanche is developed there.
91         This position is not directly available, track intersections with entrance and exit of amplification gap are only stored.
92         So the position in the middle of the gap is calculated as average out of pHit->In() and pHit->Out() positions.
93         Then, total charge collected for this hit is calculated by AliHMPIDParam::Hit2Qdc.    
94         Area of disintegration is a list of pads affected by current hit. This is a parameter of Mathienson    
95 sdigits->digits:
96         The necessety of sdigits is dictated by the fact that transport engine transports tracks in a continuous sequence track by track. 
97   It means that it may happen that the same pad is affected by few tracks. But this might be known only after the transport of full event is finished. 
98
99 digits->clusters
100         A set of neighboring digits compose cluster. The aim of this transformation is to construct a list of clusters out of digits list.
101   The calling sequence is:
102   AliReconstruction::Run()
103   
104         AliHMPIDReconstructor::Reconstruct() creates an empty clusters list,  loops on chambers, retrieves a list of digits for a given chamber, gives it to the method Dig2Clu() and finally serializes
105                                         the list 
106                                         
107         AliHMPIDReconstructor::Dig2Clu() which knows no details about 
108
109
110 clusters+tracks->theta cerenkov 
111
112         
113         
114         
115 How to get correct magnetic field:
116         mag field is needed for simulation as well as reconstruction
117         
118
119
120
121
122
123
124 Generalized structure of AliReconstruction:
125
126 Run()
127 {
128   if(there is galice.root)                                        <-|
129     AliRunLoader::Open(....)                                        | 
130   else                                                              | this is done in InitRunLoader()
131     if(raw data process requested)                                  |
132       create galice.root on the base of AliRawReader::NextEvent   <-|   
133   
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                                                                     |   
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);            |   
141    else                                                             | <- this approach is currently used by HMPID as all branches are mounted in AliHMPID.cxx
142      reconstructor->Reconstruct(fRunLoader);                        |
143   }                                                               <-|  
144
145   for(all events){                                                      
146   
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                                                   |
173     
174   }//events loop 
175 }
176
177
178 HMPID calibration and alignment.
179
180 Abstract
181 HMPID calibration and alignment strategy is described with emphasis put on those aspects of the procedure which are relevant for reconstruction and thus the final detector
182 figure of merit. In particular, the refractive index calibration technique based on mass plot shifts analysis and chamber alignment with respect to core detectors 
183 are explained in details. External sources of calibration and alignment data are also mentioned as well as the way HMPID intends to handle those data, including initial CDB
184 creator. 
185
186 Calibration. 
187 Looking on HMPID chamber structure, full description of which is available elsewhere (ref RichTDR), easy to compile the table of all possible parameters affecting reconstruction.
188 The first one of major importance is a freon refractive index. Although the full optical path visible by photons includes freon vessel, proximity and amplification gaps filled 
189 with methane and quartz window separating above mentioned volumes, only freon refractive index is subject for calibration.  Refractive index of SiO2 window is not practically 
190 affected by any external parameters, while influence of methane temperature to it's refractive index is negligible. So it's enough to measure there optical curves just once.
191 In the rest, the only changeable parameter is refractive index of freon. Temperature influence on freon refractive index was measured experimentally. The parametrization 
192 found 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 degrees Celsius
195 Preliminary, the parametrization itself is considered to be permanent one. The only parameter to store and retrieve is freon temperature. Since this value is available from
196 DCS DB and expected to be served by a SHUTTLE program which is not yet ready, the following temporarily solution has been adopted.
197 In local CDB storage (default directory is $ALICE_ROOT) two versions of freon refractive index are written by external macro RichCdb.C :
198 Run0_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.
199 Run0_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. 
200 Both of them are valid in run range from run number 0 to run number 0, thus in no way affecting any normal operations.   
201
202 Refractive index of freon (C6F14) is taken in AliHMPIDRecon for 3 different photon energies by means of 2 methods: Set
203
204
205
206 Alignment.
207 Information about detector position and orientation is needed during reconstruction phase. This information affects track-cluster matching procedure, the relevant peace of 
208 code comes to AliHMPIDTracker::PropogateBack(). Matching procedure consists in prolongation of the track reconstructed in core detectors up to each HMPID chamber plane in 
209 a sequence. The plane used is the entrance to HMPID radiators. If the intersection exists and inside the sensitive area, the point of intersection is to be transformed to HMPID
210 local reference system. Note, that in this check, the dead zones in-between radiators are not taken into account. This operation requiring MARS to LORS transformations is done
211 in AliHMPIDHelix::RichIntersection(). Plane to be intersected is defined by a point belonging to that plane served by AliHMPIDParam::Center(ChamberNumber) and a vector normal 
212 to the plane served by AliHMPIDParam::Norm(ChamberNumber). Transformations itself are done in AliHMPIDParam::Mars2Lors() and AliHMPIDParam::Lors2Mars(). Internaly in AliHMPIDParam, 
213 each chamber is represented by TGeoHMatrix. It's worth to stress again that geometry related operations are needed to be done for 3 different planes per chamber, namely entrance 
214 to radiator, anode wires plane and photocathode plane. So AliHMPIDParam sustains 7*3=21 planes. Also important to say, that direct usage of TGeoHMatrix::MasterToLocal() 
215 and vice versa is not possible due to special nature of HMPID LORS. According to the decision made about 3 years ago, HMPID local reference system is centered in low left
216 hand corner of the chamber if one looks from outside to direction pointing to intersection point.
217 So the most obvious candidate for alignable objects to be stored are these 21 TGeoHMatrix objects. 
218 The approach suggested in AliAlignObj is not quite feasible mainly due to the fact it relays on incrementing procedure using import from geometry.root. HMPID geometry is defined 
219 in a way that there is no volumes exactly corresponding to the HMPID planes. 
220
221 Geometry of HMPID chambers.
222 After the decision to rotate the whole HMPID setup from 12 o'clock position to 2 o'clock position we have the following situation:
223
224 Theta = 109.5 degrees for chambers 1,3
225 Theta =  90.0 degrees for chambers 2,4,6
226 Theta =  70.5 degrees for chambers 5,7
227
228 Phi   =  50.0 degrees for chambers 6,7 
229 Phi   =  30.0 degrees for chambers 3,4,5 
230 Phi   =  10.0 degrees for chambers 1,2 
231
232
233 Old parametrization by AliHMPIDChamber:
234 HMPID chamber 1 (454.877118 ,  80.207109 , -163.565361)(rho,theta,phi)=(490.0,109.5,10.0)
235 HMPID chamber 2 (482.555799 ,  85.087607 ,    0.000000)(rho,theta,phi)=(490.0, 90.0,10.0)
236 HMPID chamber 3 (400.012224 , 230.947165 , -163.565361)(rho,theta,phi)=(490.0,109.5,30.0)
237 HMPID chamber 4 (424.352448 , 245.000000 ,    0.000000)(rho,theta,phi)=(490.0, 90.0,30.0)
238 HMPID chamber 5 (400.012224 , 230.947165 ,  163.565361)(rho,theta,phi)=(490.0, 70.5,30.0)
239 HMPID chamber 6 (314.965929 , 375.361777 ,    0.000000)(rho,theta,phi)=(490.0, 90.0,50.0)
240 HMPID chamber 7 (296.899953 , 353.831585 ,  163.565361)(rho,theta,phi)=(490.0, 70.5,50.0)
241
242 New parametrization by TGeoHMatrix:  perfect geometry, no misalignment
243 HMPID 0
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
247 HMPID 1
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
251 HMPID 2
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
255 HMPID 3
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
259 HMPID 4
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
263 HMPID 5
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
267 HMPID 6
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
271
272
273
274
275
276
277
278
279
280