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" 31 #include "AliEMCALTriggerPatchInfo.h" 34 #include "AliEMCALTriggerMapping.h" 36 #include "AliOADBContainer.h" 54 fCaloTriggersOutName("EmcalTriggers"),
55 fV0InName("AliAODVZERO"),
56 fBadFEEChannelOADB(""),
57 fMaskedFastorOADB(""),
58 fUseL0Amplitudes(kFALSE),
59 fLoadFastORMaskingFromOCDB(kFALSE),
71 fCaloTriggersOutName(
"EmcalTriggers"),
72 fV0InName(
"AliAODVZERO"),
73 fBadFEEChannelOADB(
""),
74 fMaskedFastorOADB(
""),
75 fUseL0Amplitudes(kFALSE),
76 fLoadFastORMaskingFromOCDB(kFALSE),
77 fCaloTriggersOut(NULL),
95 const std::array<const TString, 3> kTriggerTypeNames = {{
"EJE",
"EGA",
"EL0"}},
96 kPatchTypes = {{
"Online",
"Offline",
"Recalc"}};
98 if(
fDoQA) AliInfoStream() <<
"Trigger maker - QA requested" << std::endl;
99 else AliInfoStream() <<
"Trigger maker - no QA requested" << std::endl;
100 if(!
fOutput) AliErrorStream() <<
"No output container initialized" << std::endl;
104 AliInfoStream() <<
"Enabling QA for trigger maker" << std::endl;
107 for(
const auto &triggertype : kTriggerTypeNames){
108 for(
const auto &patchtype : kPatchTypes){
110 "RCPos" + triggertype + patchtype,
111 "Lower edge position of " + patchtype +
" " + triggertype +
" patches (col-row);iEta;iPhi",
112 48, -0.5, 47.5, 104, -0.5, 103.5
115 "EPCentPos" + triggertype + patchtype,
116 "Center position of the " + patchtype +
" " + triggertype +
" trigger patches;#eta;#phi",
117 20, -0.8, 0.8, 700, 0., 7.
120 "PatchADCvsE" + triggertype + patchtype,
121 "Patch ADC value for trigger type " + patchtype +
" " + triggertype +
"; Trigger ADC; FEE patch energy (GeV)",
122 2000, 0., 2000, 200, 0., 200
125 "PatchEvsEsmear" + triggertype + patchtype,
126 "Patch energy vs. smeared energy for " + patchtype +
" " + triggertype +
"; FEE patch energy (GeV); smeared FEE energy (GeV)",
127 200, 0., 200, 200, 0., 200
130 "PatchADCvsEsmear" + triggertype + patchtype,
131 "Patch ADC vs. smeared energy for " + patchtype +
" " + triggertype +
"; Trigger ADC; smeared FEE energy (GeV)",
132 2000, 0., 2000, 200, 0., 200
135 "PatchADCOffvsE" + triggertype + patchtype,
136 "Patch offline ADC value for trigger type " + patchtype +
" " + triggertype +
"; Trigger ADC; FEE patch energy (GeV)",
137 2000, 0., 2000, 200, 0., 200
140 "PatchEvsADCrough" + triggertype + patchtype,
141 "Patch Energy vs. ADC rough for trigger type " + patchtype +
" " + triggertype +
"; FEE patch energy (GeV); ADC rough (GeV)",
142 2000, 0., 2000, 200, 0., 200
146 fQAHistos->
CreateTH1(
"triggerBitsAll",
"Trigger bits for all incoming patches;bit nr", 64, -0.5, 63.5);
147 fQAHistos->
CreateTH1(
"triggerBitsSel",
"Trigger bits for reconstructed patches;bit nr", 64, -0.5, 63.5);
148 fQAHistos->
CreateTH2(
"FastORMaskOnline",
"Masked FastORs at online level; col; row", 48, -0.5, 47.5, 104, -0.5, 103.5);
151 fQAHistos->
CreateTH2(
"FastORCorrEnergyADCrough",
"FastOR cell energy vs. ADC energy", 200, 0., 20., 200, 0., 20.);
152 fQAHistos->
CreateTH2(
"FastORCorrEnergyESmear",
"FastOR cell energy vs. smeared energy", 200, 0., 20., 200, 0., 20.);
153 fQAHistos->
CreateTH2(
"FastORCorrADCroughEsmear",
"FastOR ADC rough vs. smeared energy", 200, 0., 20., 200, 0., 20.);
154 fQAHistos->
CreateTH2(
"FastORDiffEnergyADCrough",
"FastOR ADCrough - cell energy", 4994, -0.5, 4993.5, 200, -10., 10);
155 fQAHistos->
CreateTH2(
"FastORDiffEnergyEsmear",
"FastOR smeared energy - cell energy", 4994, -0.5, 4993.5, 200, -10., 10);
156 fQAHistos->
CreateTH2(
"FastORDiffEsmearADCrough",
"FastOR ADC rough - smeared energy", 4994, -0.5, 4993.5, 200, -10., 10);
162 AliWarningStream() <<
"QA requested but no output container initialized - QA needs to be disabled" << std::endl;
170 AliEMCALTriggerBitConfig *triggerBitConfig(NULL);
173 triggerBitConfig =
new AliEMCALTriggerBitConfigNew();
176 triggerBitConfig =
new AliEMCALTriggerBitConfigOld();
195 AliFatal(Form(
"%s: Container with same name %s already present. Aborting", GetName(),
fCaloTriggersOutName.Data()));
201 fV0 = (AliVVZERO*)InputEvent()->FindListObject(
fV0InName);
206 AliInfoStream() <<
"Trigger maker not yet configure - automatically configuring ..." << std::endl;
207 int runnumber = InputEvent()->GetRunNumber();
208 std::string dataset =
"";
209 if(runnumber >= 145144 && runnumber <= 165746){
212 }
else if(runnumber >= 167806 && runnumber <= 170593){
214 dataset =
"Pb-Pb 2011";
215 }
else if(runnumber >= 176326 && runnumber <= 193766){
218 }
else if(runnumber >= 195344 && runnumber <= 197692){
221 dataset =
"p-Pb 2013";
222 }
else if((runnumber >= 224891 && runnumber <= 244628) || runnumber >= 253434){
225 dataset =
"pp 2015-2016";
226 }
else if(runnumber >= 244824 && runnumber <= 246994){
228 dataset =
"Pb-Pb 2015";
232 AliInfoStream() <<
"Applying configuration for " << dataset << std::endl;
234 AliErrorStream() <<
"No valid configuration found for the given dataset - trigger maker run loop disabled" << std::endl;
250 AliErrorStream() <<
"Trigger maker not configured" << std::endl;
253 AliDebugStream(1) <<
"Looking for trigger patches ..." << std::endl;
264 double ecell, eadc, esmear;
266 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,8,0) 268 for(
auto icol : ROOT::TSeqI(0, 48)){
272 for(
int icol = 0; icol < 48; icol++){
278 fGeom->GetTriggerMapping()->GetAbsFastORIndexFromPositionInEMCAL(icol, irow, fastORAbsID);
280 if(TMath::Abs(ecell) > DBL_EPSILON || TMath::Abs(eadc) > DBL_EPSILON){
284 if(TMath::Abs(ecell) > DBL_EPSILON || TMath::Abs(esmear) > DBL_EPSILON){
288 if(TMath::Abs(eadc) > DBL_EPSILON || TMath::Abs(esmear) > DBL_EPSILON){
296 std::vector<AliEMCALTriggerPatchInfo> patches;
298 Int_t patchcounter = 0;
300 AliDebugStream(2) << GetName() <<
": Found " << patches.size() <<
" patches" << std::endl;
301 for(
const auto &patchIter : patches){
303 AliDebugStream(3) << GetName() <<
": Next patch: size " << patchIter.GetPatchSize() <<
" , trigger bits " << std::bitset<sizeof(Int_t)*8>(patchIter.GetTriggerBits()) << std::endl;
305 if(patchIter.IsJetHigh() || patchIter.IsJetLow())
FillQAHistos(
"EJEOnline", patchIter);
306 if(patchIter.IsGammaHigh() || patchIter.IsGammaLow())
FillQAHistos(
"EGAOnline", patchIter);
307 if(patchIter.IsJetHighSimple() || patchIter.IsJetLowSimple())
FillQAHistos(
"EJEOffline", patchIter);
308 if(patchIter.IsGammaHighSimple() || patchIter.IsGammaLowSimple())
FillQAHistos(
"EGAOffline", patchIter);
309 if(patchIter.IsLevel0())
FillQAHistos(
"EL0Online", patchIter);
310 if(patchIter.IsRecalcJet())
FillQAHistos(
"EJERecalc", patchIter);
311 if(patchIter.IsRecalcGamma())
FillQAHistos(
"EGARecalc", patchIter);
313 int tBits = patchIter.GetTriggerBits();
314 for(
unsigned int ibit = 0; ibit <
sizeof(tBits)*8; ibit++) {
315 if(tBits & (1 << ibit)){
320 new((*fCaloTriggersOut)[patchcounter++]) AliEMCALTriggerPatchInfo(patchIter);
326 AliDebugStream(1) <<
"Run changed, new run " << newrun << std::endl;
334 Int_t globCol(-1), globRow(-1) ;
336 fGeom->GetTriggerMapping()->GetPositionInEMCALFromAbsFastORIndex(ifastOrID, globCol, globRow);
343 AliInfoStream() <<
"Loading additional bad FEE channels from OADB container " <<
fBadFEEChannelOADB << std::endl;
346 AliOADBContainer badchannelDB(
"EmcalBadChannelsAdditional");
349 if(!badchannelmap || !badchannelmap->GetEntries())
return;
350 for(TIter citer = TIter(badchannelmap).Begin(); citer != TIter::End(); ++citer){
357 AliInfoStream() <<
"Loading masked fastors from OCDB" << std::endl;
358 AliCDBManager *cdb = AliCDBManager::Instance();
360 AliCDBEntry *en = cdb->Get(
"EMCAL/Calib/Trigger");
362 AliErrorStream() << GetName() <<
": FastOR masking from CDB required, but OCDB entry is not available. No masking will be applied." << std::endl;
366 AliEMCALTriggerDCSConfig *trgconf =
dynamic_cast<AliEMCALTriggerDCSConfig *
>(en->GetObject());
368 AliErrorStream() << GetName() <<
": Failed decoding OCDB entry: Object is not of type AliEMCALTriggerDCSConfig." << std::endl;
376 Int_t fastOrAbsID(-1), ic(-1);
377 for(
int itru = 0; itru < trgconf->GetTRUArr()->GetEntries(); itru++){
378 AliEMCALTriggerTRUDCSConfig *truconf = trgconf->GetTRUDCSConfig(itru);
387 for(
unsigned int ifield = 0; ifield < 6; ifield++){
388 for(
unsigned int ibit = 0; ibit < 16; ibit ++){
389 if((truconf->GetMaskReg(ifield) >> ibit) & 0x1){
392 AliDebugStream(1) << GetName() <<
"Channel " << ic <<
" in TRU " << itru <<
" ( abs fastor " << fastOrAbsID <<
") masked." << std::endl;
395 AliErrorStream() << GetName() <<
"Invalid mask: (" << ifield <<
"|" << ibit <<
"), exception " << exept <<
" thrown. Mask will not be recognized" << std::endl;
404 AliInfoStream() <<
"Initializing masked fastors from OADB container " <<
fMaskedFastorOADB.Data() << std::endl;
406 AliOADBContainer badchannelDB(
"AliEmcalMaskedFastors");
409 if(!badchannelmap || !badchannelmap->GetEntries())
return;
410 for(TIter citer = TIter(badchannelmap).Begin(); citer != TIter::End(); ++citer){
412 AliDebugStream(1) << GetName() <<
": Found masked fastor channel " << channelID->GetVal() << std::endl;
419 bool isTRUsmallSM = ((itru >= 30 && itru < 31) || (itru >= 44 && itru < 45)) ;
420 if(
fGeom->GetTriggerMappingVersion() == 2 && !isTRUsmallSM){
422 return [] (
unsigned int ifield,
unsigned int ibit) ->
int {
424 const int kChannelMap[6][16] = {{ 8, 9,10,11,20,21,22,23,32,33,34,35,44,45,46,47},
425 {56,57,58,59,68,69,70,71,80,81,82,83,92,93,94,95},
426 { 4, 5, 6, 7,16,17,18,19,28,29,30,31,40,41,42,43},
427 {52,53,54,55,64,65,66,67,76,77,78,79,88,89,90,91},
428 { 0, 1, 2, 3,12,13,14,15,24,25,26,27,36,37,38,39},
429 {48,49,50,51,60,61,62,63,72,73,74,75,84,85,86,87}};
430 return kChannelMap[ifield][ibit];
434 return [] (
int ifield,
int ibit) ->
int {
436 return ifield * 16 + ibit;
442 if(
fGeom->GetTriggerMappingVersion() == 2){
443 const int trumapping[46] = {0,1,2,5,4,3,6,7,8,11,10,9,12,13,14,17,16,15,18,19,20,23,22,21,24,25,26,29,28,27,30,31,32,33,37,36,38,39,43,42,44,45,49,48,50,51};
444 return trumapping[itru];
449 fQAHistos->
FillTH2(
"RCPos" + patchtype, recpatch.GetColStart(), recpatch.GetRowStart());
450 fQAHistos->
FillTH2(
"EPCentPos" + patchtype, recpatch.GetEtaGeo(), recpatch.GetPhiGeo());
451 fQAHistos->
FillTH2(
"PatchADCvsE" + patchtype, recpatch.GetADCAmp(), recpatch.GetPatchE());
452 fQAHistos->
FillTH2(
"PatchEvsEsmear" + patchtype, recpatch.GetPatchE(), recpatch.GetSmearedEnergy());
453 fQAHistos->
FillTH2(
"PatchADCvsEsmear" + patchtype, recpatch.GetADCAmp(), recpatch.GetSmearedEnergy());
454 fQAHistos->
FillTH2(
"PatchADCOffvsE" + patchtype, recpatch.GetADCOfflineAmp(), recpatch.GetPatchE());
455 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.
int RemapTRUIndex(int itru) const
Fix mapping in TRU index.
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
virtual Bool_t Run()
Run trigger patch finding.
void ConfigureForPP2015()
Configure the class for 2015 pp.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
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 CreateTriggerPatches(const AliVEvent *inputevent, std::vector< AliEMCALTriggerPatchInfo > &outputcont, Bool_t useL0amp=kFALSE)
Run patch finders on input data.
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="")
Create a new TH2 within the container.
Old configuration, no distinction between high and low threshold.
void ConfigureForPP2012()
Configure the class for 2012 pp.
THashList * GetListOfHistograms() const
Get the list of histograms.
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="")
Create a new TH1 within the container.
std::function< int(unsigned int, unsigned int)> GetMaskHandler(int itru) const
Create functor handling the conversion between reg mask and channel.
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="")
Fill a 1D histogram within the container.
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.
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.
void FillQAHistos(const TString &patchtype, const AliEMCALTriggerPatchInfo &recpatch)
Internal QA handler for trigger pathches of given type.
TString fBadFEEChannelOADB
name of the OADB container containing channels to be masked inside the trigger maker ...
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 ...
virtual void ExecOnce()
Perform steps needed to initialize the analysis.
Int_t GetRunNumber(TString)
AliVCaloTrigger * fCaloTriggers
!calo triggers
void UserCreateOutputObjects()
Main initialization function on the worker.
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.