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"
34 #include "AliDetectorRecoParam.h"
37 #include "AliRecoParam.h"
38 #include "AliRunInfo.h"
39 #include "AliEventInfo.h"
42 ClassImp(AliRecoParam)
44 TString AliRecoParam::fkgEventSpecieName[] = {"Default", "LowMultiplicity", "HighMultiplicity", "Cosmic", "Calib", "Unknown"} ;
46 AliRecoParam::AliRecoParam():
48 fEventSpecie(kDefault)
50 // Default constructor
52 for(Int_t iDet = 0; iDet < kNDetectors; iDet++)
53 fDetRecoParams[iDet] = NULL;
54 for(Int_t iSpecie = 0; iSpecie < kNSpecies; iSpecie++) {
55 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
56 fDetRecoParamsIndex[iSpecie][iDet] = -1;
61 AliRecoParam::AliRecoParam(const AliRecoParam& par) :
63 fEventSpecie(par.fEventSpecie)
66 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
67 if (par.fDetRecoParams[iDet])
68 fDetRecoParams[iDet] = (TObjArray*)(par.fDetRecoParams[iDet]->Clone());
70 fDetRecoParams[iDet] = NULL;
72 for(Int_t iSpecie = 0; iSpecie < kNSpecies; iSpecie++) {
73 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
74 fDetRecoParamsIndex[iSpecie][iDet] = par.fDetRecoParamsIndex[iSpecie][iDet];
79 //_____________________________________________________________________________
80 AliRecoParam& AliRecoParam::operator = (const AliRecoParam& par)
82 // assignment operator
84 if(&par == this) return *this;
86 this->~AliRecoParam();
87 new(this) AliRecoParam(par);
91 AliRecoParam::~AliRecoParam(){
94 // Delete the array with the reco-param objects
95 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
96 if (fDetRecoParams[iDet]){
97 fDetRecoParams[iDet]->Delete();
98 delete fDetRecoParams[iDet];
103 Int_t AliRecoParam::AConvert(EventSpecie_t es)
105 //Converts EventSpecie_t into int
128 AliFatalClass(Form("Wrong event specie conversion %d", es)) ;
133 AliRecoParam::EventSpecie_t AliRecoParam::Convert(Int_t ies)
135 //Converts int into EventSpecie_t
136 AliRecoParam::EventSpecie_t es = kDefault ;
149 AliRecoParam::EventSpecie_t AliRecoParam::ConvertIndex(Int_t index)
151 //Converts index of lists into eventspecie
152 EventSpecie_t es = kDefault ;
175 void AliRecoParam::Print(Option_t *option) const {
177 // Print reconstruction setup
179 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
180 if (fDetRecoParams[iDet]){
181 printf("AliDetectorRecoParam objects for detector %d:\n",iDet);
182 Int_t nparam = fDetRecoParams[iDet]->GetEntriesFast();
183 for (Int_t iparam=0; iparam<nparam; iparam++){
184 AliDetectorRecoParam * param = (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(iparam);
185 if (!param) continue;
186 param->Print(option);
190 printf("No AliDetectorRecoParam objects specified for detector %d\n",iDet);
195 void AliRecoParam::SetEventSpecie(const AliRunInfo *runInfo, const AliEventInfo &evInfo, const THashTable *cosmicTriggersList)
197 // Implemented according to the discussions
198 // and meetings with physics and trigger coordination
200 fEventSpecie = kDefault;
202 if (strcmp(runInfo->GetRunType(),"PHYSICS")) {
203 // Not a physics run, the event specie is set to kCalib
204 fEventSpecie = kCalib;
208 // Special DAQ events considered as calibration events
209 if (evInfo.GetEventType() != 7) {
210 // START_OF_*, END_OF_*, CALIBRATION etc events
211 fEventSpecie = kCalib;
215 TString lhcState(runInfo->GetLHCState());
216 TString beamType(runInfo->GetBeamType());
217 TRegexp reStable("^STABLE[_ ]BEAMS$");
218 TRegexp reASthg("^A-");
219 TRegexp reSthgA(".*-A$");
220 TRegexp repSthg("^[pP]-.*");
221 TRegexp reSthgp(".*-[pP]$");
223 if(lhcState.Index(reStable)==0){
224 if(beamType.Index(repSthg)==0 || beamType.Index(reSthgp)==0){
225 // Proton run, the event specie is set to kLowMult
226 fEventSpecie = kLowMult;
227 }else if(beamType.Index(reASthg)==0 || beamType.Index(reSthgA)==0){
228 // Heavy ion run (any beam that is not pp, the event specie is set to kHighMult
229 fEventSpecie = kHighMult;
232 if(beamType==TString("-")){
233 // No beams, we assume cosmic data
234 fEventSpecie = kCosmic;
237 // Now we look into the trigger type in order to decide
238 // on the remaining cases (cosmic event within LHC run,
239 // calibration, for example TPC laser, triggers within physics run
241 Bool_t cosmicTrigger = evInfo.HasCosmicTrigger();
242 Bool_t calibTrigger = evInfo.HasCalibLaserTrigger();
243 Bool_t otherTrigger = evInfo.HasBeamTrigger();
245 // -------------------------------------------------------------- >>
246 // for BWD compatibility, preserve also old way of checking
247 if (!cosmicTrigger && !calibTrigger) { // not set via alias
248 TString triggerClasses = evInfo.GetTriggerClasses();
249 TObjArray* trClassArray = triggerClasses.Tokenize(" ");
250 Int_t nTrClasses = trClassArray->GetEntriesFast();
251 for( Int_t i=0; i<nTrClasses; ++i ) {
252 TString trClass = ((TObjString*)trClassArray->At(i))->String();
253 if (trClass.BeginsWith("C0L")) { // Calibration triggers always start with C0L
254 calibTrigger = kTRUE;
258 if (cosmicTriggersList) {
259 if (cosmicTriggersList->FindObject(trClass.Data())) {
260 // Cosmic trigger accorind to the table provided in OCDB
261 cosmicTrigger = kTRUE;
262 AliDebug(1,Form("Trigger %s identified as cosmic according to the list defined in OCDB.",trClass.Data()));
267 AliDebug(1,"Cosmic trigger list is not provided, cosmic event specie is effectively disabled!");
270 otherTrigger = kTRUE;
275 // -------------------------------------------------------------- <<
278 fEventSpecie = kCalib;
281 if (cosmicTrigger && !otherTrigger) {
282 fEventSpecie = kCosmic;
286 // Here we have to add if we have other cases
287 // and also HLT info if any...
290 const AliDetectorRecoParam *AliRecoParam::GetDetRecoParam(Int_t iDet) const
292 // Return AliDetectorRecoParam object for a given detector
293 // according to the event specie provided as an argument
294 if ( iDet >= kNDetectors) return NULL;
295 if (!fDetRecoParams[iDet]) return NULL;
296 if (fDetRecoParams[iDet]->GetEntries() == 0) return NULL;
298 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
299 if (fEventSpecie & (1 << iBit)) {
300 if (fDetRecoParamsIndex[iBit][iDet] >= 0)
301 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[iBit][iDet]);
302 else if (fDetRecoParamsIndex[0][iDet] >= 0)
303 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
305 AliError(Form("no RecoParam set for detector %d", iDet));
312 AliError(Form("Invalid event specie: %d!",fEventSpecie));
313 if (fDetRecoParamsIndex[0][iDet] >= 0)
314 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
316 AliError(Form("no RecoParam set for detector %d", iDet));
320 void AliRecoParam::AddDetRecoParam(Int_t iDet, AliDetectorRecoParam* param)
322 // Add an instance of reco params object into
323 // the fDetRecoParams for detector iDet
324 // Updates the fDetRecoParams index
325 if (!fDetRecoParams[iDet]) fDetRecoParams[iDet] = new TObjArray;
326 fDetRecoParams[iDet]->AddLast(param);
327 Int_t index = fDetRecoParams[iDet]->GetLast();
330 Int_t specie = param->GetEventSpecie();
331 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
332 if (specie & (1 << iBit)) {
333 fDetRecoParamsIndex[iBit][iDet] = index;
338 Bool_t AliRecoParam::AddDetRecoParamArray(Int_t iDet, TObjArray* parArray)
340 // Add an array of reconstruction parameter objects
341 // for a given detector
342 // Basic check on the consistency of the array
343 Bool_t defaultFound = kFALSE;
344 if (!parArray) return defaultFound;
345 for(Int_t i = 0; i < parArray->GetEntriesFast(); i++) {
346 AliDetectorRecoParam *par = (AliDetectorRecoParam*)parArray->At(i);
348 if (par->IsDefault()) defaultFound = kTRUE;
350 Int_t specie = par->GetEventSpecie();
351 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
352 if (specie & (1 << iBit)) {
353 fDetRecoParamsIndex[iBit][iDet] = i;
358 fDetRecoParams[iDet] = parArray;
363 const char* AliRecoParam::PrintEventSpecie() const
367 switch (fEventSpecie) {
369 return fkgEventSpecieName[0].Data() ;
372 return fkgEventSpecieName[1].Data() ;
375 return fkgEventSpecieName[2].Data() ;
378 return fkgEventSpecieName[3].Data() ;
381 return fkgEventSpecieName[4].Data() ;
384 return fkgEventSpecieName[5].Data() ;
389 const char * AliRecoParam::GetEventSpecieName(EventSpecie_t es)
393 return fkgEventSpecieName[0].Data() ;
396 return fkgEventSpecieName[1].Data() ;
399 return fkgEventSpecieName[2].Data() ;
402 return fkgEventSpecieName[3].Data() ;
405 return fkgEventSpecieName[4].Data() ;
408 return fkgEventSpecieName[5].Data() ;
413 const char * AliRecoParam::GetEventSpecieName(Int_t esIndex)
415 if ( esIndex >= 0 && esIndex < kNSpecies)
416 return fkgEventSpecieName[esIndex].Data() ;
418 return fkgEventSpecieName[kNSpecies].Data() ;