@@ -33,6 +33,9 @@ struct MultiplicityExtraTable {
3333 Produces<aod::MultsBC> multBC;
3434 Produces<aod::MultNeighs> multNeigh;
3535
36+ Produces<aod::Mults2BC> mult2bc;
37+ Produces<aod::BC2Mults> bc2mult;
38+
3639 // Allow for downscaling of BC table for less space use in derived data
3740 Configurable<float > bcDownscaleFactor{" bcDownscaleFactor" , 2 , " Downscale factor for BC table (0: save nothing, 1: save all)" };
3841 Configurable<float > minFT0CforBCTable{" minFT0CforBCTable" , 25 .0f , " Minimum FT0C amplitude to fill BC table to reduce data" };
@@ -59,117 +62,154 @@ struct MultiplicityExtraTable {
5962
6063 using BCsWithRun3Matchings = soa::Join<aod::BCs, aod::Timestamps, aod::Run3MatchedToBCSparse>;
6164
62- void processBCs (BCsWithRun3Matchings::iterator const & bc , aod::FV0As const &, aod::FT0s const &, aod::FDDs const &, aod::Zdcs const &)
65+ void processBCs (BCsWithRun3Matchings const & bcs , aod::FV0As const &, aod::FT0s const &, aod::FDDs const &, aod::Zdcs const &, aod::Collisions const & collisions )
6366 {
64- // downscale if requested to do so
65- if (bcDownscaleFactor < 1 .f && (static_cast <float >(rand_r (&randomSeed)) / static_cast <float >(RAND_MAX )) > bcDownscaleFactor) {
66- return ;
67- }
67+ // +-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+
68+ // determine saved BCs and corresponding new BC table index
69+ std::vector<int > newBCindex (bcs.size ());
70+ std::vector<int > bc2multArray (bcs.size ());
71+ int atIndex = 0 ;
72+ for (const auto & bc : bcs) {
73+ newBCindex[bc.globalIndex ()] = -1 ;
74+ bc2multArray[bc.globalIndex ()] = -1 ;
75+
76+ // downscale if requested to do so
77+ if (bcDownscaleFactor < 1 .f && (static_cast <float >(rand_r (&randomSeed)) / static_cast <float >(RAND_MAX )) > bcDownscaleFactor) {
78+ continue ;
79+ }
6880
69- bool Tvx = false ;
70- bool isFV0OrA = false ;
71- float multFT0C = 0 .f ;
72- float multFT0A = 0 .f ;
73- float multFV0A = 0 .f ;
74- float multFDDA = 0 .f ;
75- float multFDDC = 0 .f ;
76-
77- // ZDC amplitudes
78- float multZEM1 = -1 .f ;
79- float multZEM2 = -1 .f ;
80- float multZNA = -1 .f ;
81- float multZNC = -1 .f ;
82- float multZPA = -1 .f ;
83- float multZPC = -1 .f ;
84-
85- uint8_t multFT0TriggerBits = 0 ;
86- uint8_t multFV0TriggerBits = 0 ;
87- uint8_t multFDDTriggerBits = 0 ;
88- uint64_t multBCTriggerMask = bc.triggerMask ();
89-
90- // initialize - from Arvind
91- newRunNumber = bc.runNumber ();
92- int localBC = bc.globalBC () % nBCsPerOrbit;
93-
94- if (newRunNumber != oldRunNumber) {
95- auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration (ccdbApi, newRunNumber);
96- auto ts = soreor.first ;
97-
98- LOG (info) << " newRunNumber " << newRunNumber << " time stamp " << ts;
99- oldRunNumber = newRunNumber;
100- auto grplhcif = ccdb->getForTimeStamp <o2::parameters::GRPLHCIFData>(" GLO/Config/GRPLHCIF" , ts);
101- CollidingBunch = grplhcif->getBunchFilling ().getBCPattern ();
102- } // new run number
103-
104- bool collidingBC = CollidingBunch.test (localBC);
105-
106- if (bc.has_ft0 ()) {
107- auto ft0 = bc.ft0 ();
108- std::bitset<8 > triggers = ft0.triggerMask ();
109- Tvx = triggers[o2::fit::Triggers::bitVertex];
110- multFT0TriggerBits = static_cast <uint8_t >(triggers.to_ulong ());
111-
112- // calculate T0 charge
113- for (auto amplitude : ft0.amplitudeA ()) {
114- multFT0A += amplitude;
81+ float multFT0C = 0 .f ;
82+ if (bc.has_ft0 ()) {
83+ auto ft0 = bc.ft0 ();
84+ for (auto amplitude : ft0.amplitudeC ()) {
85+ multFT0C += amplitude;
86+ }
87+ } else {
88+ multFT0C = -999 .0f ;
11589 }
116- for (auto amplitude : ft0.amplitudeC ()) {
117- multFT0C += amplitude;
90+
91+ if (multFT0C < minFT0CforBCTable) {
92+ continue ; // skip this event
11893 }
119- } else {
120- multFT0A = -999 .0f ;
121- multFT0C = -999 .0f ;
94+ newBCindex[bc.globalIndex ()] = atIndex++;
12295 }
123- if (bc.has_fv0a ()) {
124- auto fv0 = bc.fv0a ();
125- std::bitset<8 > fV0Triggers = fv0.triggerMask ();
126- multFV0TriggerBits = static_cast <uint8_t >(fV0Triggers .to_ulong ());
96+ // +-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+
12797
128- for (auto amplitude : fv0.amplitude ()) {
129- multFV0A += amplitude;
130- }
131- isFV0OrA = fV0Triggers [o2::fit::Triggers::bitA];
132- } else {
133- multFV0A = -999 .0f ;
98+ // +-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+
99+ // interlink: collision -> valid BC, BC -> collision
100+ for (const auto & collision : collisions) {
101+ mult2bc (newBCindex[collision.bcId ()]);
102+ bc2multArray[collision.bcId ()] = collision.globalIndex ();
134103 }
104+ // +-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+
135105
136- if (bc. has_fdd () ) {
137- auto fdd = bc.fdd ();
138- std::bitset< 8 > fFDDTriggers = fdd. triggerMask ();
139- multFDDTriggerBits = static_cast < uint8_t >( fFDDTriggers . to_ulong ());
106+ for ( const auto & bc : bcs ) {
107+ if (newBCindex[ bc.globalIndex ()] < 0 ) {
108+ continue ; // don't keep if low mult or downsampled out
109+ }
140110
141- for (auto amplitude : fdd.chargeA ()) {
142- multFDDA += amplitude;
111+ bool Tvx = false ;
112+ bool isFV0OrA = false ;
113+ float multFT0C = 0 .f ;
114+ float multFT0A = 0 .f ;
115+ float multFV0A = 0 .f ;
116+ float multFDDA = 0 .f ;
117+ float multFDDC = 0 .f ;
118+
119+ // ZDC amplitudes
120+ float multZEM1 = -1 .f ;
121+ float multZEM2 = -1 .f ;
122+ float multZNA = -1 .f ;
123+ float multZNC = -1 .f ;
124+ float multZPA = -1 .f ;
125+ float multZPC = -1 .f ;
126+
127+ uint8_t multFT0TriggerBits = 0 ;
128+ uint8_t multFV0TriggerBits = 0 ;
129+ uint8_t multFDDTriggerBits = 0 ;
130+ uint64_t multBCTriggerMask = bc.triggerMask ();
131+
132+ // initialize - from Arvind
133+ newRunNumber = bc.runNumber ();
134+ int localBC = bc.globalBC () % nBCsPerOrbit;
135+
136+ if (newRunNumber != oldRunNumber) {
137+ auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration (ccdbApi, newRunNumber);
138+ auto ts = soreor.first ;
139+
140+ LOG (info) << " newRunNumber " << newRunNumber << " time stamp " << ts;
141+ oldRunNumber = newRunNumber;
142+ auto grplhcif = ccdb->getForTimeStamp <o2::parameters::GRPLHCIFData>(" GLO/Config/GRPLHCIF" , ts);
143+ CollidingBunch = grplhcif->getBunchFilling ().getBCPattern ();
144+ } // new run number
145+
146+ bool collidingBC = CollidingBunch.test (localBC);
147+
148+ if (bc.has_ft0 ()) {
149+ auto ft0 = bc.ft0 ();
150+ std::bitset<8 > triggers = ft0.triggerMask ();
151+ Tvx = triggers[o2::fit::Triggers::bitVertex];
152+ multFT0TriggerBits = static_cast <uint8_t >(triggers.to_ulong ());
153+
154+ // calculate T0 charge
155+ for (auto amplitude : ft0.amplitudeA ()) {
156+ multFT0A += amplitude;
157+ }
158+ for (auto amplitude : ft0.amplitudeC ()) {
159+ multFT0C += amplitude;
160+ }
161+ } else {
162+ multFT0A = -999 .0f ;
163+ multFT0C = -999 .0f ;
143164 }
144- for (auto amplitude : fdd.chargeC ()) {
145- multFDDC += amplitude;
165+ if (bc.has_fv0a ()) {
166+ auto fv0 = bc.fv0a ();
167+ std::bitset<8 > fV0Triggers = fv0.triggerMask ();
168+ multFV0TriggerBits = static_cast <uint8_t >(fV0Triggers .to_ulong ());
169+
170+ for (auto amplitude : fv0.amplitude ()) {
171+ multFV0A += amplitude;
172+ }
173+ isFV0OrA = fV0Triggers [o2::fit::Triggers::bitA];
174+ } else {
175+ multFV0A = -999 .0f ;
146176 }
147- } else {
148- multFDDA = -999 .0f ;
149- multFDDC = -999 .0f ;
150- }
151177
152- if (bc.has_zdc ()) {
153- multZNA = bc.zdc (). amplitudeZNA ();
154- multZNC = bc. zdc (). amplitudeZNC ();
155- multZEM1 = bc. zdc (). amplitudeZEM1 ( );
156- multZEM2 = bc. zdc (). amplitudeZEM2 ();
157- multZPA = bc. zdc (). amplitudeZPA ();
158- multZPC = bc. zdc (). amplitudeZPC () ;
159- } else {
160- multZNA = - 999 . f ;
161- multZNC = - 999 . f ;
162- multZEM1 = - 999 . f ;
163- multZEM2 = - 999 . f ;
164- multZPA = -999 .f ;
165- multZPC = -999 .f ;
166- }
178+ if (bc.has_fdd ()) {
179+ auto fdd = bc.fdd ();
180+ std::bitset< 8 > fFDDTriggers = fdd. triggerMask ();
181+ multFDDTriggerBits = static_cast < uint8_t >( fFDDTriggers . to_ulong () );
182+
183+ for ( auto amplitude : fdd. chargeA ()) {
184+ multFDDA += amplitude ;
185+ }
186+ for ( auto amplitude : fdd. chargeC ()) {
187+ multFDDC += amplitude ;
188+ }
189+ } else {
190+ multFDDA = -999 .0f ;
191+ multFDDC = -999 .0f ;
192+ }
167193
168- if (multFT0C < minFT0CforBCTable) {
169- return ; // skip this event
170- }
194+ if (bc.has_zdc ()) {
195+ multZNA = bc.zdc ().amplitudeZNA ();
196+ multZNC = bc.zdc ().amplitudeZNC ();
197+ multZEM1 = bc.zdc ().amplitudeZEM1 ();
198+ multZEM2 = bc.zdc ().amplitudeZEM2 ();
199+ multZPA = bc.zdc ().amplitudeZPA ();
200+ multZPC = bc.zdc ().amplitudeZPC ();
201+ } else {
202+ multZNA = -999 .f ;
203+ multZNC = -999 .f ;
204+ multZEM1 = -999 .f ;
205+ multZEM2 = -999 .f ;
206+ multZPA = -999 .f ;
207+ multZPC = -999 .f ;
208+ }
171209
172- multBC (multFT0A, multFT0C, multFV0A, multFDDA, multFDDC, multZNA, multZNC, multZEM1, multZEM2, multZPA, multZPC, Tvx, isFV0OrA, multFV0TriggerBits, multFT0TriggerBits, multFDDTriggerBits, multBCTriggerMask, collidingBC);
210+ bc2mult (bc2multArray[bc.globalIndex ()]);
211+ multBC (multFT0A, multFT0C, multFV0A, multFDDA, multFDDC, multZNA, multZNC, multZEM1, multZEM2, multZPA, multZPC, Tvx, isFV0OrA, multFV0TriggerBits, multFT0TriggerBits, multFDDTriggerBits, multBCTriggerMask, collidingBC);
212+ }
173213 }
174214
175215 void processCollisionNeighbors (aod::Collisions const & collisions)
0 commit comments