@@ -151,17 +151,9 @@ struct fitQa {
151151 bool hasFT0 = false ; // /< (o2::aod::collision::has_foundFT0())
152152 bool hasFV0 = false ; // /< (o2::aod::collision::has_foundFV0())
153153 bool hasFDD = false ; // /< (o2::aod::collision::has_foundFDD())
154- bool isFT0VTX = false ; // /< FT0 vertex trigger
155- bool isFT0CE = false ; // /< FT0 central trigger
156- bool isFT0SCE = false ; // /< FT0 semi-central trigger
157- bool isFV0ORA = false ; // /< FV0 ORA trigger
158- bool isFV0CH = false ; // /< FV0 charge trigger
159- bool isFV0IN = false ; // /< FV0 inner rings charge trigger
160- bool isFDDORA = false ; // /< FDD ORA trigger
161- bool isFDDORC = false ; // /< FDD ORC trigger
162- bool isFDDVTX = false ; // /< FDD vertex trigger
163- bool isFT0VTXandFV0ORA = false ; // /< FT0 vertex AND FV0 ORA trigger
164- bool isFT0VTXandFDDVTX = false ; // /< FT0 vertex AND FDD vertex trigger
154+ std::bitset<8 > ft0Triggers; // /< FT0 trigger bits (o2::aod::ft0::TriggerMask)
155+ std::bitset<8 > fv0Triggers; // /< FV0 trigger bits (o2::aod::fv0::TriggerMask)
156+ std::bitset<8 > fddTriggers; // /< FDD trigger bits (o2::aod::fdd::TriggerMask)
165157
166158 // / Helper struct for event selection conditions
167159 struct Condition {
@@ -171,6 +163,9 @@ struct fitQa {
171163 };
172164
173165 std::vector<Condition> conditions{}; // < Event selection conditions to be considered
166+ std::vector<Condition> ft0Conditions{}; // < FT0 related event selection conditions to be considered
167+ std::vector<Condition> fv0Conditions{}; // < FT0 related event selection conditions to be considered
168+ std::vector<Condition> fddConditions{}; // < FT0 related event selection conditions to be considered
174169
175170 /* Output objects
176171 NOTE1: 1D Quantities are stored in 2D hists, with event selection conditions on the Y-axis.
@@ -189,6 +184,9 @@ struct fitQa {
189184 OutputObj<TH2F > ooPV{" collPV" }; // /< Primary vertex (cm)
190185 OutputObj<TH2F > ooPVns{" collPVns" }; // /< Primary vertex (ns)
191186 OutputObj<TH2F > ooNcontrib{" collNcontrib" }; // /< Number of contributors
187+ OutputObj<TH2F > ooNcontribFT0{" collNcontribFT0" }; // /< Number of contributors, FT0 triggers
188+ OutputObj<TH2F > ooNcontribFV0{" collNcontribFV0" }; // /< Number of contributors, FV0 triggers
189+ OutputObj<TH2F > ooNcontribFDD{" collNcontribFDD" }; // /< Number of contributors, FDD triggers
192190
193191 // FT0
194192 OutputObj<TH2F > ooFT0TimeA{" FT0TimeA" }; // /< FT0A average time (ns)
@@ -286,6 +284,9 @@ struct fitQa {
286284
287285 // / 1D quantities (one value per collision)
288286 std::unordered_map<OutputObj<TH2F >*, std::function<float ()>> objs;
287+ std::unordered_map<OutputObj<TH2F >*, std::function<float ()>> objsft0;
288+ std::unordered_map<OutputObj<TH2F >*, std::function<float ()>> objsfv0;
289+ std::unordered_map<OutputObj<TH2F >*, std::function<float ()>> objsfdd;
289290 // / 2D quantities (one value per collision, e.g. collision time vs vertex)
290291 std::unordered_map<OutputObj<TH3F >*, std::function<std::pair<float , float >()>> objs2D;
291292 // / 2D quantities per X bin (one value per X bin per collision, e.g. amplitude per channel)
@@ -323,17 +324,9 @@ struct fitQa {
323324 hasFT0 = false ;
324325 hasFV0 = false ;
325326 hasFDD = false ;
326- isFT0VTX = false ;
327- isFT0CE = false ;
328- isFT0SCE = false ;
329- isFV0ORA = false ;
330- isFV0CH = false ;
331- isFV0IN = false ;
332- isFDDORA = false ;
333- isFDDORC = false ;
334- isFDDVTX = false ;
335- isFT0VTXandFV0ORA = false ;
336- isFT0VTXandFDDVTX = false ;
327+ ft0Triggers.reset ();
328+ fv0Triggers.reset ();
329+ fddTriggers.reset ();
337330 }
338331
339332 void init (InitContext&) {
@@ -344,17 +337,42 @@ struct fitQa {
344337 // conditions.push_back({"HasFT0", "has FT0", [&]() { return hasFT0; }});
345338 // conditions.push_back({"HasFV0", "has FV0", [&]() { return hasFV0; }});
346339 // conditions.push_back({"HasFDD", "has FDD", [&]() { return hasFDD; }});
347- conditions.push_back ({" FT0VTX" , " FT0 vertex" , [&]() { return isFT0VTX ; }});
340+ conditions.push_back ({" FT0VTX" , " FT0 vertex" , [&]() { return ft0Triggers. test (o2::fit::Triggers::bitVertex) ; }});
348341 // conditions.push_back({"FT0CE", "FT0 CE", [&]() { return isFT0CE; }});
349342 // conditions.push_back({"FT0SCE", "FT0 SCE", [&]() { return isFT0SCE; }});
350343 // conditions.push_back({"FV0ORA", "FV0 ORA", [&]() { return isFV0ORA; }});
351344 // conditions.push_back({"FV0CH", "FV0 CH", [&]() { return isFV0CH; }});
352345 // conditions.push_back({"FV0IN", "FV0 IN", [&]() { return isFV0IN; }});
353346 // conditions.push_back({"FDDVTX", "FDD vertex", [&]() { return isFDDVTX; }});
354- conditions.push_back ({" FT0VTXandFV0ORA" , " FT0 vertex AND FV0 ORA" , [&]() { return isFT0VTXandFV0ORA ; }});
347+ conditions.push_back ({" FT0VTXandFV0ORA" , " FT0 vertex AND FV0 ORA" , [&]() { return ft0Triggers. test (o2::fit::Triggers::bitVertex) && fv0Triggers. test (o2::fit::Triggers::bitA) ; }});
355348 // conditions.push_back({"FT0VTXandFV0CH", "FT0 vertex AND FV0 CH", [&]() { return isFT0VTX && isFV0CH; }});
356349 // conditions.push_back({"FT0VTXandFV0IN", "FT0 vertex AND FV0 IN", [&]() { return isFT0VTX && isFV0IN; }});
357- conditions.push_back ({" FT0VTXandFDDVTX" , " FT0 vertex AND FDD vertex" , [&]() { return isFT0VTXandFDDVTX; }});
350+ conditions.push_back ({" FT0VTXandFDDVTX" , " FT0 vertex AND FDD vertex" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitVertex) && fddTriggers.test (o2::fit::Triggers::bitVertex); }});
351+
352+ ft0Conditions.push_back ({" All" , " all collisions" , [&]() { return true ; }});
353+ ft0Conditions.push_back ({" FT0ORA" , " FT0 ORA" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitA); }});
354+ ft0Conditions.push_back ({" FT0ORC" , " FT0 ORC" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitC); }});
355+ ft0Conditions.push_back ({" FT0VTX" , " FT0 VTX" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitVertex); }});
356+ ft0Conditions.push_back ({" FT0CE" , " FT0 CE" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitCen); }});
357+ ft0Conditions.push_back ({" FT0SCE" , " FT0 SCE" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitSCen); }});
358+ ft0Conditions.push_back ({" FT0ACTIVEA" , " FT0 ACTIVE A" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitLaser); }});
359+ ft0Conditions.push_back ({" FT0ACTIVEC" , " FT0 ACTIVE C" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitOutputsAreBlocked); }});
360+ ft0Conditions.push_back ({" FT0FLANGE" , " FT0 FLANGE" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitDataIsValid); }});
361+ ft0Conditions.push_back ({" FT0MINBIAS" , " FT0 MIN BIAS" , [&]() { return ft0Triggers.test (o2::fit::Triggers::bitVertex) && (ft0Triggers.test (o2::fit::Triggers::bitCen) || ft0Triggers.test (o2::fit::Triggers::bitSCen)); }});
362+
363+ fv0Conditions.push_back ({" All" , " all collisions" , [&]() { return true ; }});
364+ fv0Conditions.push_back ({" FV0ORA" , " FV0 ORA" , [&]() { return fv0Triggers.test (o2::fit::Triggers::bitA); }});
365+ fv0Conditions.push_back ({" FV0NCHAN" , " FV0 NCHAN" , [&]() { return fv0Triggers.test (o2::fit::Triggers::bitTrgNchan); }});
366+ fv0Conditions.push_back ({" FV0CH" , " FV0 CH" , [&]() { return fv0Triggers.test (o2::fit::Triggers::bitTrgCharge); }});
367+ fv0Conditions.push_back ({" FV0OUT" , " FV0 OUT" , [&]() { return fv0Triggers.test (o2::fit::Triggers::bitAOut); }});
368+ fv0Conditions.push_back ({" FV0CH" , " FV0 IN" , [&]() { return fv0Triggers.test (o2::fit::Triggers::bitAIn); }});
369+
370+ fddConditions.push_back ({" All" , " all collisions" , [&]() { return true ; }});
371+ fddConditions.push_back ({" FDDORA" , " FDD ORA" , [&]() { return fddTriggers.test (o2::fit::Triggers::bitA); }});
372+ fddConditions.push_back ({" FDDORC" , " FDD ORC" , [&]() { return fddTriggers.test (o2::fit::Triggers::bitC); }});
373+ fddConditions.push_back ({" FDDVTX" , " FDD vertex" , [&]() { return fddTriggers.test (o2::fit::Triggers::bitVertex); }});
374+ fddConditions.push_back ({" FDDCE" , " FDD CE" , [&]() { return fddTriggers.test (o2::fit::Triggers::bitCen); }});
375+ fddConditions.push_back ({" FDDSCE" , " FDD SCE" , [&]() { return fddTriggers.test (o2::fit::Triggers::bitSCen); }});
358376
359377 /* Init OutputObj's */
360378
@@ -371,6 +389,15 @@ struct fitQa {
371389 ooNcontrib.setObject (new TH2F (ooNcontrib.label .c_str (), " Number of contributors to primary vertex;Number of contributors to primary vertex" , nBinsNContrib, nContribMin, nContribMax, conditions.size (), 0 , conditions.size ()));
372390 objs[&ooNcontrib] = [&]() { return nContrib; };
373391
392+ ooNcontribFT0.setObject (new TH2F (ooNcontribFT0.label .c_str (), " Number of contributors to primary vertex;Number of contributors to primary vertex" , nBinsNContrib, nContribMin, nContribMax, ft0Conditions.size (), 0 , ft0Conditions.size ()));
393+ objsft0[&ooNcontribFT0] = [&]() { return nContrib; };
394+
395+ ooNcontribFV0.setObject (new TH2F (ooNcontribFV0.label .c_str (), " Number of contributors to primary vertex;Number of contributors to primary vertex" , nBinsNContrib, nContribMin, nContribMax, fv0Conditions.size (), 0 , fv0Conditions.size ()));
396+ objsfv0[&ooNcontribFV0] = [&]() { return nContrib; };
397+
398+ ooNcontribFDD.setObject (new TH2F (ooNcontribFDD.label .c_str (), " Number of contributors to primary vertex;Number of contributors to primary vertex" , nBinsNContrib, nContribMin, nContribMax, fddConditions.size (), 0 , fddConditions.size ()));
399+ objsfdd[&ooNcontribFDD] = [&]() { return nContrib; };
400+
374401 ooFT0TimeA.setObject (new TH2F (ooFT0TimeA.label .c_str (), " FT0A time;$\\ langle t_{\\ text{FT0A}} \\ rangle \\ text{ (ns)}$" , nBinsT, tMin, tMax, conditions.size (), 0 , conditions.size ()));
375402 objs[&ooFT0TimeA] = [&]() { return ft0timeA; };
376403
@@ -573,6 +600,21 @@ struct fitQa {
573600 h.first ->object ->GetYaxis ()->SetBinLabel (c + 1 , conditions[c].title .c_str ());
574601 }
575602 }
603+ for (auto &h : objsft0) {
604+ for (size_t c = 0 ; c < ft0Conditions.size (); c++) {
605+ h.first ->object ->GetYaxis ()->SetBinLabel (c + 1 , ft0Conditions[c].title .c_str ());
606+ }
607+ }
608+ for (auto &h : objsfv0) {
609+ for (size_t c = 0 ; c < fv0Conditions.size (); c++) {
610+ h.first ->object ->GetYaxis ()->SetBinLabel (c + 1 , fv0Conditions[c].title .c_str ());
611+ }
612+ }
613+ for (auto &h : objsfdd) {
614+ for (size_t c = 0 ; c < fddConditions.size (); c++) {
615+ h.first ->object ->GetYaxis ()->SetBinLabel (c + 1 , fddConditions[c].title .c_str ());
616+ }
617+ }
576618 for (auto &h : objs2D) {
577619 for (size_t c = 0 ; c < conditions.size (); c++) {
578620 h.first ->object ->GetZaxis ()->SetBinLabel (c + 1 , conditions[c].title .c_str ());
@@ -607,10 +649,10 @@ struct fitQa {
607649
608650 if (hasFT0) {
609651 auto ft0 = collision.foundFT0 ();
610- std::bitset< 8 > ft0Triggers = ft0.triggerMask ();
611- isFT0VTX = ft0Triggers[o2::fit::Triggers::bitVertex];
612- isFT0CE = ft0Triggers[o2::fit::Triggers::bitCen];
613- isFT0SCE = ft0Triggers[o2::fit::Triggers::bitSCen];
652+ ft0Triggers = ft0.triggerMask ();
653+ // isFT0VTX = ft0Triggers[o2::fit::Triggers::bitVertex];
654+ // isFT0CE = ft0Triggers[o2::fit::Triggers::bitCen];
655+ // isFT0SCE = ft0Triggers[o2::fit::Triggers::bitSCen];
614656
615657 ft0timeA = ft0.timeA ();
616658 ft0timeC = ft0.timeC ();
@@ -632,10 +674,10 @@ struct fitQa {
632674
633675 if (hasFV0) {
634676 auto fv0 = collision.foundFV0 ();
635- std::bitset< 8 > fv0Triggers = fv0.triggerMask ();
636- isFV0ORA = fv0Triggers[o2::fit::Triggers::bitA];
637- isFV0CH = fv0Triggers[o2::fit::Triggers::bitTrgNchan];
638- isFV0IN = fv0Triggers[o2::fit::Triggers::bitAIn];
677+ fv0Triggers = fv0.triggerMask ();
678+ // isFV0ORA = fv0Triggers[o2::fit::Triggers::bitA];
679+ // isFV0CH = fv0Triggers[o2::fit::Triggers::bitTrgNchan];
680+ // isFV0IN = fv0Triggers[o2::fit::Triggers::bitAIn];
639681
640682 fv0time = fv0.time ();
641683
@@ -647,10 +689,10 @@ struct fitQa {
647689
648690 if (hasFDD) {
649691 auto fdd = collision.foundFDD ();
650- std::bitset< 8 > fddTriggers = fdd.triggerMask ();
651- isFDDORA = fddTriggers[o2::fit::Triggers::bitA];
652- isFDDORC = fddTriggers[o2::fit::Triggers::bitC];
653- isFDDVTX = fddTriggers[o2::fit::Triggers::bitVertex];
692+ fddTriggers = fdd.triggerMask ();
693+ // isFDDORA = fddTriggers[o2::fit::Triggers::bitA];
694+ // isFDDORC = fddTriggers[o2::fit::Triggers::bitC];
695+ // isFDDVTX = fddTriggers[o2::fit::Triggers::bitVertex];
654696
655697 fddtimeA = fdd.timeA ();
656698 fddtimeC = fdd.timeC ();
@@ -668,12 +710,15 @@ struct fitQa {
668710 }
669711 }
670712
671- isFT0VTXandFV0ORA = isFT0VTX && isFV0ORA;
672- isFT0VTXandFDDVTX = isFT0VTX && isFDDVTX;
713+ // isFT0VTXandFV0ORA = isFT0VTX && isFV0ORA;
714+ // isFT0VTXandFDDVTX = isFT0VTX && isFDDVTX;
673715
674716 /* Evaluate conditions and fill stats histo */
675717
676718 std::vector<bool > condResults (conditions.size (), false );
719+ std::vector<bool > ft0CondResults (ft0Conditions.size (), false );
720+ std::vector<bool > fv0CondResults (fv0Conditions.size (), false );
721+ std::vector<bool > fddCondResults (fddConditions.size (), false );
677722
678723 for (size_t c = 0 ; c < conditions.size (); c++) {
679724 condResults[c] = conditions[c].eval ();
@@ -682,6 +727,16 @@ struct fitQa {
682727 }
683728 }
684729
730+ for (size_t c = 0 ; c < ft0Conditions.size (); c++) {
731+ ft0CondResults[c] = ft0Conditions[c].eval ();
732+ }
733+ for (size_t c = 0 ; c < fv0Conditions.size (); c++) {
734+ fv0CondResults[c] = fv0Conditions[c].eval ();
735+ }
736+ for (size_t c = 0 ; c < fddConditions.size (); c++) {
737+ fddCondResults[c] = fddConditions[c].eval ();
738+ }
739+
685740 /* Fill histograms */
686741
687742 for (auto &h : objs) {
@@ -693,6 +748,33 @@ struct fitQa {
693748 }
694749 }
695750
751+ for (auto &h : objsft0) {
752+ float v = h.second ();
753+ for (size_t c = 0 ; c < ft0Conditions.size (); c++) {
754+ if (ft0CondResults[c]) {
755+ (*h.first )->Fill (v, c + 0 .5f );
756+ }
757+ }
758+ }
759+
760+ for (auto &h : objsfv0) {
761+ float v = h.second ();
762+ for (size_t c = 0 ; c < fv0Conditions.size (); c++) {
763+ if (fv0CondResults[c]) {
764+ (*h.first )->Fill (v, c + 0 .5f );
765+ }
766+ }
767+ }
768+
769+ for (auto &h : objsfdd) {
770+ float v = h.second ();
771+ for (size_t c = 0 ; c < fddConditions.size (); c++) {
772+ if (fddCondResults[c]) {
773+ (*h.first )->Fill (v, c + 0 .5f );
774+ }
775+ }
776+ }
777+
696778 for (auto &h : objs2D) {
697779 auto v = h.second ();
698780 for (size_t c = 0 ; c < conditions.size (); c++) {
0 commit comments