}
}
-void AliRecoParam::SetEventSpecie(const AliRunInfo *runInfo, const AliEventInfo &evInfo,
- const THashTable *cosmicTriggersList)
+void AliRecoParam::SetEventSpecie(const AliRunInfo *runInfo, const AliEventInfo &evInfo, const THashTable *cosmicTriggersList)
{
// Implemented according to the discussions
// and meetings with physics and trigger coordination
// Now we look into the trigger type in order to decide
// on the remaining cases (cosmic event within LHC run,
// calibration, for example TPC laser, triggers within physics run
- TString triggerClasses = evInfo.GetTriggerClasses();
- TObjArray* trClassArray = triggerClasses.Tokenize(" ");
- Int_t nTrClasses = trClassArray->GetEntriesFast();
- Bool_t cosmicTrigger = kFALSE,
- calibTrigger = kFALSE,
- otherTrigger = kFALSE;
- for( Int_t i=0; i<nTrClasses; ++i ) {
+ //
+ Bool_t cosmicTrigger = evInfo.HasCosmicTrigger();
+ Bool_t calibTrigger = evInfo.HasCalibLaserTrigger();
+ Bool_t otherTrigger = evInfo.HasBeamTrigger();
+ //
+ // -------------------------------------------------------------- >>
+ // for BWD compatibility, preserve also old way of checking
+ if (!cosmicTrigger && !calibTrigger) { // not set via alias
+ TString triggerClasses = evInfo.GetTriggerClasses();
+ TObjArray* trClassArray = triggerClasses.Tokenize(" ");
+ Int_t nTrClasses = trClassArray->GetEntriesFast();
+ for( Int_t i=0; i<nTrClasses; ++i ) {
TString trClass = ((TObjString*)trClassArray->At(i))->String();
-
- if (trClass.BeginsWith("C0L")) {
- // Calibration triggers always start with C0L
- calibTrigger = kTRUE;
- continue;
+ if (trClass.BeginsWith("C0L")) { // Calibration triggers always start with C0L
+ calibTrigger = kTRUE;
+ continue;
}
-
+ //
if (cosmicTriggersList) {
- if (cosmicTriggersList->FindObject(trClass.Data())) {
- // Cosmic trigger accorind to the table
- // provided in OCDB
- cosmicTrigger = kTRUE;
- AliDebug(1,Form("Trigger %s identified as cosmic according to the list defined in OCDB.",
- trClass.Data()));
- continue;
- }
+ if (cosmicTriggersList->FindObject(trClass.Data())) {
+ // Cosmic trigger accorind to the table provided in OCDB
+ cosmicTrigger = kTRUE;
+ AliDebug(1,Form("Trigger %s identified as cosmic according to the list defined in OCDB.",trClass.Data()));
+ continue;
+ }
}
else {
- AliDebug(1,"Cosmic trigger list is not provided, cosmic event specie is effectively disabled!");
+ AliDebug(1,"Cosmic trigger list is not provided, cosmic event specie is effectively disabled!");
}
-
+ //
otherTrigger = kTRUE;
+ }
+ delete trClassArray;
+ //
}
- delete trClassArray;
-
+ // -------------------------------------------------------------- <<
+ //
if (calibTrigger) {
fEventSpecie = kCalib;
return;
fDmax(50.),
fZmax(50.),
+ fCosmicAlias("kCosmic"),
+ fLaserAlias("kCalibLaser"),
fRunLocalReconstruction("ALL"),
fRunTracking("ALL"),
fFillESD("ALL"),
fDiamondProfileSPD(NULL),
fDiamondProfile(NULL),
fDiamondProfileTPC(NULL),
- fListOfCosmicTriggers(NULL),
+ fListOfCosmicTriggers(NULL), //RS for BWD comp.
+ fAlias2Trigger(NULL),
fGRPData(NULL),
fDmax(rec.fDmax),
fZmax(rec.fZmax),
+ fCosmicAlias(rec.fCosmicAlias),
+ fLaserAlias(rec.fLaserAlias),
fRunLocalReconstruction(rec.fRunLocalReconstruction),
fRunTracking(rec.fRunTracking),
fFillESD(rec.fFillESD),
fDiamondProfileSPD(rec.fDiamondProfileSPD),
fDiamondProfile(rec.fDiamondProfile),
fDiamondProfileTPC(rec.fDiamondProfileTPC),
- fListOfCosmicTriggers(NULL),
+ fListOfCosmicTriggers(NULL), //RS for BWD comp.
+ fAlias2Trigger(NULL),
fGRPData(NULL),
fDmax = rec.fDmax;
fZmax = rec.fZmax;
+ fCosmicAlias = rec.fCosmicAlias;
+ fLaserAlias = rec.fLaserAlias;
+
fRunLocalReconstruction = rec.fRunLocalReconstruction;
fRunTracking = rec.fRunTracking;
fFillESD = rec.fFillESD;
delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
+ //
+ delete fAlias2Trigger; fAlias2Trigger = NULL;
+ if (rec.fAlias2Trigger) fAlias2Trigger = (THashList*)((rec.fAlias2Trigger)->Clone());
delete fGRPData; fGRPData = NULL;
// if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
fListOfCosmicTriggers->Delete();
delete fListOfCosmicTriggers;
}
+ if (fAlias2Trigger) {
+ fAlias2Trigger->Delete();
+ delete fAlias2Trigger;
+ }
delete fGRPData;
delete fRunScalers;
delete fCTPTimeParams;
AliError("No TPC diamond profile found in OCDB!");
}
- entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
- if (entry) {
- fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
- entry->SetOwner(0);
- }
-
- if (!fListOfCosmicTriggers) {
- AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
- }
-
return kTRUE;
}
AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
AliCDBManager::Instance()->GetAll("HLT/*/*");
+ AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
+ if (entry) {
+ fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
+ entry->SetOwner(0);
+ }
+ //
+ if (!fListOfCosmicTriggers) {
+ AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will rely on aliases if defined");
+ }
+
+
return kTRUE;
}
//_____________________________________________________________________________
// Set CDB lock: from now on it is forbidden to reset the run number
// or the default storage or to activate any further storage!
SetCDBLock();
-
+ //
+ ProcessTriggerAliases();
+ //
}
//_____________________________________________________________________________
oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
}
AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
+ fEventInfo.Print();
AliSysInfo::AddStamp(Form("StartReco_%d",iEvent), 0,0,iEvent);
-
// Set the reco-params
{
TString detStr = fLoadCDB;
AliInfo("======================= End Event ===================");
- fEventInfo.Reset();
+
for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
if (fReconstructor[iDet]) {
fReconstructor[iDet]->SetRecoParam(NULL);
// Fill the event info object
// ...
AliCodeTimerAuto("",0)
-
+
AliCentralTrigger *aCTP = NULL;
+ fEventInfo.Reset();
if (fRawReader) {
fEventInfo.SetEventType(fRawReader->GetType());
if (fRawReader) delete aCTP;
return kFALSE;
}
-
- // Load trigger aliases and declare the trigger classes included in aliases
- //PH Why do we do it in each event and not only once in the beginning of the chunk??
- //PH Temporary fix for #99725: AliReconstruction::GetEventInfo bug
- fDeclTriggerClasses.Clear();
- AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
- if (entry) {
- THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
- if (lst) {
- lst->Sort(kSortDescending); // to avoid problems with substrungs
- if (fRawReader) fRawReader->LoadTriggerAlias(lst);
- // Now declare all the triggers present in the aliases
- TIter iter(lst);
- TNamed *nmd = 0;
- while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
- fDeclTriggerClasses += " ";
- fDeclTriggerClasses += nmd->GetName();
- }
- }
- else {
- AliError("Cannot cast the object with trigger aliases to THashList!");
- }
- }
- else {
- AliError("No OCDB ebtry for the trigger aliases!");
- }
- // Load trigger classes for this run
UChar_t clustmask = 0;
TString trclasses;
ULong64_t trmask = fEventInfo.GetTriggerMask();
if (trclass && trclass->GetMask()>0) {
Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
if (fesd) fesd->SetTriggerClass(trclass->GetName(),trindex);
- if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
if (trmask & (1ull << trindex)) {
trclasses += " ";
trclasses += trclass->GetName();
trclasses += " ";
clustmask |= trclass->GetCluster()->GetClusterMask();
+ if (TriggerMatches2Alias(trclass->GetName(),fCosmicAlias)) fEventInfo.SetCosmicTrigger(kTRUE);
+ else if (TriggerMatches2Alias(trclass->GetName(),fLaserAlias)) fEventInfo.SetCalibLaserTrigger(kTRUE);
+ else fEventInfo.SetBeamTrigger(kTRUE);
}
}
if (trclass && trclass->GetMaskNext50()>0) {
Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMaskNext50()))+50;
if (fesd) fesd->SetTriggerClass(trclass->GetName(),trindex);
- if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
if (trmaskNext50 & (1ull << (trindex-50))) {
trclasses += " ";
trclasses += trclass->GetName();
trclasses += " ";
clustmask |= trclass->GetCluster()->GetClusterMask();
+ if (TriggerMatches2Alias(trclass->GetName(),fCosmicAlias)) fEventInfo.SetCosmicTrigger(kTRUE);
+ else if (TriggerMatches2Alias(trclass->GetName(),fLaserAlias)) fEventInfo.SetCalibLaserTrigger(kTRUE);
+ else fEventInfo.SetBeamTrigger(kTRUE);
}
}
}
fEventInfo.SetTriggerClasses(trclasses);
- // Now put the declared trigger classes (not present in the run)
- // to 0/false in the event selection
- if (!fDeclTriggerClasses.IsNull()) {
- TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
- Int_t ntokens = tokens->GetEntriesFast();
- for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
- if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
- }
- delete tokens;
- }
// Write names of active trigger inputs in ESD Header
const TObjArray& inputsArray = config->GetInputs();
// We have to fill also the HLT decision here!!
// ...
+ // check if event has cosmic or laser alias
+
return kTRUE;
}
//url.ToLower();
//
}
+
+//_________________________________________________________
+void AliReconstruction::ProcessTriggerAliases()
+{
+ // load trigger aliases, attach them to the reader
+ //
+ fDeclTriggerClasses.Clear();
+ AliCentralTrigger *aCTP = NULL;
+ if (fRawReader) {
+ aCTP = new AliCentralTrigger();
+ TString configstr("");
+ if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
+ AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
+ delete aCTP;
+ return;
+ }
+ }
+ else if (fRunLoader && (!fRunLoader->LoadTrigger())) {
+ aCTP = fRunLoader->GetTrigger();
+ }
+ else {
+ if (fStopOnMissingTriggerFile) AliFatal("No trigger can be loaded! Stopping reconstruction!");
+ AliWarning("No trigger can be loaded! The trigger information will not be used!");
+ return;
+ }
+ //
+ AliTriggerConfiguration *config = aCTP->GetConfiguration();
+ if (!config) {
+ AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
+ if (fRawReader) delete aCTP;
+ return;
+ }
+ //
+ // here we have list of active triggers
+ const TObjArray& classesArray = config->GetClasses();
+ Int_t nclasses = classesArray.GetEntriesFast();
+ //
+ fAlias2Trigger = new THashList();
+ //
+ AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
+ if (entry) {
+ THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
+ if (lst) {
+ lst->Sort(kSortDescending); // to avoid problems with substrungs
+ if (fRawReader) fRawReader->LoadTriggerAlias(lst);
+ // Now declare all the triggers present in the aliases
+ TIter iter(lst);
+ TNamed *nmd = 0;
+ while((nmd = dynamic_cast<TNamed*>(iter.Next()))) { // account aliases of this trigger >>
+ fDeclTriggerClasses += " ";
+ fDeclTriggerClasses += nmd->GetName();
+ //
+ if (!classesArray.FindObject(nmd->GetName())) continue;
+ TString aliasList(nmd->GetTitle());
+ TObjArray* arrAliases = aliasList.Tokenize(',');
+ Int_t nAliases = arrAliases->GetEntries();
+ // Loop on aliases for the current trigger
+ for(Int_t i=0; i<nAliases; i++){
+ TObjString *alias = (TObjString*) arrAliases->At(i);
+ // Find the current alias in the hash list. If it is not there, add TNamed entry
+ TNamed * inlist = (TNamed*)fAlias2Trigger->FindObject((alias->GetString()).Data());
+ if (!inlist) {
+ inlist = new TNamed((alias->GetString()).Data(),Form(" %s ",nmd->GetName()));
+ fAlias2Trigger->Add(inlist);
+ }
+ else {
+ TString tt(inlist->GetTitle());
+ tt += "||";
+ tt += Form(" %s ",nmd->GetName());
+ inlist->SetTitle(tt.Data());
+ }
+ }
+ delete arrAliases;
+ } // account aliases of this trigger <<
+ }
+ else AliError("Cannot cast the object with trigger aliases to THashList!");
+ }
+ else AliError("No OCDB ebtry for the trigger aliases!");
+ //
+ AliInfo("Aliases defined:");
+ fAlias2Trigger->Print();
+ //
+ if (fRawReader) {
+ // active classes mentioned in the alias will be converted to their masks
+ for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
+ AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
+ if (trclass && trclass->GetMask()>0) {
+ Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
+ fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
+ }
+ if (trclass && trclass->GetMaskNext50()>0) {
+ Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMaskNext50()))+50;
+ fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
+ }
+ }
+ //
+ // nullify all remaining triggers mentioned in the alias
+ if (!fDeclTriggerClasses.IsNull()) {
+ TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
+ Int_t ntokens = tokens->GetEntriesFast();
+ for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
+ fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
+ }
+ delete tokens;
+ }
+ }
+ //
+}
+
+//___________________________________________________
+Bool_t AliReconstruction::TriggerMatches2Alias(const char* trigName, const char* alias)
+{
+ // check if trigger matches to alias
+ TString trName = trigName;
+ if (!fAlias2Trigger) return kFALSE;
+ TNamed* al = (TNamed*)fAlias2Trigger->FindObject(alias);
+ if (!al) return kFALSE;
+ TString altrig = al->GetTitle();
+ return altrig.Contains(Form(" %s ",trigName));
+ //
+}