fMinNTrack(0),
fUseAliAnaUtils(kFALSE),
fRejectPileup(kFALSE),
+ fTklVsClusSPDCut(kFALSE),
fAliAnalysisUtils(0x0),
fOffTrigger(AliVEvent::kAny),
fTrigClass(),
fXsection(0),
fParticleCollArray(),
fClusterCollArray(),
- fMainTriggerPatch(0x0),
fTriggers(0),
fOutput(0),
fHistEventCount(0),
fMinNTrack(0),
fUseAliAnaUtils(kFALSE),
fRejectPileup(kFALSE),
+ fTklVsClusSPDCut(kFALSE),
fAliAnalysisUtils(0x0),
fOffTrigger(AliVEvent::kAny),
fTrigClass(),
fXsection(0),
fParticleCollArray(),
fClusterCollArray(),
- fMainTriggerPatch(0x0),
fTriggers(0),
fOutput(0),
fHistEventCount(0),
fHistEventRejection->GetXaxis()->SetBinLabel(10,"PileUp");
fHistEventRejection->GetXaxis()->SetBinLabel(11,"EvtPlane");
fHistEventRejection->GetXaxis()->SetBinLabel(12,"SelPtHardBin");
+ fHistEventRejection->GetXaxis()->SetBinLabel(13,"Bkg evt");
fHistEventRejection->GetYaxis()->SetTitle("counts");
fOutput->Add(fHistEventRejection);
{
// Main loop, called for each event.
- fMainTriggerPatch = NULL;
-
if (!fInitialized)
ExecOnce();
Int_t nG2 = 0;
Int_t nJ1 = 0;
Int_t nJ2 = 0;
+ Int_t nL0 = 0;
AliEmcalTriggerPatchInfo *patch;
for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
if (patch->IsGammaLow()) nG2++;
if (patch->IsJetHigh()) nJ1++;
if (patch->IsJetLow()) nJ2++;
+ if (patch->IsLevel0()) nL0++;
}
AliDebug(2, "Patch summary: ");
AliDebug(2, Form("Gamma: low[%d], high[%d]" ,nG2, nG1));
ULong_t triggers(0);
- if (nG1>0)
- SETBIT(triggers, kG1);
- if (nG2>0)
- SETBIT(triggers, kG2);
- if (nJ1>0)
- SETBIT(triggers, kJ1);
- if (nJ2>0)
- SETBIT(triggers, kJ2);
+ if (nL0>0) SETBIT(triggers, kL0);
+ if (nG1>0) SETBIT(triggers, kG1);
+ if (nG2>0) SETBIT(triggers, kG2);
+ if (nJ1>0) SETBIT(triggers, kJ1);
+ if (nJ2>0) SETBIT(triggers, kJ2);
return triggers;
}
//________________________________________________________________________
-Bool_t AliAnalysisTaskEmcal::HasTriggerType(TriggerType t)
+Bool_t AliAnalysisTaskEmcal::HasTriggerType(TriggerType trigger)
{
// Check if event has a given trigger type
- if(t == kND){
+ if(trigger & kND){
return fTriggers == 0;
}
- return TESTBIT(fTriggers, int(t));
+ return TESTBIT(fTriggers, trigger);
}
//________________________________________________________________________
return kFALSE;
}
- if (fRejectPileup &&fAliAnalysisUtils->IsPileUpEvent(InputEvent())) {
+ if (fRejectPileup && fAliAnalysisUtils->IsPileUpEvent(InputEvent())) {
if (fGeneralHistograms) fHistEventRejection->Fill("PileUp",1);
return kFALSE;
}
+
+ if(fTklVsClusSPDCut && fAliAnalysisUtils->IsSPDClusterVsTrackletBG(InputEvent())) {
+ if (fGeneralHistograms) fHistEventRejection->Fill("Bkg evt",1);
+ return kFALSE;
+ }
}
if ((fMinVz != -999) && (fMaxVz != -999)) {
}
//________________________________________________________________________
-AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch()
+AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch(TriggerCategory trigger, Bool_t doSimpleOffline)
{
- //get main trigger match; if not known yet, look for it and cache
-
- if (fMainTriggerPatch)
- return fMainTriggerPatch;
+ // Get main trigger match
+ //
+ // For the selection of the main trigger patch, high and low threshold triggers of a given category are grouped
+ // If there are more than 1 main patch of a given trigger category (i.e. different high and low threshold patches),
+ // the highest one according to the ADC value is taken. In case doSimpleOffline is true, then only the patches from
+ // the simple offline trigger are used.
if (!fTriggerPatchInfo) {
AliError(Form("%s: fTriggerPatchInfo not available",GetName()));
//number of patches in event
Int_t nPatch = fTriggerPatchInfo->GetEntries();
- //extract main trigger patch
- AliEmcalTriggerPatchInfo *patch;
+ //extract main trigger patch(es)
+ AliEmcalTriggerPatchInfo *patch(NULL), *selected(NULL);
for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
-
+
patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
if (patch->IsMainTrigger()) {
- fMainTriggerPatch = patch;
- break;
+ if(doSimpleOffline){
+ if(patch->IsOfflineSimple()){
+ switch(trigger){
+ case kTriggerLevel0:
+ // option not yet implemented in the trigger maker
+ if(patch->IsLevel0()) selected = patch;
+ break;
+ case kTriggerLevel1Jet:
+ if(patch->IsJetHighSimple() || patch->IsJetLowSimple()){
+ if(!selected) selected = patch;
+ else if(patch->GetADCOfflineAmp() > selected->GetADCOfflineAmp()) selected = patch;
+ }
+ break;
+ case kTriggerLevel1Gamma:
+ if(patch->IsGammaHighSimple() || patch->IsGammaLowSimple()){
+ if(!selected) selected = patch;
+ else if(patch->GetADCOfflineAmp() > selected->GetADCOfflineAmp()) selected = patch;
+ }
+ break;
+ default: // Silence compiler warnings
+ AliError("Untreated case: Main Patch is recalculated; should be in 'else' branch");
+ };
+ }
+ } else { // Not OfflineSimple
+ switch(trigger){
+ case kTriggerLevel0:
+ if(patch->IsLevel0()) selected = patch;
+ break;
+ case kTriggerLevel1Jet:
+ if(patch->IsJetHigh() || patch->IsJetLow()){
+ if(!selected) selected = patch;
+ else if (patch->GetADCAmp() > selected->GetADCAmp())
+ selected = patch;
+ }
+ break;
+ case kTriggerLevel1Gamma:
+ if(patch->IsGammaHigh() || patch->IsGammaLow()){
+ if(!selected) selected = patch;
+ else if (patch->GetADCAmp() > selected->GetADCAmp())
+ selected = patch;
+ }
+ break;
+ default:
+ AliError("Untreated case: Main Patch is recalculated; should be in 'else' branch");
+ };
+ }
+ }
+ else if ((trigger == kTriggerRecalcJet && patch->IsRecalcJet()) ||
+ (trigger == kTriggerRecalcGamma && patch->IsRecalcGamma())) { // recalculated patches
+ if (doSimpleOffline && patch->IsOfflineSimple()) {
+ if(!selected) selected = patch;
+ else if (patch->GetADCOfflineAmp() > selected->GetADCOfflineAmp()) // this in fact should not be needed, but we have it in teh other branches as well, so keeping it for compleness
+ selected = patch;
+ }
+ else if (!doSimpleOffline && !patch->IsOfflineSimple()) {
+ if(!selected) selected = patch;
+ else if (patch->GetADCAmp() > selected->GetADCAmp())
+ selected = patch;
+ }
}
}
-
- return fMainTriggerPatch;
+ return selected;
}
//________________________________________________________________________
axis->SetBinLabel(9, "MCFlag");
axis->SetBinLabel(10, "MCGenerator");
axis->SetBinLabel(11, "ChargeCut");
- axis->SetBinLabel(12, "Bit11");
- axis->SetBinLabel(13, "Bit12");
+ axis->SetBinLabel(12, "MinDistanceTPCSectorEdge");
+ axis->SetBinLabel(13, "MinMCLabelAccept");
axis->SetBinLabel(14, "IsEMCal");
axis->SetBinLabel(15, "Time");
axis->SetBinLabel(16, "Energy");