Skip to content

Commit a8d4568

Browse files
ddobrigkalibuildgianniliveraro
authored
PWGLF: adapt V0 TOF PID to be used also for coll-unassoc V0s (#6396)
* PWGLF: adapt V0 TOF PID to be used also for coll-unassoc V0s * Please consider the following formatting changes (#305) * Add correct cast * Fix compilation-stopping typo * findableStudy: straCollision check * Please consider the following formatting changes (#307) * Megalinter fix --------- Co-authored-by: ALICE Builder <alibuild@users.noreply.github.com> Co-authored-by: gianniliveraro <gianniliveraro@gmail.com>
1 parent 86f7f2b commit a8d4568

2 files changed

Lines changed: 211 additions & 183 deletions

File tree

PWGLF/TableProducer/Strangeness/lambdakzeropid.cxx

Lines changed: 66 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
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

Comments
 (0)