Bool_t v0ABG = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kV0ABG));
Bool_t v0CBG = fSkipV0 ? 0 : triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kV0CBG));
Bool_t v0BG = v0ABG || v0CBG;
+ Bool_t t0 = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kT0 ));
+ Bool_t t0BG = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kT0BG ));
+ Bool_t t0PileUp = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kT0Pileup));
// fmd
// Bool_t fmdA = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kFMDA));
if (v0CBG)
fHistStatistics[iHistStat]->Fill(kStatV0CBG, i);
+ // T0 stats
+ if(t0)
+ fHistStatistics[iHistStat]->Fill(kStatT0BB, i);
+ if(t0BG)
+ fHistStatistics[iHistStat]->Fill(kStatT0BG, i);
+ if(t0PileUp)
+ fHistStatistics[iHistStat]->Fill(kStatT0PileUp, i);
+
// mb 1
if (mb1)
fHistStatistics[iHistStat]->Fill(kStatMB1, i);
#else
Int_t extrarows = fComputeBG != 0 ? 6 : 0;
#endif
- TH2F * h = new TH2F(Form("fHistStatistics%s",tag), Form("fHistStatistics - %s ;;",tag), kStatAcceptedPileUp, 0.5, kStatAcceptedPileUp+0.5, count+extrarows, -0.5, -0.5 + count+extrarows);
+ TH2F * h = new TH2F(Form("fHistStatistics%s",tag), Form("fHistStatistics - %s ;;",tag), kStatAccepted, 0.5, kStatAccepted+0.5, count+extrarows, -0.5, -0.5 + count+extrarows);
h->GetXaxis()->SetBinLabel(kStatTriggerClass, "Trigger class");
h->GetXaxis()->SetBinLabel(kStatHWTrig, "Hardware trigger");
h->GetXaxis()->SetBinLabel(kStatFO2L1, "FO (L1) >= 2");
h->GetXaxis()->SetBinLabel(kStatV0A, "V0A");
h->GetXaxis()->SetBinLabel(kStatV0C, "V0C");
+ h->GetXaxis()->SetBinLabel(kStatT0BB, "T0");
+ h->GetXaxis()->SetBinLabel(kStatT0BG, "T0BG");
+ h->GetXaxis()->SetBinLabel(kStatT0PileUp, "T0 PileUp");
h->GetXaxis()->SetBinLabel(kStatLaserCut, "TPC Laser Wup Cut");
h->GetXaxis()->SetBinLabel(kStatV0ABG, "V0A BG");
h->GetXaxis()->SetBinLabel(kStatV0CBG, "V0C BG");
h->GetXaxis()->SetBinLabel(kStatOffline, "Offline Trigger");
//h->GetXaxis()->SetBinLabel(kStatAny2Hits, "2 Hits & !V0 BG");
h->GetXaxis()->SetBinLabel(kStatBG, "Background identification");
- h->GetXaxis()->SetBinLabel(kStatAccepted, "Accepted");
h->GetXaxis()->SetBinLabel(kStatAcceptedPileUp, "Pile up (in accepted)");
+ h->GetXaxis()->SetBinLabel(kStatAccepted, "Accepted");
Int_t n = 1;
public:
public:
- enum {kStatTriggerClass=1,kStatHWTrig,kStatV0ABG,kStatV0CBG,kStatMB1,kStatMB1Prime,kStatLaserCut,kStatFO1,kStatFO2,kStatFO2L1,kStatV0A,kStatV0C,kStatZDCA,kStatZDCC,kStatZDCAC,kStatZDCTime,kStatV0,kStatOffline,kStatBG,kStatAccepted, kStatAcceptedPileUp};
+ enum {kStatTriggerClass=1,kStatHWTrig,kStatV0ABG,kStatV0CBG,kStatMB1,kStatMB1Prime,kStatLaserCut,kStatFO1,kStatFO2,kStatFO2L1,kStatV0A,kStatV0C, kStatT0BB, kStatT0BG, kStatT0PileUp, kStatZDCA,kStatZDCC,kStatZDCAC,kStatZDCTime,kStatV0,kStatOffline,kStatBG, kStatAcceptedPileUp, kStatAccepted};
#ifdef VERBOSE_STAT
enum {kStatRowAllB=0, kStatRowAllAC, kStatRowAllE, kStatRowBG,kStatRowAcc,kStatRowBGFrac,kStatRowAccFrac,kStatRowErrGoodFrac,kStatRowGoodFrac,kStatRowErrGood,kStatRowGood}; // offset wrt fBGStatOffset
fHistFMDC(0),
fHistFMDSingle(0),
fHistFMDSum(0),
+ fHistT0(0),
fTriggerClasses(0),
fMC(kFALSE),
fEsdTrackCuts(0),
fHistFMDSum = 0;
}
+ if (fHistT0)
+ {
+ delete fHistT0;
+ fHistT0 = 0;
+ }
+
if (fTriggerClasses)
{
fTriggerClasses->DeleteAll();
fHistFMDC = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
fHistFMDSingle = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
fHistFMDSum = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
+ fHistT0 = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
fTriggerClasses = new TMap;
fTriggerClasses->SetOwner();
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)
V0Trigger(aEsd, kASide, kFALSE, kTRUE);
V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
+ T0Trigger(aEsd, kFALSE, kTRUE);
ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
ZDCTimeTrigger(aEsd,kTRUE);
IsSPDClusterVsTrackletBG(aEsd, kTRUE);
TObject* obj;
// collections of all histograms
- const Int_t nHists = 13;
+ const Int_t nHists = 14;
TList collections[nHists];
Int_t count = 0;
collections[n++].Add(entry->fHistBitsSPD);
collections[n++].Add(entry->fHistFiredBitsSPD);
collections[n++].Add(entry->fHistSPDClsVsTrk);
+ collections[n++].Add(entry->fHistT0);
// merge fTriggerClasses
TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
fHistBitsSPD->Merge(&collections[n++]);
fHistFiredBitsSPD->Merge(&collections[n++]);
fHistSPDClsVsTrk->Merge(&collections[n++]);
+ fHistT0->Merge(&collections[n++]);
delete iter;
return count+1;
else Printf("Cannot save fHistFMDSum");
if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
+ if (fHistT0) fHistT0->Write("fHistT0");
+
// else Printf("Cannot save fSPDGFOEfficiency");
fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
}
+//----------------------------------------------------------------------------------------------------
+AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
+{
+ // Returns the T0 TVDC trigger decision
+ //
+ // argument 'online' is used as a switch between online and offline trigger algorithms
+ // in online mode return 0TVX
+ // in offline mode in addition check pile-up and background :
+ // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
+ // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
+ //
+ // Based on an algorithm by Alla Maevskaya
+
+ const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
+ if (!esdT0)
+ {
+ AliError("AliESDTZERO not available");
+ return kT0Invalid;
+ }
+ //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
+ Float_t tvdc[5] ;
+ for (Int_t ii=0; ii<5; ii++)
+ tvdc[ii] = esdT0->GetTVDC(ii);
+ Int_t trig=esdT0->GetT0Trig();
+ // cout<<" T0 trig "<<trig<<endl;
+
+ if(fillHists) fHistT0->Fill(tvdc[0]);
+
+ if (online) {
+ if(trig&1) return kT0BB;
+ }
+ else {
+
+ if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
+ if (esdT0->GetPileupFlag()) return kT0DecPileup;
+ if (esdT0->GetBackgroundFlag()) return kT0DecBG;
+ }
+
+ if (fMC)
+ if( esdT0->GetT0zVertex()>-10 && esdT0->GetT0zVertex() < 10) return kT0BB;
+
+ return kT0Empty;
+}
enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kSPDGFOBits, kV0A, kV0C, kV0OR, kV0AND,
kV0ABG, kV0CBG, kZDC, kZDCA, kZDCC, kFMDA, kFMDC, kFPANY, kNSD1, kMB1Prime,
kSPDGFOL0, kSPDGFOL1, kZDCTDCA, kZDCTDCC, kZDCTime, kCTPV0A, kCTPV0C, kTPCLaserWarmUp, kSPDClsVsTrkBG,
- kCentral,kSemiCentral,
+ kCentral,kSemiCentral, kT0, kT0BG, kT0Pileup,
kStartOfFlags = 0x0100, kOfflineFlag = 0x8000, kOneParticle = 0x10000, kOneTrack = 0x20000}; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
enum AliceSide { kASide = 1, kCSide, kCentralBarrel };
enum V0Decision { kV0Invalid = -1, kV0Empty = 0, kV0BB, kV0BG, kV0Fake };
+ enum T0Decision { kT0Invalid = -1, kT0Empty = 0, kT0BB, kT0DecBG, kT0DecPileup };
AliTriggerAnalysis();
virtual ~AliTriggerAnalysis();
// some "raw" trigger functions
Int_t SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists = kFALSE, Int_t layer = 0);
Bool_t SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin);
- Bool_t IsSPDClusterVsTrackletBG(const AliESDEvent* esd, Bool_t fillHists = kFALSE);
+ Bool_t IsSPDClusterVsTrackletBG(const AliESDEvent* esd, Bool_t fillHists = kFALSE);
V0Decision V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists = kFALSE);
+ T0Decision T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists = kFALSE);
Bool_t ZDCTrigger (const AliESDEvent* aEsd, AliceSide side) const;
Bool_t ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN=kTRUE, Bool_t useZP=kFALSE, Bool_t fillHists=kFALSE) const;
Bool_t ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists=kFALSE) const;
TH1F* fHistFMDC; // histograms that histogram the criterion the cut is applied on: number of hit combination above threshold
TH1F* fHistFMDSingle; // histograms that histogram the criterion the cut is applied on: single mult value (more than one entry per event)
TH1F* fHistFMDSum; // histograms that histogram the criterion the cut is applied on: summed mult value (more than one entry per event)
-
+ TH1F* fHistT0; // histograms that histogram the criterion the cut is applied on: bb triggers
TMap* fTriggerClasses; // counts the active trigger classes (uses the full string)
Bool_t fMC; // flag if MC is analyzed
Bool_t fTPCOnly; // flag to set whether TPC only tracks have to be used for the offline trigger
- ClassDef(AliTriggerAnalysis, 17)
+ ClassDef(AliTriggerAnalysis, 18)
private:
AliTriggerAnalysis(const AliTriggerAnalysis&);