88// In applying this license CERN does not waive the privileges and immunities
99// granted to it by virtue of its status as an Intergovernmental Organization
1010// or submit itself to any jurisdiction.
11+
12+ // /
13+ // / \file multiplicityExtraTable.cxx
14+ // / \brief This tasks produces BC based multiplicity tables
15+ // / \author David Dobrigkeit Chinellato and Jesper Karlsson Gumprecht
16+ // /
17+
1118#include " Common/DataModel/EventSelection.h"
1219#include " Common/DataModel/Multiplicity.h"
1320
@@ -43,6 +50,7 @@ struct MultiplicityExtraTable {
4350 Produces<aod::MultBCs> multBC;
4451 Produces<aod::MultBcSel> multBcSel;
4552 Produces<aod::MultNeighs> multNeigh;
53+ Produces<aod::TimeBCs> timeBC;
4654
4755 Produces<aod::Mults2BC> mult2bc;
4856 Produces<aod::BC2Mults> bc2mult;
@@ -59,17 +67,19 @@ struct MultiplicityExtraTable {
5967
6068 float tru (float value)
6169 {
62- if (bcTableFloatPrecision < 1e-4 )
70+ static constexpr float PrecisionThreshold = 1e-4 ;
71+ if (bcTableFloatPrecision < PrecisionThreshold) {
6372 return value; // make sure nothing bad happens in case zero (best precision)
73+ }
6474 return bcTableFloatPrecision * std::round (value / bcTableFloatPrecision) + 0 .5f * bcTableFloatPrecision;
6575 };
6676
6777 // needed for downscale
6878 unsigned int randomSeed = 0 ;
6979
7080 o2::ccdb::CcdbApi ccdbApi;
71- Service<o2::ccdb::BasicCCDBManager> ccdb;
72- BCPattern CollidingBunch ;
81+ Service<o2::ccdb::BasicCCDBManager> ccdb{} ;
82+ BCPattern collidingBunch ;
7383
7484 int newRunNumber = -999 ;
7585 int oldRunNumber = -999 ;
@@ -116,7 +126,7 @@ struct MultiplicityExtraTable {
116126 float multFT0C = 0 .f ;
117127 if (bc.has_ft0 ()) {
118128 auto ft0 = bc.ft0 ();
119- for (auto amplitude : ft0.amplitudeC ()) {
129+ for (const auto amplitude : ft0.amplitudeC ()) {
120130 multFT0C += amplitude;
121131 }
122132 } else {
@@ -148,7 +158,7 @@ struct MultiplicityExtraTable {
148158 continue ; // don't keep if low mult or downsampled out
149159 }
150160
151- bool Tvx = false ;
161+ bool tvx = false ;
152162 bool isFV0OrA = false ;
153163 float multFT0C = 0 .f ;
154164 float multFT0A = 0 .f ;
@@ -166,6 +176,16 @@ struct MultiplicityExtraTable {
166176 float multZPA = -1 .f ;
167177 float multZPC = -1 .f ;
168178
179+ // FT0 and ZDC time
180+ float timeFT0A = -1e+3 ;
181+ float timeFT0C = -1e+3 ;
182+ float timeFDDA = -1e+3 ;
183+ float timeFDDC = -1e+3 ;
184+ float timeZNA = -1e+3 ;
185+ float timeZNC = -1e+3 ;
186+ float timeZPA = -1e+3 ;
187+ float timeZPC = -1e+3 ;
188+
169189 float posZFT0 = -1e+3 ;
170190 bool posZFT0valid = false ;
171191
@@ -185,32 +205,37 @@ struct MultiplicityExtraTable {
185205 LOG (info) << " newRunNumber " << newRunNumber << " time stamp " << ts;
186206 oldRunNumber = newRunNumber;
187207 auto grplhcif = ccdb->getForTimeStamp <o2::parameters::GRPLHCIFData>(" GLO/Config/GRPLHCIF" , ts);
188- CollidingBunch = grplhcif->getBunchFilling ().getBCPattern ();
208+ collidingBunch = grplhcif->getBunchFilling ().getBCPattern ();
189209 } // new run number
190210
191- bool collidingBC = CollidingBunch .test (localBC);
211+ bool collidingBC = collidingBunch .test (localBC);
192212
193213 if (bc.has_ft0 ()) {
194214 const auto & ft0 = bc.ft0 ();
195215 std::bitset<8 > triggers = ft0.triggerMask ();
196- Tvx = triggers[o2::fit::Triggers::bitVertex];
216+ tvx = triggers[o2::fit::Triggers::bitVertex];
197217 multFT0TriggerBits = static_cast <uint8_t >(triggers.to_ulong ());
198218
199219 // calculate T0 charge
200220 for (size_t ii = 0 ; ii < ft0.amplitudeA ().size (); ++ii) {
201221 multFT0A += ft0.amplitudeA ()[ii];
202- if (ft0.channelA ()[ii] > 31 ) {
222+ static constexpr int MaxChannelIdInnerRingFT0A = 31 ;
223+ if (ft0.channelA ()[ii] > MaxChannelIdInnerRingFT0A) {
203224 multFT0AOuter += ft0.amplitudeA ()[ii];
204225 }
205226 }
206- for (auto amplitude : ft0.amplitudeC ()) {
227+ for (const auto amplitude : ft0.amplitudeC ()) {
207228 multFT0C += amplitude;
208229 }
209230 posZFT0 = ft0.posZ ();
210231 posZFT0valid = ft0.isValidTime ();
232+ timeFT0A = ft0.timeC ();
233+ timeFT0C = ft0.timeA ();
211234 } else {
212235 multFT0A = -999 .0f ;
213236 multFT0C = -999 .0f ;
237+ timeFT0A = -999 .0f ;
238+ timeFT0C = -999 .0f ;
214239 }
215240 if (bc.has_fv0a ()) {
216241 auto fv0 = bc.fv0a ();
@@ -221,7 +246,8 @@ struct MultiplicityExtraTable {
221246 auto amplitude = fv0.amplitude ()[ii];
222247 auto channel = fv0.channel ()[ii];
223248 multFV0A += amplitude;
224- if (channel > 7 ) {
249+ static constexpr int MaxChannelIdInnerRingFV0 = 7 ;
250+ if (channel > MaxChannelIdInnerRingFV0) {
225251 multFV0AOuter += amplitude;
226252 }
227253 }
@@ -235,15 +261,20 @@ struct MultiplicityExtraTable {
235261 std::bitset<8 > fFDDTriggers = fdd.triggerMask ();
236262 multFDDTriggerBits = static_cast <uint8_t >(fFDDTriggers .to_ulong ());
237263
238- for (auto amplitude : fdd.chargeA ()) {
264+ for (const auto amplitude : fdd.chargeA ()) {
239265 multFDDA += amplitude;
240266 }
241- for (auto amplitude : fdd.chargeC ()) {
267+ for (const auto amplitude : fdd.chargeC ()) {
242268 multFDDC += amplitude;
243269 }
270+
271+ timeFDDA = fdd.timeA ();
272+ timeFDDC = fdd.timeC ();
244273 } else {
245274 multFDDA = -999 .0f ;
246275 multFDDC = -999 .0f ;
276+ timeFDDA = -999 .0f ;
277+ timeFDDC = -999 .0f ;
247278 }
248279
249280 if (bc.has_zdc ()) {
@@ -253,13 +284,19 @@ struct MultiplicityExtraTable {
253284 multZEM2 = bc.zdc ().amplitudeZEM2 ();
254285 multZPA = bc.zdc ().amplitudeZPA ();
255286 multZPC = bc.zdc ().amplitudeZPC ();
287+ timeZPA = bc.zdc ().timeZPA ();
288+ timeZPC = bc.zdc ().timeZPC ();
256289 } else {
257290 multZNA = -999 .f ;
258291 multZNC = -999 .f ;
259292 multZEM1 = -999 .f ;
260293 multZEM2 = -999 .f ;
261294 multZPA = -999 .f ;
262295 multZPC = -999 .f ;
296+ timeZNA = -999 .f ;
297+ timeZNC = -999 .f ;
298+ timeZPA = -999 .f ;
299+ timeZPC = -999 .f ;
263300 }
264301
265302 bc2mult (bc2multArray[bc.globalIndex ()]);
@@ -290,8 +327,18 @@ struct MultiplicityExtraTable {
290327 multFDDTriggerBits,
291328 multBCTriggerMask,
292329 collidingBC,
293- Tvx ,
330+ tvx ,
294331 isFV0OrA);
332+
333+ timeBC (
334+ timeFT0A,
335+ timeFT0C,
336+ timeFDDA,
337+ timeFDDC,
338+ timeZNA,
339+ timeZNC,
340+ timeZPA,
341+ timeZPC);
295342 }
296343 }
297344
@@ -307,16 +354,24 @@ struct MultiplicityExtraTable {
307354 float deltaPrevious = 1e+6 , deltaPrePrevious = 1e+6 ;
308355 float deltaNext = 1e+6 , deltaNeNext = 1e+6 ;
309356 for (const auto & collision : collisions) {
310- int ii = collision.globalIndex ();
311-
312- if (ii - 1 >= 0 )
313- deltaPrevious = timeArray[ii] - timeArray[ii - 1 ];
314- if (ii - 2 >= 0 )
315- deltaPrePrevious = timeArray[ii] - timeArray[ii - 2 ];
316- if (ii + 1 < collisions.size ())
317- deltaNext = timeArray[ii + 1 ] - timeArray[ii];
318- if (ii + 2 < collisions.size ())
319- deltaNeNext = timeArray[ii + 2 ] - timeArray[ii];
357+ const int thisCollision = collision.globalIndex ();
358+ const int prevCollision = thisCollision - 1 ;
359+ const int prevPrevCollision = thisCollision - 2 ;
360+ const int nextCollision = thisCollision + 1 ;
361+ const int nextNextCollision = thisCollision + 2 ;
362+
363+ if (prevCollision >= 0 ) {
364+ deltaPrevious = timeArray[thisCollision] - timeArray[prevCollision];
365+ }
366+ if (prevPrevCollision >= 0 ) {
367+ deltaPrePrevious = timeArray[thisCollision] - timeArray[prevPrevCollision];
368+ }
369+ if (nextCollision < collisions.size ()) {
370+ deltaNext = timeArray[nextCollision] - timeArray[thisCollision];
371+ }
372+ if (nextNextCollision < collisions.size ()) {
373+ deltaNeNext = timeArray[nextNextCollision] - timeArray[thisCollision];
374+ }
320375
321376 multNeigh (deltaPrePrevious, deltaPrevious, deltaNext, deltaNeNext);
322377 }
@@ -342,5 +397,5 @@ struct MultiplicityExtraTable {
342397
343398WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
344399{
345- return WorkflowSpec{adaptAnalysisTask<MultiplicityExtraTable>(cfgc, TaskName{ " multiplicity-extra-table " } )};
400+ return WorkflowSpec{adaptAnalysisTask<MultiplicityExtraTable>(cfgc)};
346401}
0 commit comments