9 #include <generators/babayaganlo/BabayagaNLO.h>
10 #include <framework/gearbox/Unit.h>
11 #include <framework/logging/Logger.h>
12 #include <framework/dataobjects/EventMetaData.h>
13 #include <framework/dataobjects/EventExtraInfo.h>
15 #include <TDatabasePDG.h>
18 #include <generators/utilities/InitialParticleGeneration.h>
43 double rescrossphot[40];
44 double rescrossphoterr[40];
45 double rescrossphotfrac[40];
56 double hnmmaxtriallimit;
65 double biasneghitmiss;
80 double babayaganlo_rndm_(
int*)
82 double r = gRandom->Rndm();
87 double babayaganlo_getrandomcmsenergy_()
89 B2FATAL(
"babayaganlo_getrandomcmsenergy() is not implmented");
94 void main_belle2_(
int* mode,
double* ecm,
double* xpar,
int* npar);
97 void babayaga_setvpolnsk_(
const char* vpolnskfilename,
size_t* length);
100 void babayaganlo_warning_overweight_(
const double* weight,
const double* max)
102 B2WARNING(
"Babayaga.NLO: Maximum weight " << *max <<
" to small, increase fmax to at least " << *weight);
106 void babayaganlo_error_rejection_(
const double* ratio)
108 B2ERROR(
"Babayaga.NLO: Event rejected! Ratio of cross section error increase too large: " << *ratio);
112 void babayaganlo_error_negative_(
const double* weight)
114 B2ERROR(
"Babayaga.NLO: Event has negative weight: " << *weight);
118 void babayaganlo_result_nominalcmsenergy_(
const double* energy)
120 B2RESULT(
"Babayaga.NLO: Nominal CMS energy (GeV): " << *energy);
123 void babayaganlo_result_weightedxsec_(
const double* xsec,
const double* xsecerr)
125 B2RESULT(
"Babayaga.NLO: Weighted cross section (nb): " << *xsec <<
" +/- " << *xsecerr);
128 void babayaganlo_result_unweightedxsec_(
const double* xsec,
const double* xsecerr)
130 B2RESULT(
"Babayaga.NLO: Unweighted cross section (nb): " << *xsec <<
" +/- " << *xsecerr);
133 void babayaganlo_result_unweightedxsec_biascorrected_(
const double* xsec,
const double* xsecerr)
135 B2RESULT(
"Babayaga.NLO: Unweighted cross section, bias corrected (nb): " << *xsec <<
" +/- " << *xsecerr);
138 void babayaganlo_result_unweightedxsec_overweight_(
const double* xsec,
const double* xsecerr)
140 B2RESULT(
"Babayaga.NLO: Unweighted cross section overweight (nb): " << *xsec <<
" +/- " << *xsecerr);
143 void babayaganlo_result_unweightedxsec_underweight_(
const double* xsec,
const double* xsecerr)
145 B2RESULT(
"Babayaga.NLO: Unweighted cross section underweight (nb): " << -*xsec <<
" +/- " << *xsecerr);
148 void babayaganlo_result_hitormisseff_(
const double* eff)
150 B2RESULT(
"Babayaga.NLO: Hit or miss efficiency: " << *eff * 100. <<
" % ");
153 void babayaganlo_result_nover_(
const int* nover)
155 B2RESULT(
"Babayaga.NLO: Points with w > fmax (bias): " << *nover);
158 void babayaganlo_result_biashit_(
const double* biashit)
160 B2RESULT(
"Babayaga.NLO: Bias/hit: " << *biashit * 100. <<
" % ");
163 void babayaganlo_result_biashitpmiss_(
const double* biashitpmiss)
165 B2RESULT(
"Babayaga.NLO: Bias/(hit+missed): " << *biashitpmiss * 100. <<
" % ");
168 void babayaganlo_result_nneg_(
const int* nneg)
170 B2RESULT(
"Babayaga.NLO: Points with w > fmax (bias): " << *nneg);
173 void babayaganlo_result_biasneghit_(
const double* biasneghit)
175 B2RESULT(
"Babayaga.NLO: Neg. bias/hit: " << *biasneghit * 100. <<
" % ");
178 void babayaganlo_result_biasneghitmiss_(
const double* biasneghitmiss)
180 B2RESULT(
"Babayaga.NLO: Neg. bias/(hit+missed): " << *biasneghitmiss * 100. <<
" % ");
183 void babayaganlo_result_maxweight_(
const double* sdifmax,
const double* fmax)
185 B2RESULT(
"Babayaga.NLO: Maximum weight (sdifmax): " << *sdifmax <<
", user maximum weight(fmax): " << *fmax);
188 void babayaganlo_result_vpmin_(
const double* xsec,
const double* xsecerr,
const double* frac)
190 B2RESULT(
"Babayaga.NLO: VP Uncertainty, minimum (nb): " << *xsec <<
" +/- " << *xsecerr <<
" (" << *frac <<
" %)");
193 void babayaganlo_result_vpcentral_(
const double* xsec,
const double* xsecerr)
195 B2RESULT(
"Babayaga.NLO: VP Uncertainty, central (nb): " << *xsec <<
" +/- " << *xsecerr);
198 void babayaganlo_result_vpmax_(
const double* xsec,
const double* xsecerr,
const double* frac)
200 B2RESULT(
"Babayaga.NLO: VP Uncertainty, maximum (nb): " << *xsec <<
" +/- " << *xsecerr <<
" ( " << *frac <<
" %)");
203 void babayaganlo_finishedmaxsearch_(
const double* fmax)
205 B2INFO(
"Babayaga.NLO: Finished maximum search: " << *fmax <<
", starting now unweighted generation");
208 void babayaganlo_fatal_usercuts_()
210 B2FATAL(
"Babayaga.NLO: UserMode is selected but wrong user cuts are provided!");
213 void babayaganlo_fatal_usercutsfs_()
215 B2FATAL(
"Babayaga.NLO: UserMode is only possible for ee final states!");
218 void babayaganlo_fatal_usercutsprescale_()
220 B2FATAL(
"Babayaga.NLO: Prescale value must be larger than 0 (zero), hint: ~100 is reasonable!");
223 void babayaganlo_fatal_weightedprescale_()
225 B2FATAL(
"Babayaga.NLO: Generator prescale is not allowed with usermode = weighted");
228 void babayaganlo_result_weightsum_(
const double* wsum)
230 B2RESULT(
"Babayaga.NLO: Sum of weights: " << *wsum);
233 void babayaganlo_result_intlum_(
const double* lum,
const double* lumerr)
235 B2RESULT(
"Babayaga.NLO: Luminosity equivalent (using calc. xsec) (fb-1): " << *lum <<
" +/- " << *lumerr);
238 void babayaganlo_warning_prescaleweight_(
const double* weight)
240 B2WARNING(
"Babayaga.NLO: Prescale of less than one, increase prescale safety margin " << *weight);
243 void babayaganlo_error_isnan1_(
const double* phsp,
const double* w)
245 B2ERROR(
"Babayaga.NLO: phsp (" << *phsp <<
") or w (" << *w <<
") are NAN, skipping event (nan1 type)");
248 void babayaganlo_error_isnan2_(
const double* sdif)
250 B2ERROR(
"Babayaga.NLO: sdif (" << *sdif <<
") is NAN, skipping event (nan2 type)");
257 BabayagaNLO::BabayagaNLO()
259 for (
int i = 0; i < 100; ++i) {
266 setDefaultSettings();
269 BabayagaNLO::~BabayagaNLO()
274 void BabayagaNLO::setDefaultSettings()
277 m_cmsEnergyNominal = -1.;
285 m_mode =
"unweighted";
288 m_pi = 3.1415926535897932384626433832795029;
289 m_conversionFactor = 0.389379660e6;
290 m_alphaQED0 = 1.0 / 137.0359895;
291 m_massElectron = 0.51099906 * Unit::MeV;
292 m_massMuon = 105.65836900 * Unit::MeV;
293 m_massW = 80.385 * Unit::GeV;
294 m_massZ = 91.1882 * Unit::GeV;
295 m_widthZ = 2.4952 * Unit::GeV;
296 m_eMin = 0.1 * Unit::GeV;
298 m_maxAcollinearity = 180.0;
300 m_ScatteringAngleRange = make_pair(15.0, 165.0);
301 m_ScatteringAngleRangePhoton = make_pair(15.0, 165.0);
304 m_nSearchMax = 50000;
306 m_EnergySpread = 5e-3;
307 m_VPUncertainty =
false;
319 void BabayagaNLO::initExtraInfo()
325 void BabayagaNLO::init()
331 void BabayagaNLO::generateEvent(
MCParticleGraph& mcGraph,
double ecm, ROOT::Math::XYZVector vertex,
332 ROOT::Math::LorentzRotation boost)
336 main_belle2_(&mode, &ecm, m_xpar, m_npar);
339 storeParticle(mcGraph, momset_.bq1, 11, vertex, boost,
false,
true,
false);
340 storeParticle(mcGraph, momset_.bp1, -11, vertex, boost,
false,
true,
false);
346 if (m_finalState ==
"gg") {
349 }
else if (m_finalState ==
"mm") {
354 storeParticle(mcGraph, momset_.bq2, pdg, vertex, boost,
false,
false,
false);
355 storeParticle(mcGraph, momset_.bp2, antipdg, vertex, boost,
false,
false,
false);
358 for (
int iPhot = 0; iPhot < momset_.bnphot; ++iPhot) {
359 double photMom[4] = {momset_.bphot[0][iPhot], momset_.bphot[1][iPhot], momset_.bphot[2][iPhot], momset_.bphot[3][iPhot]};
360 storeParticle(mcGraph, photMom, 22, vertex, boost,
false,
false,
true);
365 eventMetaDataPtr->setGeneratedWeight(momset_.bweight);
369 if (not eventExtraInfo.isValid())
370 eventExtraInfo.create();
371 if (eventExtraInfo->hasExtraInfo(
"GeneratedPrescale")) {
372 B2WARNING(
"EventExtraInfo with given name is already set! I won't set it again!");
374 float targetValue = prescale_.bprescale;
375 eventExtraInfo->addExtraInfo(
"GeneratedPrescale", targetValue);
381 void BabayagaNLO::term()
384 B2RESULT(
"Babayaga.NLO: Final state: " << m_finalState);
385 B2RESULT(
"Babayaga.NLO: Mode: " << m_mode);
386 B2RESULT(
"Babayaga.NLO: Order: " << m_order);
387 B2RESULT(
"Babayaga.NLO: Model: " << m_model);
388 B2RESULT(
"Babayaga.NLO: Vac. pol. (VP): " << m_vacPol);
389 B2RESULT(
"Babayaga.NLO: Usercuts: " << m_userMode);
395 main_belle2_(&mode, &ecm, m_xpar, m_npar);
403 void BabayagaNLO::applySettings()
409 m_npar[1] = m_nSearchMax;
410 if (m_VPUncertainty) m_npar[5] = 1;
416 m_xpar[0] = m_cmsEnergyNominal;
418 m_xpar[2] = m_conversionFactor;
419 m_xpar[3] = m_alphaQED0;
420 m_xpar[4] = m_massElectron;
421 m_xpar[5] = m_massMuon;
424 m_xpar[8] = m_widthZ;
426 m_xpar[10] = m_maxAcollinearity;
427 m_xpar[11] = m_epsilon;
428 m_xpar[20] = m_ScatteringAngleRange.first;
429 m_xpar[21] = m_ScatteringAngleRange.second;
431 m_xpar[40] = m_EnergySpread;
434 m_xpar[50] = m_eemin;
435 m_xpar[51] = m_temin;
436 m_xpar[52] = m_egmin;
437 m_xpar[53] = m_tgmin;
438 m_xpar[54] = m_eeveto;
439 m_xpar[55] = m_teveto;
440 m_xpar[56] = m_egveto;
441 m_xpar[57] = m_tgveto;
442 m_xpar[58] = m_maxprescale;
447 if (m_finalState ==
"ee") m_npar[20] = 1;
448 else if (m_finalState ==
"gg") m_npar[20] = 2;
449 else if (m_finalState ==
"mm") m_npar[20] = 3;
450 else B2FATAL(
"Invalid final state: " << m_finalState);
452 if (m_model ==
"matched") m_npar[21] = 1;
453 else if (m_model ==
"ps") m_npar[21] = 2;
454 else B2FATAL(
"Invalid matching model: " << m_model);
456 if (m_order ==
"born") m_npar[22] = 1;
457 else if (m_order ==
"alpha") m_npar[22] = 2;
458 else if (m_order ==
"exp") m_npar[22] = 3;
459 else B2FATAL(
"Invalid QED order: " << m_order);
461 if (m_vacPol ==
"off") m_npar[23] = 1;
462 else if (m_vacPol ==
"hadr5") m_npar[23] = 2;
463 else if (m_vacPol ==
"hlmnt") m_npar[23] = 3;
464 else B2FATAL(
"Invalid vacuum polarization code: " << m_vacPol);
466 if (m_mode ==
"unweighted" || m_mode ==
"uw") m_npar[24] = 1;
467 else if (m_mode ==
"weighted" || m_mode ==
"w") m_npar[24] = 2;
468 else B2FATAL(
"Invalid mode: " << m_mode);
470 if (m_userMode ==
"NONE") m_npar[25] = 1;
471 else if (m_userMode ==
"GAMMA") m_npar[25] = 2;
472 else if (m_userMode ==
"EGAMMA") m_npar[25] = 3;
473 else if (m_userMode ==
"ETRON") m_npar[25] = 4;
474 else if (m_userMode ==
"PRESCALE") m_npar[25] = 5;
475 else B2FATAL(
"Invalid user mode: " << m_userMode);
478 size_t fileLength = m_NSKDataFile.size();
479 babayaga_setvpolnsk_(m_NSKDataFile.c_str(), &fileLength);
484 main_belle2_(&mode, &ecm, m_xpar, m_npar);
488 void BabayagaNLO::storeParticle(
MCParticleGraph& mcGraph,
const double* mom,
int pdg, ROOT::Math::XYZVector vertex,
489 ROOT::Math::LorentzRotation boost,
bool isVirtual,
bool isInitial,
bool isISRFSR)
495 part.setStatus(MCParticle::c_IsVirtual);
496 }
else if (isInitial) {
497 part.setStatus(MCParticle::c_Initial);
501 part.addStatus(MCParticle::c_PrimaryParticle);
504 part.addStatus(MCParticle::c_StableInGenerator);
508 part.addStatus(MCParticle::c_IsISRPhoton);
509 part.addStatus(MCParticle::c_IsFSRPhoton);
513 part.setFirstDaughter(0);
514 part.setLastDaughter(0);
515 part.setMomentum(ROOT::Math::XYZVector(mom[0], mom[1], mom[2]));
516 part.setMass(TDatabasePDG::Instance()->GetParticle(pdg)->Mass());
517 part.setEnergy(mom[3]);
520 ROOT::Math::PxPyPzEVector p4 = part.get4Vector();
526 ROOT::Math::XYZVector v3 = part.getProductionVertex();
528 part.setProductionVertex(v3);
529 part.setValidVertex(
true);
Class to represent Particle data in graph.
Class to build, validate and sort a particle decay chain.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Type-safe access to single objects in the data store.
GraphParticle & addParticle()
Add new particle to the graph.
Abstract base class for different kinds of events.