30 #include <unordered_map> 33 #include <TClonesArray.h> 37 #include <TObjString.h> 39 #include "AliAnalysisManager.h" 40 #include "AliEMCALTriggerPatchInfo.h" 42 #include "AliMultSelection.h" 43 #include "AliMultEstimator.h" 57 fCentralityRange(-999., 999.),
58 fUseRecalcPatches(false),
59 fRequestCentrality(false),
82 const std::array<std::string, 9> kNamesTriggerClasses = {{
"MB",
"EG1",
"EG2",
"DG1",
"DG2",
"EJ1",
"EJ2",
"DJ1",
"DJ2"}};
83 const std::array<std::string, 6> kNamesTriggerClusters = {{
"ANY",
"CENT",
"CENTNOTRD",
"BOTH",
"ONLYCENT",
"ONLYCENTNOTRD"}};
84 const std::array<std::string, 4> kNamesPatchTypes = {{
"EGA",
"DGA",
"EJE",
"DJE"}};
86 TLinearBinning ADCBinning(2000, 0., 2000.), colbinning(48, -0.5, 47.5), rowbinning(104, -0.5, 103.5), npatchbinning(51, -0.5, 50.5), noverlapbinning(21, -0.5, 20.5);
87 const TBinning *firedpatchbinning[5] = {&ADCBinning, &colbinning, &rowbinning, &npatchbinning, &noverlapbinning},
88 *allpatchbinning[3] = {&ADCBinning, &npatchbinning, &noverlapbinning};
90 for(
const auto &kt : kNamesTriggerClasses){
93 if(kt.find(
"MB") != std::string::npos)
94 fHistos->
CreateTH1(Form(
"hEventCounter%s", kt.data()), Form(
"Event counter for %s", kt.data()), 1, 0.5, 1.5);
96 for(
const auto &kc : kNamesTriggerClusters) {
97 fHistos->
CreateTH1(Form(
"hEventCounter%s%s", kt.data(), kc.data()), Form(
"Event counter for %s in cluster %s", kt.data(), kc.data()), 1, 0.5, 1.5);
104 for(
const auto &kp : kNamesPatchTypes)
fHistos->
CreateTH1(Form(
"hPatchADC%sMB", kp.data()), Form(
"Patch ADC spectra for %s patches in MB events", kp.data()), 2000, 0., 2000.,
fEnableSumw2 ?
"s" :
"");
107 for(
const auto &kt : kNamesTriggerClasses) {
108 if(kt ==
"MB")
continue;
109 const char detector = kt[0];
110 const char *patchtype = ((kt[1] ==
'G') ?
"GA" :
"JE");
112 for(
const auto &kc : kNamesTriggerClusters){
113 fHistos->
CreateTH1(Form(
"hPatchADC%c%s%s%s", detector, patchtype, kt.data(), kc.data()), Form(
"Patch ADC spectra for %c%s patches in %s events (cluster %s)", detector, patchtype, kt.data(), kc.data()), 2000, 0., 2000.,
fEnableSumw2 ?
"s" :
"");
114 fHistos->
CreateTHnSparse(Form(
"hFiredPatches%c%s%s%s", detector, patchtype, kt.data(), kc.data()), Form(
"Fired %c%s patches for trigger %s (cluster %s)", detector, patchtype, kt.data(), kc.data()), 5, firedpatchbinning,
fEnableSumw2 ?
"s" :
"");
115 fHistos->
CreateTHnSparse(Form(
"hAllPatches%c%s%s%s", detector, patchtype, kt.data(), kc.data()), Form(
"Fired %c%s patches for trigger %s (cluster %s)", detector, patchtype, kt.data(), kc.data()), 3, allpatchbinning,
fEnableSumw2 ?
"s" :
"");
124 AliMultSelection *mult =
dynamic_cast<AliMultSelection *
>(InputEvent()->FindListObject(
"MultSelection"));
126 AliErrorStream() << GetName() <<
": Centrality selection enabled but no centrality estimator found" << std::endl;
129 if(mult->IsEventSelected())
return false;
131 AliDebugStream(1) << GetName() <<
": Centrality " <<
fEventCentrality << std::endl;
133 AliDebugStream(1) << GetName() <<
": reject centrality: " <<
fEventCentrality << std::endl;
136 AliDebugStream(1) << GetName() <<
": select centrality " <<
fEventCentrality << std::endl;
139 AliDebugStream(1) << GetName() <<
": No centrality selection applied" << std::endl;
147 auto trgstr =
static_cast<TObjString *
>(t)->String();
153 if(!allFound)
return false;
159 auto trgstr =
static_cast<TObjString *
>(t)->String();
165 if(oneFound)
return false;
172 const std::array<std::string, 9> kNamesTriggerClasses = {{
"MB",
"EG1",
"EG2",
"DG1",
"DG2",
"EJ1",
"EJ2",
"DJ1",
"DJ2"}};
175 auto findTriggerType = [](
const std::vector<TString> &triggers,
TString type) ->
bool {
177 for(
const auto t : triggers) {
178 if(t.Contains(type)) {
186 std::vector<TString> handledtriggers;
187 for(
auto t : kNamesTriggerClasses) {
189 handledtriggers.emplace_back(t);
193 for(
const auto &kt : handledtriggers) {
194 if(kt ==
"MB")
fHistos->
FillTH1(Form(
"hEventCounter%s", kt.Data()), 1.);
196 for(
const auto &kc : selclusters)
fHistos->
FillTH1(Form(
"hEventCounter%s%s", kt.Data(), kc.data()), 1.);
202 const std::array<std::string, 9> kNamesTriggerClasses = {{
"MB",
"EG1",
"EG2",
"DG1",
"DG2",
"EJ1",
"EJ2",
"DJ1",
"DJ2"}};
206 AliDebugStream(1) <<
"Found triggers" << std::endl;
208 AliDebugStream(1) <<
"Trigger patch container has " <<
fTriggerPatchInfo->GetEntries() <<
" patches" << std::endl;
213 auto findTriggerType = [](
const std::vector<TString> &triggers,
TString type) ->
bool {
215 for(
const auto t : triggers) {
216 if(t.Contains(type)) {
223 bool isMB = std::find(fSelectedTriggers.begin(), fSelectedTriggers.end(),
"MB") != fSelectedTriggers.end(),
224 isEG = findTriggerType(fSelectedTriggers,
"EG"),
225 isDG = findTriggerType(fSelectedTriggers,
"DG"),
226 isEJ = findTriggerType(fSelectedTriggers,
"EJ"),
227 isDJ = findTriggerType(fSelectedTriggers,
"DJ");
229 std::vector<TString> handledtriggers;
230 for(
auto t : kNamesTriggerClasses) {
231 if(findTriggerType(fSelectedTriggers, t.data())){
232 handledtriggers.emplace_back(t);
236 AliDebugStream(1) <<
"Processing triggers" << std::endl;
237 for(
auto t : handledtriggers) AliDebugStream(1) << t << std::endl;
238 if(!handledtriggers.size()){
239 AliDebugStream(1) <<
"No supported trigger class found " << std::endl;
243 std::vector<const AliEMCALTriggerPatchInfo *> EGApatches, DGApatches, EJEpatches, DJEpatches;
249 for(
const auto &t : handledtriggers) {
252 for(
auto patch : EGApatches)
fHistos->
FillTH1(
"hPatchADCEGAMB", patch->GetADCAmp());
253 for(
auto patch : DGApatches)
fHistos->
FillTH1(
"hPatchADCDGAMB", patch->GetADCAmp());
254 for(
auto patch : EJEpatches)
fHistos->
FillTH1(
"hPatchADCEJEMB", patch->GetADCAmp());
255 for(
auto patch : DJEpatches)
fHistos->
FillTH1(
"hPatchADCDJEMB", patch->GetADCAmp());
257 const char detector = t[0];
258 const char *patchtype = ((t[1] ==
'G') ?
"GA" :
"JE");
259 std::vector<const AliEMCALTriggerPatchInfo *> &patchhandler = (detector ==
'E' ? (t[1] ==
'G' ? EGApatches : EJEpatches) : (t[1] ==
'G' ? DGApatches : DJEpatches));
262 AliDebugStream(3) <<
"Trigger " << t <<
", patches " << patchhandler.size() <<
", firing " << firedpatches.size() << std::endl;
263 for(
auto p : patchhandler){
264 double point[3] = {
static_cast<double>(p->GetADCAmp()), static_cast<double>(firedpatches.size()), static_cast<double>(patchareas)};
265 for(
const auto &kc : selclusters) {
266 fHistos->
FillTH1(Form(
"hPatchADC%c%s%s%s", detector, patchtype, t.Data(), kc.data()), p->GetADCAmp());
267 fHistos->
FillTHnSparse(Form(
"hAllPatches%c%s%s%s", detector, patchtype, t.Data(), kc.data()), point);
270 for(
auto p : firedpatches) {
271 double point[5] = {
static_cast<double>(p->GetADCAmp()), static_cast<double>(p->GetColStart()), static_cast<double>(p->GetRowStart()), static_cast<double>(firedpatches.size()), static_cast<double>(patchareas)};
272 for(
const auto &kc : selclusters)
273 fHistos->
FillTHnSparse(Form(
"hFiredPatches%c%s%s%s", detector, patchtype, t.Data(), kc.data()), point);
281 AliDebugStream(2) <<
"Selecting all patches for trigger " <<
static_cast<int>(patchtype) << std::endl;
282 std::vector<const AliEMCALTriggerPatchInfo *> result;
284 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(p);
285 if(!patch->IsRecalc())
continue;
288 case kEGApatches:
if(patch->IsDCalPHOS() || !patch->IsGammaHighRecalc()) selected =
false;
break;
289 case kDGApatches:
if(patch->IsEMCal() || !patch->IsGammaHighRecalc()) selected =
false;
break;
290 case kEJEpatches:
if(patch->IsDCalPHOS() || !patch->IsJetHighRecalc()) selected =
false;
break;
291 case kDJEpatches:
if(patch->IsEMCal() || !patch->IsJetHighRecalc()) selected =
false;
break;
293 if(selected) result.emplace_back(patch);
295 AliDebugStream(2) <<
"In: " << list.GetEntries() <<
", out: " << result.size() << std::endl;
300 std::vector<const AliEMCALTriggerPatchInfo *> result;
311 default:
return result;
321 std::vector<std::string> selclusters;
322 selclusters.push_back(
"ANY");
323 bool isCENT(
false), isCENTNOTRD(
false);
324 for(
const auto &
c : clusters){
325 if((
c.Triggercluster() ==
"CENT") && !isCENT) {
326 selclusters.push_back(
"CENT");
328 }
else if((
c.Triggercluster() ==
"CENTNOTRD") && !isCENTNOTRD) {
329 selclusters.push_back(
"CENTNOTRD");
333 if(isCENT && isCENTNOTRD) selclusters.push_back(
"BOTH");
335 if(isCENT) selclusters.push_back(
"ONLYCENT");
336 if(isCENTNOTRD) selclusters.push_back(
"ONLYCENTNOTRD");
342 std::vector<const AliEMCALTriggerPatchInfo *> patchareas;
343 for(
const auto patch : firedpatches) {
344 if(!patchareas.size()) patchareas.push_back(patch);
346 bool overlapFound =
false;
347 for(
const auto refpatch : patchareas) {
349 AliErrorStream() <<
"Ref patch null" << std::endl;
350 AliErrorStream() <<
"Patchareas has size " << patchareas.size() << std::endl;
351 AliErrorStream() <<
"Firedpatches has size " << firedpatches.size() << std::endl;
354 AliErrorStream() <<
"Test patch null" << std::endl;
355 AliErrorStream() <<
"Patchareas has size " << patchareas.size() << std::endl;
356 AliErrorStream() <<
"Firedpatches has size " << firedpatches.size() << std::endl;
364 if(!overlapFound) patchareas.emplace_back(patch);
367 return patchareas.size();
371 int testcolmin = test.GetColStart(), testcolmax = test.GetColStart()+test.GetPatchSize()-1,
372 testrowmin = test.GetRowStart(), testrowmax = test.GetRowStart()+test.GetPatchSize()-1,
373 refcolmin = ref.GetColStart(), refcolmax = ref.GetColStart()+ref.GetPatchSize()-1,
374 refrowmin = ref.GetRowStart(), refrowmax = ref.GetRowStart()+ref.GetPatchSize()-1;
375 if((
InRange(testcolmin, refcolmin, refcolmax) &&
InRange(testrowmin, refrowmin, refrowmax)) ||
376 (
InRange(testcolmax, refcolmin, refcolmax) &&
InRange(testrowmax, refrowmin, refrowmax)))
return true;
393 std::cerr <<
"No analysis manager defined" << std::endl;
397 std::stringstream taskname;
398 taskname <<
"EmcalRecalcPatches_" <<
suffix;
412 std::stringstream outfilename, outlistname;
413 outfilename << mgr->GetCommonFileName() <<
":" << taskname.str();
414 outlistname <<
"Histos_" << taskname.str();
415 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
416 mgr->ConnectOutput(task, 1, mgr->CreateContainer(outlistname.str().data(), TList::Class(), AliAnalysisManager::kOutputContainer, outfilename.str().data()));
std::vector< TString > fSelectedTriggers
! Triggers selected for given event
Bool_t fSwapPatches
Look explicitly for the wrong patches.
void SetOnlineThreshold(ETriggerThreshold_t trigger, Int_t value)
bool HasOverlap(const AliEMCALTriggerPatchInfo &ref, const AliEMCALTriggerPatchInfo &test) const
Class creating a linear binning, used in the histogram manager.
void AddRequiredTriggerOverlap(const char *trigger)
THistManager * fHistos
Task Histogram container.
AliAnalysisTaskEmcalRecalcPatchesRef()
virtual bool IsUserEventSelected()
TArrayI fOnlineThresholds
Online thresholds.
Interface for binnings used by the histogram handler.
static std::vector< PWG::EMCAL::Triggerinfo > DecodeTriggerString(const std::string &triggerstring)
Decoding trigger string.
void SetCaloTriggerPatchInfoName(const char *n)
Double_t fEventCentrality
! Event centrality
AliCutValueRange< double > fCentralityRange
Range of accepted event centralities.
TObjArray fRequiredOverlaps
Add option to require overlap with certain triggers.
Base class for analyses using EMCAL triggers.
void FillTHnSparse(const char *name, const double *x, double weight=1., Option_t *opt="")
Bool_t fUseRecalcPatches
Switch between offline (FEE) and recalc (L1) patches.
static AliAnalysisTaskEmcalRecalcPatchesRef * AddTaskEmcalRecalcPatches(const char *suffix)
std::vector< const AliEMCALTriggerPatchInfo * > SelectFiredPatchesByTrigger(const TClonesArray &patches, ETriggerThreshold_t trigger) const
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
bool InRange(int test, int includemin, int includemax) const
int GetNumberNonOverlappingPatchAreas(const std::vector< const AliEMCALTriggerPatchInfo * > &diredpatches) const
virtual void UserFillHistosAfterEventSelection()
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
virtual bool Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
virtual void CreateUserHistos()
Bool_t fRequestCentrality
Switch for request of centrality selection.
TObjArray fExcludedOverlaps
Add option to exclude overlap with certain triggers.
std::vector< std::string > GetAcceptedTriggerClusters(const char *triggerstring) const
Analysis of high- tracks in triggered events.
TClonesArray * fTriggerPatchInfo
!trigger patch info array
void test(int runnumber=195345)
void AddExcludedTriggerOverlap(const char *trigger)
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
Create a new THnSparse within the container.
std::vector< const AliEMCALTriggerPatchInfo * > SelectAllPatchesByType(const TClonesArray &patches, EPatchType_t patchtype) const
Bool_t fEnableSumw2
Enable sum of weights.
bool IsInRange(t value) const
void SetEnableSumw2(Bool_t doEnable)