#include <AliTriggerAnalysis.h>
#include <AliLog.h>
+#include <AliAnalysisManager.h>
#include <AliESDEvent.h>
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 kZDCTime : str = "ZDC Time Cut"; break;
case kCentral : str = "V0 Central"; break;
case kSemiCentral : str = "V0 Semi-central"; break;
+ case kEMCAL : str = "EMCAL"; 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)
}
break;
}
+ case kEMCAL:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (EMCALCellsTrigger(aEsd))
+ decision = kTRUE;
+ break;
+ }
default:
{
AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
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))
break;
}
- default:
+ case kEMCAL:
{
+ if (EMCALCellsTrigger(aEsd))
+ decision = kTRUE;
+ break;
+ }
+ default:
+ {
AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
}
}
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;
+
+ 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);
+ }
+ }
+ 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);
+ }
+ }
+
+ const Int_t runNumber = aEsd->GetRunNumber();
+ if(runNumber<188124 || runNumber>188374){
+ AliError(Form(" ZN BG time cut not implemented for run %d",runNumber));
+ return kFALSE;
+ }
+
+ Bool_t znabg = (zna && (TMath::Abs(tdcAcorr)>2.0));
+ Bool_t zncbg = (znc && (TMath::Abs(tdcCcorr)>5.0));
+
+ // 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(fillHists) fHistT0->Fill(tvdc[0]);
if (online) {
- if(trig&1) return kT0BB;
+ if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
}
else {
return kT0Empty;
}
+
+//----------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
+{
+ //
+ // Returns the EMCAL trigger decision
+ // so far only implemented for LHC11a data
+ // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
+ //
+
+ Bool_t isFired = kTRUE;
+ const Int_t runNumber = aEsd->GetRunNumber();
+
+ /*
+ // Load EMCAL branches from the manager
+ AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
+ am->LoadBranch("EMCALCells.");
+ am->LoadBranch("CaloClusters");
+ */
+
+ // Get EMCAL cells
+ AliVCaloCells *cells = aEsd->GetEMCALCells();
+ const Short_t nCells = cells->GetNumberOfCells();
+
+ // count cells above threshold per sm
+ Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
+ for(Int_t iCell=0; iCell<nCells; ++iCell) {
+ Short_t cellId = cells->GetCellNumber(iCell);
+ Double_t cellE = cells->GetCellAmplitude(cellId);
+ Int_t sm = cellId / (24*48);
+ if (cellE>0.1)
+ ++nCellCount[sm];
+ }
+
+ // Trigger decision for LHC11a
+ Bool_t isLedEvent = kFALSE;
+ if ((runNumber>=144871) && (runNumber<=146860)) {
+ if (nCellCount[4] > 100)
+ isLedEvent = kTRUE;
+ else {
+ if ((runNumber>=146858) && (runNumber<=146860)) {
+ if (nCellCount[3]>=35)
+ isLedEvent = kTRUE;
+ }
+ }
+ }
+
+ if (isLedEvent) {
+ isFired = kFALSE;
+ }
+
+ return isFired;
+}