4949#include " DataFormatsParameters/GRPObject.h"
5050#include " DataFormatsParameters/GRPMagField.h"
5151#include " CCDB/BasicCCDBManager.h"
52+ #include " DataFormatsCalibration/MeanVertexObject.h"
5253#include " CommonConstants/PhysicsConstants.h"
5354#include " Common/TableProducer/PID/pidTOFBase.h"
5455#include " Common/DataModel/PIDResponse.h"
@@ -75,6 +76,9 @@ struct lambdakzeropid {
7576
7677 Service<o2::ccdb::BasicCCDBManager> ccdb;
7778
79+ // mean vertex position to be used if no collision associated
80+ o2::dataformats::MeanVertexObject* mVtx = nullptr ;
81+
7882 // For manual sliceBy
7983 Preslice<V0OriginalDatas> perCollisionOriginal = o2::aod::v0data::collisionId;
8084 ;
@@ -100,6 +104,11 @@ struct lambdakzeropid {
100104 Configurable<std::string> lutPath{" lutPath" , " GLO/Param/MatLUT" , " Path of the Lut parametrization" };
101105 Configurable<std::string> geoPath{" geoPath" , " GLO/Config/GeometryAligned" , " Path of the geometry file" };
102106 Configurable<std::string> nSigmaPath{" nSigmaPath" , " Users/d/ddobrigk/stratof" , " Path of information for n-sigma calculation" };
107+ Configurable<std::string> mVtxPath {" mVtxPath" , " GLO/Calib/MeanVertex" , " Path of the mean vertex file" };
108+
109+ // manual
110+ Configurable<int > manualRunNumber{" manualRunNumber" , 544122 , " manual run number if no collisions saved" };
111+ Configurable<uint64_t > manualTimeStamp{" manualTimeStamp" , 1696549226920 , " manual time stamp if no collisions saved" };
103112
104113 ConfigurableAxis axisEta{" axisEta" , {20 , -1 .0f , +1 .0f }, " #eta" };
105114 ConfigurableAxis axisDeltaTime{" axisDeltaTime" , {2000 , -1000 .0f , +1000 .0f }, " delta-time (ps)" };
@@ -318,10 +327,9 @@ struct lambdakzeropid {
318327 }
319328 }
320329
321- template <typename TInformationClass>
322- void initCCDB (TInformationClass const & infoObject)
330+ void initCCDB (int runNumber, uint64_t timeStamp)
323331 {
324- if (mRunNumber == infoObject. runNumber () ) {
332+ if (mRunNumber == runNumber) {
325333 return ;
326334 }
327335
@@ -333,11 +341,12 @@ struct lambdakzeropid {
333341 grpmag.setL3Current (30000 .f / (d_bz / 5 .0f ));
334342 }
335343 o2::base::Propagator::initFieldFromGRP (&grpmag);
336- mRunNumber = infoObject.runNumber ();
344+ mVtx = ccdb->getForTimeStamp <o2::dataformats::MeanVertexObject>(mVtxPath , timeStamp);
345+ mRunNumber = runNumber;
337346 return ;
338347 }
339348
340- auto run3grp_timestamp = infoObject. timestamp () ;
349+ auto run3grp_timestamp = timeStamp ;
341350 o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp <o2::parameters::GRPObject>(grpPath, run3grp_timestamp);
342351 o2::parameters::GRPMagField* grpmag = 0x0 ;
343352 if (grpo) {
@@ -353,12 +362,13 @@ struct lambdakzeropid {
353362 o2::base::Propagator::initFieldFromGRP (grpmag);
354363 // Fetch magnetic field from ccdb for current collision
355364 d_bz = std::lround (5 .f * grpmag->getL3Current () / 30000 .f );
365+ mVtx = ccdb->getForTimeStamp <o2::dataformats::MeanVertexObject>(mVtxPath , timeStamp);
356366 LOG (info) << " Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG" ;
357367 }
358368
359369 // if TOF Nsigma desired
360370 if (doNSigmas) {
361- nSigmaCalibObjects = ccdb->getForTimeStamp <TList>(nSigmaPath, infoObject. timestamp () );
371+ nSigmaCalibObjects = ccdb->getForTimeStamp <TList>(nSigmaPath, timeStamp );
362372 if (nSigmaCalibObjects) {
363373 LOGF (info, " loaded TList with this many objects: %i" , nSigmaCalibObjects->GetEntries ());
364374
@@ -393,7 +403,7 @@ struct lambdakzeropid {
393403 }
394404 }
395405 }
396- mRunNumber = infoObject. runNumber () ;
406+ mRunNumber = runNumber;
397407 }
398408
399409 float velocity (float lMomentum, float lMass)
@@ -409,7 +419,7 @@ struct lambdakzeropid {
409419 void processV0Candidate (TCollision const & collision, TV0 const & v0, TTrack const & pTra, TTrack const & nTra)
410420 {
411421 // time of V0 segment
412- float lengthV0 = std::hypot (v0.x () - collision.posX (), v0.y () - collision.posY (), v0.z () - collision.posZ ());
422+ float lengthV0 = std::hypot (v0.x () - collision.getX (), v0.y () - collision.getY (), v0.z () - collision.getZ ());
413423 float velocityK0Short = velocity (v0.p (), o2::constants::physics::MassKaonNeutral);
414424 float velocityLambda = velocity (v0.p (), o2::constants::physics::MassLambda);
415425 float timeK0Short = lengthV0 / velocityK0Short; // in picoseconds
@@ -460,14 +470,14 @@ struct lambdakzeropid {
460470 // calculate and pack properties for QA purposes
461471 int posProperties = 0 ;
462472 if (lengthPositive > 0 )
463- posProperties = posProperties | (int (1 ) << kLength );
473+ posProperties = posProperties | (static_cast < int > (1 ) << kLength );
464474 if (pTra.hasTOF ())
465- posProperties = posProperties | (int (1 ) << kHasTOF );
475+ posProperties = posProperties | (static_cast < int > (1 ) << kHasTOF );
466476 int negProperties = 0 ;
467477 if (lengthNegative > 0 )
468- negProperties = negProperties | (int (1 ) << kLength );
478+ negProperties = negProperties | (static_cast < int > (1 ) << kLength );
469479 if (nTra.hasTOF ())
470- negProperties = negProperties | (int (1 ) << kHasTOF );
480+ negProperties = negProperties | (static_cast < int > (1 ) << kHasTOF );
471481
472482 histos.fill (HIST (" h2dPositiveTOFProperties" ), v0.pt (), posProperties);
473483 histos.fill (HIST (" h2dNegativeTOFProperties" ), v0.pt (), negProperties);
@@ -582,43 +592,57 @@ struct lambdakzeropid {
582592
583593 void processStandardData (aod::Collisions const & collisions, V0OriginalDatas const & V0s, TracksWithAllExtras const &, aod::BCsWithTimestamps const & /* bcs*/ )
584594 {
585- auto collision = collisions.begin ();
586- auto bc = collision.bc_as <aod::BCsWithTimestamps>();
587- // Fire up CCDB - based on standard collisions
588- initCCDB (bc);
589- for (const auto & collision : collisions) {
590- // Do analysis with collision-grouped V0s, retain full collision information
591- const uint64_t collIdx = collision.globalIndex ();
592- auto V0Table_thisCollision = V0s.sliceBy (perCollisionOriginal, collIdx);
593- histos.fill (HIST (" hCandidateCounter" ), V0Table_thisCollision.size ());
594- // V0 table sliced
595- for (auto const & v0 : V0Table_thisCollision) {
596- // de-reference interlinks by hand for derived data
597- auto pTra = v0.posTrack_as <TracksWithAllExtras>();
598- auto nTra = v0.negTrack_as <TracksWithAllExtras>();
599-
600- processV0Candidate (collision, v0, pTra, nTra);
595+ // Fire up CCDB with first collision in record. If no collisions, bypass
596+ if (collisions.size () > 0 ) {
597+ auto collision = collisions.begin ();
598+ auto bc = collision.bc_as <aod::BCsWithTimestamps>();
599+ initCCDB (bc.runNumber (), bc.timestamp ());
600+ } else {
601+ initCCDB (manualRunNumber, manualTimeStamp);
602+ }
603+
604+ for (const auto & V0 : V0s) {
605+ // for storing whatever is the relevant quantity for the PV
606+ o2::dataformats::VertexBase primaryVertex;
607+ if (V0 .has_collision ()) {
608+ auto const & collision = V0 .collision ();
609+ primaryVertex.setPos ({collision.posX (), collision.posY (), collision.posZ ()});
610+ primaryVertex.setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
611+ } else {
612+ primaryVertex.setPos ({mVtx ->getX (), mVtx ->getY (), mVtx ->getZ ()});
601613 }
614+
615+ auto pTra = V0 .posTrack_as <TracksWithAllExtras>();
616+ auto nTra = V0 .negTrack_as <TracksWithAllExtras>();
617+ processV0Candidate (primaryVertex, V0 , pTra, nTra);
602618 }
603619 }
604620
605621 void processDerivedData (soa::Join<aod::StraCollisions, aod::StraStamps> const & collisions, V0DerivedDatas const & V0s, dauTracks const &)
606622 {
607- for (const auto & collision : collisions) {
608- // Fire up CCDB - based on StraCollisions for derived analysis
609- initCCDB (collision);
610- // Do analysis with collision-grouped V0s, retain full collision information
611- const uint64_t collIdx = collision.globalIndex ();
612- auto V0Table_thisCollision = V0s.sliceBy (perCollisionDerived, collIdx);
613- histos.fill (HIST (" hCandidateCounter" ), V0Table_thisCollision.size ());
614- // V0 table sliced
615- for (auto const & v0 : V0Table_thisCollision) {
616- // de-reference interlinks by hand for derived data
617- auto pTra = v0.posTrackExtra_as <dauTracks>();
618- auto nTra = v0.negTrackExtra_as <dauTracks>();
619-
620- processV0Candidate (collision, v0, pTra, nTra);
623+ // Fire up CCDB with first collision in record. If no collisions, bypass
624+ if (collisions.size () > 0 ) {
625+ auto collision = collisions.begin ();
626+ initCCDB (collision.runNumber (), collision.timestamp ());
627+ } else {
628+ initCCDB (manualRunNumber, manualTimeStamp);
629+ }
630+
631+ for (const auto & V0 : V0s) {
632+ // for storing whatever is the relevant quantity for the PV
633+ o2::dataformats::VertexBase primaryVertex;
634+ if (V0 .has_straCollision ()) {
635+ auto const & collision = V0 .straCollision_as <soa::Join<aod::StraCollisions, aod::StraStamps>>();
636+ primaryVertex.setPos ({collision.posX (), collision.posY (), collision.posZ ()});
637+ // cov: won't be used anyways, all fine
638+ primaryVertex.setCov (1e-6 , 1e-6 , 1e-6 , 1e-6 , 1e-6 , 1e-6 );
639+ } else {
640+ primaryVertex.setPos ({mVtx ->getX (), mVtx ->getY (), mVtx ->getZ ()});
621641 }
642+
643+ auto pTra = V0 .posTrackExtra_as <dauTracks>();
644+ auto nTra = V0 .negTrackExtra_as <dauTracks>();
645+ processV0Candidate (primaryVertex, V0 , pTra, nTra);
622646 }
623647 }
624648
0 commit comments