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 "AliDetectorRecoParam.h"
34 #include "AliRecoParam.h"
35 #include "AliRunInfo.h"
36 #include "AliEventInfo.h"
39 ClassImp(AliRecoParam)
41 TString AliRecoParam::fkgEventSpecieName[] = {"Default", "LowMultiplicity", "HighMultiplicity", "Cosmic", "Calibration", "Unknown"} ;
43 AliRecoParam::AliRecoParam():
45 fEventSpecie(kDefault)
47 // Default constructor
49 for(Int_t iDet = 0; iDet < kNDetectors; iDet++)
50 fDetRecoParams[iDet] = NULL;
51 for(Int_t iSpecie = 0; iSpecie < kNSpecies; iSpecie++) {
52 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
53 fDetRecoParamsIndex[iSpecie][iDet] = -1;
58 AliRecoParam::AliRecoParam(const AliRecoParam& par) :
60 fEventSpecie(par.fEventSpecie)
63 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
64 if (par.fDetRecoParams[iDet])
65 fDetRecoParams[iDet] = (TObjArray*)(par.fDetRecoParams[iDet]->Clone());
67 fDetRecoParams[iDet] = NULL;
69 for(Int_t iSpecie = 0; iSpecie < kNSpecies; iSpecie++) {
70 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
71 fDetRecoParamsIndex[iSpecie][iDet] = par.fDetRecoParamsIndex[iSpecie][iDet];
76 //_____________________________________________________________________________
77 AliRecoParam& AliRecoParam::operator = (const AliRecoParam& par)
79 // assignment operator
81 if(&par == this) return *this;
83 this->~AliRecoParam();
84 new(this) AliRecoParam(par);
88 AliRecoParam::~AliRecoParam(){
91 // Delete the array with the reco-param objects
92 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
93 if (fDetRecoParams[iDet]){
94 fDetRecoParams[iDet]->Delete();
95 delete fDetRecoParams[iDet];
100 Int_t AliRecoParam::AConvert(EventSpecie_t es)
102 //Converts EventSpecie_t into int
125 AliFatalClass(Form("Wrong event specie conversion %d", es)) ;
130 AliRecoParam::EventSpecie_t AliRecoParam::Convert(Int_t ies)
132 //Converts int into EventSpecie_t
133 AliRecoParam::EventSpecie_t es = kDefault ;
146 AliRecoParam::EventSpecie_t AliRecoParam::ConvertIndex(Int_t index)
148 //Converts index of lists into eventspecie
149 EventSpecie_t es = kDefault ;
172 void AliRecoParam::Print(Option_t *option) const {
174 // Print reconstruction setup
176 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
177 if (fDetRecoParams[iDet]){
178 printf("AliDetectorRecoParam objects for detector %d:\n",iDet);
179 Int_t nparam = fDetRecoParams[iDet]->GetEntriesFast();
180 for (Int_t iparam=0; iparam<nparam; iparam++){
181 AliDetectorRecoParam * param = (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(iparam);
182 if (!param) continue;
183 param->Print(option);
187 printf("No AliDetectorRecoParam objects specified for detector %d\n",iDet);
192 void AliRecoParam::SetEventSpecie(const AliRunInfo *runInfo, const AliEventInfo &evInfo)
195 // Here we return always kDefault!!
197 fEventSpecie = kDefault;
199 if (strcmp(runInfo->GetRunType(),"PHYSICS")) {
200 // Not a physics run, the event specie is set to kCalib
201 fEventSpecie = kCalib;
205 if (strcmp(runInfo->GetLHCState(),"STABLE_BEAMS") == 0) {
206 // In case of stable beams
207 // if ((strcmp(runInfo->GetBeamType(),"A-A") == 0) ||
208 // (strcmp(runInfo->GetBeamType(),"A-") == 0) ||
209 // (strcmp(runInfo->GetBeamType(),"-A") == 0)) {
210 // Heavy ion run (any beam tha is not pp, the event specie is set to kHighMult
211 fEventSpecie = kHighMult;
214 if ((strcmp(runInfo->GetBeamType(),"p-p") == 0) ||
215 (strcmp(runInfo->GetBeamType(),"p-") == 0) ||
216 (strcmp(runInfo->GetBeamType(),"-p") == 0) ||
217 (strcmp(runInfo->GetBeamType(),"P-P") == 0) ||
218 (strcmp(runInfo->GetBeamType(),"P-") == 0) ||
219 (strcmp(runInfo->GetBeamType(),"-P") == 0)) {
220 // Proton run, the event specie is set to kLowMult
221 fEventSpecie = kLowMult;
223 else if (strcmp(runInfo->GetBeamType(),"-") == 0) {
224 // No beams, we assume cosmic data
225 fEventSpecie = kCosmic;
227 else if (strcmp(runInfo->GetBeamType(),"UNKNOWN") == 0) {
228 // No LHC beam information is available, we the default
230 fEventSpecie = kDefault;
233 // Now we look into the trigger type in order to decide
234 // on the remaining cases (cosmic event within LHC run,
235 // high-mult event based on high-mult SPD trigger
236 // within p-p run, laser triggers within physics run,
237 // special DAQ events considered as calibration etc...)
238 if (evInfo.GetEventType() != 7) {
239 // START_OF_*, END_OF_*, CALIBRATION etc events
240 fEventSpecie = kCalib;
243 TString triggerClasses = evInfo.GetTriggerClasses();
244 TObjArray* trClassArray = triggerClasses.Tokenize(" ");
245 Int_t nTrClasses = trClassArray->GetEntriesFast();
246 Bool_t cosmicTrigger = kFALSE,
247 laserTrigger = kFALSE,
248 highMultTrigger = kFALSE,
249 otherTrigger = kFALSE;
250 for( Int_t i=0; i<nTrClasses; ++i ) {
251 TString trClass = ((TObjString*)trClassArray->At(i))->String();
252 if (trClass.BeginsWith("C0A") ||
253 trClass.BeginsWith("C0SC") ||
254 trClass.BeginsWith("C0OC")) {
255 // ACORDE/SPD/TOF cosmic trigger, so we have cosmic event
256 // not always true, but we don't have a better idea...
257 cosmicTrigger = kTRUE;
259 else if (trClass.BeginsWith("C0LSR")) {
261 laserTrigger = kTRUE;
263 else if (trClass.BeginsWith("C0SH")) {
264 // High-multiplicity SPD trugger
265 // Have to add other high-mult triggers here...
266 highMultTrigger = kTRUE;
269 otherTrigger = kTRUE;
274 fEventSpecie = kCalib;
277 if (cosmicTrigger && !highMultTrigger && !otherTrigger) {
278 fEventSpecie = kCosmic;
281 if (highMultTrigger) {
282 fEventSpecie = kHighMult;
286 // Here we have to add if we have other cases
287 // and also HLT info if any...
291 const AliDetectorRecoParam *AliRecoParam::GetDetRecoParam(Int_t iDet) const
293 // Return AliDetectorRecoParam object for a given detector
294 // according to the event specie provided as an argument
295 if ( iDet >= kNDetectors) return NULL;
296 if (!fDetRecoParams[iDet]) return NULL;
297 if (fDetRecoParams[iDet]->GetEntries() == 0) return NULL;
299 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
300 if (fEventSpecie & (1 << iBit)) {
301 if (fDetRecoParamsIndex[iBit][iDet] >= 0)
302 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[iBit][iDet]);
304 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
309 AliError(Form("Invalid event specie: %d!",fEventSpecie));
310 return (AliDetectorRecoParam *)fDetRecoParams[iDet]->At(fDetRecoParamsIndex[0][iDet]);
313 void AliRecoParam::AddDetRecoParam(Int_t iDet, AliDetectorRecoParam* param)
315 // Add an instance of reco params object into
316 // the fDetRecoParams for detector iDet
317 // Updates the fDetRecoParams index
318 if (!fDetRecoParams[iDet]) fDetRecoParams[iDet] = new TObjArray;
319 fDetRecoParams[iDet]->AddLast(param);
320 Int_t index = fDetRecoParams[iDet]->GetLast();
323 Int_t specie = param->GetEventSpecie();
324 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
325 if (specie & (1 << iBit)) {
326 fDetRecoParamsIndex[iBit][iDet] = index;
331 Bool_t AliRecoParam::AddDetRecoParamArray(Int_t iDet, TObjArray* parArray)
333 // Add an array of reconstruction parameter objects
334 // for a given detector
335 // Basic check on the consistency of the array
336 Bool_t defaultFound = kFALSE;
337 for(Int_t i = 0; i < parArray->GetEntriesFast(); i++) {
338 AliDetectorRecoParam *par = (AliDetectorRecoParam*)parArray->At(i);
340 if (par->IsDefault()) defaultFound = kTRUE;
342 Int_t specie = par->GetEventSpecie();
343 for(Int_t iBit = 0; iBit < kNSpecies; iBit++) {
344 if (specie & (1 << iBit)) {
345 fDetRecoParamsIndex[iBit][iDet] = i;
350 fDetRecoParams[iDet] = parArray;
355 const char* AliRecoParam::PrintEventSpecie() const
359 switch (fEventSpecie) {
361 return fkgEventSpecieName[0].Data() ;
364 return fkgEventSpecieName[1].Data() ;
367 return fkgEventSpecieName[2].Data() ;
370 return fkgEventSpecieName[3].Data() ;
373 return fkgEventSpecieName[4].Data() ;
376 return fkgEventSpecieName[5].Data() ;
381 const char * AliRecoParam::GetEventSpecieName(EventSpecie_t es)
385 return fkgEventSpecieName[0].Data() ;
388 return fkgEventSpecieName[1].Data() ;
391 return fkgEventSpecieName[2].Data() ;
394 return fkgEventSpecieName[3].Data() ;
397 return fkgEventSpecieName[4].Data() ;
400 return fkgEventSpecieName[5].Data() ;
405 const char * AliRecoParam::GetEventSpecieName(Int_t esIndex)
407 if ( esIndex >= 0 && esIndex < kNSpecies)
408 return fkgEventSpecieName[esIndex].Data() ;
410 return fkgEventSpecieName[kNSpecies].Data() ;