Corrected protection.
[u/mrichter/AliRoot.git] / STEER / AliRecoParam.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16
17 ///////////////////////////////////////////////////////////////////////////////
18 //                                                                           //
19 // ALICE Reconstruction parameterization:                                    //
20 //                                                                           //
21 //                                                                           //
22 // Base Class for Detector reconstruction parameters                         //
23 // Revision: cvetan.cheshkov@cern.ch 12/06/2008                              //
24 // Its structure has been revised and it is interfaced to AliEventInfo.      //
25 //                                                                           //
26 ///////////////////////////////////////////////////////////////////////////////
27
28 #include "TClass.h"
29 #include "TObjArray.h"
30 #include "TMath.h"
31 #include "THashTable.h"
32 #include "AliDetectorRecoParam.h"
33
34 #include "AliLog.h"
35 #include "AliRecoParam.h"
36 #include "AliRunInfo.h"
37 #include "AliEventInfo.h"
38 #include "AliLog.h"
39
40 ClassImp(AliRecoParam)
41
42 TString AliRecoParam::fkgEventSpecieName[] = {"Default", "LowMultiplicity", "HighMultiplicity", "Cosmic", "Calib", "Unknown"} ; 
43
44 AliRecoParam::AliRecoParam(): 
45   TObject(),
46   fEventSpecie(kDefault)
47 {
48   // Default constructor
49   // ...
50   for(Int_t iDet = 0; iDet < kNDetectors; iDet++)
51     fDetRecoParams[iDet] = NULL;
52   for(Int_t iSpecie = 0; iSpecie < kNSpecies; iSpecie++) {
53     for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
54       fDetRecoParamsIndex[iSpecie][iDet] = -1;
55     }
56   }
57 }
58
59 AliRecoParam::AliRecoParam(const AliRecoParam& par) :
60   TObject(),
61   fEventSpecie(par.fEventSpecie)
62 {
63   // copy constructor
64   for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
65     if (par.fDetRecoParams[iDet])
66       fDetRecoParams[iDet] = (TObjArray*)(par.fDetRecoParams[iDet]->Clone());
67     else
68       fDetRecoParams[iDet] = NULL;
69   }
70   for(Int_t iSpecie = 0; iSpecie < kNSpecies; iSpecie++) {
71     for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
72       fDetRecoParamsIndex[iSpecie][iDet] = par.fDetRecoParamsIndex[iSpecie][iDet];
73     }
74   }
75 }
76
77 //_____________________________________________________________________________
78 AliRecoParam& AliRecoParam::operator = (const AliRecoParam& par)
79 {
80   // assignment operator
81
82   if(&par == this) return *this;
83
84   this->~AliRecoParam();
85   new(this) AliRecoParam(par);
86   return *this;
87 }
88
89 AliRecoParam::~AliRecoParam(){
90   // Destructor
91   // ...
92   // Delete the array with the reco-param objects
93   for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
94     if (fDetRecoParams[iDet]){
95       fDetRecoParams[iDet]->Delete();
96       delete fDetRecoParams[iDet];
97     }
98   }
99 }
100
101 Int_t AliRecoParam::AConvert(EventSpecie_t es)
102 {
103   //Converts EventSpecie_t  into int
104   Int_t rv = -1 ; 
105   switch (es) {
106     case kDefault:
107       rv = 0 ; 
108       break;
109     case kLowMult:
110       rv = 1 ; 
111       break;
112     case kHighMult:
113       rv = 2 ; 
114       break;
115     case kCosmic:
116       rv = 3 ; 
117       break;
118     case kCalib:
119       rv = 4 ; 
120       break;
121     default:
122       break;
123   }
124
125   if (rv < 0) 
126     AliFatalClass(Form("Wrong event specie conversion %d", es)) ; 
127
128   return rv ;
129 }
130
131 AliRecoParam::EventSpecie_t AliRecoParam::Convert(Int_t ies)
132 {
133   //Converts int into EventSpecie_t
134   AliRecoParam::EventSpecie_t es = kDefault ; 
135   if ( ies >> 1) 
136     es = kLowMult ; 
137   if ( ies >> 2) 
138     es = kHighMult ;   
139   if ( ies >> 3) 
140     es = kCosmic ;   
141   if ( ies >> 4) 
142     es = kCalib ;
143
144   return es ;   
145 }
146
147 AliRecoParam::EventSpecie_t AliRecoParam::ConvertIndex(Int_t index)
148 {
149   //Converts index of lists into eventspecie
150   EventSpecie_t es = kDefault ; 
151   switch (index) {
152     case 0:
153       es = kDefault ; 
154       break;
155     case 1:
156       es = kLowMult ; 
157       break;
158     case 2:
159       es = kHighMult ;   
160       break;
161     case 3:
162       es = kCosmic ;   
163       break;
164     case 4:
165       es = kCalib ;
166       break;
167     default:
168       break;
169   }
170   return es ;
171 }
172
173 void  AliRecoParam::Print(Option_t *option) const {
174   //
175   // Print reconstruction setup
176   //
177   for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
178     if (fDetRecoParams[iDet]){
179       printf("AliDetectorRecoParam objects for detector %d:\n",iDet); 
180       Int_t nparam = fDetRecoParams[iDet]->GetEntriesFast();
181       for (Int_t iparam=0; iparam<nparam; iparam++){
182         AliDetectorRecoParam * param = (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(iparam);
183         if (!param) continue;
184         param->Print(option);
185       }
186     }
187     else {
188       printf("No AliDetectorRecoParam objects specified for detector %d\n",iDet); 
189     }
190   }
191 }
192
193 void AliRecoParam::SetEventSpecie(const AliRunInfo *runInfo, const AliEventInfo &evInfo,
194                                   const THashTable *cosmicTriggersList)
195 {
196   // Implemented according to the discussions
197   // and meetings with physics and trigger coordination
198
199   fEventSpecie = kDefault;
200
201   if (strcmp(runInfo->GetRunType(),"PHYSICS")) {
202     // Not a physics run, the event specie is set to kCalib
203     fEventSpecie = kCalib;
204     return;
205   }
206
207   // Special DAQ events considered as calibration events
208   if (evInfo.GetEventType() != 7) {
209     // START_OF_*, END_OF_*, CALIBRATION etc events
210     fEventSpecie = kCalib;
211     return;
212   }
213
214     if ((strcmp(runInfo->GetLHCState(),"STABLE_BEAMS") == 0) &&
215         ((strcmp(runInfo->GetBeamType(),"A-A") == 0) ||
216         (strcmp(runInfo->GetBeamType(),"A-") == 0) ||
217         (strcmp(runInfo->GetBeamType(),"-A") == 0))) {
218       // Heavy ion run (any beam that is not pp, the event specie is set to kHighMult
219       fEventSpecie = kHighMult;
220     }
221     else if ((strcmp(runInfo->GetLHCState(),"STABLE_BEAMS") == 0) &&
222              ((strcmp(runInfo->GetBeamType(),"p-p") == 0) ||
223               (strcmp(runInfo->GetBeamType(),"p-") == 0) ||
224               (strcmp(runInfo->GetBeamType(),"-p") == 0) ||
225               (strcmp(runInfo->GetBeamType(),"P-P") == 0) ||
226               (strcmp(runInfo->GetBeamType(),"P-") == 0) ||
227               (strcmp(runInfo->GetBeamType(),"-P") == 0))) {
228       // Proton run, the event specie is set to kLowMult
229       fEventSpecie = kLowMult;
230     }
231     else if (strcmp(runInfo->GetBeamType(),"-") == 0) {
232       // No beams, we assume cosmic data
233       fEventSpecie = kCosmic;
234     }
235
236     // Now we look into the trigger type in order to decide
237     // on the remaining cases (cosmic event within LHC run,
238     // calibration, for example TPC laser, triggers within physics run
239     TString triggerClasses = evInfo.GetTriggerClasses();
240     TObjArray* trClassArray = triggerClasses.Tokenize(" ");
241     Int_t nTrClasses = trClassArray->GetEntriesFast();
242     Bool_t cosmicTrigger = kFALSE,
243       calibTrigger = kFALSE,
244       otherTrigger = kFALSE;
245     for( Int_t i=0; i<nTrClasses; ++i ) {
246       TString trClass = ((TObjString*)trClassArray->At(i))->String();
247
248       if (trClass.BeginsWith("C0L")) {
249         // Calibration triggers always start with C0L
250         calibTrigger = kTRUE;
251         continue;
252       }
253
254       if (cosmicTriggersList) {
255         if (cosmicTriggersList->FindObject(trClass.Data())) {
256           // Cosmic trigger accorind to the table
257           // provided in OCDB
258           cosmicTrigger = kTRUE;
259           AliDebug(1,Form("Trigger %s identified as cosmic according to the list defined in OCDB.",
260                           trClass.Data()));
261           continue;
262         }
263       }
264       else {
265         AliDebug(1,"Cosmic trigger list is not provided, cosmic event specie is effectively disabled!");
266       }
267
268       otherTrigger = kTRUE;
269     }
270     delete trClassArray;
271
272     if (calibTrigger) {
273       fEventSpecie = kCalib;
274       return;
275     }
276     if (cosmicTrigger && !otherTrigger) {
277       fEventSpecie = kCosmic;
278       return;
279     }
280
281     // Here we have to add if we have other cases
282     // and also HLT info if any...
283 }
284
285 const AliDetectorRecoParam *AliRecoParam::GetDetRecoParam(Int_t iDet) const
286 {
287   // Return AliDetectorRecoParam object for a given detector
288   // according to the event specie provided as an argument
289   if ( iDet >= kNDetectors) return NULL;
290   if (!fDetRecoParams[iDet]) return NULL;
291   if (fDetRecoParams[iDet]->GetEntries() == 0) return NULL;
292
293   for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
294     if (fEventSpecie & (1 << iBit)) {
295       if (fDetRecoParamsIndex[iBit][iDet] >= 0)
296         return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[iBit][iDet]);
297       else if (fDetRecoParamsIndex[0][iDet] >= 0)
298         return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
299       else {
300         AliError(Form("no RecoParam set for detector %d", iDet));
301         return NULL;
302       }
303     }
304   }
305
306   // Default one
307   AliError(Form("Invalid event specie: %d!",fEventSpecie));
308   if (fDetRecoParamsIndex[0][iDet] >= 0)
309     return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
310
311   AliError(Form("no RecoParam set for detector %d", iDet));
312   return NULL;
313 }
314
315 void  AliRecoParam::AddDetRecoParam(Int_t iDet, AliDetectorRecoParam* param)
316 {
317   // Add an instance of reco params object into
318   // the fDetRecoParams for detector iDet
319   // Updates the fDetRecoParams index
320   if (!fDetRecoParams[iDet]) fDetRecoParams[iDet] = new TObjArray;
321   fDetRecoParams[iDet]->AddLast(param);
322   Int_t index = fDetRecoParams[iDet]->GetLast();
323
324   // Index
325   Int_t specie = param->GetEventSpecie();
326   for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
327     if (specie & (1 << iBit)) {
328       fDetRecoParamsIndex[iBit][iDet] = index;
329     }
330   }
331 }
332
333 Bool_t AliRecoParam::AddDetRecoParamArray(Int_t iDet, TObjArray* parArray)
334 {
335   // Add an array of reconstruction parameter objects
336   // for a given detector
337   // Basic check on the consistency of the array
338   Bool_t defaultFound = kFALSE;
339   for(Int_t i = 0; i < parArray->GetEntriesFast(); i++) {
340     AliDetectorRecoParam *par = (AliDetectorRecoParam*)parArray->At(i);
341     if (!par) continue;
342     if (par->IsDefault()) defaultFound = kTRUE;
343
344     Int_t specie = par->GetEventSpecie();
345     for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
346       if (specie & (1 << iBit)) {
347         fDetRecoParamsIndex[iBit][iDet] = i;
348       }
349     }
350  }
351    
352   fDetRecoParams[iDet] = parArray;
353
354   return defaultFound;
355 }
356
357 const char*  AliRecoParam::PrintEventSpecie() const
358 {
359   // Print the current
360   // event specie
361   switch (fEventSpecie) {
362   case kDefault:
363     return fkgEventSpecieName[0].Data() ;
364     break;
365   case kLowMult:
366     return fkgEventSpecieName[1].Data() ;
367     break;
368   case kHighMult:
369     return fkgEventSpecieName[2].Data() ;
370     break;
371   case kCosmic:
372     return fkgEventSpecieName[3].Data() ;
373     break;
374   case kCalib:
375     return fkgEventSpecieName[4].Data() ;
376     break;
377   default:
378     return fkgEventSpecieName[5].Data() ;
379     break;
380   }
381 }
382
383 const char * AliRecoParam::GetEventSpecieName(EventSpecie_t es)
384 {
385   switch (es) {
386     case kDefault:
387       return fkgEventSpecieName[0].Data() ;
388       break;
389     case kLowMult:
390       return fkgEventSpecieName[1].Data() ;
391       break;
392     case kHighMult:
393       return fkgEventSpecieName[2].Data() ;
394       break;
395     case kCosmic:
396       return fkgEventSpecieName[3].Data() ;
397       break;
398     case kCalib:
399       return fkgEventSpecieName[4].Data() ;
400       break;
401     default:
402       return fkgEventSpecieName[5].Data() ;
403       break;
404   }
405 }
406
407 const char * AliRecoParam::GetEventSpecieName(Int_t esIndex)
408 {
409   if ( esIndex >= 0 && esIndex < kNSpecies) 
410     return fkgEventSpecieName[esIndex].Data() ;
411   else 
412     return fkgEventSpecieName[kNSpecies].Data() ;
413 }