15 #include <TClonesArray.h>
17 #include <THashList.h>
19 #include <TObjArray.h>
20 #include <TParameter.h>
21 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,8,0)
22 #include <ROOT/TSeq.hxx>
25 #include "AliCDBEntry.h"
26 #include "AliCDBManager.h"
27 #include "AliEMCALGeometry.h"
28 #include "AliEMCALTriggerBitConfig.h"
29 #include "AliEMCALTriggerDCSConfig.h"
30 #include "AliEMCALTriggerTRUDCSConfig.h"
34 #include "AliEMCALTriggerMapping.h"
36 #include "AliOADBContainer.h"
53 fCaloTriggersOutName("EmcalTriggers"),
54 fV0InName("AliAODVZERO"),
55 fBadFEEChannelOADB(""),
56 fMaskedFastorOADB(""),
57 fUseL0Amplitudes(kFALSE),
58 fLoadFastORMaskingFromOCDB(kFALSE),
70 fCaloTriggersOutName(
"EmcalTriggers"),
71 fV0InName(
"AliAODVZERO"),
72 fBadFEEChannelOADB(
""),
73 fMaskedFastorOADB(
""),
74 fUseL0Amplitudes(kFALSE),
75 fLoadFastORMaskingFromOCDB(kFALSE),
76 fCaloTriggersOut(NULL),
92 const std::array<const TString, 3> kTriggerTypeNames = {
"EJE",
"EGA",
"EL0"},
93 kPatchTypes = {
"Online",
"Offline",
"Recalc"};
95 if(
fDoQA) AliInfoStream() <<
"Trigger maker - QA requested" << std::endl;
96 else AliInfoStream() <<
"Trigger maker - no QA requested" << std::endl;
97 if(!
fOutput) AliErrorStream() <<
"No output container initialized" << std::endl;
101 AliInfoStream() <<
"Enabling QA for trigger maker" << std::endl;
104 for(
const auto &triggertype : kTriggerTypeNames){
105 for(
const auto &patchtype : kPatchTypes){
107 "RCPos" + triggertype + patchtype,
108 "Lower edge position of " + patchtype +
" " + triggertype +
" patches (col-row);iEta;iPhi",
109 48, -0.5, 47.5, 104, -0.5, 103.5
112 "EPCentPos" + triggertype + patchtype,
113 "Center position of the " + patchtype +
" " + triggertype +
" trigger patches;#eta;#phi",
114 20, -0.8, 0.8, 700, 0., 7.
117 "PatchADCvsE" + triggertype + patchtype,
118 "Patch ADC value for trigger type " + patchtype +
" " + triggertype +
"; Trigger ADC; FEE patch energy (GeV)",
119 2000, 0., 2000, 200, 0., 200
122 "PatchEvsEsmear" + triggertype + patchtype,
123 "Patch energy vs. smeared energy for " + patchtype +
" " + triggertype +
"; FEE patch energy (GeV); smeared FEE energy (GeV)",
124 200, 0., 200, 200, 0., 200
127 "PatchADCvsEsmear" + triggertype + patchtype,
128 "Patch ADC vs. smeared energy for " + patchtype +
" " + triggertype +
"; Trigger ADC; smeared FEE energy (GeV)",
129 2000, 0., 2000, 200, 0., 200
132 "PatchADCOffvsE" + triggertype + patchtype,
133 "Patch offline ADC value for trigger type " + patchtype +
" " + triggertype +
"; Trigger ADC; FEE patch energy (GeV)",
134 2000, 0., 2000, 200, 0., 200
137 "PatchEvsADCrough" + triggertype + patchtype,
138 "Patch Energy vs. ADC rough for trigger type " + patchtype +
" " + triggertype +
"; FEE patch energy (GeV); ADC rough (GeV)",
139 2000, 0., 2000, 200, 0., 200
143 fQAHistos->
CreateTH1(
"triggerBitsAll",
"Trigger bits for all incoming patches;bit nr", 64, -0.5, 63.5);
144 fQAHistos->
CreateTH1(
"triggerBitsSel",
"Trigger bits for reconstructed patches;bit nr", 64, -0.5, 63.5);
145 fQAHistos->
CreateTH2(
"FastORMaskOnline",
"Masked FastORs at online level; col; row", 48, -0.5, 47.5, 104, -0.5, 103.5);
148 fQAHistos->
CreateTH2(
"FastORCorrEnergyADCrough",
"FastOR cell energy vs. ADC energy", 200, 0., 20., 200, 0., 20.);
149 fQAHistos->
CreateTH2(
"FastORCorrEnergyESmear",
"FastOR cell energy vs. smeared energy", 200, 0., 20., 200, 0., 20.);
150 fQAHistos->
CreateTH2(
"FastORCorrADCroughEsmear",
"FastOR ADC rough vs. smeared energy", 200, 0., 20., 200, 0., 20.);
151 fQAHistos->
CreateTH2(
"FastORDiffEnergyADCrough",
"FastOR ADCrough - cell energy", 4994, -0.5, 4993.5, 200, -10., 10);
152 fQAHistos->
CreateTH2(
"FastORDiffEnergyEsmear",
"FastOR smeared energy - cell energy", 4994, -0.5, 4993.5, 200, -10., 10);
153 fQAHistos->
CreateTH2(
"FastORDiffEsmearADCrough",
"FastOR ADC rough - smeared energy", 4994, -0.5, 4993.5, 200, -10., 10);
158 AliWarningStream() <<
"QA requested but no output container initialized - QA needs to be disabled" << std::endl;
166 AliEMCALTriggerBitConfig *triggerBitConfig(NULL);
169 triggerBitConfig =
new AliEMCALTriggerBitConfigNew();
172 triggerBitConfig =
new AliEMCALTriggerBitConfigOld();
192 AliFatal(Form(
"%s: Container with same name %s already present. Aborting", GetName(),
fCaloTriggersOutName.Data()));
198 fV0 = (AliVVZERO*)InputEvent()->FindListObject(
fV0InName);
203 AliInfoStream() <<
"Trigger maker not yet configure - automatically configuring ..." << std::endl;
204 int runnumber = InputEvent()->GetRunNumber();
205 std::string dataset =
"";
206 if(runnumber >= 145144 && runnumber <= 165746){
209 }
else if(runnumber >= 167806 && runnumber <= 170593){
211 dataset =
"Pb-Pb 2011";
212 }
else if(runnumber >= 176326 && runnumber <= 193766){
215 }
else if(runnumber >= 195344 && runnumber <= 197692){
218 dataset =
"p-Pb 2013";
219 }
else if((runnumber >= 224891 && runnumber <= 244628) || runnumber >= 253434){
222 dataset =
"pp 2015-2016";
223 }
else if(runnumber >= 244824 && runnumber <= 246994){
225 dataset =
"Pb-Pb 2015";
229 AliInfoStream() <<
"Applying configuration for " << dataset << std::endl;
231 AliErrorStream() <<
"No valid configuration found for the given dataset - trigger maker disabled" << std::endl;
257 double ecell, eadc, esmear;
259 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,8,0)
261 for(
auto icol : ROOT::TSeqI(0, 48)){
265 for(
int icol = 0; icol < 48; icol++){
271 fGeom->GetTriggerMapping()->GetAbsFastORIndexFromPositionInEMCAL(icol, irow, fastORAbsID);
273 if(TMath::Abs(ecell) > DBL_EPSILON || TMath::Abs(eadc) > DBL_EPSILON){
277 if(TMath::Abs(ecell) > DBL_EPSILON || TMath::Abs(esmear) > DBL_EPSILON){
281 if(TMath::Abs(eadc) > DBL_EPSILON || TMath::Abs(esmear) > DBL_EPSILON){
291 Int_t patchcounter = 0;
293 AliDebugStream(2) << GetName() <<
": Found " << patches->GetEntries() <<
" patches" << std::endl;
294 for(TIter patchIter = TIter(patches).Begin(); patchIter != TIter::End(); ++patchIter){
297 AliDebugStream(3) << GetName() <<
": Next patch: size " << recpatch->GetPatchSize() <<
" , trigger bits " << std::bitset<sizeof(Int_t)*8>(recpatch->GetTriggerBits()) << std::endl;
299 if(recpatch->IsJetHigh() || recpatch->IsJetLow())
FillQAHistos(
"EJEOnline", *recpatch);
300 if(recpatch->IsGammaHigh() || recpatch->IsGammaLow())
FillQAHistos(
"EGAOnline", *recpatch);
301 if(recpatch->IsJetHighSimple() || recpatch->IsJetLowSimple())
FillQAHistos(
"EJEOffline", *recpatch);
302 if(recpatch->IsGammaHighSimple() || recpatch->IsGammaLowSimple())
FillQAHistos(
"EGAOffline", *recpatch);
303 if(recpatch->IsLevel0())
FillQAHistos(
"EL0Online", *recpatch);
304 if(recpatch->IsRecalcJet())
FillQAHistos(
"EJERecalc", *recpatch);
305 if(recpatch->IsRecalcGamma())
FillQAHistos(
"EGARecalc", *recpatch);
307 int tBits = recpatch->GetTriggerBits();
308 for(
unsigned int ibit = 0; ibit <
sizeof(tBits)*8; ibit++) {
309 if(tBits & (1 << ibit)){
316 if(patches)
delete patches;
328 Int_t globCol(-1), globRow(-1) ;
330 fGeom->GetTriggerMapping()->GetPositionInEMCALFromAbsFastORIndex(ifastOrID, globCol, globRow);
337 AliInfoStream() <<
"Loading additional bad FEE channels from OADB container " <<
fBadFEEChannelOADB << std::endl;
340 AliOADBContainer badchannelDB(
"EmcalBadChannelsAdditional");
343 if(!badchannelmap || !badchannelmap->GetEntries())
return;
344 for(TIter citer = TIter(badchannelmap).Begin(); citer != TIter::End(); ++citer){
351 AliInfoStream() <<
"Loading masked fastors from OCDB" << std::endl;
352 AliCDBManager *cdb = AliCDBManager::Instance();
354 AliCDBEntry *en = cdb->Get(
"EMCAL/Calib/Trigger");
356 AliErrorStream() << GetName() <<
": FastOR masking from CDB required, but OCDB entry is not available. No masking will be applied." << std::endl;
360 AliEMCALTriggerDCSConfig *trgconf =
dynamic_cast<AliEMCALTriggerDCSConfig *
>(en->GetObject());
362 AliErrorStream() << GetName() <<
": Failed decoding OCDB entry: Object is not of type AliEMCALTriggerDCSConfig." << std::endl;
370 Int_t fastOrAbsID(-1), ic(-1);
371 for(
int itru = 0; itru < trgconf->GetTRUArr()->GetEntries(); itru++){
372 AliEMCALTriggerTRUDCSConfig *truconf = trgconf->GetTRUDCSConfig(itru);
381 for(
unsigned int ifield = 0; ifield < 6; ifield++){
382 for(
unsigned int ibit = 0; ibit < 16; ibit ++){
383 if((truconf->GetMaskReg(ifield) >> ibit) & 0x1){
385 fGeom->GetTriggerMapping()->GetAbsFastORIndexFromTRU(itru, (ic =
GetMaskHandler()(ifield, ibit)), fastOrAbsID);
386 AliDebugStream(1) << GetName() <<
"Channel " << ic <<
" in TRU " << itru <<
" ( abs fastor " << fastOrAbsID <<
") masked." << std::endl;
389 AliErrorStream() << GetName() <<
"Invalid mask: (" << ifield <<
"|" << ibit <<
"), exception " << exept <<
" thrown. Mask will not be recognized" << std::endl;
398 AliInfoStream() <<
"Initializing masked fastors from OADB container " <<
fMaskedFastorOADB.Data() << std::endl;
400 AliOADBContainer badchannelDB(
"AliEmcalMaskedFastors");
403 if(!badchannelmap || !badchannelmap->GetEntries())
return;
404 for(TIter citer = TIter(badchannelmap).Begin(); citer != TIter::End(); ++citer){
406 AliDebugStream(1) << GetName() <<
": Found masked fastor channel " << channelID->GetVal() << std::endl;
413 if(
fGeom->GetTriggerMappingVersion() == 2){
415 return [] (
unsigned int ifield,
unsigned int ibit) ->
int {
417 const int kChannelMap[6][16] = {{ 8, 9,10,11,20,21,22,23,32,33,34,35,44,45,46,47},
418 {56,57,58,59,68,69,70,71,80,81,82,83,92,93,94,95},
419 { 4, 5, 6, 7,16,17,18,19,28,29,30,31,40,41,42,43},
420 {52,53,54,55,64,65,66,67,76,77,78,79,88,89,90,91},
421 { 0, 1, 2, 3,12,13,14,15,24,25,26,27,36,37,38,39},
422 {48,49,50,51,60,61,62,63,72,73,74,75,84,85,86,87}};
423 return kChannelMap[ifield][ibit];
427 return [] (
int ifield,
int ibit) ->
int {
429 return ifield * 16 + ibit;
435 fQAHistos->
FillTH2(
"RCPos" + patchtype, recpatch.GetColStart(), recpatch.GetRowStart());
436 fQAHistos->
FillTH2(
"EPCentPos" + patchtype, recpatch.GetEtaGeo(), recpatch.GetPhiGeo());
437 fQAHistos->
FillTH2(
"PatchADCvsE" + patchtype, recpatch.GetADCAmp(), recpatch.GetPatchE());
440 fQAHistos->
FillTH2(
"PatchADCOffvsE" + patchtype, recpatch.GetADCOfflineAmp(), recpatch.GetPatchE());
441 fQAHistos->
FillTH2(
"PatchEvsADCrough" + patchtype, recpatch.GetPatchE(), recpatch.GetADCAmpGeVRough());
AliVVZERO * fV0
! VZERO data
AliEmcalTriggerMakerTask()
Dummy constructor.
void Reset()
Reset all data grids and VZERO-dependent L1 thresholds.
New configuration, distinction between high and low threshold.
void InitializeBadFEEChannels()
Initialize bad channels from the OADB container.
virtual void ExecOnce()
Initialize the trigger maker kernel.
void ConfigureForPbPb2015()
Configure the class for 2015 PbPb.
Base task in the EMCAL framework.
Bool_t fLocalInitialized
whether or not the task has been already initialized
void FillQAHistos(const TString &patchtype, const AliEMCALTriggerPatchInfoV1 &recpatch)
Internal QA handler for trigger pathches of given type.
virtual Bool_t Run()
Run trigger patch finding.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
TObjArray * CreateTriggerPatches(const AliVEvent *inputevent, Bool_t useL0amp=kFALSE)
Run patch finders on input data.
void InitializeFastORMaskingFromOADB()
Initialize the FastOR masking from the OADB.
void AddFastORBadChannel(Short_t absId)
Add a FastOR bad channel to the list.
void SetTriggerBitConfig(const AliEMCALTriggerBitConfig *const config)
Set the trigger bit configuration applied for the given data set.
void ConfigureForPbPb2011()
Configure the class for 2011 PbPb.
Bool_t fUseL0Amplitudes
Use L0 amplitudes instead of L1 time sum (useful for runs where STU was not read) ...
virtual void UserCreateOutputObjects()
Initializing output objects.
void Init()
Initialize the trigger maker Kernel.
void ClearFastORBadChannels()
Clear FastOR bad channel list.
void SetIsMC(Bool_t isMC)
Define whether running on MC or not (for offset)
void ConfigureForPP2011()
Configure the class for 2011 pp.
Bool_t fLoadFastORMaskingFromOCDB
Load FastOR masking from the OCDB.
void ReadTriggerData(AliVCaloTrigger *trigger)
Read the calo trigger data.
virtual ~AliEmcalTriggerMakerTask()
Destructor.
TString fV0InName
name of output track array
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
Old configuration, no distinction between high and low threshold.
void ConfigureForPP2012()
Configure the class for 2012 pp.
THashList * GetListOfHistograms() const
AliEMCALGeometry * fGeom
!emcal geometry
void SetUseTriggerBitConfig(TriggerMakerBitConfig_t bitConfig)
Trigger bit configuration to be used in the trigger patch maker.
AliEmcalTriggerMakerKernel * fTriggerMaker
The actual trigger maker kernel.
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Temporary class handling.
void AddOfflineBadChannel(Short_t absId)
Add an offline bad channel to the set.
EMCAL trigger maker task.
double GetTriggerChannelEnergy(Int_t col, Int_t row) const
Get energy of the trigger channel estimated from cells (in col-row space)
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
const std::set< Short_t > & GetListOfBadFastORAbsIDs() const
Get the list of online masked FastOR's used in the trigger maker.
AliVCaloCells * fCaloCells
!cells
void BuildL1ThresholdsOffline(const AliVVZERO *vzdata)
Build VZERO-dependent thresholds for the offline trigger.
std::function< int(unsigned int, unsigned int)> GetMaskHandler() const
AliEmcalList * fOutput
!output list
void SetGeometry(const AliEMCALGeometry *const geo)
Provide the EMCAL geometry to the trigger maker Kernel.
virtual void RunChanged(Int_t newrun)
RunChanged method of the trigger maker.
TString fBadFEEChannelOADB
name of the OADB container containing channels to be masked inside the trigger maker ...
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
TString fCaloTriggersOutName
name of output track array
TClonesArray * fCaloTriggersOut
! trigger array out
void ClearOfflineBadChannels()
Clear offline bad channel list.
double GetTriggerChannelEnergyRough(Int_t col, Int_t row) const
Get estimated energy of the trigger channel based on ADC measurement (in col-row space) ...
Container class for histograms.
double GetTriggerChannelEnergySmeared(Int_t col, Int_t row) const
Get (simulated) smeared energy of a trigger channel estimated based on the measured energy from cells...
Kernel of the EMCAL trigger patch maker.
TString fMaskedFastorOADB
name of the OADB container containing fastors to be masked inside the trigger maker ...
Int_t GetRunNumber(TString)
Double_t GetSmearedEnergyV1() const
AliVCaloTrigger * fCaloTriggers
!calo triggers
void UserCreateOutputObjects()
void InitializeFastORMaskingFromOCDB()
Initialize the FastOR masking from the OCDB.
Bool_t IsConfigured() const
THistManager * fQAHistos
! Histograms for QA
double GetDataGridDimensionRows() const
Get the dimension of the underlying data grids in row direction.
Bool_t fDoQA
Fill QA histograms.
void ReadCellData(AliVCaloCells *cells)
Read the EMCAL cell data.
void ConfigureForPPb2013()
Configure the class for 2013 pPb.