Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 09:09:45

0001 #ifndef MODEL_Interaction_Models_Lorentz_Function_H
0002 #define MODEL_Interaction_Models_Lorentz_Function_H
0003 
0004 #include "ATOOLS/Org/MyStrStream.H"
0005 #include "ATOOLS/Org/Getter_Function.H"
0006 #include "ATOOLS/Org/STL_Tools.H"
0007 #include <vector>
0008 
0009 namespace MODEL {
0010 
0011   struct LF_Key {};
0012 
0013   class Lorentz_Function {
0014   private:
0015 
0016     Lorentz_Function(const Lorentz_Function &l): p_next(NULL) { *this=l; }
0017 
0018   protected:
0019 
0020     std::string m_type;
0021 
0022     int m_partarg[4], m_permcount;
0023 
0024     std::vector<int*> m_permlist;
0025     std::vector<int>  m_signlist;
0026     Lorentz_Function* p_next;
0027 
0028     std::string Str(int a) const;
0029 
0030     Lorentz_Function(const std::string &type);
0031 
0032     virtual ~Lorentz_Function();
0033 
0034   public:
0035 
0036     virtual void Delete() = 0;
0037 
0038     virtual int NofIndex() const = 0;
0039 
0040     virtual std::string String(int shortversion=0) const = 0;
0041 
0042     virtual void InitPermutation();
0043 
0044     virtual bool CutVectors();
0045 
0046     virtual Lorentz_Function *GetCopy() const = 0;
0047 
0048     void SetParticleArg(int a=-1,int b=-1,int c=-1,int d=-1);
0049     void AddPermutation(int sign,int a,int b=-1,int c=-1,int d=-1);
0050 
0051     int  GetSign();
0052     int  ResetPermutation();
0053     int  NextPermutation();
0054 
0055     Lorentz_Function &operator=(const Lorentz_Function &l);
0056 
0057     bool operator==(const Lorentz_Function &l) const;
0058 
0059     inline int ParticleArg(int i) const { return m_partarg[i]; }
0060     inline const int* ParticleArg() const { return m_partarg; }
0061 
0062     inline std::string Type() const { return m_type; }
0063 
0064   };// end of class Lorentz_Function
0065 
0066   typedef ATOOLS::Getter_Function<Lorentz_Function,LF_Key> LF_Getter;
0067 
0068   std::ostream &operator<<(std::ostream &str,const Lorentz_Function &lf);
0069   class LF_Pol: public Lorentz_Function {
0070   public:
0071     LF_Pol();
0072     int NofIndex() const;
0073     std::string String(int shortversion) const;
0074     Lorentz_Function *GetCopy() const;
0075     static ATOOLS::AutoDelete_Vector<LF_Pol> s_objects;
0076     static Lorentz_Function *New();
0077     void Delete();
0078   };
0079 
0080 
0081  /*! 
0082     \file
0083     \brief this file contains the classes MODEL::Lorentz_Function
0084            and MODEL::lf   
0085   */
0086 
0087   /*! 
0088     \class lf 
0089     \brief Helper class to collect the existing types of possible Lorentz_Functions
0090 
0091     
0092   */
0093  
0094   /*! 
0095     \class Lorentz_Function 
0096     \brief In this class basic Lorentz structures as present in the SM, MSSM and LED
0097            are defined. According to these Lorentz structures generated amplitudes can
0098        uniquely be translated into helicity amplitudes.
0099 
0100     In order to attach the Lorentz structure to a Single_Vertex object 
0101     Lorentz_Function objects are defined. A Lorentz_Function possesses a type, 
0102     defined in the class MODEL::lf, and a number of arguments. These arguments called 
0103     partarg are of the integer type. Per default they are set to '-1'. Attached to a 
0104     Lorentz_Function is a string expression that contains the information of the 
0105     Lorentz_Function type and its arguments, see Tab. ?? for a complete list of 
0106     Lorentz_Function types defined in MODEL++, there associated number of arguments 
0107     and the corresponding string expression. 
0108     
0109     <table width=450 align=center>
0110     <tr>
0111     <td>Lorentz_Function</td>
0112     <td>args</td>
0113     <td>Lorentz structure </td>
0114     <td>string</td>
0115     </tr>
0116     <tr>
0117     <td>Pol</td>
0118     <td>1</td>
0119     <td>\f$ \epsilon^{\mu} \f$</td>
0120     <td>EPS[0]</td>
0121     </tr>
0122     <tr>
0123     <td>SSS</td>
0124     <td>0</td>
0125     <td>\f$ 1 \f$</td>
0126     <td>1</td>
0127     </tr>
0128     <tr>
0129     <td>FFS</td>
0130     <td>0</td>
0131     <td>\f$ 1 \f$</td>
0132     <td>1</td>
0133     </tr>
0134     <tr>
0135     <td>SSV</td>
0136     <td>3</td>
0137     <td>\f$ (p_0-p_1)^{\mu} \f$</td>
0138     <td>P[0,2]-P[1,2]</td>
0139     </tr>
0140     <tr>
0141     <td>Gamma</td>
0142     <td>1</td>
0143     <td>\f$ \gamma^{\mu} \f$</td>
0144     <td>Gam[0]</td>
0145     </tr>
0146     <tr>
0147     <td>Gab</td>
0148     <td>2</td>
0149     <td>\f$ g^{\mu\nu} \f$</td>
0150     <td>G[0,1]</td>
0151     </tr>
0152     <tr>
0153     <td>Gauge3</td>
0154     <td>3</td>
0155     <td>\f$ (p_0-p_1)^{\mu}g^{\nu\lambda} + (p_1-p_2)^{\nu} g^{\lambda\mu}+ (p_2-p_0)^{\lambda}g^{\mu\nu} \f$</td>
0156     <td>(P[0,2]-P[1,2])*G[0,1]+(P[1,0]-P[2,0])*G[1,2]+(P[2,1]-P[0,1])*G[2,0]</td>
0157     </tr>
0158     <tr>
0159     <td>Gauge4</td>
0160     <td>4</td>
0161     <td>\f$ 2g^{\alpha\beta}g^{\mu\nu} - g^{\alpha\mu}g^{\beta\nu} - g^{\alpha\nu}g^{\beta\mu}\f$</td>
0162     <td>2*G(0,1)*G(2,3) - G(0,2)*G(1,3) -  G(0,3)*G(1,2)</td>
0163     </tr>
0164     <tr>
0165     <td>Gluon4</td>
0166     <td>4</td>
0167     <td>\f$ g^{\alpha\beta}g^{\mu\nu} - g^{\alpha\nu}g^{\beta\mu}\f$</td>
0168     <td>G(0,1)*G(2,3) - G(0,3)*G(1,2)</td>
0169     </tr>
0170     <tr>
0171     <td>VVSS</td>
0172     <td>2</td>
0173     <td>\f$ g^{\mu\nu}\f$</td>
0174     <td>G(2V2S)[0,1]</td>
0175     </tr>
0176     <tr>
0177     <td>SSSS</td>
0178     <td>0</td>
0179     <td>\f$ 1\f$</td>
0180     <td>1</td>
0181     </tr>
0182     <tr>
0183     <td>FFT</td>
0184     <td>1</td>
0185     <td>\f$ ??\f$</td>
0186     <td>??</td>
0187     </tr>
0188     <tr>
0189     <td>VVT</td>
0190     <td>3</td>
0191     <td>\f$ ??\f$</td>
0192     <td>??</td>
0193     </tr>
0194     <tr>
0195     <td>SST</td>
0196     <td>3</td>
0197     <td>\f$ ??\f$</td>
0198     <td>??</td>
0199     </tr>
0200     <tr>
0201     <td>FFVT</td>
0202     <td>2</td>
0203     <td>\f$ ??\f$</td>
0204     <td>??</td>
0205     </tr>
0206     <tr>
0207     <td>VVVT</td>
0208     <td>4</td>
0209     <td>\f$ ??\f$</td>
0210     <td>??</td>
0211     </tr>
0212     <tr>
0213     <td>SSST</td>
0214     <td>1</td>
0215     <td>\f$ ??\f$</td>
0216     <td>??</td>
0217     </tr>
0218     <tr>
0219     <td>FFGS</td>
0220     <td>0</td>
0221     <td>\f$ ??\f$</td>
0222     <td>??</td>
0223     </tr>
0224     <tr>
0225     <td>VVGS</td>
0226     <td>3</td>
0227     <td>\f$ ??\f$</td>
0228     <td>??</td>
0229     </tr>
0230     <tr>
0231     <td>SSGS</td>
0232     <td>2</td>
0233     <td>\f$ ??\f$</td>
0234     <td>??</td>
0235     </tr>
0236     <tr>
0237     <td>FFVGS</td>
0238     <td>1</td>
0239     <td>\f$ ??\f$</td>
0240     <td>??</td>
0241     </tr>
0242     </table>
0243 
0244     In addition to its type and arguments a Lorentz_Function owns a pointer to a further
0245     Lorentz_Function called Next, a priori this pointer is initialized as nil.
0246   */
0247  
0248   /*!
0249     \fn std::string Lorentz_Function::String(int shortversion=0)
0250     \brief Returns the string expression of the associated Lorentz_Function in terms 
0251     of the underlying Lorentz structure or a shorthand notation. 
0252   */
0253 
0254   /*!
0255     \fn int Lorentz_Function::NofIndex()
0256     \brief Returns the number of arguments the Lorentz_Function owns.
0257   */
0258 
0259   /*!
0260     \fn void Lorentz_Function::SetParticleArg(int a=-1, int b=-1,int c=-1,int d=-1)
0261     \brief The setting of the integer arguments of a Lorentz_Function object is 
0262     performed. Since all arguments are per default set to '-1' it is sufficient to 
0263     specify only the number of physical meaningful arguments even this number is smaller
0264     than four.
0265   */
0266 
0267   /*!
0268     \fn int Lorentz_Function::GetSign()
0269     \brief Returns the sign according to a specific permutation of the arguments of 
0270     a Lorentz_Function.
0271   */
0272   
0273   /*!
0274     \fn void Lorentz_Function::AddPermutation(int,int,int,int,int);
0275     \brief A new permution can be added to the list of permutations associated
0276     to a Lorentz_Function.
0277 
0278     The first argument determines the sign of the permutation and therefore
0279     can have the two values '\f$\pm 1\f$'. The remaining arguments determine the 
0280     exchange of the original order of arguments of the Lorentz_Function under consideration.
0281     Taking a Lorentz_Function with four arguments (0,1,2,3) the call AddPermutation(-1,2,1,0,3) 
0282     would result in the argument tuple (2,1,0,3) and the sign '-1' is added to the m_signlist. 
0283 
0284   */
0285     
0286   /*!
0287     \fn void Lorentz_Function::InitPermutation();
0288     \brief The predefined permutations of all Lorentz_Function objets are initialized.
0289 
0290     After clearing the lists m_permlist and m_signlist of the Lorentz_Function the existing argument 
0291     permutations are added to m_permlist and the corresponding signs to m_signlist. The counter 
0292     m_percount is initialized as zero.
0293   */
0294   /*!
0295     \fn int Lorentz_Function::ResetPermutation();
0296     \brief Resets the arguments of a Lorentz_Function to the original order, resp. (0,1,2,3). 
0297     The counter m_percount is set to zero.
0298   */
0299   /*!
0300     \fn int Lorentz_Function::NextPermutation();
0301     \brief This method trys to set up a new permutation of the arguments be going through 
0302     the m_permlist of the object where the current position is determined by the value of
0303     m_permcount.
0304 
0305     For Lorentz_Functions possessing less than two arguments clearly there exists no nontrivial
0306     permutation and therefore the method returns a zero. For all other cases the method rearanges 
0307     the arguments of the Lorentz_Function according to a permutation out list of m_permlist and 
0308     increases the value of m_permcount by one. For each call of the method one new permutation is 
0309     set up and in case the end of list is reached a zero is returned.
0310   */
0311   
0312   /*!
0313     \var int Lorentz_Function::m_permcount;
0314     \brief Variable that stores the current position in the list of permutations m_permlist.
0315   */
0316   
0317    /*!
0318      \var std::vector<int*> Lorentz_Function::m_permlist;
0319      \brief List of allowed argument permutations belonging to a Lorentz_Function.
0320    */
0321    /*!
0322      \var std::vector<int> Lorentz_Function::m_signlist;
0323      \brief Associated list of signs corresponding to the permutations in m_permlist.
0324    */
0325 }
0326 
0327 #define DEFINE_LF_GETTER(CLASS,TAG,INFO)                \
0328   DECLARE_GETTER(CLASS,TAG,Lorentz_Function,LF_Key);            \
0329   Lorentz_Function *ATOOLS::Getter<Lorentz_Function,LF_Key,CLASS>:: \
0330   operator()(const LF_Key &key) const { return CLASS::New(); }      \
0331   void ATOOLS::Getter<Lorentz_Function,LF_Key,CLASS>::          \
0332   PrintInfo(std::ostream &str,const size_t width) const { str<<INFO; }
0333 
0334 #endif
0335