@@ -146,7 +146,6 @@ DECLARE_SOA_TABLE(HfOmegaStGen, "AOD", "HFOMEGACSTGEN",
146146} // namespace o2::aod
147147
148148struct 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