Skip to content

Commit 7511843

Browse files
authored
PWGHF: Improve tree creator for Omega_c with ST (#3956)
* Improve tree creator for Omega_c with ST - implement improvements from ST filter to tree creator - add missing variables to tree
1 parent 60470e6 commit 7511843

1 file changed

Lines changed: 79 additions & 36 deletions

File tree

PWGHF/TableProducer/treeCreatorOmegacSt.cxx

Lines changed: 79 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,6 @@ DECLARE_SOA_TABLE(HfOmegaStGen, "AOD", "HFOMEGACSTGEN",
146146
} // namespace o2::aod
147147

148148
struct HfTreeCreatorOmegacSt {
149-
Configurable<double> bz{"bz", -5., "magnetic field"};
150149
Configurable<int> materialCorrectionType{"materialCorrectionType", static_cast<int>(o2::base::Propagator::MatCorrType::USEMatCorrLUT), "Type of material correction"};
151150
Configurable<std::string> ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
152151
Configurable<std::string> grpMagPath{"grpMagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"};
@@ -158,13 +157,24 @@ struct HfTreeCreatorOmegacSt {
158157
Configurable<double> maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"};
159158
Configurable<double> minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"};
160159
Configurable<double> minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations if chi2/chi2old > this"};
160+
Configurable<int> minNoClsTrackedCascade{"minNoClsTrackedCascade", 70, "Minimum number of clusters required for daughters of tracked cascades"};
161+
Configurable<float> massWindowTrackedOmega{"massWindowTrackedOmega", 0.05, "Inv. mass window for tracked Omega-"};
162+
Configurable<float> massWindowLambda{"massWindowLambda", 0.05, "Inv. mass window for Lambda"};
163+
Configurable<float> massWindowOmegaC{"massWindowOmegaC", 0.1, "Inv. mass window for Omegac"};
164+
Configurable<float> maxMatchingChi2TrackedCascade{"maxMatchingChi2TrackedCascade", 2000., "Max matching chi2 for tracked cascades"};
165+
Configurable<bool> recalculateMasses{"recalculateMasses", true, "Recalculate Xi/Omega masses"};
166+
Configurable<float> maxNSigmaBachelor{"maxNSigmaBachelor", 5., "Max Nsigma for bachelor of tracked Xi (Ka)"};
167+
Configurable<float> maxNSigmaV0Pr{"maxNSigmaV0Pr", 5., "Max Nsigma for proton from V0 fromtracked Xi"};
168+
Configurable<float> maxNSigmaV0Pi{"maxNSigmaV0Pi", 5., "Max Nsigma for pion from V0 fromtracked Xi"};
169+
Configurable<float> maxNSigmaPion{"maxNSigmaPion", 5., "Max Nsigma for pion to be paired with Omega2git s2"};
161170

162171
Produces<aod::HfOmegacSt> outputTable;
163172
Produces<aod::HfOmegaStGen> outputTableGen;
164173
Service<o2::ccdb::BasicCCDBManager> ccdb;
165174
o2::vertexing::DCAFitterN<2> df2;
166175

167176
bool bzOnly = true;
177+
float bz = 0.;
168178
int runNumber{0};
169179

170180
using TracksExt = soa::Join<aod::TracksIU, aod::TracksCovIU, aod::TracksExtra, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCPr, aod::pidTOFPi, aod::pidTOFKa, aod::pidTOFPr>;
@@ -208,7 +218,6 @@ struct HfTreeCreatorOmegacSt {
208218
o2::base::Propagator::Instance(true)->setMatLUT(lut);
209219
}
210220

211-
df2.setBz(bz);
212221
df2.setPropagateToPCA(propToDCA);
213222
df2.setMaxR(maxR);
214223
df2.setMaxDZIni(maxDZIni);
@@ -252,15 +261,19 @@ struct HfTreeCreatorOmegacSt {
252261

253262
if (o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp<o2::parameters::GRPObject>(grpPath, timestamp)) {
254263
o2::base::Propagator::initFieldFromGRP(grpo);
264+
bz = grpo->getNominalL3Field();
255265
} else if (o2::parameters::GRPMagField* grpmag = ccdb->getForTimeStamp<o2::parameters::GRPMagField>(grpMagPath, timestamp)) {
256266
o2::base::Propagator::initFieldFromGRP(grpmag);
267+
bz = std::lround(5.f * grpmag->getL3Current() / 30000.f);
257268
} else {
258269
LOG(fatal) << "Got nullptr from CCDB for path " << grpMagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << timestamp;
259270
}
271+
df2.setBz(bz);
260272
}
261273

262274
const auto matCorr = static_cast<o2::base::Propagator::MatCorrType>(materialCorrectionType.value);
263275
const auto primaryVertex = getPrimaryVertex(collision);
276+
const std::array<double, 3> primaryVertexPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()};
264277
o2::dataformats::DCA impactParameterTrk;
265278
for (const auto& trackedCascade : trackedCascades) {
266279
const auto trackCasc = trackedCascade.track_as<TracksExt>();
@@ -277,15 +290,41 @@ struct HfTreeCreatorOmegacSt {
277290
const auto& v0TrackPos = v0.posTrack_as<TracksExt>();
278291
const auto& v0TrackNeg = v0.negTrack_as<TracksExt>();
279292

280-
std::array<double, 3> m{o2::analysis::pdg::MassProton, o2::analysis::pdg::MassPiMinus, o2::analysis::pdg::MassKMinus};
281-
std::array<std::array<float, 3>, 3> p;
282-
// TODO: treat properly as omega +-
283-
p[0] = {v0TrackPos.px(), v0TrackPos.py(), v0TrackPos.pz()};
284-
p[1] = {v0TrackNeg.px(), v0TrackNeg.py(), v0TrackNeg.pz()};
285-
p[2] = {bachelor.px(), bachelor.py(), bachelor.pz()};
286-
double massOmega1 = RecoDecay::m(p, m);
287-
std::swap(p[0], p[1]);
288-
double massOmega2 = RecoDecay::m(p, m);
293+
if (!v0TrackPos.hasTPC() || !v0TrackNeg.hasTPC() || !bachelor.hasTPC() ||
294+
v0TrackPos.tpcNClsFindable() < minNoClsTrackedCascade ||
295+
v0TrackNeg.tpcNClsFindable() < minNoClsTrackedCascade ||
296+
bachelor.tpcNClsFindable() < minNoClsTrackedCascade) {
297+
continue;
298+
}
299+
300+
const auto& v0TrackPr = trackCasc.sign() > 0 ? v0TrackPos : v0TrackNeg;
301+
const auto& v0TrackPi = trackCasc.sign() > 0 ? v0TrackNeg : v0TrackPos;
302+
303+
// track propagation
304+
o2::track::TrackParCov trackParCovV0;
305+
o2::track::TrackPar trackParV0;
306+
o2::track::TrackPar trackParBachelor;
307+
std::array<std::array<float, 3>, 2> momentaOmegaDaughters;
308+
if (!df2.process(getTrackParCov(v0TrackNeg), getTrackParCov(v0TrackPos))) {
309+
continue;
310+
}
311+
trackParCovV0 = df2.createParentTrackParCov(0);
312+
if (!df2.process(trackParCovV0, getTrackParCov(bachelor))) {
313+
continue;
314+
}
315+
const auto& secondaryVertex = df2.getPCACandidate();
316+
const auto decayLengthOmega = RecoDecay::distance(secondaryVertex, primaryVertexPos);
317+
const auto decayLengthOmegaXY = RecoDecay::distanceXY(secondaryVertex, primaryVertexPos);
318+
trackParV0 = df2.getTrackParamAtPCA(0);
319+
trackParBachelor = df2.getTrackParamAtPCA(1);
320+
trackParV0.getPxPyPzGlo(momentaOmegaDaughters[0]);
321+
trackParBachelor.getPxPyPzGlo(momentaOmegaDaughters[1]);
322+
std::array<float, 3> pVec;
323+
df2.createParentTrackParCov().getPxPyPzGlo(pVec);
324+
const auto cpaOmega = RecoDecay::cpa(primaryVertexPos, df2.getPCACandidate(), pVec);
325+
326+
std::array<double, 2> masses = {o2::analysis::pdg::MassLambda0, o2::analysis::pdg::MassKPlus};
327+
const auto massOmega = RecoDecay::m(momentaOmegaDaughters, masses);
289328

290329
registry.fill(HIST("hDca"), std::sqrt(impactParameterTrk.getR2()));
291330
registry.fill(HIST("hDcaXY"), impactParameterTrk.getY());
@@ -294,23 +333,19 @@ struct HfTreeCreatorOmegacSt {
294333
registry.fill(HIST("hDcaZVsPt"), trackParCovTrk.getPt(), impactParameterTrk.getZ());
295334
registry.fill(HIST("hDcaVsPt"), impactParameterTrk.getY(), trackCasc.pt());
296335
registry.fill(HIST("hDcaVsR"), impactParameterTrk.getY(), RecoDecay::sqrtSumOfSquares(trackCasc.x(), trackCasc.y()));
297-
registry.fill(HIST("hMassVsPt"), massOmega1, trackCasc.pt());
298-
registry.fill(HIST("hMassVsPt"), massOmega2, trackCasc.pt());
336+
registry.fill(HIST("hMassVsPt"), massOmega, trackCasc.pt());
299337

300-
// TODO: separate cases of omega +-
301-
if ((std::abs(massOmega1 - o2::analysis::pdg::MassOmegaMinus) < .1) ||
302-
(std::abs(massOmega2 - o2::analysis::pdg::MassOmegaMinus) < .1)) {
338+
if ((std::abs(massOmega - o2::analysis::pdg::MassOmegaMinus) < massWindowTrackedOmega)) {
303339
LOGF(debug, "found candidate in mass range");
304-
if ((std::abs(bachelor.tpcNSigmaKa()) < 3.) &&
305-
(((std::abs(v0TrackPos.tpcNSigmaPr()) < 3.) && (std::abs(v0TrackNeg.tpcNSigmaPi()) < 3.)) ||
306-
((std::abs(v0TrackPos.tpcNSigmaPi()) < 3.) && (std::abs(v0TrackNeg.tpcNSigmaPr()) < 3.)))) {
340+
if ((std::abs(bachelor.tpcNSigmaKa()) < maxNSigmaBachelor) &&
341+
(std::abs(v0TrackPr.tpcNSigmaPr()) < maxNSigmaV0Pr) &&
342+
(std::abs(v0TrackPi.tpcNSigmaPi()) < maxNSigmaV0Pi)) {
307343
LOGF(debug, ".. species compatible with Omega");
308344
std::array<double, 2> masses{o2::analysis::pdg::MassOmegaMinus, o2::analysis::pdg::MassPiPlus};
309345
std::array<std::array<float, 3>, 2> momenta;
310-
std::array<double, 3> primaryVertexPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()};
311346

312-
auto trackParCovPr = getTrackParCov(v0TrackPos); // TODO: depends on charge!
313-
auto trackParCovKa = getTrackParCov(v0TrackNeg); // TODO: depends on charge!
347+
auto trackParCovPr = getTrackParCov(v0TrackPr);
348+
auto trackParCovKa = getTrackParCov(v0TrackPi);
314349
auto trackParCovPi = getTrackParCov(bachelor);
315350
o2::dataformats::DCA impactParameterPr;
316351
o2::dataformats::DCA impactParameterKa;
@@ -326,9 +361,11 @@ struct HfTreeCreatorOmegacSt {
326361
}
327362

328363
for (const auto& track : tracks) {
329-
if (std::abs(track.tpcNSigmaPi()) < 3.) {
364+
if (std::abs(track.tpcNSigmaPi()) < maxNSigmaPion) {
330365
LOGF(debug, " .. combining with pion candidate %d", track.globalIndex());
331-
// TODO: need to check charge
366+
if (trackCasc.sign() == track.sign()) {
367+
continue;
368+
}
332369
auto trackParCovPion = getTrackParCov(track);
333370
o2::dataformats::DCA impactParameterPion;
334371
if (bzOnly) {
@@ -337,7 +374,7 @@ struct HfTreeCreatorOmegacSt {
337374
o2::base::Propagator::Instance()->propagateToDCABxByBz(primaryVertex, trackParCovPion, 2.f, matCorr, &impactParameterPion);
338375
}
339376

340-
trackParCovTrk.getPxPyPzGlo(momenta[0]);
377+
trackParCovTrk.getPxPyPzGlo(momenta[0]); // or better use momentum from DCA fitter?
341378
trackParCovPion.getPxPyPzGlo(momenta[1]);
342379
const auto massOmegaC = RecoDecay::m(momenta, masses);
343380
registry.fill(HIST("hMassOmegac"), massOmegaC);
@@ -346,15 +383,21 @@ struct HfTreeCreatorOmegacSt {
346383
if (df2.process(trackParCovTrk, trackParCovPion)) {
347384
const auto& secondaryVertex = df2.getPCACandidate();
348385
const auto decayLength = RecoDecay::distance(secondaryVertex, primaryVertexPos);
349-
if (std::abs(massOmegaC - o2::analysis::pdg::MassOmegaC0) < 0.02) {
386+
const auto decayLengthXY = RecoDecay::distanceXY(secondaryVertex, primaryVertexPos);
387+
const auto chi2TopOmegac = df2.getChi2AtPCACandidate();
388+
std::array<float, 3> pVec;
389+
df2.createParentTrackParCov().getPxPyPzGlo(pVec);
390+
const auto cpaOmegaC = RecoDecay::cpa(primaryVertexPos, df2.getPCACandidate(), pVec);
391+
392+
if (std::abs(massOmegaC - o2::analysis::pdg::MassOmegaC0) < massWindowOmegaC) {
350393
registry.fill(HIST("hDecayLength"), decayLength * 1e4);
351394
registry.fill(HIST("hDecayLengthScaled"), decayLength * o2::analysis::pdg::MassOmegaC0 / RecoDecay::p(momenta[0], momenta[1]) * 1e4);
352395
outputTable(massOmegaC,
353-
massOmega1, // TODO: need to choose according to supposed sign
396+
massOmega,
354397
track.tpcNSigmaPi(),
355398
track.tofNSigmaPi(),
356-
v0TrackPos.tpcNSigmaPr(), // TODO: depends on charge
357-
v0TrackPos.tofNSigmaPr(),
399+
v0TrackPr.tpcNSigmaPr(),
400+
v0TrackPi.tofNSigmaPr(),
358401
bachelor.tpcNSigmaKa(),
359402
bachelor.tofNSigmaKa(),
360403
v0TrackNeg.tpcNSigmaPi(),
@@ -365,8 +408,8 @@ struct HfTreeCreatorOmegacSt {
365408
momenta[1][0], // pion momentum
366409
momenta[1][1],
367410
momenta[1][2],
368-
0., // st_omegac::CpaOmegaC,
369-
0., // trackedCascade.cpa(),
411+
cpaOmegaC,
412+
cpaOmega,
370413
impactParameterTrk.getY(),
371414
impactParameterTrk.getZ(),
372415
impactParameterPion.getY(),
@@ -377,12 +420,12 @@ struct HfTreeCreatorOmegacSt {
377420
impactParameterKa.getZ(),
378421
impactParameterPi.getY(),
379422
impactParameterPi.getZ(),
380-
0., // st_omegac::Chi2TopologicalOmegaC,
381-
0., // st_omegac::Chi2TopologicalOmega,
423+
chi2TopOmegac,
424+
trackedCascade.topologyChi2(),
382425
decayLength,
383-
0., // st_omegac::DecayLengthXYOmegaC,
384-
0., // st_omegac::DecayLengthOmega,
385-
0.); // st_omegac::DecayLengthXYOmega
426+
decayLengthXY,
427+
decayLengthOmega,
428+
decayLengthOmegaXY);
386429
}
387430
}
388431
}

0 commit comments

Comments
 (0)