diff --git a/EvtGenModels/EvtB2MuMuMuNu.hh b/EvtGenModels/EvtB2MuMuMuNu.hh deleted file mode 100644 index 7df0b2c..0000000 --- a/EvtGenModels/EvtB2MuMuMuNu.hh +++ /dev/null @@ -1,51 +0,0 @@ -//-------------------------------------------------------------------------- -// -// Environment: -// This software is part of the EvtGen package developed jointly -// for the BaBar and CLEO collaborations. If you use all or part -// of it, please give an appropriate acknowledgement. -// -// Copyright Information: See EvtGen/COPYRIGHT -// Copyright (C) 2003 Caltech -// -// Module: EvtB2MuMuMuNu.hh -// -// Description: -// -// Modification history: -// -// Nikolai Nikitin (Lomonosov Moscow State Univ.) August 04, 2015 Module created -// Email: Nikolai.Nikitine@cern.ch -// -//------------------------------------------------------------------------ - -#ifndef EVTBUTOLLLN_HH -#define EVTBUTOLLLN_HH - -#include "EvtGenBase/EvtDecayAmp.hh" - -class EvtParticle; -class EvtbTosllMSFF; // my class with ff for the rare semileptonic B-decays -class EvtB2MuMuMuNuAmp; // my class with amplitudes for four-leptonic B^{pm}-decays - - -class EvtB2MuMuMuNu:public EvtDecayAmp{ - -public: - - EvtB2MuMuMuNu() {} ; - virtual ~EvtB2MuMuMuNu(); - - virtual std::string getName() ; - virtual EvtDecayBase* clone(); - - virtual void init(); - virtual void initProbMax(); - virtual void decay(EvtParticle *p); - -private: - EvtbTosllMSFF *_msffmodel; - EvtB2MuMuMuNuAmp *_calcamp; -}; - -#endif diff --git a/EvtGenModels/EvtB2MuMuMuNuAmp.hh b/EvtGenModels/EvtB2MuMuMuNuAmp.hh deleted file mode 100644 index 4b00a60..0000000 --- a/EvtGenModels/EvtB2MuMuMuNuAmp.hh +++ /dev/null @@ -1,51 +0,0 @@ -//-------------------------------------------------------------------------- -// -// Environment: -// This software is part of the EvtGen package developed jointly -// for the BaBar and CLEO collaborations. If you use all or part -// of it, please give an appropriate acknowledgement. -// -// Copyright Information: See EvtGen/COPYRIGHT -// Copyright (C) 1998 Caltech, UCSB -// -// Module: EvtB2MuMuMuNuAmp.hh -// -// Description: -// -// Modification history: -// -// Nikolai Nikitin (Lomonosov Moscow State Univ.) August 06, 2015 Module created -// Email: Nikolai.Nikitine@cern.ch -// -//------------------------------------------------------------------------ - -#ifndef EVTBUTOLLLN_AMP_HH -#define EVTBUTOLLLN_AMP_HH - - -class EvtId; -class EvtAmp; -class EvtParticle; -class EvtbTosllMSFF; // my class with ff for the rare semileptonic B-decays - -class EvtB2MuMuMuNuAmp{ - - public: - - void CalcAmp( EvtParticle *parent, - EvtAmp& amp, - EvtbTosllMSFF *formFactorsms - ); - - double CalcMaxProb(); - - double lambda(double a, double b, double c); - - double FF_B2BstarGamma_fromU(double q2); - - double FF_B2BstarGamma_fromB(double q2); - -}; - -#endif - diff --git a/EvtGenModels/EvtBLLNuL.hh b/EvtGenModels/EvtBLLNuL.hh new file mode 100644 index 0000000..ee377d3 --- /dev/null +++ b/EvtGenModels/EvtBLLNuL.hh @@ -0,0 +1,49 @@ +//-------------------------------------------------------------------------- +// +// Copyright Information: See EvtGen/COPYRIGHT +// +// Module: EvtBLLNuL.hh +// +// Description: The header file for the model "BLLNUL" which simulates +// the rare four-leptonic B-decays +// B^-(p) -> ell^+(k_1) ell^-(k_2) neu (k_3) ell^-(k_4) +// +// Modification history: +// +// Anna Danilina (anna.danilina@cern.ch) and +// Nikolai Nikitin (Nikolai.Nikitine@cern.ch) Nov 2018 Module created +// +//------------------------------------------------------------------------ + +#ifndef EVTBLLNUL_HH +#define EVTBLLNUL_HH + +#include "EvtGenBase/EvtDecayAmp.hh" + +#include + +class EvtParticle; +class EvtbTosllMSFF; // Form factor class +class EvtBLLNuLAmp; // Amplitude class + +class EvtBLLNuL: public EvtDecayAmp { + +public: + + EvtBLLNuL(); + virtual ~EvtBLLNuL(); + + virtual std::string getName(); + virtual EvtDecayBase* clone(); + + virtual void init(); + virtual void initProbMax(); + virtual void decay(EvtParticle *p); + +private: + + EvtBLLNuLAmp* calcAmp_; + +}; + +#endif diff --git a/EvtGenModels/EvtBLLNuLAmp.hh b/EvtGenModels/EvtBLLNuLAmp.hh new file mode 100644 index 0000000..4ee80e1 --- /dev/null +++ b/EvtGenModels/EvtBLLNuLAmp.hh @@ -0,0 +1,132 @@ +//-------------------------------------------------------------------------- +// +// +// Module: EvtB2MuMuENuAmp.hh +// +// Description: Header file for the amplitude calculation for the "BLLNUL" +// model which generates rare four-leptonic B-decays +// B^-(p) -> ell^+(k_1) ell^-(k_2) neu (k_3) ell^-(k_4) +// +// Modification history: +// +// Anna Danilina (anna.danilina@cern.ch) and +// Nikolai Nikitin (Nikolai.Nikitine@cern.ch) Nov 2018 Module created +// John B Code optimisations +// +//------------------------------------------------------------------------ + +#ifndef EVTBLLNUL_AMP_HH +#define EVTBLLNUL_AMP_HH + +#include "EvtGenBase/EvtAmp.hh" +#include "EvtGenBase/EvtComplex.hh" +#include "EvtGenBase/EvtId.hh" +#include "EvtGenBase/EvtTensor4C.hh" +#include "EvtGenBase/EvtVector4R.hh" + +#include + +class EvtParticle; + +class EvtBLLNuLAmp { + +public: + + EvtBLLNuLAmp(double qSqMin, double kSqMin, bool symmetry, double Vub = 4.09e-3); + + virtual ~EvtBLLNuLAmp(); + + void CalcAmp(EvtParticle *parent, EvtAmp& amp) const; + + // Resonance poles + class ResPole { + public: + ResPole(double mass, double width, double coupling); + virtual ~ResPole() {;} + + EvtComplex propagator(double qSq, int numForm = 0) const; + + double getMass() const {return m0_;} + double getMassSq() const {return m0Sq_;} + double getWidth() const {return w0_;} + double getCoupling() const {return c_;} + + private: + double m0_; // pole mass + double m0Sq_; + double w0_; // width + double c_; // coupling constant + EvtComplex I_; + EvtComplex Imw_; + + }; + + // Kinematics + class KinInfo { + public: + KinInfo(const EvtVector4R& q, const EvtVector4R& k, + double qSq, double kSq, double MB, + int sign); + virtual ~KinInfo() {;} + + EvtVector4R getQ() const {return q_;} + EvtVector4R getK() const {return k_;} + double getQSq() const {return qSq_;} + double getKSq() const {return kSq_;} + double getMB() const {return MB_;} + int getSign() const {return sign_;} + + private: + EvtVector4R q_; + EvtVector4R k_; + double qSq_; + double kSq_; + double MB_; + int sign_; + }; + +protected: + + EvtTensor4C getHadronTensor(const EvtBLLNuLAmp::KinInfo& info) const; + + std::vector getVMDTerms(double qSq, double kSq, double MB) const; + + EvtComplex getBStarTerm(double qSq, double kSq, double MB) const; + + double FF_B2Bstar(double qSq) const; + + double FF_V(double kSq) const; + + double FF_A1(double kSq) const; + + double FF_A2(double kSq) const; + +private: + + // Kinematic cut-offs + double qSqMin_; + double kSqMin_; + + // If we have identical charged lepton flavours + bool symmetry_; + + // B+, B- Ids + EvtId BpId_, BnId_; + + // Form factor constants + double coupling_, sqrt2_; + double fBu_; + + // Resonance poles + EvtBLLNuLAmp::ResPole* Bstar_; + EvtBLLNuLAmp::ResPole* Upsilon_; + + std::vector resPoles_; + int nPoles_; + + // Complex number constants + EvtComplex zero_, unitI_; + +}; + +#endif diff --git a/History.txt b/History.txt index 02a6fc0..65ed4cf 100644 --- a/History.txt +++ b/History.txt @@ -1,545 +1,551 @@ //========================================================================== // // History file for EvtGen // //=========================================================================== +7th December 2018 John Back + Added the EvtBLLNuL (BLLNUL) model that generates rare B -> ell ell nu ell + decays, where ell = e or mu, courtesy of Anna Danilina and Nikolai Nikitin + (LHCb). Removed the EvtB2MuMuMuNu (BUTOMMMN) model, since its now replaced + by the more general BLLNuL one. + 5th November 2018 John Back Added the BToDiBaryonlnupQCD model for generating B to p N* l nu decays, where N can be any (exited) charged baryon (spin 1/2 or 3/2), courtesy of Mark Smith and Ryan Newcombe (LHCb), with added code optimisations. 17th October 2018 John Back Added various decay models from LHCb EvtGenExtras package: EvtBcVHad ("BC_VHAD"), Evtbs2llGammaMNT ("BSTOGLLMNT"), Evtbs2llGammaISRFSR ("BSTOGLLISRFSR"), EvtbTosllMS ("BTOSLLMS"), EvtbTosllMSExt ("BTOSLLMSEXT"), EvtLb2Baryonlnu ("Lb2Baryonlnu"), EvtLb2plnuLCSR ("Lb2plnuLCSR"), EvtLb2plnuLQCD ("Lb2plnuLQCD"), EvtFlatSqDalitz ("FLATSQDALITZ") and EvtPhspFlatLifetime ("PHSPFLATLIFETIME"). 5th October 2018 John Back Updated setupEvtGen.sh to work with the new HepForge Phabricator site. 13th March 2018 John Back Updated EvtPythiaEngine to correctly handle updates of various particle properties so that Pythia uses the same information as EvtGen (evt.pdl) for the generic and alias PYTHIA decay model. 12th March 2018 John Back Updated EvtBcXMuNu models (X = Scalar, Vector, Tensor) to generate Bc to D0(star) mu nu decays, with associated form factors in EvtBCXFF, courtesy of Aleksei Luchinskii (LHCb). Also generalised the calculation of their maximum probabilities by reusing the CalcMaxProb method in EvtSemiLeptonicAmp, which now allows for different Q^2 binning (default remains at 25 bins). R01-07-00------------------------------------------------------------------- 13th December 2017 John Back New tag incorporating all changes below. Recommended external packages are HepMC 2.06.09, pythia 8.230, Photos++ 3.61 and Tauola++ 1.1.6c, as used in the setupEvtGen.sh script. 12th December 2017 John Back Changed Pythia validation example decay files to use Pythia8 codes. 6th December 2017 John Back Modified the examples to use DECAY.DEC (see 25th April 2016) instead of DECAY_2010.DEC. Changed EvtExternalGenList to assume Pythia8 codes are used in decay files by default, which is the case for DECAY.DEC. Also updated the setupEvtGen.sh script to work with Pythia 8.2x versions. 29th November 2017 John Back Modified EvtSVP, EvtVVP and EvtTVP models to handle both radiative and two-lepton decays, courtesy of Aleksei Luchinskii (LHCb). 14th July 2017 John Back Only create external generator objects if they don't already exist in EvtExternalGenFactory. Modified configure script to work with Pythia 8.2x 5th July 2017 Michal Kreps Register the VTOSLL model. 14th June 2017 John Back Add isNeutralKaon() boolean function and corrected comments in EvtDDalitz. 8th May 2017 Michal Kreps Fix bug in EvtbTosllVectorAmp to recognise Bs --> K*bar mu mu decay as b --> d ll transition. 8th May 2017 Michal Kreps Significantly simplify way how we decide on decay mode and daughters ordering in DDalitz model. With new code by definition all orderings of daughters in the decay file will yield same output. 4th May 2017 John Back Further fixes to DDalitz particle ordering (including charge-conjugates): Mode 5: D0 -> K- K0bar K+ and K+ K- K0bar Mode 12: D0 -> pi0 pi- pi+ and pi+ pi0 pi- Removed unneeded index ordering checks for mode 10 (D+ -> pi- pi+ pi+) and mode 11 (Ds+ -> pi- pi+ pi+) 27th April 2017 John Back Fixed DDalitz particle ordering for mode 7: D+ -> pi+ K- K+ and K+ pi+ K- and their charge-conjugates 7th April 2017 John Back Modified EvtGenExternal/EvtPythiaEngine to ensure that the EvtGen-based instances of Pythia8 (for generic and alias decays) use the same particle properties as defined by EvtGen, courtesy Patrick Robbe (LHCb). 5th April 2017 Michal Kreps Fixed indexing in copy constructor of Evt3Rank3C, which would otherwise produce an infinite loop; bug report from David Grellscheid. 3rd November 2016 John Back Modified EvtFlatQ2 model to work for all B -> X lepton lepton modes, as well as adding an extra phase space factor to correct for the dip at low q^2, courtesy of Marcin Chrzaszcz & Thomas Blake (LHCb), which is enabled by using "FLATQ2 1" instead of just "FLATQ2" in the decay file. 13th October 2016 John Back Added the TauolaCurrentOption decfile keyword to select the hadronic current in Tauola; default is the BaBar-tuned current option (int = 1). EvtParticles can store double attributes using the functions setAttributeDouble(name, double) and getAttributeDouble(name), which can be useful for storing and retrieving amplitude weights, for example. The analogous EvtParticle integer attribute interface remains unchanged: setAttribute(name, int) and getAttribute(name). 13th September 2016 John Back Modified EvtTauolaEngine to use internal Tauola spin matrices for tau pair events by temporarily setting the PDG id of the mother as a boson, keeping the same 4-momentum. The BaBar hadronic currents are now used by default. Also added the ability to change some Tauola parameters using the "Define" keyword in decay files. Added an example decay file illustrating the new features: validation/TauolaFiles/Btautau.dec 9th September 2016 Michal Kreps Reimplement code in EvtBTo3pi.F, EvtBTo3piMPP.F, EvtBTo3piP00.F and EvtBToKpipi.F in C++ in order to remove dependence on Fortran compiler. With this, there is no internal Fortran code in EvtGen. R01-06-00------------------------------------------------------------------- 1st June 2016 John Back New tag incorporating all changes below. Recommended external packages are HepMC 2.06.09, pythia 8.186, Photos++ 3.61 and Tauola++ 1.1.5. 28th April 2016 Michal Kreps For Ds+ --> 2pi+ pi- there was double counting of branching fraction resulting in total branching fraction being 1.5 times larger than measured one. Fix by revisiting submodes, which now fill total Ds --> 3pi. 25th April 2016 Michal Kreps Added DECAY.DEC/XML, which contain updated semileptonic charm and beauty branching fractions using the 2014 PDG, tuned to minimize disagreements between measurements and EvtGen for both inclusive and exclusive decays. Updated the evt.pdl particle properties file to the PDG 2014 edition. Implemented new LQCD form factors for Lb --> L mu mu from arXiv paper 1602.01399 (EvtRareLbToLllFFlQCD); old LQCD form factors are removed. 18th March 2016 John Back Fixed incorrect spinor algebra used in S1 -> 1/2 S2, 1/2 -> S3 S4 decays in EvtDiracParticle::rotateToHelicityBasis() functions, courtesy of Luis Miguel Garcia Martin and the IFIC Valencia LHCb group. 19th Feburary 2016 John Back Fixed bug in the definition of the initial spinor term Sinit in EvtRareLbToLll::HadronicAmpRS(), from Tom Blake (LHCb). 12th February 2016 John Back From LHCb, added extensions to the EvtHQET2(FF) model for semitauonic decays from Brian Hamilton, which needs a patch to EvtSemiLeptonicAmp from Jack Wimberley to ensure that the q^2 range is physical when finding the maximum amplitude probability. 2nd December 2015 John Back From LHCb, added EvtKStopizmumu model for KS -> pi0 mu mu decays based on JHEP08(1998)004, courtesy of Veronika Chobanova, Diego Martinez Santos and Jeremy Dalseno. Added EvtConst::Fermi for Fermi coupling constant. R01-05-00------------------------------------------------------------------- 21st October 2015 John Back New tag incorporating all changes below. Recommended external packages are HepMC 2.06.09, pythia 8.186, Photos++ 3.61 and Tauola++ 1.1.5. Added the EvtB2MuMuMuNu model for simulating the very rare four-leptonic decays B- -> mu+ mu- anti-nu_mu mu-, courtesy Nikolai Nikitin. 16th October 2015 John Back Updated the configure script to automatically select the library names for PHOTOS++; version 3.56 and below uses Fortran, version 3.61 and above uses C++ only (default). Avoid using v3.60, since it does not work. This needs the PHOTOS libraries built before EvtGen is configured. Modified setupEvtGen.sh to use Photos++ v3.61. 7th October 2015 John Back Updated EvtGenExternal/EvtPhotosEngine to check that additional particles from the outgoing vertex are indeed (FSR) photons, since later versions of PHOTOS introduce pair emission, where particles may not always be photons. Added the genRootDecayChain.cc validation program to create ROOT files containing information about the complete decay tree. Two example test decay files BKstarGamma.dec and BuDst0rhop.dec can be used with this; the first tests PHOTOS, the second looks at sequential decay chain storage. The plotBKstarGamma.C ROOT macro can be used for B -> K* gamma plots. 2nd October 2015 John Back Modified EvtSVPHelAmp and added a new EvtSVPHelCPMix model, implementing the complete mixing phenomenology of Bs to vector gamma decays, courtesy of Clara Remon (LHCb). EvtD0mixDalitz code: cleanup, inverted q/p for decays of D0bar (simplifies user decay files) and fixed y parameter bug, courtesy of Jordi Tico (LHCb). Changed the initialisation order of the infrared cut-off in EvtPhotosEngine. This actually has no effect, since the exponentiation function sets it to the same 1e-7 value, but it's now in the correct order if we need to update it. Removed all remaining obsolete pragma (Win32) warnings from some classes. 23rd September 2015 Michal Kreps Reimplement the real Spence function in C++ and removed its fortran implementation. 15th September 2015 Michal Kreps Fixed accessed uninitialised memory in EvtPDL.cpp, line 213. Modified the configure and setupEvtGen.sh scripts to work on Mac; needed Mac compilation patch files added to the new "platform" subdirectory. 10th September 2015 John Back Updated setupEvtGen.sh to use the recommended external packages: HepMC 2.06.09, pythia 8.186, Photos++ 3.56 and Tauola++ 1.1.5. Fixed form-factor calculations for the BTOSLLBALL model 6 used to generate b -> sll decays, courtesy of Christoph Langenbruch and David Loh (LHCb). Affects B->K*ll, B->rholl and B->omegall, particularly the electron modes. In the validation directory, added runPhotosTest.sh for testing FSR in Upsilon(4S) -> e+ e- decays, and changed the plot comparison scripts to use the 2nd directory "oldRootFiles" (which could be a soft-link) for including ROOT histograms made from a previous version of EvtGen. 27th August 2015 John Back Added Mersenne-Twister random number generator (RNG) EvtMTRandomEngine. It requires c++11 compiler features (>= gcc 4.7), which should automatically be enabled by the configure script. Introduced the preprocessor environment variable EVTGEN_CPP11 for c++11 features. EvtMTRandomEngine is the default RNG for the validation and test examples if c++11 features are enabled. Added a phase-space test validation/genPHSP.sh and PhaseSpacePlots.C to visually check the flatness of Dalitz plots in order to ensure that the RNG is not producing biased results that depend on particle ordering. Added the models EvtbsToLLLLAmp and EvtbsToLLLLHyperCP for B0_q -> l+ l- l+ l- decays (SM and one supersymmetric scenario), courtesy of Nikolai Nikitin and Konstantin Toms. Documentation provided in doc/evt_BQTOLLLL_model.pdf and doc/evt_BQTOLLLLHYPERCP_model.pdf. Changed the installation and set-up script name to be just setupEvtGen.sh; it uses the VERSION variable to specify the required tag. List of tags are available using either "svn ls -v http://svn.cern.ch/guest/evtgen/tags" or by going to http://svn.cern.ch/guest/evtgen/tags in a web browser. 12th June 2015 John Back Changed the width of chi_b1 in evt.pdl from 9.8928 GeV (!) to zero. 1st May 2015 John Back Added Bc -> scalar ell nu (EvtBcSMuNu) and Bc -> tensor ell nu (EvtBcTMuNu) decays, courtesy of Jack Wimberley, LHCb. Also included the chi_c1 mode for EvtBcVMuNu. R01-04-00------------------------------------------------------------------- 2nd April 2015 John Back Removed the EvtStdlibRandomEngine class since this can produce biases to kinematic distributions when one or more of the daughters is a resonance, such as B0 -> K pi psi (thanks to Antonio Augusto Alves Jr who discovered this issue). EvtSimpleRandomEngine is now the default random number generator in the validation and test examples. Incorporated several additions and modifications from LHCb: a) From Michal Kreps, Tom Blake & Christoph Langenbruch, added rare Lb --> Lambda^(*) ell ell models described in arXiv:1108.6129, with various form factors from Gutsche et al. (arXiv:1301.3737) and lattice QCD (arXiv:1212.4827) b) From Andrew Crocombe, implemented Bs --> K* form factors from Ball-Zwicky and z-parametrization form factors from arXiv:1006.4945 for EvtbTosllBallFF c) Christoph Langenbruch fixed the Bs -> phi ll form factors in EvtbTosllBallFF; T3 showed a non-physical pole at very low q2 which significantly affected the electron mode d) From Michal Kreps, removed semicolons from wrong places to clear warnings when compiled with the "-pedantic" option. 9th October 2014 John Back Change svnweb.cern.ch to svn.cern.ch in the setup script. 1st April 2014 John Back In EvtReport, modified the logging output severity status flags to have the "EVTGEN_" prefix, e.g. INFO becomes EVTGEN_INFO. The global report() function has been renamed to EvtGenReport(). 31st March 2014 John Back Added the ability to store named attributes for EvtParticles in the form of a map. The setAttribute(name, value) stores the required value, while getAttribute(name) retrieves the integer value. This is used in EvtPhotosEngine to specify the final-state radiation "FSR" attribute to 1 for any additional photons (EvtPhotonParticles) created by Photos++. It also stores the "ISR" attribute, but this is always set to zero, since only FSR photons are created. If the named attribute doesn't exist, then getAttribute() returns zero. 29th January 2014 Daniel Craik Removed mass assertion on GS shape in EvtDalitzReso to allow it to also be used for charged rho resonances. 27th January 2014 John Back Minor corrections to Vub models to remove further gcc 4.8 warnings. Updated configure script to work for MacOS clang (from Genser team). R01-03-00------------------------------------------------------------------- 9th January 2014 John Back New tag version "1.3.0", incorporating all changes below. Replaced auto-install script to work with this version as well as the latest versions of all external generator packages. Updated README to mention the new CERN-based web pages for Photos++ and Tauola++. 8th January 2014 John Back Fix gcc 4.6 and 4.8 compilation warnings, courtesy of Patrick Robbe (LHCb); main changes are removal of unused variables. Changed the EvtPythiaEngine class and configure script to use new Pythia 8 header locations; Pythia 8.180 or above is now required. 7th January 2014 John Back Modified EvtBCVFF to correct the Kiselev form factors from Jack Wimberley (LHCb). 9th October 2013 Daniel Craik Added Gounaris-Sakurai and Gaussian shapes to EvtGenericDalitz and set sensible defaults for LASS parameters. 19th September 2013 John Back Modified EvtGenExternal/EvtPythiaEngine to keep track of any new particles that are added to the default Pythia database to avoid duplicating particle/anti-particle entries that could override previously defined Pythia decay chains. 18th September 2013 John Back Added Mac OS flags for the configure script and src/Makefile. 15th July 2013 Daniel Craik Added flag to turn on scaling of LASS amplitude by M/q in EvtDalitzReso 15th July 2013 Daniel Craik EvtParserXML now accepts file names containing environment variables, exponential non-resonant shape in EvtDalitzReso now defined as exp(-alpha*m^2), LASS shape in EvtDalitzReso now takes a cutoff parameter 4th July 2013 Daniel Craik Added LASS, exponential non-resonant and linear non-resonant shapes to EvtGenericDalitz. 3rd July 2013 Daniel Craik Fixed auto-install script for R01-02-00. 1st July 2013 Daniel Craik Added auto-install script for R01-02-00. R01-02-00------------------------------------------------------------------- 15th May 2013 John Back New tag, version "1.2.0", incorporating all changes below. 14th May 2013 Michal Kreps Added Blatt-Weisskopf barrier factors up to L=5 in EvtGenBase/EvtBlattWeisskopf::compute(). 14th May 2013 John Back Added additional entries (appended at the end) to the evt.pdl particle data file courtesy of Romulus Godang and Belle II colleagues. 14th March 2013 John Back Added the method EvtParticle::getPDGId() to get the PDG integer for a particle directly (which just calls EvtPDL::getStdHep()). Added a check in EvtPhotosEngine::doDecay to skip Photos if a given particle has too many daughters (>= 10) to avoid a problem with a hard coded upper limit in the Photos PHOENE subroutine. 2nd February 2013 Daniel Craik Updated EvtDalitzTable to estimate probMax when it is missing from a Dalitz model. 1st February 2013 John Back Added the ability to read in Pythia 6 commands in ascii decay files in EvtDecayTable::readDecayFile (this was already possible in xml files). Modified the Photos++ engine default settings to be more suited to B decays (from LHCb defaults). 31st January 2013 John Back Added the ability to read in Pythia 8 commands in ascii decay files in EvtDecayTable::readDecayFile. They can be set using the syntax: "PythiaTypeParam module:variable=value", where Type = Generic, Alias or Both for specifying whether the parameter is for the generic or alias Pythia decay engines (or both). The 2nd argument must not contain any spaces. Fixed the list of commands strings being used in the EvtPythiaEngine class (i.e. Pythia parameters that can be set via decay files). 31st January 2013 Daniel Craik Added named parameters to various decay models. 30th January 2013 John Back Fixed some of the parameter arguments used in the EvtSVSCPiso model. 24th January 2013 John Back Set the Photos++ and Tauola++ models to use the EvtGen random number engine when useEvtGenRandom is set to true in the EvtExternalGenList constructor. 23rd January 2013 John Back Added EvtGenExternal/EvtPythiaRandom to allow the use of the EvtGen random number engine to also be used for the random engine for Pythia 8. Added a boolean (useEvtGenRandom, default = true) within the EvtExternalGenList constructor to use this feature. 18th December 2012 John Back Corrected some wrong daughter ordering assignments for decay modes 5 and 12 in EvtDDalitz. Updated validation/DalitzDecays.xml to also contain D decay mode 12, as well as various modes that may use K_S0 and K_L0. Added validation/genDDalitzModes.sh and updated validation/compareDalitz.C to do a complete comparison of the D Dalitz modes with the xml versions. 11th December 2012 Daniel Craik Updated the Xml parser to support named model parameters. Updated the generic Dalitz model to use named model parameters as an example. 15th October 2012 John Back Make EvtSimpleRandomEngine inherit from EvtRandomEngine to avoid crash in EvtGen.cpp when no random engine is defined (from Bjoern Spruck). R01-01-00------------------------------------------------------------------- 4th October 2012 John Back New tag, version "1.1.0", incorporating all changes below. Provide proper default constructors for EvtVector4R and EvtPhotonParticle. Modified the validation and test code to also compile/link in the case of no external generators being included. 3rd October 2012 John Back Corrected the t3 vector form factor values for the Ball-Zwicky '05 model (modelId = 6) in EvtbTosllBallFF::getVectorFF(), which were set to t3tilde instead. 18th September 2012 John Back Moved the external generator engines to a new sub-directory EvtGenExternal. Building the code now creates 2 libraries: libEvtGen.so (Base+Models) and libEvtGenExternal.so. This allows anyone to ignore using the new external generators if required (by not creating/loading the 2nd library). Added prefix option to the configure script/Makefile to allow the user to specify an installation directory for the include files, libraries, DECAY.DEC and evt.pdl files (for Genser). 14th September 2012 Michal Kreps Fixed the calculation of the angle between decay planes in the function EvtKine::EvtDecayAngleChi. Fixed typo in EvtLb2Lll decay model. Only some NP scenarious could be affected, SM one is definitely unaffected. 13th September 2012 John Back Added the use of the environment variables EVTGEN_PHOTOS, EVTGEN_PYTHIA and EVTGEN_TAUOLA to specify if the Photos, Pythia and/or Tauola engine classes are used or not. These variables are set by the configure script, depending if the library paths are specified for these generators. R01-00-01-------------------------------------------------------------------- 12th September 2012 John Back New tag incorporating all changes below, since R01-00-00. 11th September 2012 John Back Modified the Photos and Tauola engine classes to use the new Photospp and Tauolapp namespaces that are present in the latest versions of Photos++(3.5) and Tauola++(1.0.7). Updated the configure file to get the correct location of the Tauola++ include files. Added the D0->pi+pi-pi0 decay mode in EvtDDalitz from Marco Gersabeck and Frederic Dreyer (LHCb). Added new decay models/classes from Alexey Luchinsky (LHCb): EvtBcVMuNu, EvtTVP, EvtWnPi, EvtSVP, EvtXPsiGamma, EvtBcVNpi 29th June 2012 John Back Corrected mass(squared) variables filled in the Dalitz TTree in validation/genExampleRootFiles. 15th May 2012 Daniel Craik Updated EvtD0gammaDalitz to deal with D mesons from neutral B->DK Added save function to validation/compareDalitz.C. 11th May 2012 Daniel Craik Replaced BaBar specific configuration for BlattWeisskopf birth factors. Updated XML conversion script to handle new configuration. Fixed some bugs in the XML conversion script related to particle modifications. 9th May 2012 Daniel Craik Added latex documentation for xml decay files. 2nd May 2012 Daniel Craik Added resDaughters attribute to the Dalitz resonance xml tag to simplify defining symmetric resonances. Updated validation xml files to use the new functionality. 27th April 2012 Daniel Craik Upgraded EvtGenericDalitz to use EvtDalitzReso for resonances. Added validation to compare EvtGenericDalitz to all 11 EvtDDalitz modes. Added a root macro to quickly compare two Dalitz decays for validation. 24th April 2012 John Back Solved two bugs in the EvtD0gammaDalitz model (from Jordi Tico, LHCb): configuration of the conjugated model, and using only the B charge to determine the model used, not the D flavour. 17th April 2012 Daniel Craik Updated the GenericDalitz validation code to use the same probMax values as DDalitz. Added XML decay file parsing to EvtGen::readUDecay. Dec files are still the default. 30th March 2012 John Back Update maximum probability values in EvtDDalitz::initProbMax() for all DDalitz modes. 23rd March 2012 John Back Added the EvtEta2MuMuGamma decay model from LHCb. 21st March 2012 John Back Added EvtD0gammaDalitz decay model from LHCb. 20th March 2012 Daniel Craik Added backwards compatibility for Pythia 6 commands in the XML configuration. Updated decay file conversion tool to convert JetSetPar lines to pythia6Param tags. 19th March 2012 Daniel Craik Added infrastructure to pass commands to external generators. XML config now takes Pythia8 configuration commands. 16th March 2012 Daniel Craik Added the ability to define particles from the PDL for Dalitz decay resonances instead of defining mass, width and spin seperately. Renamed the lifetime attribute of Dalitz decay resonaces to width to avoid confusion. Added further validation code for the generic Dalitz model. 15th March 2012 Daniel Craik Added validation code for xml decay files and the generic Dalitz model. R01-00-00 ------------------------------------------------------------------ 6th March 2012 John Back First official version for Genser (evtgen 1.0.0) that includes support for external generators: Pythia8, Photos++ and Tauola++. This also includes a preliminary version of creating Dalitz plot decay models using EvtGenericDalitz. diff --git a/src/EvtGenModels/EvtB2MuMuMuNu.cpp b/src/EvtGenModels/EvtB2MuMuMuNu.cpp deleted file mode 100644 index 44517ee..0000000 --- a/src/EvtGenModels/EvtB2MuMuMuNu.cpp +++ /dev/null @@ -1,106 +0,0 @@ -//-------------------------------------------------------------------------- -// -// Environment: -// This software is part of the EvtGen package developed jointly -// for the BaBar and CLEO collaborations. If you use all or part -// of it, please give an appropriate acknowledgement. -// -// Copyright Information: See EvtGen/COPYRIGHT -// Copyright (C) 2003 Caltech, UCSB -// -// Module: EvtB2MuMuMuNu.cpp -// -// Description: The main file for the model "BUTOMMMN" which simulated the -// the very rare four-leptonic decays -// B^-(p) -> Mu^+(k_1) Mu^-(k_2) \bar Nu_{Mu}(k_3) Mu^-(k_4) -// -// Modification history: -// -// Nikolai Nikitin (Lomonosov Moscow State Univ.) August 04, 2015 Module created -// Email: Nikolai.Nikitine@cern.ch -// -//------------------------------------------------------------------------ -// -#include -#include -#include "EvtGenBase/EvtParticle.hh" -#include "EvtGenBase/EvtGenKine.hh" -#include "EvtGenBase/EvtPDL.hh" -#include "EvtGenBase/EvtReport.hh" -#include "EvtGenModels/EvtB2MuMuMuNu.hh" -#include "EvtGenModels/EvtB2MuMuMuNuAmp.hh" -#include "EvtGenModels/EvtbTosllMSFF.hh" // FF for Bu -> Rho and Omega transitions - - - -EvtB2MuMuMuNu::~EvtB2MuMuMuNu() { - delete _msffmodel; - if ( _calcamp ) delete _calcamp ; -} - - -// The module name specification -std::string EvtB2MuMuMuNu::getName( ) { - return "BUTOMMMN" ; -} - - -// The implementation of the clone() method -EvtDecayBase* EvtB2MuMuMuNu::clone(){ - return new EvtB2MuMuMuNu; -} - - -// The inicialization of the decay model -void EvtB2MuMuMuNu::init(){ - - // check that there are 0 arguments - checkNArg(0); - // check that there are 4 daughteres - checkNDaug(4); - - // We expect that the parent to be a scalar (B^{-} meson) - // and the daughters to be Mu^+(k_1), Mu^-(k_2), barNu_{Mu}(k_3) and Mu^-(k_4). - checkSpinParent(EvtSpinType::SCALAR); - - checkSpinDaughter(0,EvtSpinType::DIRAC); // Mu^+(k_1) - checkSpinDaughter(1,EvtSpinType::DIRAC); // Mu^-(k_2) - checkSpinDaughter(2,EvtSpinType::NEUTRINO); // barNu_{Mu}(k_3) - checkSpinDaughter(3,EvtSpinType::DIRAC); // Mu^-(k_4) - - _msffmodel = new EvtbTosllMSFF(); - _calcamp = new EvtB2MuMuMuNuAmp(); - -} - - -// Set the maximum probability of the decay -void EvtB2MuMuMuNu::initProbMax(){ - - double mymaxprob=-10.0; // maximum of the probability - - mymaxprob = _calcamp->CalcMaxProb(); - - if(mymaxprob <= 0.0){ - EvtGenReport(EVTGEN_ERROR,"EvtGen") << "The function void EvtB2MuMuMuNu::initProbMax()" - << "\n Unexpected value of the probability maximum!" - << "\n mymaxprob = " << mymaxprob - <initializePhaseSpace(getNDaug(),getDaugs()); - - _calcamp->CalcAmp(p,_amp2, _msffmodel); - -} - diff --git a/src/EvtGenModels/EvtB2MuMuMuNuAmp.cpp b/src/EvtGenModels/EvtB2MuMuMuNuAmp.cpp deleted file mode 100644 index ef3435b..0000000 --- a/src/EvtGenModels/EvtB2MuMuMuNuAmp.cpp +++ /dev/null @@ -1,745 +0,0 @@ -//-------------------------------------------------------------------------- -// -// Environment: -// This software is part of the EvtGen package developed jointly -// for the BaBar and CLEO collaborations. If you use all or part -// of it, please give an appropriate acknowledgement. -// -// Copyright Information: See EvtGen/COPYRIGHT -// Copyright (C) 2000 Caltech, UCSB -// -// Module: EvtB2MuMuMuNuAmp.cpp -// -// Description: Amplitude preparation for the very rare four-leptonic decays -// B^-(p) -> Mu^+(k_1) Mu^-(k_2) \bar Nu_{Mu}(k_3) Mu^-(k_4). -// -// Note: This my code is based on the "EvtbsToLLLLAmp.cpp" code. -// The main functiom for the amplitude calculation retuns the -// amplitude of the decay B^- \to \mu^- \mu^+ \bar\nu_{\mu} \mu^- -// or the decay B^+ \to \mu^+ \mu^- \nu_{\mu} \mu^+ -// -// -// Modification history: -// -// Nikolai Nikitin (Lomonosov Moscow State Univ.) August 05, 2015 Module created -// Nikolai Nikitin (Lomonosov Moscow State Univ.) October 05, 2015 Maximum value of amplitude was fixed -// Email: Nikolai.Nikitine@cern.ch -// -//----------------------------------------------------------------------------------------- -// -#include "EvtGenBase/EvtPatches.hh" -#include "EvtGenBase/EvtGenKine.hh" -#include "EvtGenBase/EvtPDL.hh" -#include "EvtGenBase/EvtReport.hh" -#include "EvtGenBase/EvtComplex.hh" -#include "EvtGenBase/EvtVector4C.hh" -#include "EvtGenBase/EvtTensor4C.hh" -#include "EvtGenBase/EvtParticle.hh" -#include "EvtGenBase/EvtScalarParticle.hh" -#include "EvtGenBase/EvtDiracSpinor.hh" -#include "EvtGenBase/EvtId.hh" -#include "EvtGenBase/EvtIdSet.hh" -#include "EvtGenBase/EvtAmp.hh" -#include "EvtGenModels/EvtbTosllMSFF.hh" // FF for Bu -> Rho and Omega transitions -// The header files for current class memeber functions description -#include "EvtGenModels/EvtB2MuMuMuNuAmp.hh" - - -#include - -// input: *parent - the pointer on the parent particle (B-meson, the -// object of the EvtParticle class); -// *formFactorsms - the pointer on the EvtbTosllMSFF class object; - - -void EvtB2MuMuMuNuAmp::CalcAmp(EvtParticle *parent, - EvtAmp& amp, - EvtbTosllMSFF *formFactorsms){ - - - // Check the charge conservation in the reaction - int charge[4]; - charge[0] = (EvtPDL::chg3(parent->getDaug(0)->getId()))/3; - charge[1] = (EvtPDL::chg3(parent->getDaug(1)->getId()))/3; - charge[2] = (EvtPDL::chg3(parent->getDaug(2)->getId()))/3; - charge[3] = (EvtPDL::chg3(parent->getDaug(3)->getId()))/3; - if(abs(charge[0]+charge[1]+charge[2]+charge[3])!=1){ - EvtGenReport(EVTGEN_ERROR,"EvtGen") - << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)" - << "\n Error in the daughters charge definition!" - << "\n charge1 = " << charge[0] - << "\t KF code1 = " << EvtPDL::getLundKC(parent->getDaug(0)->getId()) - << "\n charge2 = " << charge[1] - << "\t KF code2 = " << EvtPDL::getLundKC(parent->getDaug(1)->getId()) - << "\n charge3 = " << charge[2] - << "\t KF code3 = " << EvtPDL::getLundKC(parent->getDaug(2)->getId()) - << "\n charge4 = " << charge[3] - << "\t KF code4 = " << EvtPDL::getLundKC(parent->getDaug(3)->getId()) - << "\n number of daughters = " << parent->getNDaug() - << std::endl; - ::abort(); - } - - - // Daughter's positions in the matrix element - int il1, il2, il3, il4; // Mu^+(k_1), Mu^-(k_2), \bar Nu_{Mu}(k_3) and Mu^-(k_4) - //or Mu^-(k_1), Mu^+(k_2), Nu_{Mu}(k_3) and Mu^+(k_4) - // This is the "canonical set" for current matrix element. - - il1 = -101; //initialization of the daughter's positions - il2 = -102; - il3 = -103; - il4 = -104; - - // Daughter's positions for the decay - // B^-(p) -> Mu^+(k_1) Mu^-(k_2) \bar Nu_{Mu}(k_3) Mu^-(k_4). - if(charge[0]+charge[1]+charge[2]+charge[3] == -1){ - int ll; - int min_charge, min_charge_il; - min_charge = charge[0]; - min_charge_il = 0; - for(ll = 1; ll < 4; ll++){ - if(min_charge > charge[ll]){ - min_charge = charge[ll]; - min_charge_il = ll; - } - } - il2 = min_charge_il; // this is Mu^-(k_2) - if(il2 > 2){ - EvtGenReport(EVTGEN_ERROR,"EvtGen") - << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)" - << "\n Error in the particles distribution!" - << "\n il2 = " << il2 - << "\n min_charge = " << min_charge - << "\n total charge = -1 = " << (charge[0]+charge[1]+charge[2]+charge[3]) - << std::endl; - ::abort(); - } - for(ll = il2 + 1; ll < 4; ll++){ - if(charge[ll] == -1) il4 = ll; // this is Mu^-(k_4) - } - for(ll = 0; ll < 4; ll++){ - if(charge[ll] == +1) il1 = ll; // this is Mu^+(k_1) - } - for(ll = 0; ll < 4; ll++){ - if(charge[ll] == 0) il3 = ll; // this is \bar Nu_{Mu}(k_3) - } - } - - // Daughter's positions for the decay - // B^+(p) -> Mu^-(k_1) Mu^+(k_2) Nu_{Mu}(k_3) Mu^+(k_4). - if(charge[0]+charge[1]+charge[2]+charge[3] == 1){ - int ll; - int max_charge, max_charge_il; - max_charge = charge[0]; - max_charge_il = 0; - for(ll = 1; ll < 4; ll++){ - if(max_charge < charge[ll]){ - max_charge = charge[ll]; - max_charge_il = ll; - } - } - il2 = max_charge_il; // this is Mu^+(k_2) - if(il2 > 2){ - EvtGenReport(EVTGEN_ERROR,"EvtGen") - << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)" - << "\n Error in the particles distribution!" - << "\n il2 = " << il2 - << "\n max_charge = " << max_charge - << "\n total charge = +1 = " << (charge[0]+charge[1]+charge[2]+charge[3]) - << std::endl; - ::abort(); - } - for(ll = il2 + 1; ll < 4; ll++){ - if(charge[ll] == 1) il4 = ll; // this is Mu^+(k_4) - } - for(ll = 0; ll < 4; ll++){ - if(charge[ll] == -1) il1 = ll; // this is Mu^-(k_1) - } - for(ll = 0; ll < 4; ll++){ - if(charge[ll] == 0) il3 = ll; // this is Nu_{Mu}(k_3) - } - } - - - if((il1 < 0)||(il2 < 0)|| (il3 < 0) || (il4 < 0)){ - EvtGenReport(EVTGEN_ERROR,"EvtGen") - << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)" - << "\n ilX < 0 !!!" - << "\n il1 = " << il1 - << "\t il2 = " << il2 - << "\t il3 = " << il3 - << "\t il4 = " << il4 - << std::endl; - ::abort(); - } - - // Output for program work check. - // Need to comment in the final version! -// EvtGenReport(EVTGEN_ERROR,"EvtGen") -// << "\n il1 = " << il1 -// << "\t il2 = " << il2 -// << "\t il3 = " << il3 -// << "\t il4 = " << il4 -// << std::endl; - //END of the daughter's positions initialization - - - // Kinematics initialization - - EvtComplex unit1(1.0,0.0); // real unit - EvtComplex uniti(0.0,1.0); // imaginary unit - - double M1 = parent->mass(); // B-meson mass, GeV - double ml = parent->getDaug(il1)->mass(); // mass of muon, GeV - - // Id and 4-momentums of the particles - - EvtId idparent = parent->getId(); // B-meson Id - - EvtVector4R p; // B-meson 4-momentum - p.set(0.0,0.0,0.0,0.0); - - - EvtId id_L1, id_L2, id_L3, id_L4; // leptonic Id - - EvtVector4R k_1; // 4-momentum of mu^+ in the B^- rest frame; (il1) - EvtVector4R k_2; // 4-momentum of mu^- in the B^- rest frame; (il2) - EvtVector4R k_3; // 4-momentum of \bar nu in the B^- rest frame; (il3) - EvtVector4R k_4; // 4-momentum of mu^- in the B^- rest frame; (il4) - - k_1.set(0.0,0.0,0.0,0.0); - k_2.set(0.0,0.0,0.0,0.0); - k_3.set(0.0,0.0,0.0,0.0); - k_4.set(0.0,0.0,0.0,0.0); - - EvtVector4R q_fierst; // q = k_1 + k_2 4-momentum in the B-rest frame - EvtVector4R k_fierst; // k = k_3 + k_4 4-momentum in the B-rest frame - double q2_fierst; // Mandelstam variable s=q^2 - double k2_fierst; // Mandelstam variable t=k^2 - - EvtVector4R q_second; // q = k_1 + k_4 4-momentum in the B-rest frame - EvtVector4R k_second; // k = k_3 + k_2 4-momentum in the B-rest frame - double q2_second; // Mandelstam variable s=q^2 - double k2_second; // Mandelstam variable t=k^2 - - p = parent->getP4Restframe(); // B-meson 4-momentum in the B-rest frame - - k_1 = parent->getDaug(il1)->getP4(); - k_2 = parent->getDaug(il2)->getP4(); - k_3 = parent->getDaug(il3)->getP4(); - k_4 = parent->getDaug(il4)->getP4(); - - q_fierst = k_1 + k_2; - k_fierst = k_3 + k_4; - q2_fierst = q_fierst.mass2(); - k2_fierst = k_fierst.mass2(); - - q_second = k_1 + k_4; - k_second = k_3 + k_2; - q2_second = q_second.mass2(); - k2_second = k_second.mass2(); - - - // For "B^-" - and "B^+" - mesons amplitudeы separately calculations - static EvtIdSet bmesons("B-","B_c-"); - static EvtIdSet bbarmesons("B+","B_c+"); - -// // Information for test of 4-momentum. -// // Need to comment in the final version! -// EvtGenReport(EVTGEN_ERROR,"EvtGen") -// << "\n 4-momentum initialization test" -// << "\n k_1 = " << k_1 -// << "\n k_2 = " << k_2 -// << "\n k_3 = " << k_3 -// << "\n k_4 = " << k_4 -// << "\n q_fierst = " << q_fierst -// << "\n q_second = " << q_second -// << "\n k_fierst = " << k_fierst -// << "\n k_second = " << k_second -// << std::endl; - - - // - // I. VMD Contribution - // - - double M2[4]; //intermediate vector mesons mass for VMD contribution - // M2[0] = EvtPDL::getMass(EvtPDL::getId(std::string("rho0"))); // Rho^0 - // M2[1] = EvtPDL::getMass(EvtPDL::getId(std::string("omega"))); // Omega^0 - // M2[2] = M2[0]; // GeV Rho^0 - // M2[3] = M2[1]; // GeV Omega^0 - M2[0] = 0.77526; // GeV Rho^0 - M2[1] = 0.78265; // GeV Omega^0 - M2[2] = M2[0]; // GeV Rho^0 - M2[3] = M2[1]; // GeV Omega^0 - - double Width2[4]; //intermediate vector mesons width for VMD contribution - // Width2[0] = EvtPDL::getWidth(EvtPDL::getId(std::string("rho0"))); // Rho^0 - // Width2[1] = EvtPDL::getWidth(EvtPDL::getId(std::string("omega"))); // Omega^0 - // Width2[2] = Width2[0]; // GeV Rho^0 - // Width2[3] = Width2[1]; // GeV Omega^0 - Width2[0] = 0.1491; // GeV Rho^0 - Width2[1] = 0.00849; // GeV Omega^0 - Width2[2] = Width2[0]; // GeV Rho^0 - Width2[3] = Width2[1]; // GeV Omega^0 - - double fV2[4]; //intermediate vector mesons leptonic constant for VMD contribution - // see D.Melikhov, N.Nikitin. PRD70, 114028 (2004) - fV2[0] = 5.04; // GeV Rho^0 - fV2[1] = 17.1; // GeV Omega^0 - fV2[2] = 5.04; // GeV Rho^0 - fV2[3] = 17.1; // GeV Omega^0 - - // For taking the form factors values - - // B -> V intermediate vector mesons - // transition form-factors for VMD contribution - // 0 -- Rho^0 for k2_fierst - // 1 -- Omega^0 for k2_fierst - // 2 -- Rho^0 for k2_second - // 3 -- Omega^0 for k2_second - double a1[4],a2[4],a3[4],a0[4],v[4],t1[4],t2[4],t3[4]; - - - EvtId B_meson_for_FF = EvtPDL::getId(std::string("B0")); - EvtId rho_meson_for_FF = EvtPDL::getId(std::string("rho0")); - EvtId omega_meson_for_FF = EvtPDL::getId(std::string("omega")); - - formFactorsms->getVectorFF(B_meson_for_FF, rho_meson_for_FF, k2_fierst, - a1[0],a2[0],a0[0],v[0],t1[0],t2[0],t3[0]); - - formFactorsms->getVectorFF(B_meson_for_FF, omega_meson_for_FF, k2_fierst, - a1[1],a2[1],a0[1],v[1],t1[1],t2[1],t3[1]); - - formFactorsms->getVectorFF(B_meson_for_FF, rho_meson_for_FF, k2_second, - a1[2],a2[2],a0[2],v[2],t1[2],t2[2],t3[2]); - - formFactorsms->getVectorFF(B_meson_for_FF, omega_meson_for_FF, k2_second, - a1[3],a2[3],a0[3],v[3],t1[3],t2[3],t3[3]); - - int aa; - for(aa = 0; aa < 4; aa++){ - a3[aa] = ((M1 + M2[aa])*a1[aa] - (M1 - M2[aa])*a2[aa])/(2.0*M2[aa]); - } - -// // Information for test of VMD contribution. -// // Need to comment in the final version! -// EvtGenReport(EVTGEN_ERROR,"EvtGen") -// << "\n VMD Contribution test" -// << "\n M(Bu) = " << M1 << " GeV;" -// << "\n M(Rho) = " << M2[0] << " GeV;" -// << "\t M(Omega) = " << M2[1] << " GeV;" -// << "\t Gamma(Rho) = " << Width2[0] << " Gev;" -// << "\t Gamma(Omega) = " << Width2[1] << " Gev." -// << "\n\n a1[0] = " << a1[0] -// << "\t a2[0] = " << a2[0] -// << "\t a0[0] = " << a0[0] -// << "\t a3[0] = " << a3[0] -// << "\t v[0] = " << v[0] -// << "\n\n a1[1] = " << a1[1] -// << "\t a2[1] = " << a2[1] -// << "\t a0[1] = " << a0[1] -// << "\t a3[1] = " << a3[1] -// << "\t v[1] = " << v[1] -// << "\n\n a1[2] = " << a1[2] -// << "\t a2[2] = " << a2[2] -// << "\t a0[2] = " << a0[2] -// << "\t a3[2] = " << a3[2] -// << "\t v[2] = " << v[2] -// << "\n\n a1[3] = " << a1[3] -// << "\t a2[3] = " << a2[3] -// << "\t a0[3] = " << a0[3] -// << "\t a3[3] = " << a3[3] -// << "\t v[3] = " << v[3] -// << std::endl; - - - - // Tensor structures for VMD contribution - EvtTensor4C Tvmd_fierst, Tvmd_second; - - - // - // II. Electromagnetic foton emission from B-meson contribution - // (EM contribution) - // - - // EM form factors - // 0 -- u-quark emission for q2_fierst - // 1 -- b-quark emission for q2_fierst - // 2 -- u-quark emission for q2_second - // 3 -- b-quark emission for q2_second - double v_em[4]; - double MBstar = 5.325; // GeV - - v_em[0] = 4.0*MBstar*FF_B2BstarGamma_fromU(q2_fierst)/(3.0*(M1 + MBstar)); - v_em[1] = 2.0*MBstar*FF_B2BstarGamma_fromB(q2_fierst)/(3.0*(M1 + MBstar)); - v_em[2] = 4.0*MBstar*FF_B2BstarGamma_fromU(q2_second)/(3.0*(M1 + MBstar)); - v_em[3] = 2.0*MBstar*FF_B2BstarGamma_fromB(q2_second)/(3.0*(M1 + MBstar)); - - // Tensor structures for EM contribution - EvtTensor4C Tem_fierst, Tem_second; - - - // - // *** - // - - - - // Leptonic currents - // L1 = (\bar mu \gamma^{\mu} (1 - \gamma^5) nu) - // or (\bar nu \gamma^{\mu} (1 - \gamma^5) mu) - // L2 = (\bar mu \gamma^{\nu} mu) - EvtVector4C L1_fierst, L2_fierst; - EvtVector4C L1_second, L2_second; - - - int i1, i2, i3, i4; // leptonic spin structures counters - int leptonicspin[4]; // array for the saving of the leptonic spin configuration - - - - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // + Contribution for B- decay + - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - if (bmesons.contains(idparent)){ - - Tvmd_fierst = 0.0*EvtTensor4C::g(); - for(aa = 0; aa < 2; aa++){ - EvtComplex coeff_vmd; - - double Re_vmd, Im_vmd, znam_vmd; - Re_vmd = q2_fierst - M2[aa]*M2[aa]; - Im_vmd = Width2[aa]*M2[aa]; - znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd); - coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd; - - double vaa, a2aa, a3aa; - vaa = 2.0*v[aa]/(M1 + M2[aa]); - a2aa = a2[aa]/(M1 + M2[aa]); - a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_fierst; - - Tvmd_fierst = Tvmd_fierst - +coeff_vmd*(0.0*EvtTensor4C::g() - -(unit1*vaa*dual(EvtGenFunctions::directProd(p,q_fierst))) - -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g() - +uniti*a2aa*EvtGenFunctions::directProd((p + q_fierst),p) - +uniti*a3aa*EvtGenFunctions::directProd((p - q_fierst),p)); - } - - Tvmd_second = 0.0*EvtTensor4C::g(); - for(aa = 2; aa < 4; aa++){ - EvtComplex coeff_vmd; - - double Re_vmd, Im_vmd, znam_vmd; - Re_vmd = q2_second - M2[aa]*M2[aa]; - Im_vmd = Width2[aa]*M2[aa]; - znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd); - coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd; - - double vaa, a2aa, a3aa; - vaa = 2.0*v[aa]/(M1 + M2[aa]); - a2aa = a2[aa]/(M1 + M2[aa]); - a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_second; - - Tvmd_second = Tvmd_second - +coeff_vmd*(0.0*EvtTensor4C::g() - -unit1*vaa*dual(EvtGenFunctions::directProd(p,q_second)) - -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g() - +uniti*a2aa*EvtGenFunctions::directProd((p + q_second),p) - +uniti*a3aa*EvtGenFunctions::directProd((p - q_second),p)); - } - - Tem_fierst = 0.0*EvtTensor4C::g(); - for(aa = 0; aa < 2; aa++){ - double fBstar = 0.2; // GeV - double coeff; - coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar)); - Tem_fierst = Tem_fierst - coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_fierst)); - } - - Tem_second = 0.0*EvtTensor4C::g(); - for(aa = 2; aa < 4; aa++){ - double fBstar = 0.2; // GeV - double coeff; - coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar)); - Tem_second = Tem_second - coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_second)); - } - - // Amplitude calculation - for(i2=0;i2<2;i2++){ - leptonicspin[0] = i2; - for(i1=0;i1<2;i1++){ - leptonicspin[1] = i1; - for(i4=0;i4<2;i4++){ - leptonicspin[2] = i4; - i3 = 0; // neutrino spin structure! - leptonicspin[3] = i3; - - //(\bar mu(k_4) \gamma^{\mu} (1 - \gamma^5) nu(- k_3)) - L1_fierst = EvtLeptonVACurrent(parent->getDaug(il4)->spParent(i4), - parent->getDaug(il3)->spParentNeutrino()); - - - //(\bar mu(k_2) \gamma^{\mu} mu(- k_1)) - L2_fierst = EvtLeptonVCurrent(parent->getDaug(il2)->spParent(i2), - parent->getDaug(il1)->spParent(i1)); - - - //(\bar mu(k_2) \gamma^{\mu} (1 - \gamma^5) nu(- k_3)) - L1_second = EvtLeptonVACurrent(parent->getDaug(il2)->spParent(i2), - parent->getDaug(il3)->spParentNeutrino()); - - - //(\bar mu(k_4) \gamma^{\mu} mu(- k_1)) - L2_second = EvtLeptonVCurrent(parent->getDaug(il4)->spParent(i4), - parent->getDaug(il1)->spParent(i1)); - - // VMD - EvtVector4C Evmd_fierst, Evmd_second; - Evmd_fierst=Tvmd_fierst.cont2(L2_fierst); - Evmd_second=Tvmd_second.cont2(L2_second); - - // EM - EvtVector4C Eem_fierst, Eem_second; - Eem_fierst=Tem_fierst.cont2(L1_fierst); - Eem_second=Tem_second.cont2(L1_second); - - // Bremsstrahlung - EvtComplex Ebrst_fierst, Ebrst_second; - double fB = 0.20; // GeV leptonic constant of B^{\pm} mesons - Ebrst_fierst = uniti*fB*L2_fierst*L1_fierst/q2_fierst; - Ebrst_second = uniti*fB*L2_second*L1_second/q2_second; - - amp.vertex(leptonicspin, L1_fierst*Evmd_fierst + L2_fierst*Eem_fierst + Ebrst_fierst - - L1_second*Evmd_second - L2_second*Eem_second - Ebrst_second); - - if(q2_fierst < 4.0*ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - if(q2_second < 4.0*ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - if(k2_fierst < ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - if(k2_second < ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - - } // End of the operator "for(i4=0;i4<2;i4++)" - } // End of the operator "for(i1=0;i1<2;i1++)" - } // End of the operator "for(i2=0;i2<2;i2++)" - - } // End of the operator: "if (bmesons.contains(idparent))" - - - else { // Start of the operator "else N1" - // ++++++++++++++++++++++++++++++++++++++++++++++++++ - // + Contribution for B+ decay + - // ++++++++++++++++++++++++++++++++++++++++++++++++++ - if (bbarmesons.contains(idparent)){ - - Tvmd_fierst = 0.0*EvtTensor4C::g(); - for(aa = 0; aa < 2; aa++){ - EvtComplex coeff_vmd; - - double Re_vmd, Im_vmd, znam_vmd; - Re_vmd = q2_fierst - M2[aa]*M2[aa]; - Im_vmd = Width2[aa]*M2[aa]; - znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd); - coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd; - - double vaa, a2aa, a3aa; - vaa = 2.0*v[aa]/(M1 + M2[aa]); - a2aa = a2[aa]/(M1 + M2[aa]); - a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_fierst; - - Tvmd_fierst = Tvmd_fierst - +coeff_vmd*(0.0*EvtTensor4C::g() - +unit1*vaa*dual(EvtGenFunctions::directProd(p,q_fierst)) - -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g() - +uniti*a2aa*EvtGenFunctions::directProd((p + q_fierst),p) - +uniti*a3aa*EvtGenFunctions::directProd((p - q_fierst),p)); - } - - Tvmd_second = 0.0*EvtTensor4C::g(); - for(aa = 2; aa < 4; aa++){ - EvtComplex coeff_vmd; - - double Re_vmd, Im_vmd, znam_vmd; - Re_vmd = q2_second - M2[aa]*M2[aa]; - Im_vmd = Width2[aa]*M2[aa]; - znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd); - coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd; - - double vaa, a2aa, a3aa; - vaa = 2.0*v[aa]/(M1 + M2[aa]); - a2aa = a2[aa]/(M1 + M2[aa]); - a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_second; - - Tvmd_second = Tvmd_second - +coeff_vmd*(0.0*EvtTensor4C::g() - +unit1*vaa*dual(EvtGenFunctions::directProd(p,q_second)) - -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g() - +uniti*a2aa*EvtGenFunctions::directProd((p + q_second),p) - +uniti*a3aa*EvtGenFunctions::directProd((p - q_second),p)); - } - - Tem_fierst = 0.0*EvtTensor4C::g(); - for(aa = 0; aa < 2; aa++){ - double fBstar = 0.0 - 0.2; // GeV - double coeff; - coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar)); - Tem_fierst = Tem_fierst + coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_fierst)); - } - - Tem_second = 0.0*EvtTensor4C::g(); - for(aa = 2; aa < 4; aa++){ - double fBstar = 0.0 - 0.2; // GeV - double coeff; - coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar)); - Tem_second = Tem_second + coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_second)); - } - - // Amplitude calculation - for(i2=0;i2<2;i2++){ - leptonicspin[0] = i2; - for(i1=0;i1<2;i1++){ - leptonicspin[1] = i1; - for(i4=0;i4<2;i4++){ - leptonicspin[2] = i4; - i3 = 0; // neutrino spin structure! - leptonicspin[3] = i3; - - //(\bar nu(k_3) \gamma^{\mu} (1 - \gamma^5) mu(- k_4)) - L1_fierst = EvtLeptonVACurrent(parent->getDaug(il3)->spParentNeutrino(), - parent->getDaug(il4)->spParent(i4)); - - - //(\bar mu(k_1) \gamma^{\mu} mu(- k_2)) - L2_fierst = EvtLeptonVCurrent(parent->getDaug(il1)->spParent(i1), - parent->getDaug(il2)->spParent(i2)); - - - //(\bar nu(k_3) \gamma^{\mu} (1 - \gamma^5) mu(- k_2)) - L1_second = EvtLeptonVACurrent(parent->getDaug(il3)->spParentNeutrino(), - parent->getDaug(il2)->spParent(i2)); - - - //(\bar mu(k_1) \gamma^{\mu} mu(- k_4)) - L2_second = EvtLeptonVCurrent(parent->getDaug(il1)->spParent(i1), - parent->getDaug(il4)->spParent(i4)); - - // VMD - EvtVector4C Evmd_fierst, Evmd_second; - Evmd_fierst=Tvmd_fierst.cont2(L2_fierst); - Evmd_second=Tvmd_second.cont2(L2_second); - - // EM - EvtVector4C Eem_fierst, Eem_second; - Eem_fierst=Tem_fierst.cont2(L1_fierst); - Eem_second=Tem_second.cont2(L1_second); - - // Bremsstrahlung - EvtComplex Ebrst_fierst, Ebrst_second; - double fB = 0.20; // GeV leptonic constant of B^{\pm} mesons - Ebrst_fierst = uniti*fB*L2_fierst*L1_fierst/q2_fierst; - Ebrst_second = uniti*fB*L2_second*L1_second/q2_second; - - - amp.vertex(leptonicspin, L1_fierst*Evmd_fierst + L2_fierst*Eem_fierst + Ebrst_fierst - - L1_second*Evmd_second - L2_second*Eem_second - Ebrst_second); - - if(q2_fierst < 4.0*ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - if(q2_second < 4.0*ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - if(k2_fierst < ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - if(k2_second < ml*ml) - { - amp.vertex(leptonicspin, unit1*0.0); - } - - } // End of the operator "for(i4=0;i4<2;i4++)" - } // End of the operator "for(i1=0;i1<2;i1++)" - } // End of the operator "for(i2=0;i2<2;i2++)" - - } // End of the operator: "if (bbarmesons.contains(idparent))" - - else{ // Start of the operator "else N2" - EvtGenReport(EVTGEN_ERROR,"EvtGen") - << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)" - << "\n Wrong B-meson number" - << "\n B-meson KF code = " << EvtPDL::getLundKC(parent->getId()) - << std::endl; - ::abort(); - } // End of the operator "else N2" - - } // End of the operator "else N1" -} - - - -// -// The decays B^- -> Mu^+ Mu^- \bar Nu_{Mu} Mu^- maximum probability calculation -// -double EvtB2MuMuMuNuAmp::CalcMaxProb(){ - - double maxfoundprob = 60000000.0; // maximum of the probability - - return maxfoundprob; -} - - -// Triangular function -double EvtB2MuMuMuNuAmp::lambda(double a, double b, double c){ - double l; - - l=pow(a,2.0)+pow(b,2.0)+pow(c,2.0)-2.0*a*b-2.0*a*c-2.0*b*c; - - return l; -} - - -// Electromagnetic FF for B -> B* gamma transition, when gamma emitted from u-quark -// q2 = q^2 in GeV^2 - transition 4-momentum -// D.Melikhov privat communication -double EvtB2MuMuMuNuAmp::FF_B2BstarGamma_fromU(double q2){ - double V; - double MRho = 0.77; // GeV - double y; - - y = q2/(MRho*MRho); - V = 10.036/((1.0 - y)*(1.0 - 0.09*y + 0.04*y*y)); - - return V; -} - - -// Electromagnetic FF for B -> B* gamma transition, when gamma emitted from b-quark -// q2 = q^2 in GeV^2 - transition 4-momentum -// D.Melikhov privat communication -double EvtB2MuMuMuNuAmp::FF_B2BstarGamma_fromB(double q2){ - double V; - double MUpsilon = 8.50; // GeV - double y; - - y = q2/(MUpsilon*MUpsilon); - V = 1.0461/((1.0 - y)*(1.0 - 0.79*y - 0.07*y*y)); - - return V; -} diff --git a/src/EvtGenModels/EvtBLLNuL.cpp b/src/EvtGenModels/EvtBLLNuL.cpp new file mode 100644 index 0000000..9f49ef5 --- /dev/null +++ b/src/EvtGenModels/EvtBLLNuL.cpp @@ -0,0 +1,158 @@ +//-------------------------------------------------------------------------- +// +// Copyright Information: See EvtGen/COPYRIGHT +// +// Module: EvtBLLNuL.cpp +// +// Description: The main file for the model "BLLNUL" which simulates +// the rare four-leptonic B-decays +// B^-(p) -> ell^+(k_1) ell^-(k_2) neu (k_3) ell^-(k_4) +// +// Modification history: +// +// Anna Danilina (anna.danilina@cern.ch) and +// Nikolai Nikitin (Nikolai.Nikitine@cern.ch) Nov 2018 Module created +// John B Code optimisations +// +//------------------------------------------------------------------------ +// +#include "EvtGenBase/EvtParticle.hh" +#include "EvtGenBase/EvtSpinType.hh" +#include "EvtGenBase/EvtReport.hh" +#include "EvtGenBase/EvtPDL.hh" +#include "EvtGenBase/EvtIdSet.hh" + +#include "EvtGenModels/EvtBLLNuL.hh" +#include "EvtGenModels/EvtBLLNuLAmp.hh" + +EvtBLLNuL::EvtBLLNuL() : + calcAmp_(0) +{ +} + +EvtBLLNuL::~EvtBLLNuL() +{ + delete calcAmp_; +} + +std::string EvtBLLNuL::getName() +{ + // The model name + return "BLLNUL"; +} + +EvtDecayBase* EvtBLLNuL::clone() +{ + return new EvtBLLNuL(); +} + +void EvtBLLNuL::init() +{ + // check that there are 4 daughters + checkNDaug(4); + + // We expect that the parent to be a scalar (B meson) and + // the daughters to be ell+ (k1), ell- (k2), neutrino (k3) + // and the last lepton ell- (k4) + + // Check spin types + checkSpinParent(EvtSpinType::SCALAR); + + checkSpinDaughter(0, EvtSpinType::DIRAC); // ell+(k_1) + checkSpinDaughter(1, EvtSpinType::DIRAC); // ell-(k_2) + checkSpinDaughter(2, EvtSpinType::NEUTRINO); // neu (k_3) + checkSpinDaughter(3, EvtSpinType::DIRAC); // ell-(k_4) + + // Check that we have a charged B parent + static EvtIdSet BMesons("B-", "B+"); + if (!BMesons.contains(getParentId())) { + + EvtGenReport(EVTGEN_ERROR, "EvtBLLNuL") << "Expecting the parent to be a charged B. Found PDG = " + << EvtPDL::getStdHep(getParentId()) << std::endl; + ::abort(); + + } + + // Make sure the first two leptons are charged conjugates of each other + int id1 = EvtPDL::getStdHep(getDaug(0)); + int id2 = EvtPDL::getStdHep(getDaug(1)); + if (id1 != -id2) { + + EvtGenReport(EVTGEN_ERROR, "EvtBLLNuL") << "Expecting the first 2 leptons, with PDG codes " << id1 << " and " + << id2 << ", to be charged conjugates of each other" << std::endl; + ::abort(); + + } + + // Check that the last lepton has the same charge as the B parent + int q3 = EvtPDL::chg3(getDaug(3))/3; + int qB = EvtPDL::chg3(getParentId())/3; + if (q3 != qB) { + + EvtGenReport(EVTGEN_ERROR, "EvtBLLNuL") << "The 3rd lepton charge " << q3 + << " does not match the B charge " + << qB << std::endl; + ::abort(); + } + + // Also check that the 2nd lepton has the same charge as the 3rd one + int q2 = EvtPDL::chg3(getDaug(1))/3; + if (q2 != q3) { + + EvtGenReport(EVTGEN_ERROR, "EvtBLLNuL") << "The 2nd lepton charge " << q2 + << " does not match the 3rd lepton charge " + << q3 << std::endl; + ::abort(); + } + + // Identify if the decay has 3 charged leptons with the same flavour. + // If so, then we need to include amplitude terms where the 2nd and 3rd + // same-sign leptons are interchanged: k2 <-> k4 + bool symmetry(false); + int id3 = EvtPDL::getStdHep(getDaug(3)); + + if (abs(id1) == abs(id2) && abs(id1) == abs(id3)) { + symmetry = true; + } + + // Specify the qSq minimum cut-off as 4*(muon mass)^2 = 0.044655 and the + // kSq minimum cut off as 4*(electron mass)^2 = 1.044e-6 + double muMass = EvtPDL::getMeanMass(EvtPDL::getId("mu+")); + double eMass = EvtPDL::getMeanMass(EvtPDL::getId("e+")); + double qSqMin = 4.0*muMass*muMass; + double kSqMin = 4.0*eMass*eMass; + + // Optionally set these cut-offs using two decay file parameters. We may + // have a 3rd parameter (max prob), so check for at least 2 parameters + if (getNArg() >= 2) { + qSqMin = getArg(0); + kSqMin = getArg(1); + } + + // Define the amplitude calculation pointer with the qSq and kSq cut-offs, + // also specifying if the decay mode has flavour symmetry + calcAmp_ = new EvtBLLNuLAmp(qSqMin, kSqMin, symmetry); +} + +void EvtBLLNuL::initProbMax() +{ + // Set the maximum probability of the decay + double maxProb(3.2); + + // Optional 3rd decay file parameter, e.g. if qSq and/or kSq min have changed. + // Note that both qSq and kSq parameters must still be specified in the decay + // file to ensure that the maximum probability value is the 3rd parameter! + if (getNArg() == 3) { + maxProb = getArg(2); + } + + setProbMax(maxProb); +} + +void EvtBLLNuL::decay(EvtParticle *p) +{ + p->initializePhaseSpace(getNDaug(), getDaugs()); + + calcAmp_->CalcAmp(p, _amp2); + +} diff --git a/src/EvtGenModels/EvtBLLNuLAmp.cpp b/src/EvtGenModels/EvtBLLNuLAmp.cpp new file mode 100644 index 0000000..cf03c88 --- /dev/null +++ b/src/EvtGenModels/EvtBLLNuLAmp.cpp @@ -0,0 +1,426 @@ +//-------------------------------------------------------------------------- +// +// Module: EvtBLLNuLAmp.cpp +// +// Description: Amplitude calculation class for the "BLLNUL" model of +// rare four-leptonic B-decays: +// B^-(p) -> ell^+(k_1) ell^-(k_2) neu (k_3) ell^-(k_4) +// +// Modification history: +// +// Anna Danilina (anna.danilina@cern.ch) and +// Nikolai Nikitin (Nikolai.Nikitine@cern.ch) Nov 2018 Module created +// John B Code optimisations +// +//----------------------------------------------------------------------------------------- +// +#include "EvtGenBase/EvtPatches.hh" + +#include "EvtGenBase/EvtConst.hh" +#include "EvtGenBase/EvtDiracSpinor.hh" +#include "EvtGenBase/EvtIdSet.hh" +#include "EvtGenBase/EvtParticle.hh" +#include "EvtGenBase/EvtPDL.hh" +#include "EvtGenBase/EvtVector4C.hh" + +#include "EvtGenModels/EvtBLLNuLAmp.hh" + +#include + +EvtBLLNuLAmp::EvtBLLNuLAmp(double qSqMin, double kSqMin, bool symmetry, double Vub) : + qSqMin_(qSqMin), + kSqMin_(kSqMin), + symmetry_(symmetry), + BpId_(EvtPDL::getId("B+")), + BnId_(EvtPDL::getId("B-")), + coupling_(0.0), + sqrt2_(sqrt(2.0)), + fBu_(0.191), // leptonic constant (GeV) + Bstar_(new EvtBLLNuLAmp::ResPole(5.32, 0.00658, 0.183/3.0)), + Upsilon_(new EvtBLLNuLAmp::ResPole(9.64, 0.0, 0.0)), + resPoles_(), + nPoles_(0), + zero_(EvtComplex(0.0, 0.0)), + unitI_(EvtComplex(0.0, 1.0)) +{ + double GF = 1.166371e-5; // GeV^{-2} + double alphaEM = 1.0/137.0; + double MyPi = EvtConst::pi; + // Normalisation constant, multiplied by 1e4 to increase probability scale + coupling_ = 400.0*GF*MyPi*alphaEM*Vub*1e4/sqrt2_; + + // Define VMD resonance poles using PDG 2016 values with constants from + // D.Melikhov, N.Nikitin and K.Toms, Phys. Atom. Nucl. 68, 1842 (2005) + EvtBLLNuLAmp::ResPole* rho = new EvtBLLNuLAmp::ResPole(0.77526, 0.1491, 1.0/5.04); + resPoles_.push_back(rho); + + EvtBLLNuLAmp::ResPole* omega = new EvtBLLNuLAmp::ResPole(0.78265, 0.00849, 1.0/17.1); + resPoles_.push_back(omega); + + nPoles_ = resPoles_.size(); +} + +EvtBLLNuLAmp::~EvtBLLNuLAmp() +{ + delete Bstar_; + delete Upsilon_; + // Delete VMD poles + std::vector::iterator iter; + for (iter = resPoles_.begin(); iter != resPoles_.end(); ++iter) { + delete *iter; + } + resPoles_.clear(); + +} + +// Storing resonance pole information +EvtBLLNuLAmp::ResPole::ResPole(double mass, double width, double coupling) : + m0_(mass), + m0Sq_(mass*mass), + w0_(width), + c_(coupling), + I_(EvtComplex(0.0, 1.0)), + Imw_(I_*mass*width) +{ +} + +EvtComplex EvtBLLNuLAmp::ResPole::propagator(double qSq, int numForm) const +{ + // Numerator term: mass-squared (default) or mass + double num(m0Sq_); + if (numForm == 1) {num = m0_;} + + EvtComplex result = num*c_/((qSq - m0Sq_) + Imw_); + return result; + +} + +// Store kinematic information that can be passed around functions +EvtBLLNuLAmp::KinInfo::KinInfo(const EvtVector4R& q, const EvtVector4R& k, + double qSq, double kSq, double MB, int sign) : + q_(q), + k_(k), + qSq_(qSq), + kSq_(kSq), + MB_(MB), + sign_(sign) +{ +} + +// Amplitude calculation +void EvtBLLNuLAmp::CalcAmp(EvtParticle *parent, EvtAmp& amp) const +{ + // Check for 4 daughters and an existing parent + if (!parent || parent->getNDaug() != 4) {return;} + + // The first two charged leptons. The 2nd one will have + // the same charge as the 3rd charged lepton + EvtParticle* lepA = parent->getDaug(0); + EvtParticle* lepB = parent->getDaug(1); + // The neutrino + EvtParticle* neu = parent->getDaug(2); + // The third charged lepton + EvtParticle* lepC = parent->getDaug(3); + + // Kinematics + double MB = parent->mass(); // B-meson mass, GeV + + // 4-momenta of the leptons in the B rest frame. The daughters will already + // be in the correct order since this check is done in EvtBLLNuL::init() + // when initialising the model using the decay file + EvtVector4R p1 = lepA->getP4(); + EvtVector4R p2 = lepB->getP4(); + EvtVector4R p3 = neu->getP4(); + EvtVector4R p4 = lepC->getP4(); + + // 4-momenta sums + EvtVector4R q12 = p1 + p2; + EvtVector4R k34 = p3 + p4; + + // Mandelstam variables: q^2 and k^2 + double q12Sq = q12.mass2(); + double k34Sq = k34.mass2(); + + // Check if we are above mass thresholds + bool threshold(true); + if (q12Sq < qSqMin_ || k34Sq < kSqMin_) { + threshold = false; + } + + // For the symmetric terms when we exchange the + // 2nd and 3rd charged leptons: p2 <-> p4 + EvtVector4R q14, k23; + double q14Sq(0.0), k23Sq(0.0); + if (symmetry_) { + + q14 = p1 + p4; + k23 = p2 + p3; + q14Sq = q14.mass2(); + k23Sq = k23.mass2(); + + if (q14Sq < qSqMin_ || k23Sq < kSqMin_) { + threshold = false; + } + + } + + // B meson id + EvtId parId = parent->getId(); + // B+ or B- decays + int sign(1); + if (parId == BnId_) {sign = -1;} + + // Hadronic tensors + EvtBLLNuLAmp::KinInfo infoA(q12, k34, q12Sq, k34Sq, MB, sign); + EvtTensor4C THadronA = getHadronTensor(infoA); + + // When we need to include the symmetric terms + EvtTensor4C THadronB; + if (symmetry_) { + EvtBLLNuLAmp::KinInfo infoB(q14, k23, q14Sq, k23Sq, MB, sign); + THadronB = getHadronTensor(infoB); + } + + // Leptonic currents: A for normal terms, B for symmetric terms + EvtVector4C L1A, L2A, L1B, L2B; + + int leptonSpins[4]; // array for saving the leptonic spin configuration + + // Loop over lepton spin states + for (int i2 = 0; i2 < 2; i2++) { + + leptonSpins[0] = i2; + + for (int i1 = 0; i1 < 2; i1++) { + + leptonSpins[1] = i1; + + if (sign == -1) { + + // B- currents + // L2^{\nu} = \bar mu(k_2) \gamma^{\nu} mu(- k_1) + L2A = EvtLeptonVCurrent(lepB->spParent(i2), lepA->spParent(i1)); + + if (symmetry_) { + // Swapping the 2nd and 3rd charged leptons + L1B = EvtLeptonVACurrent(lepB->spParent(i2), neu->spParentNeutrino()); + } + + } else { + + // B+ currents + // L2^{\nu} = \bar mu(k_1) \gamma^{\nu} mu(- k_2) + L2A = EvtLeptonVCurrent(lepA->spParent(i1), lepB->spParent(i2)); + + if (symmetry_) { + // Swapping the 2nd and 3rd charged leptons + L1B = EvtLeptonVACurrent(neu->spParentNeutrino(), lepB->spParent(i2)); + } + + } + + // Production: Tfi^{\mu} = THadron^{\mu \nu} L_{2 \nu} + EvtVector4C THL2A = THadronA.cont2(L2A); + + for (int i4 = 0; i4 < 2; i4++) { + + leptonSpins[2] = i4; + leptonSpins[3] = 0; // neutrino handedness + + if (sign == -1) { + + // B- currents + // L1^{\mu} = \bar e(k_4) \gamma^{\mu} (1 - \gamma^5) nu_e(- k_3) + L1A = EvtLeptonVACurrent(lepC->spParent(i4), neu->spParentNeutrino()); + + if (symmetry_) { + // Swapping the 2nd and 3rd charged leptons + L2B = EvtLeptonVCurrent(lepC->spParent(i4), lepA->spParent(i1)); + } + + } else { + + // B+ currents + // L1^{\mu} = \bar nu_e(k_3) \gamma^{\mu} (1 - \gamma^5) e(- k_4) + L1A = EvtLeptonVACurrent(neu->spParentNeutrino(), lepC->spParent(i4)); + + if (symmetry_) { + // Swapping the 2nd and 3rd charged leptons + L2B = EvtLeptonVCurrent(lepA->spParent(i1), lepC->spParent(i4)); + } + + } + + if (threshold == false) { + + // Below kinematic thresholds + amp.vertex(leptonSpins, zero_); + + } else { + + // Decay amplitude calculation: L_1^{\mu} Tfi_{\mu} + EvtComplex decAmp = L1A*THL2A; + + // If we also need to swap the 2nd and 3rd charged leptons + if (symmetry_) { + + // Hadronic current production term. L2B depends on i4 so we need + // it here instead of inside the i2 loop as was the case for THL2A + EvtVector4C THL2B = THadronB.cont2(L2B); + + // The symmetric amplitude + EvtComplex ampB = L1B*THL2B; + + // Subtract this from the total amplitude + decAmp -= ampB; + + } + + amp.vertex(leptonSpins, decAmp); + + } + + } // i4 loop + + } // i1 loop + + } // i2 loop + +} + +EvtTensor4C EvtBLLNuLAmp::getHadronTensor(const EvtBLLNuLAmp::KinInfo& info) const +{ + // Hadronic tensor calculation. + // First retrieve kinematic variables + EvtVector4R q = info.getQ(); + EvtVector4R k = info.getK(); + double qSq = info.getQSq(); + double kSq = info.getKSq(); + double MB = info.getMB(); + int sign = info.getSign(); + + EvtTensor4C epskq = dual(EvtGenFunctions::directProd(k, q)); + EvtTensor4C qk = EvtGenFunctions::directProd(q, k); + + EvtComplex BstarAmp = getBStarTerm(qSq, kSq, MB); + std::vector VMDAmps = getVMDTerms(qSq, kSq, MB); + + EvtComplex FF_ekq = BstarAmp + VMDAmps[0]; + EvtComplex FF_g = VMDAmps[1] - fBu_; + EvtComplex FF_qk = VMDAmps[2]; + + // Full hadronic tensor + EvtTensor4C THadron = sign*2.0*FF_ekq*epskq + unitI_*(2.0*FF_qk*qk - FF_g*EvtTensor4C::g()); + + // Kinematic cuts + double coeffcut(0.0); + if (qSq > qSqMin_ && kSq > kSqMin_) { + coeffcut = 1.0/qSq; + } + + // Normalisation constant + THadron *= coeffcut*coupling_; + + return THadron; +} + +std::vector EvtBLLNuLAmp::getVMDTerms(double qSq, double kSq, double MB) const +{ + // Find the 3 VMD form factors: epsilon*k*q, g(uv) and q*k terms + EvtComplex VMD1(0.0, 0.0), VMD2(0.0, 0.0), VMD3(0.0, 0.0); + + // Loop over the VMD poles + for (int iPole = 0; iPole < nPoles_; iPole++) { + + EvtBLLNuLAmp::ResPole* pole = resPoles_[iPole]; + + // Propagator term, common for all factors + EvtComplex prop = pole->propagator(qSq); + + double mSum = MB + pole->getMass(); + + VMD1 += prop/mSum; + VMD2 += mSum*prop; + + } + + // Third pole summation term is the same as the first one + VMD3 = VMD1; + + // Multiply by couplings for the given kSq + VMD1 *= FF_V(kSq); + VMD2 *= FF_A1(kSq); + VMD3 *= FF_A2(kSq); + + // Return the factors as a vector + std::vector factors; + factors.push_back(VMD1); + factors.push_back(VMD2); + factors.push_back(VMD3); + + return factors; +} + +EvtComplex EvtBLLNuLAmp::getBStarTerm(double qSq, double kSq, double MB) const +{ + EvtComplex amplitude = Bstar_->propagator(kSq, 1)*FF_B2Bstar(qSq)/(MB + Bstar_->getMass()); + return amplitude; +} + +double EvtBLLNuLAmp::FF_B2Bstar(double qSq) const +{ + // Electromagnetic FF for B -> B* transition, when gamma is emitted from the b quark + // D.Melikhov, private communication + double y = qSq/Upsilon_->getMassSq(); + double denom = (1.0 - y)*(1.0 - 0.81*y); + + double V(0.0); + if (fabs(denom) > 1e-10) { + V = 1.044/denom; + } + + return V; +} + +double EvtBLLNuLAmp::FF_V(double kSq) const +{ + // D. Melikhov and B. Stech, PRD 62, 014006 (2000) Table XV + double y = kSq/Bstar_->getMassSq(); + double denom = sqrt2_*(1.0 - y)*(1.0 - 0.59*y); + + double V(0.0); + if (fabs(denom) > 1e-10) { + V = 0.31/denom; + } + + return V; +} + +double EvtBLLNuLAmp::FF_A1(double kSq) const +{ + // D. Melikhov and B. Stech, PRD 62, 014006 (2000) Table XV + double y = kSq/Bstar_->getMassSq(); + double denom = ((0.1*y - 0.73)*y + 1.0)*sqrt2_; + + double A1(0.0); + if (fabs(denom) > 1e-10) { + A1 = 0.26/denom; + } + + return A1; +} + +double EvtBLLNuLAmp::FF_A2(double kSq) const +{ + // D. Melikhov and B. Stech, PRD 62, 014006 (2000) Table XV + double y = kSq/Bstar_->getMassSq(); + double denom = ((0.5*y - 1.4)*y + 1.0)*sqrt2_; + + double A2(0.0); + if (fabs(denom) > 1e-10) { + A2 = 0.24/denom; + } + + return A2; +} + diff --git a/src/EvtGenModels/EvtModelReg.cpp b/src/EvtGenModels/EvtModelReg.cpp index 95535d5..b476060 100644 --- a/src/EvtGenModels/EvtModelReg.cpp +++ b/src/EvtGenModels/EvtModelReg.cpp @@ -1,353 +1,353 @@ //-------------------------------------------------------------------------- // // Environment: // This software is part of the EvtGen package developed jointly // for the BaBar and CLEO collaborations. If you use all or part // of it, please give an appropriate acknowledgement. // // Copyright Information: See EvtGen/COPYRIGHT // Copyright (C) 1998 Caltech, UCSB // // Module: EvtModel.cc // // Description: // // Modification history: // // RYD September 25, 1996 Module created // //------------------------------------------------------------------------ // #include "EvtGenBase/EvtPatches.hh" #include #include #include #include #include #include #include "EvtGenBase/EvtModel.hh" #include "EvtGenModels/EvtTauVectornu.hh" #include "EvtGenModels/EvtVVP.hh" #include "EvtGenModels/EvtSLN.hh" #include "EvtGenModels/EvtISGW2.hh" #include "EvtGenModels/EvtMelikhov.hh" #include "EvtGenModels/EvtSLPole.hh" #include "EvtGenModels/EvtPropSLPole.hh" #include "EvtGenModels/EvtSLBKPole.hh" #include "EvtGenModels/EvtISGW.hh" #include "EvtGenModels/EvtBHadronic.hh" #include "EvtGenModels/EvtVSS.hh" #include "EvtGenModels/EvtVSSMix.hh" #include "EvtGenModels/EvtVSSBMixCPT.hh" #include "EvtGenModels/EvtVSPPwave.hh" #include "EvtGenModels/EvtGoityRoberts.hh" #include "EvtGenModels/EvtSVS.hh" #include "EvtGenModels/EvtTSS.hh" #include "EvtGenModels/EvtTVSPwave.hh" #include "EvtGenModels/EvtSVVHelAmp.hh" #include "EvtGenModels/EvtSVPHelAmp.hh" #include "EvtGenModels/EvtSVPCP.hh" #include "EvtGenModels/EvtVVSPwave.hh" #include "EvtGenModels/EvtDDalitz.hh" #include "EvtGenModels/EvtOmegaDalitz.hh" #include "EvtGenModels/EvtPi0Dalitz.hh" #include "EvtGenModels/EvtEtaDalitz.hh" #include "EvtGenModels/EvtPhsp.hh" #include "EvtGenModels/EvtBtoXsgamma.hh" #include "EvtGenModels/EvtBtoXsll.hh" #include "EvtGenModels/EvtBtoXsEtap.hh" #include "EvtGenModels/EvtSSSCP.hh" #include "EvtGenModels/EvtSSSCPpng.hh" #include "EvtGenModels/EvtSTSCP.hh" #include "EvtGenModels/EvtSTS.hh" #include "EvtGenModels/EvtSSSCPT.hh" #include "EvtGenModels/EvtSVSCP.hh" #include "EvtGenModels/EvtSSDCP.hh" #include "EvtGenModels/EvtSVSNONCPEIGEN.hh" #include "EvtGenModels/EvtSVVNONCPEIGEN.hh" #include "EvtGenModels/EvtSVVCP.hh" #include "EvtGenModels/EvtSVVCPLH.hh" #include "EvtGenModels/EvtSVSCPLH.hh" #include "EvtGenModels/EvtSll.hh" #include "EvtGenModels/EvtVll.hh" #include "EvtGenModels/EvtTaulnunu.hh" #include "EvtGenModels/EvtTauHadnu.hh" #include "EvtGenModels/EvtTauScalarnu.hh" #include "EvtGenModels/EvtKstarnunu.hh" #include "EvtGenModels/EvtbTosllBall.hh" #include "EvtGenModels/EvtSingleParticle.hh" #include "EvtGenModels/EvtVectorIsr.hh" #include "EvtGenModels/EvtBToPlnuBK.hh" #include "EvtGenModels/EvtBToVlnuBall.hh" #include "EvtGenModels/EvtSVVHelCPMix.hh" #include "EvtGenModels/EvtSVPHelCPMix.hh" #include "EvtGenModels/EvtLb2Lll.hh" #include "EvtGenModels/EvtRareLbToLll.hh" #include "EvtGenModels/EvtHypNonLepton.hh" #include "EvtGenModels/EvtbTosllAli.hh" #include "EvtGenModels/EvtBToDDalitzCPK.hh" #include "EvtGenModels/EvtPVVCPLH.hh" #include "EvtGenModels/EvtLambdaB2LambdaV.hh" #include "EvtGenModels/EvtSSD_DirectCP.hh" #include "EvtGenModels/EvtHQET.hh" #include "EvtGenModels/EvtHQET2.hh" #include "EvtGenBase/EvtParticle.hh" #include "EvtGenBase/EvtPDL.hh" #include "EvtGenModels/EvtHelAmp.hh" #include "EvtGenModels/EvtPartWave.hh" #include "EvtGenModels/EvtBto2piCPiso.hh" #include "EvtGenModels/EvtBtoKpiCPiso.hh" #include "EvtGenModels/EvtSVSCPiso.hh" #include "EvtGenModels/EvtVVpipi.hh" #include "EvtGenModels/EvtY3SToY1SpipiMoxhay.hh" #include "EvtGenModels/EvtYmSToYnSpipiCLEO.hh" #include "EvtGenModels/EvtVVPIPI_WEIGHTED.hh" #include "EvtGenModels/EvtVPHOtoVISRHi.hh" #include "EvtGenModels/EvtBTo4piCP.hh" #include "EvtGenModels/EvtBTo3piCP.hh" #include "EvtGenModels/EvtCBTo3piP00.hh" #include "EvtGenModels/EvtCBTo3piMPP.hh" #include "EvtGenModels/EvtBToKpipiCP.hh" #include "EvtGenModels/EvtBsquark.hh" #include "EvtGenModels/EvtPhiDalitz.hh" #include "EvtGenModels/EvtLNuGamma.hh" #include "EvtGenModels/EvtVub.hh" #include "EvtGenModels/EvtVubHybrid.hh" #include "EvtGenModels/EvtVubNLO.hh" #include "EvtGenModels/EvtVubBLNP.hh" #include "EvtGenModels/EvtVubBLNPHybrid.hh" #include "EvtGenModels/EvtPto3P.hh" #include "EvtGenModels/EvtBtoKD3P.hh" #include "EvtGenModels/EvtKstarstargamma.hh" #include "EvtGenModels/EvtFlatQ2.hh" #include "EvtGenModels/EvtLambdaP_BarGamma.hh" #include "EvtGenModels/EvtBBScalar.hh" #include "EvtGenModels/EvtKKLambdaC.hh" #include "EvtGenModels/EvtMultibody.hh" #include "EvtGenModels/EvtBaryonPCR.hh" #include "EvtGenModels/EvtDMix.hh" #include "EvtGenModels/EvtD0mixDalitz.hh" #include "EvtGenModels/EvtD0gammaDalitz.hh" #include "EvtGenModels/EvtEta2MuMuGamma.hh" #include "EvtGenModels/EvtBcToNPi.hh" #include "EvtGenModels/EvtBcPsiNPi.hh" #include "EvtGenModels/EvtBcBsNPi.hh" #include "EvtGenModels/EvtBcBsStarNPi.hh" #include "EvtGenModels/EvtBcSMuNu.hh" #include "EvtGenModels/EvtBcVMuNu.hh" #include "EvtGenModels/EvtBcTMuNu.hh" #include "EvtGenModels/EvtBcVNpi.hh" #include "EvtGenModels/EvtSVP.hh" #include "EvtGenModels/EvtTVP.hh" #include "EvtGenModels/EvtXPsiGamma.hh" #include "EvtGenModels/EvtbsToLLLL.hh" #include "EvtGenModels/EvtbsToLLLLHyperCP.hh" -#include "EvtGenModels/EvtB2MuMuMuNu.hh" +#include "EvtGenModels/EvtBLLNuL.hh" #include "EvtGenModels/EvtKStopizmumu.hh" #include "EvtGenModels/EvtVtoSll.hh" #include "EvtGenModels/EvtGenericDalitz.hh" #include "EvtGenModels/EvtBcVHad.hh" #include "EvtGenModels/Evtbs2llGammaMNT.hh" #include "EvtGenModels/Evtbs2llGammaISRFSR.hh" #include "EvtGenModels/EvtbTosllMS.hh" #include "EvtGenModels/EvtbTosllMSExt.hh" #include "EvtGenModels/EvtbsToLLLL.hh" #include "EvtGenModels/EvtbsToLLLLHyperCP.hh" #include "EvtGenModels/EvtLb2plnuLCSR.hh" #include "EvtGenModels/EvtLb2plnuLQCD.hh" #include "EvtGenModels/EvtLb2Baryonlnu.hh" #include "EvtGenModels/EvtBToDiBaryonlnupQCD.hh" #include "EvtGenModels/EvtFlatSqDalitz.hh" #include "EvtGenModels/EvtPhspFlatLifetime.hh" #include "EvtGenModels/EvtModelReg.hh" using std::fstream; using std::cout; using std::endl; EvtModelReg::EvtModelReg(const std::list* extraModels) { EvtModel &modelist=EvtModel::instance(); if(extraModels){ for(std::list::const_iterator it = extraModels->begin(); it != extraModels->end(); ++it){ modelist.registerModel(*it); } } modelist.registerModel(new EvtBBScalar); modelist.registerModel(new EvtLambdaP_BarGamma); modelist.registerModel(new EvtFlatQ2); modelist.registerModel(new EvtTauHadnu); modelist.registerModel(new EvtTauVectornu); modelist.registerModel(new EvtVVP); modelist.registerModel(new EvtSLN); modelist.registerModel(new EvtISGW2); modelist.registerModel(new EvtMelikhov); modelist.registerModel(new EvtSLPole); modelist.registerModel(new EvtPropSLPole); modelist.registerModel(new EvtSLBKPole); modelist.registerModel(new EvtHQET); modelist.registerModel(new EvtHQET2); modelist.registerModel(new EvtISGW); modelist.registerModel(new EvtBHadronic); modelist.registerModel(new EvtVSS); modelist.registerModel(new EvtVSSMix); modelist.registerModel(new EvtVSSBMixCPT); modelist.registerModel(new EvtVSPPwave); modelist.registerModel(new EvtGoityRoberts); modelist.registerModel(new EvtSVS); modelist.registerModel(new EvtTSS); modelist.registerModel(new EvtTVSPwave); modelist.registerModel(new EvtSVVHelAmp); modelist.registerModel(new EvtSVPHelAmp); modelist.registerModel(new EvtSVPCP); modelist.registerModel(new EvtVVSPwave); modelist.registerModel(new EvtDDalitz); modelist.registerModel(new EvtOmegaDalitz); modelist.registerModel(new EvtEtaDalitz); modelist.registerModel(new EvtPhsp); modelist.registerModel(new EvtBtoXsgamma); modelist.registerModel(new EvtBtoXsll); modelist.registerModel(new EvtBtoXsEtap); modelist.registerModel(new EvtSSSCP); modelist.registerModel(new EvtSSSCPpng); modelist.registerModel(new EvtSTSCP); modelist.registerModel(new EvtSTS); modelist.registerModel(new EvtSSSCPT); modelist.registerModel(new EvtSVSCP); modelist.registerModel(new EvtSSDCP); modelist.registerModel(new EvtSVSNONCPEIGEN); modelist.registerModel(new EvtSVVNONCPEIGEN); modelist.registerModel(new EvtSVVCP); modelist.registerModel(new EvtSVVCPLH); modelist.registerModel(new EvtSVSCPLH); modelist.registerModel(new EvtSll); modelist.registerModel(new EvtVll); modelist.registerModel(new EvtTaulnunu); modelist.registerModel(new EvtTauScalarnu); modelist.registerModel(new EvtKstarnunu); modelist.registerModel(new EvtbTosllBall); modelist.registerModel(new EvtBto2piCPiso); modelist.registerModel(new EvtBtoKpiCPiso); modelist.registerModel(new EvtSVSCPiso); modelist.registerModel(new EvtSingleParticle); modelist.registerModel(new EvtVectorIsr); modelist.registerModel(new EvtPi0Dalitz); modelist.registerModel(new EvtHelAmp); modelist.registerModel(new EvtPartWave); modelist.registerModel(new EvtVVpipi); modelist.registerModel(new EvtY3SToY1SpipiMoxhay); modelist.registerModel(new EvtYmSToYnSpipiCLEO); modelist.registerModel(new EvtBsquark); modelist.registerModel(new EvtPhiDalitz); modelist.registerModel(new EvtBToPlnuBK); modelist.registerModel(new EvtBToVlnuBall); modelist.registerModel(new EvtVVPIPI_WEIGHTED); modelist.registerModel(new EvtVPHOtoVISRHi); modelist.registerModel(new EvtBTo4piCP); modelist.registerModel(new EvtBTo3piCP); modelist.registerModel(new EvtCBTo3piP00); modelist.registerModel(new EvtCBTo3piMPP); modelist.registerModel(new EvtBToKpipiCP); modelist.registerModel(new EvtLb2Lll); modelist.registerModel(new EvtRareLbToLll); modelist.registerModel(new EvtHypNonLepton); modelist.registerModel(new EvtSVVHelCPMix); modelist.registerModel(new EvtSVPHelCPMix); modelist.registerModel(new EvtLNuGamma); modelist.registerModel(new EvtKstarstargamma); modelist.registerModel(new EvtVub); modelist.registerModel(new EvtVubHybrid); modelist.registerModel(new EvtVubNLO); modelist.registerModel(new EvtVubBLNP); modelist.registerModel(new EvtVubBLNPHybrid); modelist.registerModel(new EvtPto3P); modelist.registerModel(new EvtBtoKD3P); modelist.registerModel(new EvtKKLambdaC); modelist.registerModel(new EvtMultibody); modelist.registerModel(new EvtDMix); modelist.registerModel(new EvtD0mixDalitz); modelist.registerModel(new EvtD0gammaDalitz); modelist.registerModel(new EvtEta2MuMuGamma); modelist.registerModel(new EvtbTosllAli); modelist.registerModel(new EvtBaryonPCR); modelist.registerModel(new EvtBToDDalitzCPK); modelist.registerModel(new EvtLambdaB2LambdaV); modelist.registerModel(new EvtLambda2PPiForLambdaB2LambdaV); modelist.registerModel(new EvtV2VpVmForLambdaB2LambdaV); modelist.registerModel(new EvtPVVCPLH); modelist.registerModel(new EvtSSD_DirectCP); modelist.registerModel(new EvtBcToNPi(true)); // true = print author info modelist.registerModel(new EvtBcPsiNPi); modelist.registerModel(new EvtBcBsNPi); modelist.registerModel(new EvtBcBsStarNPi); modelist.registerModel(new EvtBcSMuNu); modelist.registerModel(new EvtBcVMuNu); modelist.registerModel(new EvtBcTMuNu); modelist.registerModel(new EvtBcVNpi); modelist.registerModel(new EvtSVP); modelist.registerModel(new EvtTVP); modelist.registerModel(new EvtXPsiGamma); modelist.registerModel(new EvtbsToLLLL); modelist.registerModel(new EvtbsToLLLLHyperCP); - modelist.registerModel(new EvtB2MuMuMuNu); + modelist.registerModel(new EvtBLLNuL); modelist.registerModel(new EvtKStopizmumu); modelist.registerModel(new EvtVtoSll); modelist.registerModel(new EvtGenericDalitz()); modelist.registerModel(new EvtBcVHad); modelist.registerModel(new Evtbs2llGammaMNT); modelist.registerModel(new Evtbs2llGammaISRFSR); modelist.registerModel(new EvtbTosllMS); modelist.registerModel(new EvtbTosllMSExt); modelist.registerModel(new EvtLb2plnuLQCD); modelist.registerModel(new EvtLb2plnuLCSR); modelist.registerModel(new EvtLb2Baryonlnu); modelist.registerModel(new EvtBToDiBaryonlnupQCD); modelist.registerModel(new EvtFlatSqDalitz); modelist.registerModel(new EvtPhspFlatLifetime); }