1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 ///////////////////////////////////////////////////////////////////////////////
19 // ALICE Reconstruction parameterization: //
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. //
26 ///////////////////////////////////////////////////////////////////////////////
29 #include "TObjArray.h"
31 #include "THashTable.h"
32 #include "AliDetectorRecoParam.h"
35 #include "AliRecoParam.h"
36 #include "AliRunInfo.h"
37 #include "AliEventInfo.h"
40 ClassImp(AliRecoParam)
42 TString AliRecoParam::fkgEventSpecieName[] = {"Default", "LowMultiplicity", "HighMultiplicity", "Cosmic", "Calib", "Unknown"} ;
44 AliRecoParam::AliRecoParam():
46 fEventSpecie(kDefault)
48 // Default constructor
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;
59 AliRecoParam::AliRecoParam(const AliRecoParam& par) :
61 fEventSpecie(par.fEventSpecie)
64 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
65 if (par.fDetRecoParams[iDet])
66 fDetRecoParams[iDet] = (TObjArray*)(par.fDetRecoParams[iDet]->Clone());
68 fDetRecoParams[iDet] = NULL;
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];
77 //_____________________________________________________________________________
78 AliRecoParam& AliRecoParam::operator = (const AliRecoParam& par)
80 // assignment operator
82 if(&par == this) return *this;
84 this->~AliRecoParam();
85 new(this) AliRecoParam(par);
89 AliRecoParam::~AliRecoParam(){
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];
101 Int_t AliRecoParam::AConvert(EventSpecie_t es)
103 //Converts EventSpecie_t into int
126 AliFatalClass(Form("Wrong event specie conversion %d", es)) ;
131 AliRecoParam::EventSpecie_t AliRecoParam::Convert(Int_t ies)
133 //Converts int into EventSpecie_t
134 AliRecoParam::EventSpecie_t es = kDefault ;
147 AliRecoParam::EventSpecie_t AliRecoParam::ConvertIndex(Int_t index)
149 //Converts index of lists into eventspecie
150 EventSpecie_t es = kDefault ;
173 void AliRecoParam::Print(Option_t *option) const {
175 // Print reconstruction setup
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);
188 printf("No AliDetectorRecoParam objects specified for detector %d\n",iDet);
193 void AliRecoParam::SetEventSpecie(const AliRunInfo *runInfo, const AliEventInfo &evInfo,
194 const THashTable *cosmicTriggersList)
196 // Implemented according to the discussions
197 // and meetings with physics and trigger coordination
199 fEventSpecie = kDefault;
201 if (strcmp(runInfo->GetRunType(),"PHYSICS")) {
202 // Not a physics run, the event specie is set to kCalib
203 fEventSpecie = kCalib;
207 // Special DAQ events considered as calibration events
208 if (evInfo.GetEventType() != 7) {
209 // START_OF_*, END_OF_*, CALIBRATION etc events
210 fEventSpecie = kCalib;
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;
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;
231 else if (strcmp(runInfo->GetBeamType(),"-") == 0) {
232 // No beams, we assume cosmic data
233 fEventSpecie = kCosmic;
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();
248 if (trClass.BeginsWith("C0L")) {
249 // Calibration triggers always start with C0L
250 calibTrigger = kTRUE;
254 if (cosmicTriggersList) {
255 if (cosmicTriggersList->FindObject(trClass.Data())) {
256 // Cosmic trigger accorind to the table
258 cosmicTrigger = kTRUE;
259 AliDebug(1,Form("Trigger %s identified as cosmic according to the list defined in OCDB.",
265 AliDebug(1,"Cosmic trigger list is not provided, cosmic event specie is effectively disabled!");
268 otherTrigger = kTRUE;
272 fEventSpecie = kCalib;
275 if (cosmicTrigger && !otherTrigger) {
276 fEventSpecie = kCosmic;
280 // Here we have to add if we have other cases
281 // and also HLT info if any...
284 const AliDetectorRecoParam *AliRecoParam::GetDetRecoParam(Int_t iDet) const
286 // Return AliDetectorRecoParam object for a given detector
287 // according to the event specie provided as an argument
288 if ( iDet >= kNDetectors) return NULL;
289 if (!fDetRecoParams[iDet]) return NULL;
290 if (fDetRecoParams[iDet]->GetEntries() == 0) return NULL;
292 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
293 if (fEventSpecie & (1 << iBit)) {
294 if (fDetRecoParamsIndex[iBit][iDet] >= 0)
295 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[iBit][iDet]);
297 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
302 AliError(Form("Invalid event specie: %d!",fEventSpecie));
303 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
306 void AliRecoParam::AddDetRecoParam(Int_t iDet, AliDetectorRecoParam* param)
308 // Add an instance of reco params object into
309 // the fDetRecoParams for detector iDet
310 // Updates the fDetRecoParams index
311 if (!fDetRecoParams[iDet]) fDetRecoParams[iDet] = new TObjArray;
312 fDetRecoParams[iDet]->AddLast(param);
313 Int_t index = fDetRecoParams[iDet]->GetLast();
316 Int_t specie = param->GetEventSpecie();
317 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
318 if (specie & (1 << iBit)) {
319 fDetRecoParamsIndex[iBit][iDet] = index;
324 Bool_t AliRecoParam::AddDetRecoParamArray(Int_t iDet, TObjArray* parArray)
326 // Add an array of reconstruction parameter objects
327 // for a given detector
328 // Basic check on the consistency of the array
329 Bool_t defaultFound = kFALSE;
330 for(Int_t i = 0; i < parArray->GetEntriesFast(); i++) {
331 AliDetectorRecoParam *par = (AliDetectorRecoParam*)parArray->At(i);
333 if (par->IsDefault()) defaultFound = kTRUE;
335 Int_t specie = par->GetEventSpecie();
336 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
337 if (specie & (1 << iBit)) {
338 fDetRecoParamsIndex[iBit][iDet] = i;
343 fDetRecoParams[iDet] = parArray;
348 const char* AliRecoParam::PrintEventSpecie() const
352 switch (fEventSpecie) {
354 return fkgEventSpecieName[0].Data() ;
357 return fkgEventSpecieName[1].Data() ;
360 return fkgEventSpecieName[2].Data() ;
363 return fkgEventSpecieName[3].Data() ;
366 return fkgEventSpecieName[4].Data() ;
369 return fkgEventSpecieName[5].Data() ;
374 const char * AliRecoParam::GetEventSpecieName(EventSpecie_t es)
378 return fkgEventSpecieName[0].Data() ;
381 return fkgEventSpecieName[1].Data() ;
384 return fkgEventSpecieName[2].Data() ;
387 return fkgEventSpecieName[3].Data() ;
390 return fkgEventSpecieName[4].Data() ;
393 return fkgEventSpecieName[5].Data() ;
398 const char * AliRecoParam::GetEventSpecieName(Int_t esIndex)
400 if ( esIndex >= 0 && esIndex < kNSpecies)
401 return fkgEventSpecieName[esIndex].Data() ;
403 return fkgEventSpecieName[kNSpecies].Data() ;