11 #include <framework/datastore/StoreArray.h>
12 #include <framework/datastore/RelationArray.h>
14 #include <tracking/modules/vxdtfRedesign/NoKickCutsEvalModule.h>
16 #include <mdst/dataobjects/MCParticle.h>
17 #include <svd/dataobjects/SVDTrueHit.h>
36 setDescription(
"This module evaluate cuts necessary for the selction of reco tracks based on Multiple Scattering, NoKickRTSel");
39 addParam(
"useValidation", c_validationON,
40 "print in output file validation plot: track parameters distributions and cuts distributions",
false);
43 addParam(
"useFitMethod", c_fitMethod,
"apply the method of double-gaussian fit to evaluate the cuts",
false);
55 for (
int par = 0; par <
c_nbinpar; par++) {
56 std::vector<std::vector<std::vector<std::vector<TH1F*>>>> histo_par;
57 for (
int lay1 = 0; lay1 <
c_nbinlay; lay1++) {
58 std::vector<std::vector<std::vector<TH1F*>>> histo_lay1;
59 for (
int lay2 = 0; lay2 <
c_nbinlay; lay2++) {
60 std::vector<std::vector<TH1F*>> histo_lay2;
61 for (
int theta = 0; theta <
c_nbint; theta++) {
62 std::vector<TH1F*> histo_theta;
63 for (
int p = 0; p <
c_nbinp; p++) {
64 histo_theta.push_back(
new TH1F(
"histo_" +
m_namePar.at(par) + Form(
"_layer%d-%d_theta%d_p%d", lay1, lay2, theta, p),
68 histo_lay2.push_back(histo_theta);
71 histo_lay1.push_back(histo_lay2);
74 histo_par.push_back(histo_lay1);
87 storeClusters.isRequired();
88 storeTrueHits.isRequired();
89 storeMCParticles.isRequired();
90 recoTracks.isRequired();
92 RelationArray relClusterTrueHits(storeClusters, storeTrueHits);
93 RelationArray relClusterMCParticles(storeClusters, storeMCParticles);
94 RelationArray recoTracksToMCParticles(recoTracks , storeMCParticles);
108 for (
const RecoTrack& track : recoTracks) {
117 if (XP8.size() > 0) {
118 for (
int i = 0; (i + 1) < (
int)XP8.size(); i++) {
119 for (
int par = 0; par <
c_nbinpar; par++) {
121 if (p >
c_nbinp - 1 || p < 0) {
125 double sinTheta = abs(XP8.at(i).m_momentum0.Y()) / sqrt(pow(XP8.at(i).m_momentum0.Y(), 2) + pow(XP8.at(i).m_momentum0.Z(), 2));
127 if (t >
c_nbint - 1 || t < 0) {
132 if (deltaPar ==
c_over)
continue;
133 m_histo.at(par).at(XP8.at(i).m_sensorLayer).at(XP8.at(i + 1).m_sensorLayer).at(t).at(p)->Fill(deltaPar);
136 if (deltaPar ==
c_over)
continue;
137 m_histo.at(par).at(0).at(XP8.at(i).m_sensorLayer).at(t).at(p)->Fill(deltaPar);
150 std::vector<std::vector<std::vector<std::vector<std::vector<double>>>>> cut_m;
151 std::vector<std::vector<std::vector<std::vector<std::vector<double>>>>> cut_M;
153 for (
int par = 0; par <
c_nbinpar; par++) {
154 std::vector<std::vector<std::vector<std::vector<double>>>> cut_M_par;
155 std::vector<std::vector<std::vector<std::vector<double>>>> cut_m_par;
156 for (
int lay1 = 0; lay1 <
c_nbinlay; lay1++) {
157 std::vector<std::vector<std::vector<double>>> cut_M_lay1;
158 std::vector<std::vector<std::vector<double>>> cut_m_lay1;
159 for (
int lay2 = 0; lay2 <
c_nbinlay; lay2++) {
160 std::vector<std::vector<double>> cut_M_lay2;
161 std::vector<std::vector<double>> cut_m_lay2;
162 for (
int theta = 0; theta <
c_nbint; theta++) {
163 std::vector<double> cut_M_theta;
164 std::vector<double> cut_m_theta;
165 for (
int p = 0; p <
c_nbinp; p++) {
169 TF1* fit_2gaus =
new TF1(
"fit_2gaus",
"[0]*TMath::Gaus(x,[1],[2], kTRUE)+[3]*TMath::Gaus(x,[4],[5],kTRUE)+[6]",
173 int nbin0 =
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(bin0);
174 double moltSigma1 = 0.5;
175 double moltSigma2 = 2;
176 double sigma1 = (double)moltSigma1 * (
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetStdDev());
177 double sigma2 = (double)moltSigma2 * (
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetStdDev());
178 double norm1 = sigma1 * sqrt(2 * 3.1415) * 0.9 * nbin0;
179 double norm2 = sigma2 * sqrt(2 * 3.1415) * 0.1 * nbin0;
180 double mean1 = (double)
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetMean();
181 double mean2 = (double)
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetMean();
182 double bkg = (double)
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(2);
184 fit_2gaus->SetParameters(norm1, mean1, sigma1, norm2, mean2, sigma2, bkg);
186 cut_M_theta.push_back(3 * (sqrt(fit_2gaus->GetParameter(2)*fit_2gaus->GetParameter(2))));
187 cut_m_theta.push_back(3 * (-sqrt(fit_2gaus->GetParameter(2)*fit_2gaus->GetParameter(2))));
193 double integral =
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->Integral();
194 double sum_M =
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(
c_nbin + 1);
195 double sum_m =
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(0);
200 while (sum_m < integral * percent / 2) {
202 sum_m = sum_m +
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(bin_m);
204 while (sum_M < integral * percent / 2) {
206 sum_M = sum_M +
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(bin_M);
208 if (
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetEntries() < 100) {
210 int filledBin_M =
c_nbin + 1;
211 while (
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(filledBin_m) == 0 && filledBin_m < (
double)
c_nbin / 2) {
214 while (
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinContent(filledBin_M) == 0 && filledBin_M > (
double)
c_nbin / 2) {
220 cut_M_theta.push_back(
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinCenter(bin_M));
221 cut_m_theta.push_back(
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetBinCenter(bin_m));
226 cut_M_lay2.push_back(cut_M_theta);
228 cut_m_lay2.push_back(cut_m_theta);
231 cut_M_lay1.push_back(cut_M_lay2);
233 cut_m_lay1.push_back(cut_m_lay2);
236 cut_M_par.push_back(cut_M_lay1);
238 cut_m_par.push_back(cut_m_lay1);
241 cut_M.push_back(cut_M_par);
243 cut_m.push_back(cut_m_par);
250 std::vector<std::vector<std::vector<TH2F*>>> cut_M_histo;
251 std::vector<std::vector<std::vector<TH2F*>>> cut_m_histo;
253 for (
int par = 0; par <
c_nbinpar; par++) {
254 std::vector<std::vector<TH2F*>> cut_M_histo_par;
255 std::vector<std::vector<TH2F*>> cut_m_histo_par;
256 for (
int lay1 = 0; lay1 <
c_nbinlay; lay1++) {
257 std::vector<TH2F*> cut_M_histo_lay1;
258 std::vector<TH2F*> cut_m_histo_lay1;
259 for (
int lay2 = 0; lay2 <
c_nbinlay; lay2++) {
260 cut_M_histo_lay1.push_back(
new TH2F(
"CUTS_M_" +
m_namePar.at(par) + Form(
"layer%d_%d", lay1, lay2),
262 cut_m_histo_lay1.push_back(
new TH2F(
"CUTS_m_" +
m_namePar.at(par) + Form(
"layer%d_%d", lay1, lay2),
264 for (
int theta = 1; theta <=
c_nbint; theta++) {
265 for (
int p = 1; p <=
c_nbinp; p++) {
266 cut_M_histo_lay1.at(lay2)->SetBinContent(p, theta, cut_M.at(par).at(lay1).at(lay2).at(theta - 1).at(p - 1));
267 cut_m_histo_lay1.at(lay2)->SetBinContent(p, theta, cut_m.at(par).at(lay1).at(lay2).at(theta - 1).at(p - 1));
271 cut_M_histo_par.push_back(cut_M_histo_lay1);
272 cut_M_histo_lay1.clear();
273 cut_m_histo_par.push_back(cut_m_histo_lay1);
274 cut_m_histo_lay1.clear();
276 cut_M_histo.push_back(cut_M_histo_par);
277 cut_M_histo_par.clear();
278 cut_m_histo.push_back(cut_m_histo_par);
279 cut_m_histo_par.clear();
283 std::vector<std::vector<std::vector<std::vector<double>>>> cut_out_norm;
284 std::vector<std::vector<std::vector<std::vector<double>>>> cut_out_pow;
285 std::vector<std::vector<std::vector<std::vector<double>>>> cut_out_bkg;
287 for (
int minmax = 0; minmax < 2; minmax++) {
288 std::vector<std::vector<std::vector<double>>> cut_out_norm_minmax;
289 std::vector<std::vector<std::vector<double>>> cut_out_pow_minmax;
290 std::vector<std::vector<std::vector<double>>> cut_out_bkg_minmax;
291 for (
int par = 0; par <
c_nbinpar; par++) {
292 std::vector<std::vector<double>> cut_out_norm_par;
293 std::vector<std::vector<double>> cut_out_pow_par;
294 std::vector<std::vector<double>> cut_out_bkg_par;
295 for (
int lay1 = 0; lay1 <
c_nbinlay; lay1++) {
296 std::vector<double> cut_out_norm_lay1;
297 std::vector<double> cut_out_pow_lay1;
298 std::vector<double> cut_out_bkg_lay1;
299 for (
int lay2 = 0; lay2 <
c_nbinlay; lay2++) {
301 TF2* fit_MS =
new TF2(
"fit_MS",
"[0]*1/(TMath::Power(x,[1])*TMath::Sqrt(TMath::Sin(y)))+[2]",
c_pmin,
c_pmax,
c_tmin,
c_tmax);
303 double norm = cut_M.at(par).at(lay1).at(lay2).at(1).at(1);
305 double bkg = cut_M.at(par).at(lay1).at(lay2).at(1).at(
c_nbinp - 1);
306 fit_MS->SetParameters(norm, Pow, bkg);
309 cut_m_histo.at(par).at(lay1).at(lay2) -> Fit(
"fit_MS");
313 cut_M_histo.at(par).at(lay1).at(lay2) -> Fit(
"fit_MS");
316 cut_out_norm_lay1.push_back(fit_MS->GetParameter(0));
317 cut_out_pow_lay1.push_back(fit_MS->GetParameter(1));
318 cut_out_bkg_lay1.push_back(fit_MS->GetParameter(2));
320 cut_out_norm_par.push_back(cut_out_norm_lay1);
321 cut_out_norm_lay1.clear();
322 cut_out_pow_par.push_back(cut_out_pow_lay1);
323 cut_out_pow_lay1.clear();
324 cut_out_bkg_par.push_back(cut_out_bkg_lay1);
325 cut_out_bkg_lay1.clear();
327 cut_out_norm_minmax.push_back(cut_out_norm_par);
328 cut_out_norm_par.clear();
329 cut_out_pow_minmax.push_back(cut_out_pow_par);
330 cut_out_pow_par.clear();
331 cut_out_bkg_minmax.push_back(cut_out_bkg_par);
332 cut_out_bkg_par.clear();
334 cut_out_norm.push_back(cut_out_norm_minmax);
335 cut_out_norm_minmax.clear();
336 cut_out_pow.push_back(cut_out_pow_minmax);
337 cut_out_pow_minmax.clear();
338 cut_out_bkg.push_back(cut_out_bkg_minmax);
339 cut_out_bkg_minmax.clear();
346 for (
int g = 0; g <
c_nbinp; g++) {
349 B2DEBUG(30,
"momentum=" << p_out_mom);
350 B2DEBUG(30,
"d0, 3-4, Min: " << cut_m.at(1).at(3).at(4).at(1).at(g));
351 B2DEBUG(30,
"min cut (TH2F):" << cut_m_histo.at(1).at(3).at(4)->GetBinContent(g + 1, 2));
352 double norm_min = cut_out_norm.at(0).at(1).at(3).at(4);
353 double pow_min = cut_out_pow.at(0).at(1).at(3).at(4);
354 double bkg_min = cut_out_bkg.at(0).at(1).at(3).at(4);
355 B2DEBUG(30,
"norm par min:" << norm_min);
356 B2DEBUG(30,
"pow par min:" << pow_min);
357 B2DEBUG(30,
"bkg par min:" << bkg_min);
358 B2DEBUG(30,
"evaluate min cut:" << norm_min / (sqrt(sin(t_out_theta)) * pow(p_out_mom, pow_min)) + bkg_min);
359 B2DEBUG(30,
"d0, 3-4, Max: " << cut_M.at(1).at(3).at(4).at(1).at(g));
360 B2DEBUG(30,
"max cut (TH2F):" << cut_M_histo.at(1).at(3).at(4)->GetBinContent(g + 1, 2));
361 double norm_max = cut_out_norm.at(1).at(1).at(3).at(4);
362 double pow_max = cut_out_pow.at(1).at(1).at(3).at(4);
363 double bkg_max = cut_out_bkg.at(1).at(1).at(3).at(4);
364 B2DEBUG(30,
"norm par max:" << norm_max);
365 B2DEBUG(30,
"pow par max:" << pow_max);
366 B2DEBUG(30,
"bkg par max:" << bkg_max);
367 B2DEBUG(30,
"evaluate max cut:" << norm_max / (sqrt(sin(t_out_theta)) * pow(p_out_mom, pow_max)) + bkg_max);
368 B2DEBUG(30,
"----------------------------------------");
376 for (
int par = 0; par <
c_nbinpar; par++) {
377 for (
int lay1 = 0; lay1 <
c_nbinlay; lay1++) {
378 for (
int lay2 = 0; lay2 <
c_nbinlay; lay2++) {
379 for (
int theta = 0; theta <
c_nbint; theta++) {
380 for (
int p = 0; p <
c_nbinp; p++) {
381 double layerdiff = lay2 - lay1;
382 if (layerdiff >= 0 && layerdiff < 3) {
383 if (
m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->GetEntries() > 0) {
384 m_histo.at(par).at(lay1).at(lay2).at(theta).at(p)->Write();
394 for (
int par = 0; par <
c_nbinpar; par++) {
395 for (
int lay1 = 0; lay1 <
c_nbinlay; lay1++) {
396 for (
int lay2 = 0; lay2 <
c_nbinlay; lay2++) {
397 for (
int minmax = 0; minmax < 2; minmax++) {
399 int layerdiff = lay2 - lay1;
400 if (layerdiff >= 0 && layerdiff < 3) {
401 cut_m_histo.at(par).at(lay1).at(lay2)->Write();
405 int layerdiff = lay2 - lay1;
406 if (layerdiff >= 0 && layerdiff < 3) {
407 cut_M_histo.at(par).at(lay1).at(lay2)->Write();
418 TH3F* output_norm_m =
new TH3F(
"output_norm_m",
"output_norm_m",
c_nbinpar, 0, 4,
c_nbinlay, 0, 4,
c_nbinlay, 0, 4);
419 TH3F* output_pow_m =
new TH3F(
"output_pow_m",
"output_pow_m",
c_nbinpar, 0, 4,
c_nbinlay, 0, 4,
c_nbinlay, 0, 4);
420 TH3F* output_bkg_m =
new TH3F(
"output_bkg_m",
"output_bkg_m",
c_nbinpar, 0, 4,
c_nbinlay, 0, 4,
c_nbinlay, 0, 4);
422 TH3F* output_norm_M =
new TH3F(
"output_norm_M",
"output_norm_M",
c_nbinpar, 0, 4,
c_nbinlay, 0, 4,
c_nbinlay, 0, 4);
423 TH3F* output_pow_M =
new TH3F(
"output_pow_M",
"output_pow_M",
c_nbinpar, 0, 4,
c_nbinlay, 0, 4,
c_nbinlay, 0, 4);
424 TH3F* output_bkg_M =
new TH3F(
"output_bkg_M",
"output_bkg_M",
c_nbinpar, 0, 4,
c_nbinlay, 0, 4,
c_nbinlay, 0, 4);
427 for (
int par = 0; par <
c_nbinpar; par++) {
428 for (
int lay1 = 0; lay1 <
c_nbinlay; lay1++) {
429 for (
int lay2 = 0; lay2 <
c_nbinlay; lay2++) {
430 output_norm_m->SetBinContent(par, lay1, lay2, cut_out_norm.at(0).at(par).at(lay1).at(lay2));
431 output_norm_M->SetBinContent(par, lay1, lay2, cut_out_norm.at(1).at(par).at(lay1).at(lay2));
433 output_pow_m->SetBinContent(par, lay1, lay2, cut_out_pow.at(0).at(par).at(lay1).at(lay2));
434 output_pow_M->SetBinContent(par, lay1, lay2, cut_out_pow.at(1).at(par).at(lay1).at(lay2));
436 output_bkg_m->SetBinContent(par, lay1, lay2, cut_out_bkg.at(0).at(par).at(lay1).at(lay2));
437 output_bkg_M->SetBinContent(par, lay1, lay2, cut_out_bkg.at(1).at(par).at(lay1).at(lay2));
443 output_norm_m->Write();
444 output_norm_M->Write();
445 output_pow_m->Write();
446 output_pow_M->Write();
447 output_bkg_m->Write();
448 output_bkg_M->Write();
452 B2INFO(
"number of spacepoint with theta out of limits=" <<
m_tCounter);
453 B2INFO(
"number of spacepoint with momentum out of limits=" <<
m_pCounter);
454 B2INFO(
"number of tracks cutted by global cuts=" <<
m_globCounter);
467 double layerdiff = layer2 - layer1;
468 if (layerdiff >= 0 && layerdiff < 3) {
470 case NoKickCuts::c_Omega:
475 case NoKickCuts::c_D0:
480 case NoKickCuts::c_Phi0:
485 case NoKickCuts::c_Z0:
490 case NoKickCuts::c_Tanlambda:
502 double mom = p * pwidth;
504 out = -7.5 * pow(10, -7) / pow(mom, 3.88) + 1;
505 else out = 6.3 * mom + 0.57;