]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliRecoParam.cxx
Fixes for Coverity + changes to take into account the improvements of the analysis...
[u/mrichter/AliRoot.git] / STEER / AliRecoParam.cxx
CommitLineData
242b332c 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// //
6769d914 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. //
242b332c 25// //
26///////////////////////////////////////////////////////////////////////////////
27
5e232cd6 28#include "TClass.h"
242b332c 29#include "TObjArray.h"
57acd2d2 30#include "TMath.h"
77ba28ba 31#include "THashTable.h"
242b332c 32#include "AliDetectorRecoParam.h"
33
6bcbb25b 34#include "AliLog.h"
242b332c 35#include "AliRecoParam.h"
48f5e52d 36#include "AliRunInfo.h"
37#include "AliEventInfo.h"
5e232cd6 38#include "AliLog.h"
242b332c 39
242b332c 40ClassImp(AliRecoParam)
41
2ddda051 42TString AliRecoParam::fkgEventSpecieName[] = {"Default", "LowMultiplicity", "HighMultiplicity", "Cosmic", "Calib", "Unknown"} ;
57acd2d2 43
6769d914 44AliRecoParam::AliRecoParam():
7e88424f 45 TObject(),
46 fEventSpecie(kDefault)
242b332c 47{
6769d914 48 // Default constructor
49 // ...
7e88424f 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 }
242b332c 57}
58
54e51010 59AliRecoParam::AliRecoParam(const AliRecoParam& par) :
60 TObject(),
61 fEventSpecie(par.fEventSpecie)
62{
63 // copy constructor
64 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
54e51010 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
49ad11d0 77//_____________________________________________________________________________
78AliRecoParam& 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
242b332c 89AliRecoParam::~AliRecoParam(){
6769d914 90 // Destructor
91 // ...
92 // Delete the array with the reco-param objects
7e88424f 93 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
94 if (fDetRecoParams[iDet]){
95 fDetRecoParams[iDet]->Delete();
96 delete fDetRecoParams[iDet];
97 }
242b332c 98 }
99}
100
57acd2d2 101Int_t AliRecoParam::AConvert(EventSpecie_t es)
102{
103 //Converts EventSpecie_t into int
5e232cd6 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 }
9d556894 124
125 if (rv < 0)
5e232cd6 126 AliFatalClass(Form("Wrong event specie conversion %d", es)) ;
9d556894 127
128 return rv ;
57acd2d2 129}
130
131AliRecoParam::EventSpecie_t AliRecoParam::Convert(Int_t ies)
132{
133 //Converts int into EventSpecie_t
5e232cd6 134 AliRecoParam::EventSpecie_t es = kDefault ;
135 if ( ies >> 1)
57acd2d2 136 es = kLowMult ;
5e232cd6 137 if ( ies >> 2)
57acd2d2 138 es = kHighMult ;
5e232cd6 139 if ( ies >> 3)
57acd2d2 140 es = kCosmic ;
5e232cd6 141 if ( ies >> 4)
142 es = kCalib ;
143
57acd2d2 144 return es ;
145}
146
5e232cd6 147AliRecoParam::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
6769d914 173void AliRecoParam::Print(Option_t *option) const {
242b332c 174 //
175 // Print reconstruction setup
176 //
7e88424f 177 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
178 if (fDetRecoParams[iDet]){
ac232c75 179 printf("AliDetectorRecoParam objects for detector %d:\n",iDet);
7e88424f 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 }
242b332c 190 }
191}
192
77ba28ba 193void AliRecoParam::SetEventSpecie(const AliRunInfo *runInfo, const AliEventInfo &evInfo,
194 const THashTable *cosmicTriggersList)
7e88424f 195{
77ba28ba 196 // Implemented according to the discussions
197 // and meetings with physics and trigger coordination
48f5e52d 198
7e88424f 199 fEventSpecie = kDefault;
48f5e52d 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
3732bec6 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
6a053ee2 214 if ((strcmp(runInfo->GetLHCState(),"STABLE_BEAMS") == 0) &&
215 ((strcmp(runInfo->GetBeamType(),"A-A") == 0) ||
52fc52f0 216 (strcmp(runInfo->GetBeamType(),"A-") == 0) ||
6a053ee2 217 (strcmp(runInfo->GetBeamType(),"-A") == 0))) {
218 // Heavy ion run (any beam that is not pp, the event specie is set to kHighMult
48f5e52d 219 fEventSpecie = kHighMult;
52fc52f0 220 }
6a053ee2 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))) {
48f5e52d 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 }
48f5e52d 235
236 // Now we look into the trigger type in order to decide
237 // on the remaining cases (cosmic event within LHC run,
3732bec6 238 // calibration, for example TPC laser, triggers within physics run
48f5e52d 239 TString triggerClasses = evInfo.GetTriggerClasses();
240 TObjArray* trClassArray = triggerClasses.Tokenize(" ");
241 Int_t nTrClasses = trClassArray->GetEntriesFast();
242 Bool_t cosmicTrigger = kFALSE,
4e0a640f 243 calibTrigger = kFALSE,
48f5e52d 244 otherTrigger = kFALSE;
245 for( Int_t i=0; i<nTrClasses; ++i ) {
246 TString trClass = ((TObjString*)trClassArray->At(i))->String();
4e0a640f 247
248 if (trClass.BeginsWith("C0L")) {
249 // Calibration triggers always start with C0L
250 calibTrigger = kTRUE;
251 continue;
48f5e52d 252 }
4e0a640f 253
77ba28ba 254 if (cosmicTriggersList) {
255 if (cosmicTriggersList->FindObject(trClass.Data())) {
256 // Cosmic trigger accorind to the table
257 // provided in OCDB
4e0a640f 258 cosmicTrigger = kTRUE;
77ba28ba 259 AliDebug(1,Form("Trigger %s identified as cosmic according to the list defined in OCDB.",
260 trClass.Data()));
6a053ee2 261 continue;
4e0a640f 262 }
48f5e52d 263 }
264 else {
77ba28ba 265 AliDebug(1,"Cosmic trigger list is not provided, cosmic event specie is effectively disabled!");
48f5e52d 266 }
4e0a640f 267
268 otherTrigger = kTRUE;
48f5e52d 269 }
3c66dd72 270 delete trClassArray;
48f5e52d 271
4e0a640f 272 if (calibTrigger) {
48f5e52d 273 fEventSpecie = kCalib;
274 return;
275 }
4e0a640f 276 if (cosmicTrigger && !otherTrigger) {
48f5e52d 277 fEventSpecie = kCosmic;
278 return;
279 }
48f5e52d 280
281 // Here we have to add if we have other cases
282 // and also HLT info if any...
7e88424f 283}
284
285const 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
a00021a7 289 if ( iDet >= kNDetectors) return NULL;
7e88424f 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]);
c7a07b9c 297 else if (fDetRecoParamsIndex[0][iDet] >= 0)
7e88424f 298 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
c7a07b9c 299 else {
300 AliError(Form("no RecoParam set for detector %d", iDet));
301 return NULL;
302 }
7e88424f 303 }
304 }
6bcbb25b 305
7e88424f 306 // Default one
307 AliError(Form("Invalid event specie: %d!",fEventSpecie));
c7a07b9c 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;
6bcbb25b 313}
314
7e88424f 315void AliRecoParam::AddDetRecoParam(Int_t iDet, AliDetectorRecoParam* param)
316{
6769d914 317 // Add an instance of reco params object into
7e88424f 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
333Bool_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;
3d0847a7 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 }
7e88424f 351
352 fDetRecoParams[iDet] = parArray;
353
354 return defaultFound;
242b332c 355}
48f5e52d 356
357const char* AliRecoParam::PrintEventSpecie() const
358{
359 // Print the current
360 // event specie
361 switch (fEventSpecie) {
362 case kDefault:
57acd2d2 363 return fkgEventSpecieName[0].Data() ;
48f5e52d 364 break;
365 case kLowMult:
57acd2d2 366 return fkgEventSpecieName[1].Data() ;
48f5e52d 367 break;
368 case kHighMult:
57acd2d2 369 return fkgEventSpecieName[2].Data() ;
48f5e52d 370 break;
371 case kCosmic:
57acd2d2 372 return fkgEventSpecieName[3].Data() ;
48f5e52d 373 break;
374 case kCalib:
57acd2d2 375 return fkgEventSpecieName[4].Data() ;
48f5e52d 376 break;
377 default:
57acd2d2 378 return fkgEventSpecieName[5].Data() ;
48f5e52d 379 break;
380 }
381}
57acd2d2 382
383const 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
407const 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}