Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 09:10:07

0001 #ifndef MODEL_Main_Model_Base_H
0002 #define MODEL_Main_Model_Base_H
0003 
0004 #include "ATOOLS/Phys/Flavour.H"
0005 #include "ATOOLS/Math/Matrix.H"
0006 #include "ATOOLS/Math/Function_Base.H"
0007 #include "ATOOLS/Math/MathTools.H"
0008 #include "ATOOLS/Math/MyComplex.H"
0009 #include "ATOOLS/Org/Getter_Function.H"
0010 #include "MODEL/Main/Coupling_Data.H"
0011 #include "PDF/Main/ISR_Handler.H"
0012 #include <map>
0013 
0014 namespace MODEL {
0015 
0016   class Single_Vertex;
0017 
0018   typedef std::map<std::string,Complex> tscmap;
0019 
0020   typedef std::vector<Single_Vertex *> Vertex_List;
0021   typedef std::map<ATOOLS::Flavour, Vertex_List> Vertex_Table;
0022   typedef std::multimap<std::string,Single_Vertex*> Vertex_Map;
0023   typedef std::pair<std::string,Single_Vertex*> VMap_Key;
0024   typedef std::pair<Vertex_Map::const_iterator,
0025             Vertex_Map::const_iterator> VMIterator_Pair;
0026 
0027   typedef std::map<std::string,int>                     ScalarNumbersMap; 
0028   typedef std::map<std::string,double>                  ScalarConstantsMap; 
0029   typedef std::map<std::string,Complex>                 ComplexConstantsMap; 
0030   typedef std::map<std::string,ATOOLS::Function_Base *> ScalarFunctionsMap; 
0031   typedef std::map<std::string,ATOOLS::CMatrix>         ComplexMatricesMap; 
0032 
0033   struct Model_Arguments {
0034     bool m_elementary;
0035     Model_Arguments(const bool &elementary):
0036       m_elementary(elementary)
0037     {}
0038   };// end of struct Model_Arguments
0039 
0040   struct EWParameters {
0041     double m_sw2_r, m_cw2_r, m_aew_r, m_mw_r, m_mz_r,
0042       m_mt_r, m_mh0_r, m_cvev_r;
0043   };
0044 
0045   struct ew_scheme {
0046     enum code {
0047       UserDefined = 0,
0048       alpha0      = 1,
0049       alphamZ     = 2,
0050       Gmu         = 3,
0051       alphamZsW   = 4,
0052       alphamWsW   = 5,
0053       GmumZsW     = 6,
0054       GmumWsW     = 7,
0055       FeynRules   = 10,
0056       Undefined   = 99
0057     };
0058   };// end of struct ew_scheme
0059 
0060   std::ostream &operator<<(std::ostream &str,const ew_scheme::code &c);
0061   std::istream &operator>>(std::istream &str,ew_scheme::code &c);
0062 
0063   class Model_Base {
0064   public:
0065 
0066     typedef ATOOLS::Getter_Function<Model_Base,Model_Arguments> 
0067     Model_Getter_Function;
0068 
0069   protected:
0070 
0071     std::string               m_name;
0072     bool                      m_elementary;
0073     bool                      m_hasnegativecouplingorders;
0074 
0075     ScalarNumbersMap        * p_numbers;
0076     ScalarConstantsMap      * p_constants;
0077     ComplexConstantsMap     * p_complexconstants;
0078     ScalarFunctionsMap      * p_functions;
0079 
0080     Vertex_Table              m_vtable;
0081     Vertex_Map                m_vmap;
0082     ATOOLS::Flavour_Vector    m_fls;
0083 
0084     std::vector<Single_Vertex> m_v, m_ov;
0085 
0086     std::map<ATOOLS::Flavour,size_t> m_maxlegs;
0087 
0088     tscmap m_cplmap;   
0089 
0090     const PDF::ISR_Handler_Map* p_isrhandlermap;
0091 
0092     virtual void InitVertices() = 0;
0093 
0094     void RotateVertices();
0095 
0096     void CustomContainerInit();
0097 
0098     virtual void ParticleInit() = 0;
0099     void ReadParticleData();
0100     // Needs to be called by subclasses after initialising particle data
0101     virtual void RegisterDefaults() const;
0102     void AddStandardContainers();
0103     void InitMEInfo();
0104 
0105     // Model initialization
0106     virtual bool ModelInit() = 0;
0107     void SetAlphaQED(const double& aqed_def);
0108     void SetAlphaQEDByScale(const double& scale2);
0109     void SetAlphaQEDByInput(const std::string& tag);
0110     void SetAlphaQCD(const PDF::ISR_Handler_Map& isr, const double& alphaS);
0111     void SetRunningFermionMasses();
0112     void SetRunningBosonMasses();
0113 
0114     void ReadExplicitCKM(ATOOLS::CMatrix& CKM);
0115     void OutputCKM();
0116 
0117   public:
0118     Model_Base(bool);
0119     virtual ~Model_Base();
0120 
0121     bool ModelInit(const PDF::ISR_Handler_Map& isr) {
0122       p_isrhandlermap = &isr;
0123       return ModelInit();
0124     }
0125 
0126     static void ShowSyntax(const size_t mode);
0127     void InitializeInteractionModel();
0128     void GetCouplings(Coupling_Map &cpls);
0129 
0130     std::string Name() const { return m_name; } 
0131 
0132     inline tscmap *GetCouplings() { return &m_cplmap; }
0133 
0134     inline size_t MaxLegs(const ATOOLS::Flavour &fl) const
0135     { std::map<ATOOLS::Flavour,size_t>::const_iterator
0136     it(m_maxlegs.find(fl)); return it==m_maxlegs.end()?0:it->second; }
0137 
0138     virtual int                     ScalarNumber(const std::string) const;
0139     virtual double                  ScalarConstant(const std::string) const;
0140     virtual Complex                 ComplexConstant(const std::string) const;
0141     virtual ATOOLS::Function_Base * GetScalarFunction(const std::string);
0142     virtual double                  ScalarFunction(const std::string,double);
0143     virtual std::string             MappedLorentzName(const std::string& label) const {return label;}
0144 
0145     int MaxNumber() const;
0146 
0147     const std::vector<Single_Vertex> &Vertices() const;
0148     const std::vector<Single_Vertex> &OriginalVertices() const;
0149 
0150     // Make this map public, such that OL interface can loop over it
0151     // in order to synchronize UFO model parameters
0152     const ScalarConstantsMap & ScalarConstants() const {return *p_constants; }
0153 
0154     inline  const Vertex_Table *VertexTable() const { return &m_vtable; }
0155 
0156     virtual bool CheckFlavours(int nin, int nout, ATOOLS::Flavour* flavs);
0157 
0158     inline ATOOLS::Flavour_Vector IncludedFlavours() const { return m_fls; }
0159 
0160     inline VMIterator_Pair GetVertex(const std::string &key) const
0161     { return m_vmap.equal_range(key); }
0162 
0163     /**
0164      * Map Order keys to the internal ordering of the couplings
0165      *
0166      * The default implementation returns 0 for "QCD" and 1 for "EW".
0167      * Overwrite this in subclasses if different/additional orders are used
0168      * therein.
0169      **/
0170     virtual size_t IndexOfOrderKey(const std::string&) const;
0171 
0172     virtual void ResetVerticesWithEWParameters(const EWParameters&) {};
0173 
0174     const PDF::ISR_Handler_Map& ISRHandlerMap() const { return *p_isrhandlermap; }
0175 
0176     void CheckForNegativeCouplingOrders();
0177     inline bool HasNegativeCouplingOrders() const 
0178     { return m_hasnegativecouplingorders; }
0179   };
0180 
0181   extern Model_Base *s_model;
0182 
0183 }
0184 
0185 #endif
0186 
0187