+
+Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger)
+{
+ // evaluates a given trigger "offline"
+ // trigger combinations are not supported, for that see IsOfflineTriggerFired
+
+ UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
+ Bool_t offline = kFALSE;
+ if (trigger & kOfflineFlag)
+ offline = kTRUE;
+
+ Int_t decision = 0;
+ switch (triggerNoFlags)
+ {
+ case kSPDGFO:
+ {
+ decision = SPDFiredChips(aEsd, (offline) ? 0 : 1);
+ break;
+ }
+ case kSPDGFOL0:
+ {
+ decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 1);
+ break;
+ }
+ case kSPDGFOL1:
+ {
+ decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 2);
+ break;
+ }
+ case kSPDClsVsTrkBG:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ decision = IsSPDClusterVsTrackletBG(aEsd);
+ break;
+ }
+ case kV0A:
+ {
+ if (V0Trigger(aEsd, kASide, !offline) == kV0BB)
+ decision = 1;
+ break;
+ }
+ case kV0C:
+ {
+ if (V0Trigger(aEsd, kCSide, !offline) == kV0BB)
+ decision = 1;
+ break;
+ }
+ case kV0ABG:
+ {
+ if (V0Trigger(aEsd, kASide, !offline) == kV0BG)
+ decision = 1;
+ break;
+ }
+ case kV0CBG:
+ {
+ if (V0Trigger(aEsd, kCSide, !offline) == kV0BG)
+ decision = 1;
+ break;
+ }
+ case kT0:
+ {
+ if (T0Trigger(aEsd, !offline) == kT0BB)
+ decision = 1;
+ break;
+ }
+ case kT0BG:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (T0Trigger(aEsd, !offline) == kT0DecBG)
+ decision = 1;
+ break;
+ }
+ case kT0Pileup:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (T0Trigger(aEsd, !offline) == kT0DecPileup)
+ decision = 1;
+ break;
+ }
+ case kZDCA:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTrigger(aEsd, kASide))
+ decision = 1;
+ break;
+ }
+ case kZDCC:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTrigger(aEsd, kCSide))
+ decision = 1;
+ break;
+ }
+ case kZDCTDCA:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTDCTrigger(aEsd, kASide))
+ decision = 1;
+ break;
+ }
+ case kZDCTDCC:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTDCTrigger(aEsd, kCSide))
+ decision = 1;
+ break;
+ }
+ case kZDCTime:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTimeTrigger(aEsd))
+ decision = 1;
+ break;
+ }
+ case kZNA:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
+ decision = 1;
+ break;
+ }
+ case kZNC:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
+ decision = 1;
+ break;
+ }
+ case kZNABG:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTimeBGTrigger(aEsd,kASide))
+ decision = 1;
+ break;
+ }
+ case kZNCBG:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (ZDCTimeBGTrigger(aEsd,kCSide))
+ decision = 1;
+ break;
+ }
+ case kFMDA:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (FMDTrigger(aEsd, kASide))
+ decision = 1;
+ break;
+ }
+ case kFMDC:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (FMDTrigger(aEsd, kCSide))
+ decision = 1;
+ break;
+ }
+ case kCTPV0A:
+ {
+ if (offline)
+ AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
+ if (IsL0InputFired(aEsd, 2))
+ decision = 1;
+ break;
+ }
+ case kCTPV0C:
+ {
+ if (offline)
+ AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
+ if (IsL0InputFired(aEsd, 3))
+ decision = 1;
+ break;
+ }
+ case kTPCLaserWarmUp:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ return IsLaserWarmUpTPCEvent(aEsd);
+ }
+ case kTPCHVdip:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ return IsHVdipTPCEvent(aEsd);
+ }
+ case kIncompleteEvent:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ return IsIncompleteEvent(aEsd);
+ }
+ case kCentral:
+ {
+ if (offline)
+ AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
+ if (aEsd->GetVZEROData()) {
+ if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
+ if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2))
+ decision = kTRUE;
+ }
+ else
+ AliWarning("V0 centrality trigger bits were not filled!");
+ }
+ break;
+ }
+ case kSemiCentral:
+ {
+ if (offline)
+ AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
+ if (aEsd->GetVZEROData()) {
+ if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
+ if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA1andCTC1))
+ decision = kTRUE;
+ }
+ else
+ AliWarning("V0 centrality trigger bits were not filled!");
+ }
+ break;
+ }
+ case kEMCAL:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (EMCALCellsTrigger(aEsd))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHCO:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if(TRDTrigger(aEsd,kTRDHCO))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHJT:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if(TRDTrigger(aEsd,kTRDHJT))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHSE:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if(TRDTrigger(aEsd,kTRDHSE))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHQU:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if(TRDTrigger(aEsd,kTRDHQU))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHEE:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if(TRDTrigger(aEsd,kTRDHEE))
+ decision = kTRUE;
+ break;
+ }
+ default:
+ {
+ AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
+ }
+ }
+
+ return decision;
+}
+
+Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd)
+{
+ //
+ // This function flags noisy TPC events which can happen during laser warm-up.
+ //
+
+ Int_t trackCounter = 0;
+ for (Int_t i=0; i<esd->GetNumberOfTracks(); ++i)
+ {
+ AliESDtrack *track = esd->GetTrack(i);
+ if (!track)
+ continue;
+
+ if (track->GetTPCNcls() < 30) continue;
+ if (TMath::Abs(track->Eta()) > 0.005) continue;
+ if (track->Pt() < 4) continue;
+ if (track->GetKinkIndex(0) > 0) continue;
+
+ UInt_t status = track->GetStatus();
+ if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
+ if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
+
+ if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
+
+ trackCounter++;
+ }
+ if (trackCounter > 15)
+ return kTRUE;
+ return kFALSE;
+}
+
+Bool_t AliTriggerAnalysis::IsHVdipTPCEvent(const AliESDEvent* esd) {
+ //
+ // This function flags events in which the TPC chamber HV is not at its nominal value
+ //
+ if (fMC) return kFALSE; // there are no dip events in MC
+ if (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
+ return kFALSE;
+
+}
+
+Bool_t AliTriggerAnalysis::IsIncompleteEvent(const AliESDEvent* esd)
+{
+ //
+ // Check whether the event is incomplete
+ // (due to DAQ-HLT issues, it could be only part of the event was saved)
+ //
+ if (fMC) return kFALSE; // there are no incomplete events on MC
+ if ((esd->GetEventType() == 7) &&
+ (esd->GetDAQDetectorPattern() & (1<<4)) &&
+ !(esd->GetDAQAttributes() & (1<<7))) return kTRUE;
+
+ return kFALSE;
+}
+