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 <analysis/dataobjects/EventExtraInfo.h>
15 #include <TDatabasePDG.h>
16 #include <TLorentzVector.h>
19 #include <generators/utilities/InitialParticleGeneration.h>
44 double rescrossphot[40];
45 double rescrossphoterr[40];
46 double rescrossphotfrac[40];
57 double hnmmaxtriallimit;
66 double biasneghitmiss;
81 double babayaganlo_rndm_(
int*)
83 double r = gRandom->Rndm();
88 double babayaganlo_getrandomcmsenergy_()
90 B2FATAL(
"babayaganlo_getrandomcmsenergy() is not implmented");
95 void main_belle2_(
int* mode,
double* ecm,
double* xpar,
int* npar);
98 void babayaga_setvpolnsk_(
const char* vpolnskfilename,
size_t* length);
101 void babayaganlo_warning_overweight_(
double* weight,
double* max)
103 B2WARNING(
"Babayaga.NLO: Maximum weight " << *max <<
" to small, increase fmax to at least " << *weight);
107 void babayaganlo_error_rejection_(
double* ratio)
109 B2ERROR(
"Babayaga.NLO: Event rejected! Ratio of cross section error increase too large: " << *ratio);
113 void babayaganlo_error_negative_(
double* weight)
115 B2ERROR(
"Babayaga.NLO: Event has negative weight: " << *weight);
119 void babayaganlo_result_nominalcmsenergy_(
double* energy)
121 B2RESULT(
"Babayaga.NLO: Nominal CMS energy (GeV): " << *energy);
124 void babayaganlo_result_weightedxsec_(
double* xsec,
double* xsecerr)
126 B2RESULT(
"Babayaga.NLO: Weighted cross section (nb): " << *xsec <<
" +/- " << *xsecerr);
129 void babayaganlo_result_unweightedxsec_(
double* xsec,
double* xsecerr)
131 B2RESULT(
"Babayaga.NLO: Unweighted cross section (nb): " << *xsec <<
" +/- " << *xsecerr);
134 void babayaganlo_result_unweightedxsec_biascorrected_(
double* xsec,
double* xsecerr)
136 B2RESULT(
"Babayaga.NLO: Unweighted cross section, bias corrected (nb): " << *xsec <<
" +/- " << *xsecerr);
139 void babayaganlo_result_unweightedxsec_overweight_(
double* xsec,
double* xsecerr)
141 B2RESULT(
"Babayaga.NLO: Unweighted cross section overweight (nb): " << *xsec <<
" +/- " << *xsecerr);
144 void babayaganlo_result_unweightedxsec_underweight_(
double* xsec,
double* xsecerr)
146 B2RESULT(
"Babayaga.NLO: Unweighted cross section underweight (nb): " << -*xsec <<
" +/- " << *xsecerr);
149 void babayaganlo_result_hitormisseff_(
double* eff)
151 B2RESULT(
"Babayaga.NLO: Hit or miss efficiency: " << *eff * 100. <<
" % ");
154 void babayaganlo_result_nover_(
int* nover)
156 B2RESULT(
"Babayaga.NLO: Points with w > fmax (bias): " << *nover);
159 void babayaganlo_result_biashit_(
double* biashit)
161 B2RESULT(
"Babayaga.NLO: Bias/hit: " << *biashit * 100. <<
" % ");
164 void babayaganlo_result_biashitpmiss_(
double* biashitpmiss)
166 B2RESULT(
"Babayaga.NLO: Bias/(hit+missed): " << *biashitpmiss * 100. <<
" % ");
169 void babayaganlo_result_nneg_(
int* nneg)
171 B2RESULT(
"Babayaga.NLO: Points with w > fmax (bias): " << *nneg);
174 void babayaganlo_result_biasneghit_(
double* biasneghit)
176 B2RESULT(
"Babayaga.NLO: Neg. bias/hit: " << *biasneghit * 100. <<
" % ");
179 void babayaganlo_result_biasneghitmiss_(
double* biasneghitmiss)
181 B2RESULT(
"Babayaga.NLO: Neg. bias/(hit+missed): " << *biasneghitmiss * 100. <<
" % ");
184 void babayaganlo_result_maxweight_(
double* sdifmax,
double* fmax)
186 B2RESULT(
"Babayaga.NLO: Maximum weight (sdifmax): " << *sdifmax <<
", user maximum weight(fmax): " << *fmax);
189 void babayaganlo_result_vpmin_(
double* xsec,
double* xsecerr,
double* frac)
191 B2RESULT(
"Babayaga.NLO: VP Uncertainty, minimum (nb): " << *xsec <<
" +/- " << *xsecerr <<
" (" << *frac <<
" %)");
194 void babayaganlo_result_vpcentral_(
double* xsec,
double* xsecerr)
196 B2RESULT(
"Babayaga.NLO: VP Uncertainty, central (nb): " << *xsec <<
" +/- " << *xsecerr);
199 void babayaganlo_result_vpmax_(
double* xsec,
double* xsecerr,
double* frac)
201 B2RESULT(
"Babayaga.NLO: VP Uncertainty, maximum (nb): " << *xsec <<
" +/- " << *xsecerr <<
" ( " << *frac <<
" %)");
204 void babayaganlo_finishedmaxsearch_(
double* fmax)
206 B2INFO(
"Babayaga.NLO: Finished maximum search: " << *fmax <<
", starting now unweighted generation");
209 void babayaganlo_fatal_usercuts_()
211 B2FATAL(
"Babayaga.NLO: UserMode is selected but wrong user cuts are provided!");
214 void babayaganlo_fatal_usercutsfs_()
216 B2FATAL(
"Babayaga.NLO: UserMode is only possible for ee final states!");
219 void babayaganlo_fatal_usercutsprescale_()
221 B2FATAL(
"Babayaga.NLO: Prescale value must be larger than 0 (zero), hint: ~100 is reasonable!");
224 void babayaganlo_fatal_weightedprescale_()
226 B2FATAL(
"Babayaga.NLO: Generator prescale is not allowed with usermode = weighted");
229 void babayaganlo_result_weightsum_(
double* wsum)
231 B2RESULT(
"Babayaga.NLO: Sum of weights: " << *wsum);
234 void babayaganlo_result_intlum_(
double* lum,
double* lumerr)
236 B2RESULT(
"Babayaga.NLO: Luminosity equivalent (using calc. xsec) (fb-1): " << *lum <<
" +/- " << *lumerr);
239 void babayaganlo_warning_prescaleweight_(
double* weight)
241 B2WARNING(
"Babayaga.NLO: Prescale of less than one, increase prescale safety margin " << *weight);
244 void babayaganlo_error_isnan1_(
double* phsp,
double* w)
246 B2ERROR(
"Babayaga.NLO: phsp (" << *phsp <<
") or w (" << *w <<
") are NAN, skipping event (nan1 type)");
249 void babayaganlo_error_isnan2_(
double* sdif)
251 B2ERROR(
"Babayaga.NLO: sdif (" << *sdif <<
") is NAN, skipping event (nan2 type)");
258 BabayagaNLO::BabayagaNLO()
260 for (
int i = 0; i < 100; ++i) {
267 setDefaultSettings();
270 BabayagaNLO::~BabayagaNLO()
275 void BabayagaNLO::setDefaultSettings()
278 m_cmsEnergyNominal = -1.;
286 m_mode =
"unweighted";
289 m_pi = 3.1415926535897932384626433832795029;
290 m_conversionFactor = 0.389379660e6;
291 m_alphaQED0 = 1.0 / 137.0359895;
292 m_massElectron = 0.51099906 * Unit::MeV;
293 m_massMuon = 105.65836900 * Unit::MeV;
294 m_massW = 80.385 * Unit::GeV;
295 m_massZ = 91.1882 * Unit::GeV;
296 m_widthZ = 2.4952 * Unit::GeV;
297 m_eMin = 0.1 * Unit::GeV;
299 m_maxAcollinearity = 180.0;
301 m_ScatteringAngleRange = make_pair(15.0, 165.0);
302 m_ScatteringAngleRangePhoton = make_pair(15.0, 165.0);
305 m_nSearchMax = 50000;
307 m_EnergySpread = 5e-3;
308 m_VPUncertainty =
false;
320 void BabayagaNLO::initExtraInfo()
326 void BabayagaNLO::init()
332 void BabayagaNLO::generateEvent(
MCParticleGraph& mcGraph,
double ecm, TVector3 vertex, TLorentzRotation boost)
336 main_belle2_(&mode, &ecm, m_xpar, m_npar);
339 storeParticle(mcGraph, momset_.bq1, 11, vertex, boost,
true);
340 storeParticle(mcGraph, momset_.bp1, -11, vertex, boost,
true);
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, TVector3 vertex, TLorentzRotation boost,
489 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(TVector3(mom[0], mom[1], mom[2]));
516 part.setMass(TDatabasePDG::Instance()->GetParticle(pdg)->Mass());
517 part.setEnergy(mom[3]);
520 TLorentzVector p4 = part.get4Vector();
526 TVector3 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.