Skip to content

Commit fcba891

Browse files
author
sandeep dudi
committed
Track Time resolution configurable is added for TPC only track in MC
1 parent f473157 commit fcba891

File tree

1 file changed

+82
-14
lines changed

1 file changed

+82
-14
lines changed

PWGLF/Tasks/Nuspex/spectraKinkPiKa.cxx

Lines changed: 82 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,20 @@ struct KinkBuilder {
9999
Configurable<float> maxDCAMothToPV{"maxDCAMothToPV", 0.2, "Max DCA of the mother to the PV"};
100100
Configurable<float> minDCADaugToPV{"minDCADaugToPV", 0.1, "Min DCA of the daughter to the PV"};
101101
Configurable<float> minPtMoth{"minPtMoth", 0.15, "Minimum pT of the hypercandidate"};
102+
Configurable<float> minPtDaug{"minPtDaug", 0.15, "Minimum pT of the daughter candidate"};
102103
Configurable<float> maxZDiff{"maxZDiff", 20., "Max z difference between the kink daughter and the mother"};
103104
Configurable<float> maxPhiDiff{"maxPhiDiff", 100, "Max phi difference between the kink daughter and the mother"};
104105
Configurable<float> timeMarginNS{"timeMarginNS", 600, "Additional time res tolerance in ns"};
106+
Configurable<float> timeMarginNSDaughter{"timeMarginNSDaughter", 200, "time tolerance for daughter candidate in ns"};
105107
Configurable<float> etaMaxDaug{"etaMaxDaug", 1., "eta max daughter"};
106108
Configurable<float> etaMaxMoth{"etaMaxMoth", 1., "eta max Mother"};
107109
Configurable<float> nTPCClusMinDaug{"nTPCClusMinDaug", 30, "mother NTPC clusters cut"};
108110
Configurable<float> itsChi2cut{"itsChi2cut", 36, "mother itsChi2 cut"};
109111
Configurable<bool> askTOFforDaug{"askTOFforDaug", false, "If true, ask for TOF signal"};
110112
Configurable<bool> kaontopologhy{"kaontopologhy", true, "If true, selected mother have both ITS+TPC "};
113+
Configurable<bool> ismc{"ismc", false, "If true, additional selection crideria for daughter "};
114+
Configurable<float> minradiusKink{"minradiusKink", 130.0, "minradiuscut for kink vertex"};
115+
Configurable<float> maxradiusKink{"maxradiusKink", 200.0, "maxradiuscut for kink vertex"};
111116

112117
o2::vertexing::DCAFitterN<2> fitter;
113118
o2::base::MatLayerCylSet* lut = nullptr;
@@ -205,76 +210,122 @@ struct KinkBuilder {
205210
if (askTOFforDaug && !candidate.hasTOF()) {
206211
return false;
207212
}
213+
if (ismc && candidate.trackTimeRes() > timeMarginNSDaughter) {
214+
return false; // ns
215+
}
216+
if (ismc && candidate.pt() < minPtDaug) {
217+
return false; // ns
218+
}
219+
208220
return true;
209221
}
210222

211223
template <class Tcolls, class Ttracks>
212-
void fillCandidateData(const Tcolls& collisions, const Ttracks& tracks, aod::AmbiguousTracks const& ambiguousTracks, aod::BCsWithTimestamps const& bcs)
224+
void fillCandidateData(const Tcolls& collisions,
225+
const Ttracks& tracks,
226+
aod::AmbiguousTracks const& ambiguousTracks,
227+
aod::BCsWithTimestamps const& bcs)
213228
{
214229
svCreator.clearPools();
215230
svCreator.fillBC2Coll(collisions, bcs);
216-
bool isDaug;
217-
bool isMoth;
231+
232+
bool isDaug = false;
233+
bool isMoth = false;
234+
218235
for (const auto& track : tracks) {
219-
if (!track.hasTPC())
236+
if (!track.hasTPC()) {
220237
continue;
238+
}
221239
isDaug = false;
222240
isMoth = false;
241+
242+
// Daughter: TPC-only, not PV contributor
223243
if (!track.hasITS() && !track.isPVContributor()) {
224244
isDaug = selectDaugTrack(track);
225245
}
246+
247+
// Mother: PV contributor, ITS (+TPC if kaon topology), no TOF
226248
if (track.hasITS() && !track.hasTOF() && track.isPVContributor()) {
227249
isMoth = selectMothTrack(track);
228250
}
229-
if (!isDaug && !isMoth)
251+
252+
if (!isDaug && !isMoth) {
230253
continue;
231-
if (isMoth && std::abs(track.eta()) > etaMaxMoth)
254+
}
255+
256+
if (isMoth && std::abs(track.eta()) > etaMaxMoth) {
232257
continue;
233-
if (isDaug && std::abs(track.eta()) > etaMaxDaug)
258+
}
259+
if (isDaug && std::abs(track.eta()) > etaMaxDaug) {
234260
continue;
261+
}
262+
235263
int pdgHypo = isMoth ? 1 : 0;
236264
svCreator.appendTrackCand(track, collisions, pdgHypo, ambiguousTracks, bcs);
237265
}
238266

239-
auto& kinkPool = svCreator.getSVCandPool(collisions, !unlikeSignBkg);
267+
auto& kinkPool = svCreator.getSVCandPool(collisions, /*combineLikeSign=*/!unlikeSignBkg);
240268

241269
for (const auto& svCand : kinkPool) {
242270
KinkCandidate kinkCand;
243271
auto trackMoth = tracks.rawIteratorAt(svCand.tr0Idx);
244272
auto trackDaug = tracks.rawIteratorAt(svCand.tr1Idx);
273+
274+
// Mother must have collision (PV contributor)
275+
if (!trackMoth.has_collision()) {
276+
continue;
277+
}
278+
245279
auto const& collision = trackMoth.template collision_as<Tcolls>();
280+
if (!collision.has_bc()) {
281+
continue;
282+
}
246283
auto const& bc = collision.template bc_as<aod::BCsWithTimestamps>();
247284
initCCDB(bc);
248285
o2::dataformats::VertexBase primaryVertex;
249286
primaryVertex.setPos({collision.posX(), collision.posY(), collision.posZ()});
250-
primaryVertex.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ());
287+
primaryVertex.setCov(collision.covXX(), collision.covXY(), collision.covYY(),
288+
collision.covXZ(), collision.covYZ(), collision.covZZ());
251289
kinkCand.primVtx = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()};
252290

253291
o2::track::TrackParCov trackParCovMoth = getTrackParCov(trackMoth);
254292
o2::track::TrackParCov trackParCovMothPV{trackParCovMoth};
293+
255294
std::array<float, 2> dcaInfoMoth;
256-
bool okMoth = o2::base::Propagator::Instance()->propagateToDCABxByBz({primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}, trackParCovMothPV, 2.f, static_cast<o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value), &dcaInfoMoth);
295+
bool okMoth = o2::base::Propagator::Instance()->propagateToDCABxByBz(
296+
{primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()},
297+
trackParCovMothPV, 2.f,
298+
static_cast<o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value),
299+
&dcaInfoMoth);
300+
257301
if (!okMoth) {
258302
continue;
259303
}
304+
260305
o2::track::TrackParCov trackParCovDaug = getTrackParCov(trackDaug);
261-
// propagate to PV
262306
std::array<float, 2> dcaInfoDaug;
263-
bool okDaug = o2::base::Propagator::Instance()->propagateToDCABxByBz({primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}, trackParCovDaug, 2.f, static_cast<o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value), &dcaInfoDaug);
307+
308+
bool okDaug = o2::base::Propagator::Instance()->propagateToDCABxByBz(
309+
{primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()},
310+
trackParCovDaug, 2.f,
311+
static_cast<o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value),
312+
&dcaInfoDaug);
313+
264314
if (!okDaug) {
265315
continue;
266316
}
317+
267318
if (std::abs(dcaInfoMoth[1]) > maxDCAMothToPV) {
268319
continue;
269320
}
270321
if (std::abs(dcaInfoDaug[1]) < minDCADaugToPV) {
271322
continue;
272323
}
324+
273325
int nCand = 0;
274326
try {
275327
nCand = fitter.process(trackParCovMoth, trackParCovDaug);
276328
} catch (...) {
277-
LOG(error) << "Exception caught in DCA fitter process call!";
278329
continue;
279330
}
280331
if (nCand == 0) {
@@ -283,13 +334,19 @@ struct KinkBuilder {
283334
if (!fitter.propagateTracksToVertex()) {
284335
continue;
285336
}
337+
286338
auto propMothTrack = fitter.getTrack(0);
287339
auto propDaugTrack = fitter.getTrack(1);
340+
288341
kinkCand.decVtx = fitter.getPCACandidatePos();
289342
const int vtxp = 3;
290343
for (int i = 0; i < vtxp; i++) {
291344
kinkCand.decVtx[i] -= kinkCand.primVtx[i];
292345
}
346+
double radiusxy = std::sqrt(kinkCand.decVtx[0] * kinkCand.decVtx[0] + kinkCand.decVtx[1] * kinkCand.decVtx[1]);
347+
if (radiusxy < minradiusKink || radiusxy > maxradiusKink) {
348+
continue;
349+
}
293350
propMothTrack.getPxPyPzGlo(kinkCand.momMoth);
294351
propDaugTrack.getPxPyPzGlo(kinkCand.momDaug);
295352
for (int i = 0; i < vtxp; i++) {
@@ -380,6 +437,7 @@ struct SpectraKinkPiKa {
380437
Configurable<int> pid{"pid", 321, ""};
381438
Configurable<int> dpid{"dpid", 13, ""};
382439
Configurable<bool> dpidCut{"dpidCut", 0, ""};
440+
Configurable<bool> dradiusCrossrow{"dradiusCrossrow", 0, ""};
383441
Configurable<bool> dptCut{"dptCut", 0, ""};
384442
Configurable<bool> qa{"qa", 0, ""};
385443
Configurable<int> maxtpcncle{"maxtpcncle", 0, "max tpc find ncle"};
@@ -636,6 +694,9 @@ struct SpectraKinkPiKa {
636694
double radiusxy = std::sqrt(kinkCand.xDecVtx() * kinkCand.xDecVtx() + kinkCand.yDecVtx() * kinkCand.yDecVtx());
637695
if (radiusxy < minradius || radiusxy > maxradius)
638696
continue;
697+
698+
if (dradiusCrossrow && (mothTrack.tpcNClsFound() > (-31.67 + ((11.0 / 12.0) * radiusxy)) || mothTrack.tpcNClsFound() < (-85.5 + ((65.0 / 95.0) * radiusxy))))
699+
continue;
639700
rpiKkink.fill(HIST("h1_tracks_data"), 10.0);
640701
if (std::abs(kinkCand.zDecVtx()) < minzcut || std::abs(kinkCand.zDecVtx()) > maxzcut)
641702
continue;
@@ -744,10 +805,14 @@ struct SpectraKinkPiKa {
744805
rEventSelection.fill(HIST("hVertexZRec"), collision.posZ());
745806
rEventSelection.fill(HIST("hMultiplicity"), multiplicity);
746807

747-
auto kinkCandPerColl = KinkCands.sliceBy(mPerCol, collision.index());
808+
auto kinkCandPerColl = KinkCands.sliceBy(mPerCol, collision.globalIndex());
748809
for (const auto& kinkCand : kinkCandPerColl) {
749810
auto dauTrack = kinkCand.trackDaug_as<TracksFull>();
750811
auto mothTrack = kinkCand.trackMoth_as<TracksFull>();
812+
if (mothTrack.collisionId() != collision.globalIndex()) {
813+
continue; // not from this event
814+
}
815+
751816
if (!mothTrack.has_collision() || !dauTrack.has_collision()) {
752817
continue;
753818
}
@@ -769,8 +834,11 @@ struct SpectraKinkPiKa {
769834
v0.SetCoordinates(mothTrack.px(), mothTrack.py(), mothTrack.pz(), o2::constants::physics::MassKaonCharged);
770835

771836
double radiusxy = std::sqrt(kinkCand.xDecVtx() * kinkCand.xDecVtx() + kinkCand.yDecVtx() * kinkCand.yDecVtx());
837+
// std::cout<<"radius check: "<<radiusxy<<std::endl;
772838
if (radiusxy < minradius || radiusxy > maxradius)
773839
continue;
840+
if (dradiusCrossrow && (mothTrack.tpcNClsFound() > (-31.67 + ((11.0 / 12.0) * radiusxy)) || mothTrack.tpcNClsFound() < (-85.5 + ((65.0 / 95.0) * radiusxy))))
841+
continue;
774842
rpiKkink.fill(HIST("h1_tracks"), 3.0);
775843
if (std::abs(kinkCand.zDecVtx()) < minzcut || std::abs(kinkCand.zDecVtx()) > maxzcut)
776844
continue;

0 commit comments

Comments
 (0)