264{
265 std::map<int, int> myMap;
266
285
286 TVector3 P(myPx, myPy, myPz);
287 TVector3 Z(0, 0, 1);
288 double myPmag = P.Mag();
289
290 int in = myMap.find(myPdg)->second;
291
292 if (model == "duneCdr")
293 {
294
295 double (*resolution_ptr_duneCdr[18])(double, double, double) = {
314
315 double resolution = (*resolution_ptr_duneCdr[in])(myE, myKE, myPmag);
316
317 if (resolution == -1)
318 {
319 return 0;
320 }
321 else
322 {
323 double var = 0;
324 double eSq = 0;
325
327 {
328 var += pow((resolution * myKE), 2);
329 eSq += pow(myKE, 2);
330 }
331 else
332 {
333 var += pow((resolution * myE), 2);
334 eSq += pow(myE, 2);
335 }
336
337 double m = log(eSq / (pow(var + eSq, 0.5)));
338 double s = pow(log(1 + (var / eSq)), 0.5);
339
340 std::lognormal_distribution<double> distLognorm(m, s);
341
343 {
344 if (myPmag < 1)
345 {
346 std::uniform_real_distribution<double> distUni(0, 1);
347
348 if (distUni(
gen) < 0.1)
349 {
350 return 0;
351 }
352 else
353 {
354 return 0.6 * (distLognorm(
gen));
355 }
356 }
357 else
358 {
359 return 0.6 * (distLognorm(
gen));
360 }
361 }
362 else
363 {
364 return distLognorm(
gen);
365 }
366 }
367 }
368
369
370
371 else if (model == "default")
372 {
373 double info[18][2] = {
374
375 {0.15, 1},
376 {0.15, 1},
377 {0.15, 1},
378 {0.2, 1},
379 {0.2, 1},
380 {0.3, 0.5},
381 {0.4, 1},
382 {0.4, 1},
383 {0.4, 1},
384 {0.15, 1},
385 {0.15, 1},
386 {0.5, 0.5},
387 {0.2, 1},
388 {0.2, 1},
389 {0.3, 1},
390 {0.3, 1},
391 {0.3, 1},
392 {0.3, 1}};
393
394 double resolution = info[in][0];
395 double chanceToSee = info[in][1];
396 double var = 0;
397 double eSq = 0;
398
400 {
401 var += pow((resolution * myKE), 2);
402 eSq += pow(myKE, 2);
403 }
404 else
405 {
406 var += pow((resolution * myE), 2);
407 eSq += pow(myE, 2);
408 }
409
410 double m = log(eSq / (pow(var + eSq, 0.5)));
411 double s = pow(log(1 + (var / eSq)), 0.5);
412
413 std::lognormal_distribution<double> distLognorm(m, s);
414 std::uniform_real_distribution<double> distUni(0, 1);
415
416 if (distUni(
gen) < chanceToSee)
417 {
418 if (myKE > 0.05)
419 {
420 return distLognorm(
gen);
421 }
422 else
423 {
424 return 0;
425 }
426 }
427 else
428 {
429 return 0;
430 }
431 }
432 else
433 {
434 std::cout << "Error: Resolution model not found./n";
435 }
436}
double Gamma_Res_duneCdr(double myE, double myKE, double myPmag)
double Electron_Res_duneCdr(double myE, double myKE, double myPmag)
double Lambda_Res_duneCdr(double myE, double myKE, double myPmag)
double AntiK0_Res_duneCdr(double myE, double myKE, double myPmag)
double Positron_Res_duneCdr(double myE, double myKE, double myPmag)
double PiM_Res_duneCdr(double myE, double myKE, double myPmag)
double K0_Res_duneCdr(double myE, double myKE, double myPmag)
double Neutron_Res_duneCdr(double myE, double myKE, double myPmag)
double AntiMuon_Res_duneCdr(double myE, double myKE, double myPmag)
double SigmaP_Res_duneCdr(double myE, double myKE, double myPmag)
double Pi0_Res_duneCdr(double myE, double myKE, double myPmag)
double SigmaM_Res_duneCdr(double myE, double myKE, double myPmag)
double Proton_Res_duneCdr(double myE, double myKE, double myPmag)
double PiP_Res_duneCdr(double myE, double myKE, double myPmag)
double KP_Res_duneCdr(double myE, double myKE, double myPmag)
double Muon_Res_duneCdr(double myE, double myKE, double myPmag)
double Sigma0_Res_duneCdr(double myE, double myKE, double myPmag)
double KM_Res_duneCdr(double myE, double myKE, double myPmag)
bool IsNeutronOrProton(int pdgc)