@@ -61,6 +61,8 @@ static const std::vector<std::string> tableNames{
6161 " FT0MultZeqs" ,
6262 " FDDMultZeqs" ,
6363 " PVMultZeqs" ,
64+ " GlobalMultZeqs" ,
65+ " MFTMultZeqs" ,
6466 " MultMCExtras" ,
6567 " Mult2MCExtras" ,
6668 " MFTMults" ,
@@ -86,7 +88,7 @@ static const std::vector<std::string> tableNames{
8688 " BCCentFT0As" ,
8789 " BCCentFT0Cs" };
8890
89- static constexpr int nTablesConst = 36 ;
91+ static constexpr int nTablesConst = 38 ;
9092
9193static const std::vector<std::string> parameterNames{" enable" };
9294static const int defaultParameters[nTablesConst][nParameters]{
@@ -125,6 +127,8 @@ static const int defaultParameters[nTablesConst][nParameters]{
125127 {-1 },
126128 {-1 },
127129 {-1 },
130+ {-1 },
131+ {-1 },
128132 {-1 }};
129133
130134// table index : match order above
@@ -142,6 +146,8 @@ enum tableIndex { kFV0Mults, // standard
142146 kFT0MultZeqs , // zeq calib, standard
143147 kFDDMultZeqs , // zeq calib, standard
144148 kPVMultZeqs , // zeq calib, standard
149+ kGlobalMultZeqs , // zeq calib, extra
150+ kMFTMultZeqs , // zeq calib, extra
145151 kMultMCExtras , // MC exclusive
146152 kMult2MCExtras , // MC exclusive
147153 kMFTMults , // requires MFT task
@@ -185,6 +191,8 @@ struct products : o2::framework::ProducesGroup {
185191 o2::framework::Produces<aod::FT0MultZeqs> tableFT0Zeqs;
186192 o2::framework::Produces<aod::FDDMultZeqs> tableFDDZeqs;
187193 o2::framework::Produces<aod::PVMultZeqs> tablePVZeqs;
194+ o2::framework::Produces<aod::GlobalMultZeqs> tableNGlobalZeqs;
195+ o2::framework::Produces<aod::MFTMultZeqs> tableNMFTZeqs;
188196 o2::framework::Produces<aod::MultMCExtras> tableExtraMc;
189197 o2::framework::Produces<aod::Mult2MCExtras> tableExtraMult2MCExtras;
190198 o2::framework::Produces<aod::MFTMults> mftMults;
@@ -256,6 +264,8 @@ struct multEntry {
256264 float multFDDAZeq = -999 .0f ;
257265 float multFDDCZeq = -999 .0f ;
258266 float multNContribsZeq = 0 ;
267+ float multMFTTracksZeq = 0 ;
268+ float multGlobalTracksZeq = 0 ;
259269
260270 int multGlobalTracks = 0 ; // multsGlobal
261271 int multNbrContribsEta05GlobalTrackWoDCA = 0 ; // multsGlobal
@@ -317,6 +327,8 @@ class MultModule
317327 hVtxZFDDA = nullptr ;
318328 hVtxZFDDC = nullptr ;
319329 hVtxZNTracks = nullptr ;
330+ hVtxZNMFTTracks = nullptr ;
331+ hVtxZNGlobalTracks = nullptr ;
320332 }
321333
322334 // internal: calib related, vtx-z profiles
@@ -330,6 +342,8 @@ class MultModule
330342 TProfile* hVtxZFDDA;
331343 TProfile* hVtxZFDDC;
332344 TProfile* hVtxZNTracks;
345+ TProfile* hVtxZNMFTTracks; // non-legacy, added August/2025
346+ TProfile* hVtxZNGlobalTracks; // non-legacy, added August/2025
333347
334348 // declaration of structs here
335349 // (N.B.: will be invisible to the outside, create your own copies)
@@ -469,15 +483,28 @@ class MultModule
469483 internalOpts.mEnabledTables [kMFTMults ] = 1 ;
470484 listOfRequestors[kMFTMults ].Append (Form (" %s " , " dependency check" ));
471485 }
486+ if (internalOpts.mEnabledTables [kCentMFTs ] && !internalOpts.mEnabledTables [kMFTMultZeqs ]) {
487+ internalOpts.mEnabledTables [kMFTMultZeqs ] = 1 ;
488+ listOfRequestors[kMFTMultZeqs ].Append (Form (" %s " , " dependency check" ));
489+ }
472490 if (internalOpts.mEnabledTables [kCentNGlobals ] && !internalOpts.mEnabledTables [kMultsGlobal ]) {
473491 internalOpts.mEnabledTables [kMultsGlobal ] = 1 ;
474492 listOfRequestors[kMultsGlobal ].Append (Form (" %s " , " dependency check" ));
475493 }
494+ if (internalOpts.mEnabledTables [kCentNGlobals ] && !internalOpts.mEnabledTables [kGlobalMultZeqs ]) {
495+ internalOpts.mEnabledTables [kGlobalMultZeqs ] = 1 ;
496+ listOfRequestors[kGlobalMultZeqs ].Append (Form (" %s " , " dependency check" ));
497+ }
476498 if (internalOpts.embedINELgtZEROselection .value > 0 && !internalOpts.mEnabledTables [kPVMults ]) {
477499 internalOpts.mEnabledTables [kPVMults ] = 1 ;
478500 listOfRequestors[kPVMults ].Append (Form (" %s " , " dependency check" ));
479501 }
480502
503+ // capture the need for PYTHIA calibration in Pb-Pb runs
504+ if (metadataInfo.isMC () && mRunNumber >= 544013 && mRunNumber <= 545367 ) {
505+ internalOpts.generatorName .value = " PYTHIA" ;
506+ }
507+
481508 // list enabled tables
482509 for (int i = 0 ; i < nTablesConst; i++) {
483510 // printout to be improved in the future
@@ -486,11 +513,6 @@ class MultModule
486513 }
487514 }
488515
489- // capture the need for PYTHIA calibration in Pb-Pb runs
490- if (metadataInfo.isMC () && mRunNumber >= 544013 && mRunNumber <= 545367 ) {
491- internalOpts.generatorName .value = " PYTHIA" ;
492- }
493-
494516 mRunNumber = 0 ;
495517 mRunNumberCentrality = 0 ;
496518 lCalibLoaded = false ;
@@ -500,8 +522,9 @@ class MultModule
500522 hVtxZFDDA = nullptr ;
501523 hVtxZFDDC = nullptr ;
502524 hVtxZNTracks = nullptr ;
525+ hVtxZNMFTTracks = nullptr ;
526+ hVtxZNGlobalTracks = nullptr ;
503527
504- // pass to the outside
505528 opts = internalOpts;
506529 }
507530
@@ -632,12 +655,20 @@ class MultModule
632655 hVtxZFDDA = static_cast <TProfile*>(lCalibObjects->FindObject (" hVtxZFDDA" ));
633656 hVtxZFDDC = static_cast <TProfile*>(lCalibObjects->FindObject (" hVtxZFDDC" ));
634657 hVtxZNTracks = static_cast <TProfile*>(lCalibObjects->FindObject (" hVtxZNTracksPV" ));
658+ hVtxZNMFTTracks = static_cast <TProfile*>(lCalibObjects->FindObject (" hVtxZMFT" ));
659+ hVtxZNGlobalTracks = static_cast <TProfile*>(lCalibObjects->FindObject (" hVtxZNGlobals" ));
635660 lCalibLoaded = true ;
636661 // Capture error
637662 if (!hVtxZFV0A || !hVtxZFT0A || !hVtxZFT0C || !hVtxZFDDA || !hVtxZFDDC || !hVtxZNTracks) {
638663 LOGF (error, " Problem loading CCDB objects! Please check" );
639664 lCalibLoaded = false ;
640665 }
666+ if (!hVtxZNMFTTracks) {
667+ LOGF (info, " MFT track counter: vertex-Z calibration not loaded, will run without." );
668+ }
669+ if (!hVtxZNGlobalTracks) {
670+ LOGF (info, " Global track counter: vertex-Z calibration not loaded, will run without." );
671+ }
641672 } else {
642673 LOGF (error, " Problem loading CCDB object! Please check" );
643674 lCalibLoaded = false ;
@@ -722,17 +753,17 @@ class MultModule
722753 }
723754
724755 // _______________________________________________________________________
725- // forward detector signals, vertex-Z equalized
756+ // vertex-Z equalized signals
726757 if (internalOpts.mEnabledTables [kFV0MultZeqs ]) {
727- if (std::fabs (collision.posZ () && lCalibLoaded) ) {
758+ if (std::fabs (collision.posZ ()) < 15 . 0f && lCalibLoaded) {
728759 mults.multFV0AZeq = hVtxZFV0A->Interpolate (0.0 ) * mults.multFV0A / hVtxZFV0A->Interpolate (collision.posZ ());
729760 } else {
730761 mults.multFV0AZeq = 0 .0f ;
731762 }
732763 cursors.tableFV0Zeqs (mults.multFV0AZeq );
733764 }
734765 if (internalOpts.mEnabledTables [kFT0MultZeqs ]) {
735- if (std::fabs (collision.posZ () && lCalibLoaded) ) {
766+ if (std::fabs (collision.posZ ()) < 15 . 0f && lCalibLoaded) {
736767 mults.multFT0AZeq = hVtxZFT0A->Interpolate (0.0 ) * mults.multFT0A / hVtxZFT0A->Interpolate (collision.posZ ());
737768 mults.multFT0CZeq = hVtxZFT0C->Interpolate (0.0 ) * mults.multFT0C / hVtxZFT0C->Interpolate (collision.posZ ());
738769 } else {
@@ -742,7 +773,7 @@ class MultModule
742773 cursors.tableFT0Zeqs (mults.multFT0AZeq , mults.multFT0CZeq );
743774 }
744775 if (internalOpts.mEnabledTables [kFDDMultZeqs ]) {
745- if (std::fabs (collision.posZ () && lCalibLoaded) ) {
776+ if (std::fabs (collision.posZ ()) < 15 . 0f && lCalibLoaded) {
746777 mults.multFDDAZeq = hVtxZFDDA->Interpolate (0.0 ) * mults.multFDDA / hVtxZFDDA->Interpolate (collision.posZ ());
747778 mults.multFDDCZeq = hVtxZFDDC->Interpolate (0.0 ) * mults.multFDDC / hVtxZFDDC->Interpolate (collision.posZ ());
748779 } else {
@@ -754,7 +785,7 @@ class MultModule
754785
755786 // _______________________________________________________________________
756787 // determine if barrel track loop is required, do it (once!) if so but save CPU if not
757- if (internalOpts.mEnabledTables [kTPCMults ] || internalOpts.mEnabledTables [kPVMults ] || internalOpts.mEnabledTables [kMultsExtra ] || internalOpts.mEnabledTables [kPVMultZeqs ] || internalOpts.mEnabledTables [kMultsGlobal ]) {
788+ if (internalOpts.mEnabledTables [kTPCMults ] || internalOpts.mEnabledTables [kPVMults ] || internalOpts.mEnabledTables [kMultsExtra ] || internalOpts.mEnabledTables [kPVMultZeqs ] || internalOpts.mEnabledTables [kMultsGlobal ] || internalOpts. mEnabledTables [ kGlobalMultZeqs ] ) {
758789 // single loop to calculate all
759790 for (const auto & track : tracks) {
760791 if (track.hasTPC ()) {
@@ -822,6 +853,17 @@ class MultModule
822853 }
823854
824855 cursors.multsGlobal (mults.multGlobalTracks , mults.multNbrContribsEta08GlobalTrackWoDCA , mults.multNbrContribsEta10GlobalTrackWoDCA , mults.multNbrContribsEta05GlobalTrackWoDCA );
856+
857+ if (!hVtxZNGlobalTracks || std::fabs (collision.posZ ()) > 15 .0f ) {
858+ mults.multGlobalTracksZeq = mults.multGlobalTracks ; // if no equalization available, don't do it
859+ } else {
860+ mults.multGlobalTracksZeq = hVtxZNGlobalTracks->Interpolate (0.0 ) * mults.multFT0C / hVtxZNGlobalTracks->Interpolate (collision.posZ ());
861+ }
862+
863+ // provide vertex-Z equalized Nglobals (or non-equalized if missing or beyond range)
864+ if (internalOpts.mEnabledTables [kGlobalMultZeqs ]) {
865+ cursors.tableNGlobalZeqs (mults.multGlobalTracksZeq );
866+ }
825867 }
826868
827869 // fill track counters at this stage if requested
@@ -842,7 +884,7 @@ class MultModule
842884 collision.flags ());
843885 }
844886 if (internalOpts.mEnabledTables [kPVMultZeqs ]) {
845- if (std::fabs (collision.posZ ()) && lCalibLoaded) {
887+ if (std::fabs (collision.posZ ()) < 15 . 0f && lCalibLoaded) {
846888 mults.multNContribsZeq = hVtxZNTracks->Interpolate (0.0 ) * mults.multNContribs / hVtxZNTracks->Interpolate (collision.posZ ());
847889 } else {
848890 mults.multNContribsZeq = 0 .0f ;
@@ -934,6 +976,18 @@ class MultModule
934976 cursors.mftMults (nAllTracks, nTracks);
935977 mults[collision.globalIndex ()].multMFTAllTracks = nAllTracks;
936978 mults[collision.globalIndex ()].multMFTTracks = nTracks;
979+
980+ // vertex-Z equalized MFT
981+ if (!hVtxZNMFTTracks || std::fabs (collision.posZ ()) > 15 .0f ) {
982+ mults[collision.globalIndex ()].multMFTTracksZeq = mults[collision.globalIndex ()].multMFTTracks ; // if no equalization available, don't do it
983+ } else {
984+ mults[collision.globalIndex ()].multMFTTracksZeq = hVtxZNMFTTracks->Interpolate (0.0 ) * mults[collision.globalIndex ()].multMFTTracks / hVtxZNMFTTracks->Interpolate (collision.posZ ());
985+ }
986+
987+ // provide vertex-Z equalized Nglobals (or non-equalized if missing or beyond range)
988+ if (internalOpts.mEnabledTables [kMFTMultZeqs ]) {
989+ cursors.tableNMFTZeqs (mults[collision.globalIndex ()].multMFTTracksZeq );
990+ }
937991 }
938992
939993 // __________________________________________________
@@ -1225,9 +1279,9 @@ class MultModule
12251279 if (internalOpts.mEnabledTables [kCentNTPVs ])
12261280 populateTable (cursors.centNTPV , ntpvInfo, mults[iEv].multNContribs , isInelGt0);
12271281 if (internalOpts.mEnabledTables [kCentNGlobals ])
1228- populateTable (cursors.centNGlobals , nGlobalInfo, mults[iEv].multGlobalTracks , isInelGt0);
1282+ populateTable (cursors.centNGlobals , nGlobalInfo, mults[iEv].multGlobalTracksZeq , isInelGt0);
12291283 if (internalOpts.mEnabledTables [kCentMFTs ])
1230- populateTable (cursors.centMFTs , mftInfo, mults[iEv].multMFTTracks , isInelGt0);
1284+ populateTable (cursors.centMFTs , mftInfo, mults[iEv].multMFTTracksZeq , isInelGt0);
12311285 }
12321286
12331287 // populate centralities per BC
0 commit comments