#include <AliESDFMD.h>
#include <AliESDVertex.h>
#include <AliESDtrackCuts.h>
+#include <AliDAQ.h>
+#include <AliESDTrdTrack.h>
ClassImp(AliTriggerAnalysis)
fZDCCutRefDeltaCorr(-2.1),
fZDCCutSigmaSumCorr(6.0),
fZDCCutSigmaDeltaCorr(1.2),
+ fZDCCutZNATimeCorrMin(0.0),
+ fZDCCutZNATimeCorrMax(2.0),
+ fZDCCutZNCTimeCorrMin(0.0),
+ fZDCCutZNCTimeCorrMax(5.0),
fASPDCvsTCut(65),
fBSPDCvsTCut(4),
+ fTRDptHSE(3.),
+ fTRDpidHSE(144),
+ fTRDptHQU(2.),
+ fTRDpidHQU(164.),
+ fTRDptHEE(3.),
+ fTRDpidHEE(144),
+ fTRDminSectorHEE(6),
+ fTRDmaxSectorHEE(8),
+ fTRDptHJT(3.),
+ fTRDnHJT(3),
fDoFMD(kTRUE),
fFMDLowCut(0.2),
fFMDHitCut(0.5),
}
}
-void AliTriggerAnalysis::EnableHistograms()
+void AliTriggerAnalysis::EnableHistograms(Bool_t isLowFlux)
{
- // creates the monitoring histograms
+ // creates the monitoring histograms (dynamical range of histograms can be adapted for pp and pPb via isLowFlux flag)
// do not add this hists to the directory
Bool_t oldStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE);
-
- fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", 1202, -1.5, 1200.5, 1202, -1.5, 1200.5);
+ //
+ Int_t nBins = isLowFlux ? 600 : 1202;
+ fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", nBins, -1.5, -1.5 + nBins, nBins, -1.5, -1.5+nBins);
+ //
fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
- fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", 300, -0.5, 2999.5, 1000, -0.5, 9999.5);
+ //
+ Int_t nBinsX = isLowFlux ? 100 : 300;
+ Int_t nBinsY = isLowFlux ? 500 : 1000;
+ Float_t xMax = isLowFlux ? 400 : 2999.5;
+ Float_t yMax = isLowFlux ? 4000 : 9999.5;
+ fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", nBinsX, -0.5, xMax, nBinsY, -0.5, yMax);
+ //
fHistV0A = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
fHistV0C = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
case kZDC : str = "ZDC"; break;
case kZDCA : str = "ZDC A"; break;
case kZDCC : str = "ZDC C"; break;
+ case kZNA : str = "ZN A"; break;
+ case kZNC : str = "ZN C"; break;
+ case kZNABG : str = "ZN A BG"; break;
+ case kZNCBG : str = "ZN C BG"; break;
case kFMDA : str = "FMD A"; break;
case kFMDC : str = "FMD C"; break;
case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
case kCentral : str = "V0 Central"; break;
case kSemiCentral : str = "V0 Semi-central"; break;
case kEMCAL : str = "EMCAL"; break;
+ case kTRDHCO : str = "TRD cosmics"; break;
+ case kTRDHJT : str = "TRD Jet"; break;
+ case kTRDHSE : str = "TRD Single Electron"; break;
+ case kTRDHQU : str = "TRD Quarkonia"; break;
+ case kTRDHEE : str = "TRD Dielectron"; break;
default: str = ""; break;
}
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));
return IsLaserWarmUpTPCEvent(aEsd);
}
+ case kTPCHVdip:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ return IsHVdipTPCEvent(aEsd);
+ }
case kCentral:
{
if (offline)
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 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 (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
+ return kFALSE;
+
+}
+
+
Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
{
// checks if an event has been triggered "offline"
decision = kTRUE;
break;
}
+ case kZNA:
+ {
+ if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
+ decision = kTRUE;
+ break;
+ }
+ case kZNC:
+ {
+ if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
+ decision = kTRUE;
+ break;
+ }
+ case kZNABG:
+ {
+ if (ZDCTimeBGTrigger(aEsd,kASide))
+ decision = kTRUE;
+ break;
+ }
+ case kZNCBG:
+ {
+ if (ZDCTimeBGTrigger(aEsd,kCSide))
+ decision = kTRUE;
+ break;
+ }
case kFMDA:
{
if (FMDTrigger(aEsd, kASide))
if (EMCALCellsTrigger(aEsd))
decision = kTRUE;
break;
+ }
+ case kTRDHCO:
+ {
+ if(TRDTrigger(aEsd,kTRDHCO))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHJT:
+ {
+ if(TRDTrigger(aEsd,kTRDHJT))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHSE:
+ {
+ if(TRDTrigger(aEsd,kTRDHSE))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHQU:
+ {
+ if(TRDTrigger(aEsd,kTRDHQU))
+ decision = kTRUE;
+ break;
+ }
+ case kTRDHEE:
+ {
+ if(TRDTrigger(aEsd,kTRDHEE))
+ decision = kTRUE;
+ break;
}
default:
{
return zdcAccept;
}
+Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
+{
+ // This method implements a selection
+ // based on the timing in of zdcN
+ // It can be used in order to flag background
+ // ** So far only implemented for the 2012 pA run **
+
+ if(fMC) return kFALSE;
+
+ AliESDZDC *zdcData = aEsd->GetESDZDC();
+ Bool_t zna = kFALSE;
+ Bool_t znc = kFALSE;
+ Bool_t znabadhit = kFALSE;
+ Bool_t zncbadhit = kFALSE;
+
+ Float_t tdcC=999, tdcCcorr=999, tdcA=999, tdcAcorr=999;
+ for(Int_t i = 0; i < 4; ++i) {
+ if (zdcData->GetZDCTDCData(10,i) != 0) {
+ znc = kTRUE;
+ tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
+ tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
+ if((TMath::Abs(tdcCcorr)<fZDCCutZNCTimeCorrMax) && (TMath::Abs(tdcCcorr)>fZDCCutZNCTimeCorrMin)) zncbadhit = kTRUE;
+ }
+ }
+ for(Int_t j = 0; j < 4; ++j) {
+ if (zdcData->GetZDCTDCData(12,j) != 0) {
+ zna = kTRUE;
+ tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
+ tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
+ if((TMath::Abs(tdcAcorr)<fZDCCutZNATimeCorrMax) && (TMath::Abs(tdcAcorr)>fZDCCutZNATimeCorrMin)) znabadhit = kTRUE;
+ }
+ }
+
+ const Int_t runNumber = aEsd->GetRunNumber();
+ if(runNumber<188124 || (runNumber>188374 && runNumber<194713)){ // FIXME: end of pA-run is not known
+ AliDebug(3,Form(" ZN BG time cut not implemented for run %d",runNumber));
+ return kFALSE;
+ }
+
+ Bool_t znabg = (zna && znabadhit);
+ Bool_t zncbg = (znc && zncbadhit);
+
+ // Printf("Checking ZN background (time) for run %d, A = %d, time=%2.2f, C = %d, time=%2.2f",runNumber,(Int_t)zna,tdcAcorr,(Int_t)znc,tdcCcorr);
+ // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
+
+ if (side == kASide) return znabg;
+ if (side == kCSide) return zncbg;
+ return kFALSE;
+}
+
Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
{
// Returns if ZDC triggered
if (fHistBitsSPD) {
fHistBitsSPD->Write();
- fHistBitsSPD->ProjectionX();
- fHistBitsSPD->ProjectionY();
+ //fHistBitsSPD->ProjectionX();
+ //fHistBitsSPD->ProjectionY();
}
else Printf("Cannot save fHistBitsSPD");
if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
Float_t tvdc[5] ;
for (Int_t ii=0; ii<5; ii++)
tvdc[ii] = esdT0->GetTVDC(ii);
- Int_t trig=esdT0->GetT0Trig();
+ // Int_t trig=esdT0->GetT0Trig();
// cout<<" T0 trig "<<trig<<endl;
if(fillHists) fHistT0->Fill(tvdc[0]);
if (online) {
- if(trig&1) return kT0BB;
+ if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
}
else {
return isFired;
}
+
+//__________________________________________________________________________________________
+Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger)
+{
+ // evaluate the TRD trigger conditions,
+ // so far HCO, HSE, HQU, HJT, HEE
+
+ Bool_t isFired = kFALSE;
+
+ if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
+ AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
+ return isFired;
+ }
+
+ if (!esd) {
+ AliErrorClass("ESD event pointer is null");
+ return isFired;
+ }
+
+ Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
+
+ if (nTrdTracks > 0 && (trigger==kTRDHCO) ) {
+ isFired = kTRUE;
+ return isFired;
+ }
+
+ if(trigger!=kTRDHJT) {
+ for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
+
+ AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
+ if (!trdTrack) continue;
+
+ // for the electron triggers we only consider matched tracks
+ if(trigger==kTRDHQU)
+ if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHQU) && (trdTrack->GetPID() > fTRDpidHQU) ) {
+ isFired = kTRUE;
+ return isFired;
+ }
+
+ if(trigger==kTRDHSE)
+ if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
+ isFired = kTRUE;
+ return isFired;
+ }
+
+ if(trigger==kTRDHEE)
+ if ( (trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
+ (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) {
+ isFired = kTRUE;
+ return isFired;
+ }
+
+ }
+ } else if(trigger==kTRDHJT) {
+
+ Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
+
+ for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
+
+ AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
+ if (!trdTrack) continue;
+
+ Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
+
+ // stack-wise counting of tracks above pt threshold for jet trigger
+ if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) {
+ ++nTracks[globalStack];
+ }
+ }
+
+ // check if HJT condition is fulfilled in any stack
+ for (Int_t iStack = 0; iStack < 90; iStack++) {
+ if (nTracks[iStack] >= fTRDnHJT) {
+ isFired = kTRUE;
+ break;
+ }
+ }
+
+ }
+
+ return isFired;
+}