Skip to content

Commit 2b494d7

Browse files
committed
add photon conversion to the DCAFitter test
1 parent 2606e4a commit 2b494d7

File tree

1 file changed

+86
-1
lines changed

1 file changed

+86
-1
lines changed

Common/DCAFitter/test/testDCAFitterN.cxx

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ float checkResults(o2::utils::TreeStreamRedirector& outs, std::string& treeName,
6161
<< "genPart=" << genPar << "recPart=" << moth
6262
<< "genX=" << vgen[0] << "genY=" << vgen[1] << "genZ=" << vgen[2]
6363
<< "dx=" << df[0] << "dy=" << df[1] << "dz=" << df[2] << "dst=" << dst
64-
<< "useAbsDCA=" << absDCA << "useWghDCA=" << useWghDCA << "parent=" << parentTrack << "\n";
64+
<< "useAbsDCA=" << absDCA << "useWghDCA=" << useWghDCA << "parent=" << parentTrack;
65+
for (int i = 0; i < fitter.getNProngs(); i++) {
66+
outs << treeName.c_str() << fmt::format("prong{}=", i).c_str() << fitter.getTrack(i, ic);
67+
}
68+
outs << treeName.c_str() << "\n";
6569
}
6670
return distMin;
6771
}
@@ -145,10 +149,13 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
145149
o2::utils::TreeStreamRedirector outStream("dcafitterNTest.root");
146150

147151
TGenPhaseSpace genPHS;
152+
constexpr double ele = 0.00051;
153+
constexpr double gamma = 2 * ele + 1e-6;
148154
constexpr double pion = 0.13957;
149155
constexpr double k0 = 0.49761;
150156
constexpr double kch = 0.49368;
151157
constexpr double dch = 1.86965;
158+
std::vector<double> gammadec = {ele, ele};
152159
std::vector<double> k0dec = {pion, pion};
153160
std::vector<double> dchdec = {pion, kch, pion};
154161
std::vector<o2::track::TrackParCov> vctracks;
@@ -233,6 +240,84 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
233240
BOOST_CHECK(meanDW < 0.1);
234241
}
235242

243+
// 2 prongs vertices with collinear tracks (gamma conversion)
244+
{
245+
LOG(info) << "Processing 2-prong Helix - Helix case gamma conversion";
246+
std::vector<int> forceQ{1, 1};
247+
248+
o2::vertexing::DCAFitterN<2> ft; // 2 prong fitter
249+
ft.setBz(bz);
250+
ft.setPropagateToPCA(true); // After finding the vertex, propagate tracks to the DCA. This is default anyway
251+
ft.setMaxR(200); // do not consider V0 seeds with 2D circles crossing above this R. This is default anyway
252+
ft.setMaxDZIni(4); // do not consider V0 seeds with tracks Z-distance exceeding this. This is default anyway
253+
ft.setMaxDXYIni(4); // do not consider V0 seeds with tracks XY-distance exceeding this. This is default anyway
254+
ft.setMinParamChange(1e-3); // stop iterations if max correction is below this value. This is default anyway
255+
ft.setMinRelChi2Change(0.9); // stop iterations if chi2 improves by less that this factor
256+
257+
std::string treeName2A = "gpr2a", treeName2AW = "gpr2aw", treeName2W = "gpr2w";
258+
TStopwatch swA, swAW, swW;
259+
int nfoundA = 0, nfoundAW = 0, nfoundW = 0;
260+
double meanDA = 0, meanDAW = 0, meanDW = 0;
261+
swA.Stop();
262+
swAW.Stop();
263+
swW.Stop();
264+
for (int iev = 0; iev < NTest; iev++) {
265+
auto genParent = generate(vtxGen, vctracks, bz, genPHS, gamma, gammadec, forceQ);
266+
267+
ft.setUseAbsDCA(true);
268+
swA.Start(false);
269+
int ncA = ft.process(vctracks[0], vctracks[1]); // HERE WE FIT THE VERTICES
270+
swA.Stop();
271+
LOG(debug) << "fit abs.dist " << iev << " NC: " << ncA << " Chi2: " << (ncA ? ft.getChi2AtPCACandidate(0) : -1);
272+
if (ncA) {
273+
auto minD = checkResults(outStream, treeName2A, ft, vtxGen, genParent, gammadec);
274+
meanDA += minD;
275+
nfoundA++;
276+
}
277+
278+
ft.setUseAbsDCA(true);
279+
ft.setWeightedFinalPCA(true);
280+
swAW.Start(false);
281+
int ncAW = ft.process(vctracks[0], vctracks[1]); // HERE WE FIT THE VERTICES
282+
swAW.Stop();
283+
LOG(debug) << "fit abs.dist with final weighted DCA " << iev << " NC: " << ncAW << " Chi2: " << (ncAW ? ft.getChi2AtPCACandidate(0) : -1);
284+
if (ncAW) {
285+
auto minD = checkResults(outStream, treeName2AW, ft, vtxGen, genParent, gammadec);
286+
meanDAW += minD;
287+
nfoundAW++;
288+
}
289+
290+
ft.setUseAbsDCA(false);
291+
ft.setWeightedFinalPCA(false);
292+
swW.Start(false);
293+
int ncW = ft.process(vctracks[0], vctracks[1]); // HERE WE FIT THE VERTICES
294+
swW.Stop();
295+
LOG(debug) << "fit wgh.dist " << iev << " NC: " << ncW << " Chi2: " << (ncW ? ft.getChi2AtPCACandidate(0) : -1);
296+
if (ncW) {
297+
auto minD = checkResults(outStream, treeName2W, ft, vtxGen, genParent, gammadec);
298+
meanDW += minD;
299+
nfoundW++;
300+
}
301+
}
302+
ft.print();
303+
meanDA /= nfoundA ? nfoundA : 1;
304+
meanDAW /= nfoundA ? nfoundA : 1;
305+
meanDW /= nfoundW ? nfoundW : 1;
306+
LOG(info) << "Processed " << NTest << " 2-prong vertices Helix : Helix from gamma conversion";
307+
LOG(info) << "2-prongs with abs.dist minization: eff= " << float(nfoundA) / NTest
308+
<< " mean.dist to truth: " << meanDA << " CPU time: " << swA.CpuTime();
309+
LOG(info) << "2-prongs with abs.dist but wghPCA: eff= " << float(nfoundAW) / NTest
310+
<< " mean.dist to truth: " << meanDAW << " CPU time: " << swAW.CpuTime();
311+
LOG(info) << "2-prongs with wgh.dist minization: eff= " << float(nfoundW) / NTest
312+
<< " mean.dist to truth: " << meanDW << " CPU time: " << swW.CpuTime();
313+
BOOST_CHECK(nfoundA > 0.99 * NTest);
314+
BOOST_CHECK(nfoundAW > 0.99 * NTest);
315+
BOOST_CHECK(nfoundW > 0.99 * NTest);
316+
BOOST_CHECK(meanDA < 2.1);
317+
BOOST_CHECK(meanDAW < 2.1);
318+
BOOST_CHECK(meanDW < 2.1);
319+
}
320+
236321
// 2 prongs vertices with one of charges set to 0: Helix : Line
237322
{
238323
std::vector<int> forceQ{1, 1};

0 commit comments

Comments
 (0)