fGeneralHistograms(kFALSE),
fInitialized(kFALSE),
fCreateHisto(kTRUE),
- fMainTriggerPatchSet(kFALSE),
fCaloCellsName(),
fCaloTriggersName(),
fCaloTriggerPatchInfoName(),
fParticleCollArray.SetOwner(kTRUE);
fClusterCollArray.SetOwner(kTRUE);
- memset(fMainTriggerPatch, 0, sizeof(AliEmcalTriggerPatchInfo *) * kNType);
}
//________________________________________________________________________
fGeneralHistograms(kFALSE),
fInitialized(kFALSE),
fCreateHisto(histo),
- fMainTriggerPatchSet(kFALSE),
fCaloCellsName(),
fCaloTriggersName(),
fCaloTriggerPatchInfoName(),
fParticleCollArray.SetOwner(kTRUE);
fClusterCollArray.SetOwner(kTRUE);
- memset(fMainTriggerPatch, 0, sizeof(AliEmcalTriggerPatchInfo *) * kNType);
if (fCreateHisto) {
DefineOutput(1, TList::Class());
{
// Main loop, called for each event.
- memset(fMainTriggerPatch, 0, sizeof(AliEmcalTriggerPatchInfo *) * kNType);
-
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)
- triggers |= kG1;
- if (nG2>0)
- triggers |= kG2;
- if (nJ1>0)
- triggers |= kJ1;
- if (nJ2>0)
- 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(Int_t trigger)
+Bool_t AliAnalysisTaskEmcal::HasTriggerType(TriggerType trigger)
{
// Check if event has a given trigger type
if(trigger & kND){
return fTriggers == 0;
}
- return (fTriggers & trigger);
+ return TESTBIT(fTriggers, trigger);
}
//________________________________________________________________________
}
}
- if (!(fTriggerTypeSel & kND)) {
+ if (fTriggerTypeSel != kND) {
if (!HasTriggerType(fTriggerTypeSel)) {
if (fGeneralHistograms) fHistEventRejection->Fill("trigTypeSel",1);
return kFALSE;
}
fTriggers = GetTriggerList();
- fMainTriggerPatchSet = kFALSE;
- memset(fMainTriggerPatch, 0, sizeof(AliEmcalTriggerPatchInfo *) * (kNType - 1));
return kTRUE;
}
}
//________________________________________________________________________
-AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch(Int_t types)
+AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch(TriggerCategory trigger, Bool_t doSimpleOffline)
{
- //get main trigger match; if not known yet, look for it and cache
+ // Get main trigger match
//
- // In order to be able to select more than one class at the same time (i.e. low and
- // high threshold trigger), the argument must be a bit string, however using the enum
- // of trigger classes in order to define the selection
-
- // Get from cache (if already set)
- if(fMainTriggerPatchSet){
- return ApplyMainTriggerSelection(types);
- }
+ // 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()));
Int_t nPatch = fTriggerPatchInfo->GetEntries();
//extract main trigger patch(es)
- AliEmcalTriggerPatchInfo *patch;
+ AliEmcalTriggerPatchInfo *patch(NULL), *selected(NULL);
for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
if (patch->IsMainTrigger()) {
- if(patch->IsJetHigh()) fMainTriggerPatch[kPosJ1] = patch;
- if(patch->IsJetLow()) fMainTriggerPatch[kPosJ2] = patch;
- if(patch->IsGammaHigh()) fMainTriggerPatch[kPosG1] = patch;
- if(patch->IsGammaLow()) fMainTriggerPatch[kPosG2] = patch;
- if(patch->IsLevel0()) fMainTriggerPatch[kPosL0] = patch;
- }
- }
- fMainTriggerPatchSet = kTRUE;
-
- return ApplyMainTriggerSelection(types);
-}
-
-AliEmcalTriggerPatchInfo *AliAnalysisTaskEmcal::ApplyMainTriggerSelection(Int_t selectionBitmap) const {
- //
- // Select main trigger patch for a given combination of trigger classes
- // If the bitmap contains only one class, the selection is trivial
- // If the bitmap contains many classes, the selection takes the highest of the patchess according to the
- // ADC Amplitude
- //
- AliEmcalTriggerPatchInfo *highest(NULL);
- if(selectionBitmap & kJ1){
- highest = fMainTriggerPatch[kPosJ1];
- }
- if(selectionBitmap & kJ2){
- if(!highest) highest = fMainTriggerPatch[kPosJ2];
- else{
- if(fMainTriggerPatch[kPosJ2] && fMainTriggerPatch[kPosJ2]->GetADCAmp() > highest->GetADCAmp())
- highest = fMainTriggerPatch[kPosJ2];
- }
- }
-
- if(selectionBitmap & kG1){
- if(!highest) highest = fMainTriggerPatch[kPosG1];
- else{
- if(fMainTriggerPatch[kPosG1] && fMainTriggerPatch[kPosG1]->GetADCAmp() > highest->GetADCAmp())
- highest = fMainTriggerPatch[kPosG1];
- }
- }
-
- if(selectionBitmap & kG2){
- if(!highest) highest = fMainTriggerPatch[kPosG2];
- else{
- if(fMainTriggerPatch[kPosG2] && fMainTriggerPatch[kPosG2]->GetADCAmp() > highest->GetADCAmp())
- highest = fMainTriggerPatch[kPosG2];
- }
- }
- if(selectionBitmap & kL0){
- if(!highest) highest = fMainTriggerPatch[kPosL0];
- else{
- if(fMainTriggerPatch[kPosL0] && fMainTriggerPatch[kPosL0]->GetADCAmp() > highest->GetADCAmp())
- highest = fMainTriggerPatch[kPosL0];
+ 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: break;
+ if(patch->IsJetHighSimple() || patch->IsJetLowSimple()){
+ if(!selected) selected = patch;
+ else if(patch->GetADCAmp() > selected->GetADCAmp()) selected = patch;
+ }
+ break;
+ case kTriggerLevel1Gamma: break;
+ if(patch->IsGammaHigh() || patch->IsGammaLow()){
+ if(!selected) selected = patch;
+ else if(patch->GetADCAmp() > selected->GetADCAmp()) selected = patch;
+ }
+ break;
+ };
+ }
+ } else {
+ 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;
+ };
+ }
}
}
- return highest;
+ return selected;
}
//________________________________________________________________________
};
enum TriggerType {
- kND = BIT(31), //not defined := Sign bit of int
- kJ1 = BIT(0),
- kJ2 = BIT(1),
- kG1 = BIT(2),
- kG2 = BIT(3),
- kL0 = BIT(4)
+ kND = -1,
+ kJ1 = 0,
+ kJ2 = 1,
+ kG1 = 2,
+ kG2 = 3,
+ kL0 = 4
};
- enum MainTriggers{
- kPosJ1 = 0,
- kPosJ2 = 1,
- kPosG1 = 2,
- kPosG2 = 3,
- kPosL0 = 4,
- kNType = 5
+
+ enum TriggerCategory {
+ kTriggerLevel0 = 0,
+ kTriggerLevel1Jet = 1,
+ kTriggerLevel1Gamma=2
};
AliAnalysisTaskEmcal();
TClonesArray *GetClusterArray(Int_t i=0) const;
Int_t GetNParticles(Int_t i=0) const;
Int_t GetNClusters(Int_t i=0) const;
- AliEmcalTriggerPatchInfo *GetMainTriggerPatch(Int_t triggersel = kJ1 | kJ2);
- AliEmcalTriggerPatchInfo *ApplyMainTriggerSelection(Int_t selectionBitmap) const;
- Bool_t HasTriggerType(Int_t triggersel);
+ AliEmcalTriggerPatchInfo *GetMainTriggerPatch(TriggerCategory triggersel = kTriggerLevel1Jet, Bool_t doOfflinSimple = kFALSE);
+ Bool_t HasTriggerType(TriggerType triggersel);
ULong_t GetTriggerList();
Bool_t PythiaInfoFromFile(const char* currFile, Float_t &fXsec, Float_t &fTrials, Int_t &pthard);
void UserCreateOutputObjects();
Bool_t fGeneralHistograms; // whether or not it should fill some general histograms
Bool_t fInitialized; // whether or not the task has been already initialized
Bool_t fCreateHisto; // whether or not create histograms
- Bool_t fMainTriggerPatchSet; // Internal variable indicating whether the array of main trigger patches is initialised
TString fCaloCellsName; // name of calo cell collection
TString fCaloTriggersName; // name of calo triggers collection
TString fCaloTriggerPatchInfoName; // trigger patch info array name
AliAnalysisUtils *fAliAnalysisUtils; //! vertex selection (optional)
UInt_t fOffTrigger; // offline trigger for event selection
TString fTrigClass; // trigger class name for event selection
- Int_t fTriggerTypeSel; // trigger type to select based on trigger patches
+ TriggerType fTriggerTypeSel; // trigger type to select based on trigger patches
Int_t fNbins; // no. of pt bins
Double_t fMinBinPt; // min pt in histograms
Double_t fMaxBinPt; // max pt in histograms
Float_t fXsection; //!x-section from pythia header
TObjArray fParticleCollArray; // particle/track collection array
TObjArray fClusterCollArray; // cluster collection array
- AliEmcalTriggerPatchInfo *fMainTriggerPatch[kNType]; // main trigger patch, will be cached after calling GetMainTriggerPatch() first time
ULong_t fTriggers; // list of fired triggers
TList *fOutput; //!output list