30 #include <unordered_map> 33 #include <TClonesArray.h> 37 #include <TObjString.h> 39 #include "AliAnalysisManager.h" 40 #include "AliEMCALTriggerPatchInfo.h" 71 const std::array<std::string, 9> kNamesTriggerClasses = {{
"MB",
"EG1",
"EG2",
"DG1",
"DG2",
"EJ1",
"EJ2",
"DJ1",
"DJ2"}};
72 const std::array<std::string, 6> kNamesTriggerClusters = {{
"ANY",
"CENT",
"CENTNOTRD",
"BOTH",
"ONLYCENT",
"ONLYCENTNOTRD"}};
73 const std::array<std::string, 4> kNamesPatchTypes = {{
"EGA",
"DGA",
"EJE",
"DJE"}};
75 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);
76 const TBinning *firedpatchbinning[5] = {&ADCBinning, &colbinning, &rowbinning, &npatchbinning, &noverlapbinning},
77 *allpatchbinning[3] = {&ADCBinning, &npatchbinning, &noverlapbinning};
79 for(
const auto &kt : kNamesTriggerClasses){
82 if(kt.find(
"MB") != std::string::npos)
83 fHistos->
CreateTH1(Form(
"hEventCounter%s", kt.data()), Form(
"Event counter for %s", kt.data()), 1, 0.5, 1.5);
85 for(
const auto &kc : kNamesTriggerClusters) {
86 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);
93 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" :
"");
96 for(
const auto &kt : kNamesTriggerClasses) {
97 if(kt ==
"MB")
continue;
98 const char detector = kt[0];
99 const char *patchtype = ((kt[1] ==
'G') ?
"GA" :
"JE");
101 for(
const auto &kc : kNamesTriggerClusters){
102 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" :
"");
103 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" :
"");
104 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" :
"");
115 auto trgstr =
static_cast<TObjString *
>(t)->String();
121 if(!allFound)
return false;
127 auto trgstr =
static_cast<TObjString *
>(t)->String();
133 if(oneFound)
return false;
140 const std::array<std::string, 9> kNamesTriggerClasses = {{
"MB",
"EG1",
"EG2",
"DG1",
"DG2",
"EJ1",
"EJ2",
"DJ1",
"DJ2"}};
143 auto findTriggerType = [](
const std::vector<TString> &triggers,
TString type) ->
bool {
145 for(
const auto t : triggers) {
146 if(t.Contains(type)) {
154 std::vector<TString> handledtriggers;
155 for(
auto t : kNamesTriggerClasses) {
157 handledtriggers.emplace_back(t);
161 for(
const auto &kt : handledtriggers) {
162 if(kt ==
"MB")
fHistos->
FillTH1(Form(
"hEventCounter%s", kt.Data()), 1.);
164 for(
const auto &kc : selclusters)
fHistos->
FillTH1(Form(
"hEventCounter%s%s", kt.Data(), kc.data()), 1.);
170 const std::array<std::string, 9> kNamesTriggerClasses = {{
"MB",
"EG1",
"EG2",
"DG1",
"DG2",
"EJ1",
"EJ2",
"DJ1",
"DJ2"}};
174 AliDebugStream(1) <<
"Found triggers" << std::endl;
176 AliDebugStream(1) <<
"Trigger patch container has " <<
fTriggerPatchInfo->GetEntries() <<
" patches" << std::endl;
181 auto findTriggerType = [](
const std::vector<TString> &triggers,
TString type) ->
bool {
183 for(
const auto t : triggers) {
184 if(t.Contains(type)) {
191 bool isMB = std::find(fSelectedTriggers.begin(), fSelectedTriggers.end(),
"MB") != fSelectedTriggers.end(),
192 isEG = findTriggerType(fSelectedTriggers,
"EG"),
193 isDG = findTriggerType(fSelectedTriggers,
"DG"),
194 isEJ = findTriggerType(fSelectedTriggers,
"EJ"),
195 isDJ = findTriggerType(fSelectedTriggers,
"DJ");
197 std::vector<TString> handledtriggers;
198 for(
auto t : kNamesTriggerClasses) {
199 if(findTriggerType(fSelectedTriggers, t.data())){
200 handledtriggers.emplace_back(t);
204 AliDebugStream(1) <<
"Processing triggers" << std::endl;
205 for(
auto t : handledtriggers) AliDebugStream(1) << t << std::endl;
206 if(!handledtriggers.size()){
207 AliDebugStream(1) <<
"No supported trigger class found " << std::endl;
211 std::vector<const AliEMCALTriggerPatchInfo *> EGApatches, DGApatches, EJEpatches, DJEpatches;
217 for(
const auto &t : handledtriggers) {
220 for(
auto patch : EGApatches)
fHistos->
FillTH1(
"hPatchADCEGAMB", patch->GetADCAmp());
221 for(
auto patch : DGApatches)
fHistos->
FillTH1(
"hPatchADCDGAMB", patch->GetADCAmp());
222 for(
auto patch : EJEpatches)
fHistos->
FillTH1(
"hPatchADCEJEMB", patch->GetADCAmp());
223 for(
auto patch : DJEpatches)
fHistos->
FillTH1(
"hPatchADCDJEMB", patch->GetADCAmp());
225 const char detector = t[0];
226 const char *patchtype = ((t[1] ==
'G') ?
"GA" :
"JE");
227 std::vector<const AliEMCALTriggerPatchInfo *> &patchhandler = (detector ==
'E' ? (t[1] ==
'G' ? EGApatches : EJEpatches) : (t[1] ==
'G' ? DGApatches : DJEpatches));
230 AliDebugStream(3) <<
"Trigger " << t <<
", patches " << patchhandler.size() <<
", firing " << firedpatches.size() << std::endl;
231 for(
auto p : patchhandler){
232 double point[3] = {
static_cast<double>(p->GetADCAmp()), static_cast<double>(firedpatches.size()), static_cast<double>(patchareas)};
233 for(
const auto &kc : selclusters) {
234 fHistos->
FillTH1(Form(
"hPatchADC%c%s%s%s", detector, patchtype, t.Data(), kc.data()), p->GetADCAmp());
235 fHistos->
FillTHnSparse(Form(
"hAllPatches%c%s%s%s", detector, patchtype, t.Data(), kc.data()), point);
238 for(
auto p : firedpatches) {
239 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)};
240 for(
const auto &kc : selclusters)
241 fHistos->
FillTHnSparse(Form(
"hFiredPatches%c%s%s%s", detector, patchtype, t.Data(), kc.data()), point);
249 AliDebugStream(2) <<
"Selecting all patches for trigger " <<
static_cast<int>(patchtype) << std::endl;
250 std::vector<const AliEMCALTriggerPatchInfo *> result;
252 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(p);
253 if(!patch->IsRecalc())
continue;
256 case kEGApatches:
if(patch->IsDCalPHOS() || !patch->IsGammaHighRecalc()) selected =
false;
break;
257 case kDGApatches:
if(patch->IsEMCal() || !patch->IsGammaHighRecalc()) selected =
false;
break;
258 case kEJEpatches:
if(patch->IsDCalPHOS() || !patch->IsJetHighRecalc()) selected =
false;
break;
259 case kDJEpatches:
if(patch->IsEMCal() || !patch->IsJetHighRecalc()) selected =
false;
break;
261 if(selected) result.emplace_back(patch);
263 AliDebugStream(2) <<
"In: " << list.GetEntries() <<
", out: " << result.size() << std::endl;
268 std::vector<const AliEMCALTriggerPatchInfo *> result;
279 default:
return result;
289 std::vector<std::string> selclusters;
290 selclusters.push_back(
"ANY");
291 bool isCENT(
false), isCENTNOTRD(
false);
292 for(
const auto &
c : clusters){
293 if((
c.Triggercluster() ==
"CENT") && !isCENT) {
294 selclusters.push_back(
"CENT");
296 }
else if((
c.Triggercluster() ==
"CENTNOTRD") && !isCENTNOTRD) {
297 selclusters.push_back(
"CENTNOTRD");
301 if(isCENT && isCENTNOTRD) selclusters.push_back(
"BOTH");
303 if(isCENT) selclusters.push_back(
"ONLYCENT");
304 if(isCENTNOTRD) selclusters.push_back(
"ONLYCENTNOTRD");
310 std::vector<const AliEMCALTriggerPatchInfo *> patchareas;
311 for(
const auto patch : firedpatches) {
312 if(!patchareas.size()) patchareas.push_back(patch);
314 bool overlapFound =
false;
315 for(
const auto refpatch : patchareas) {
317 AliErrorStream() <<
"Ref patch null" << std::endl;
318 AliErrorStream() <<
"Patchareas has size " << patchareas.size() << std::endl;
319 AliErrorStream() <<
"Firedpatches has size " << firedpatches.size() << std::endl;
322 AliErrorStream() <<
"Test patch null" << std::endl;
323 AliErrorStream() <<
"Patchareas has size " << patchareas.size() << std::endl;
324 AliErrorStream() <<
"Firedpatches has size " << firedpatches.size() << std::endl;
332 if(!overlapFound) patchareas.emplace_back(patch);
335 return patchareas.size();
339 int testcolmin = test.GetColStart(), testcolmax = test.GetColStart()+test.GetPatchSize()-1,
340 testrowmin = test.GetRowStart(), testrowmax = test.GetRowStart()+test.GetPatchSize()-1,
341 refcolmin = ref.GetColStart(), refcolmax = ref.GetColStart()+ref.GetPatchSize()-1,
342 refrowmin = ref.GetRowStart(), refrowmax = ref.GetRowStart()+ref.GetPatchSize()-1;
343 if((
InRange(testcolmin, refcolmin, refcolmax) &&
InRange(testrowmin, refrowmin, refrowmax)) ||
344 (
InRange(testcolmax, refcolmin, refcolmax) &&
InRange(testrowmax, refrowmin, refrowmax)))
return true;
361 std::cerr <<
"No analysis manager defined" << std::endl;
365 std::stringstream taskname;
366 taskname <<
"EmcalRecalcPatches_" <<
suffix;
380 std::stringstream outfilename, outlistname;
381 outfilename << mgr->GetCommonFileName() <<
":" << taskname.str();
382 outlistname <<
"Histos_" << taskname.str();
383 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
384 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.
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="")
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()
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.
void SetEnableSumw2(Bool_t doEnable)