LCOV - code coverage report
Current view: top level - PYTHIA8/pythia8210dev/src - SigmaHiggs.cc (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1256 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 83 0.0 %

          Line data    Source code
       1             : // SigmaHiggs.cc is a part of the PYTHIA event generator.
       2             : // Copyright (C) 2015 Torbjorn Sjostrand.
       3             : // Part of code written by Marc Montull, CERN summer student 2007.
       4             : // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
       5             : // Please respect the MCnet Guidelines, see GUIDELINES for details.
       6             : // Function definitions (not found in the header) for the
       7             : // Higgs simulation classes.
       8             : 
       9             : #include "Pythia8/SigmaHiggs.h"
      10             : 
      11             : namespace Pythia8 {
      12             : 
      13             : //==========================================================================
      14             : 
      15             : // Sigma1ffbar2H class.
      16             : // Cross section for f fbar -> H0 , H1, H2 or A3.
      17             : // (f is quark or lepton, H0 SM Higgs and H1, H2, A3 BSM Higgses ).
      18             : 
      19             : //--------------------------------------------------------------------------
      20             : 
      21             : // Initialize process.
      22             : 
      23             : void Sigma1ffbar2H::initProc() {
      24             : 
      25             :   // Properties specific to Higgs state.
      26           0 :   if (higgsType == 0) {
      27           0 :     nameSave = "f fbar -> H (SM)";
      28           0 :     codeSave = 901;
      29           0 :     idRes    = 25;
      30           0 :   }
      31           0 :   else if (higgsType == 1) {
      32           0 :     nameSave = "f fbar -> h0(H1)";
      33           0 :     codeSave = 1001;
      34           0 :     idRes    = 25;
      35           0 :   }
      36           0 :   else if (higgsType == 2) {
      37           0 :     nameSave = "f fbar -> H0(H2)";
      38           0 :     codeSave = 1021;
      39           0 :     idRes    = 35;
      40           0 :   }
      41           0 :   else if (higgsType == 3) {
      42           0 :     nameSave = "f fbar -> A0(A3)";
      43           0 :     codeSave = 1041;
      44           0 :     idRes    = 36;
      45           0 :   }
      46             : 
      47             :   // Find pointer to H0, H1, H2 or A3 depending on the value of idRes.
      48           0 :   HResPtr = particleDataPtr->particleDataEntryPtr(idRes);
      49             : 
      50             :   // Store H0, H1, H2 or A3 mass and width for propagator.
      51           0 :   mRes     = HResPtr->m0();
      52           0 :   GammaRes = HResPtr->mWidth();
      53           0 :   m2Res    = mRes*mRes;
      54           0 :   GamMRat  = GammaRes / mRes;
      55             : 
      56           0 : }
      57             : 
      58             : 
      59             : //--------------------------------------------------------------------------
      60             : 
      61             : // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
      62             : 
      63             : void Sigma1ffbar2H::sigmaKin() {
      64             : 
      65             :   // Set up Breit-Wigner.
      66           0 :   double width = HResPtr->resWidth(idRes, mH);
      67           0 :   sigBW        = 4. * M_PI/ ( pow2(sH - m2Res) + pow2(mH * width) );
      68             : 
      69             :   // Width out only includes open channels.
      70           0 :   widthOut     = width * HResPtr->resOpenFrac(idRes);
      71             : 
      72           0 : }
      73             : 
      74             : //--------------------------------------------------------------------------
      75             : 
      76             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
      77             : 
      78             : double Sigma1ffbar2H::sigmaHat() {
      79             : 
      80             :   // Calculate mass-dependent incoming width, including colour factor.
      81           0 :   int idAbs      = abs(id1);
      82           0 :   double widthIn = HResPtr->resWidthChan( mH, idAbs, -idAbs);
      83           0 :   if (idAbs < 9) widthIn /= 9.;
      84             : 
      85             :   // Done.
      86           0 :   return widthIn * sigBW * widthOut;
      87             : 
      88             : }
      89             : 
      90             : //--------------------------------------------------------------------------
      91             : 
      92             : // Select identity, colour and anticolour.
      93             : 
      94             : void Sigma1ffbar2H::setIdColAcol() {
      95             : 
      96             :   // Flavours trivial.
      97           0 :   setId( id1, id2, idRes);
      98             : 
      99             :   // Colour flow topologies. Swap when antiquarks.
     100           0 :   if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
     101           0 :   else              setColAcol( 0, 0, 0, 0, 0, 0);
     102           0 :   if (id1 < 0) swapColAcol();
     103             : 
     104           0 : }
     105             : 
     106             : //--------------------------------------------------------------------------
     107             : 
     108             : // Evaluate weight for decay angles.
     109             : 
     110             : double Sigma1ffbar2H::weightDecay( Event& process, int iResBeg,
     111             :   int iResEnd) {
     112             : 
     113             :   // Identity of mother of decaying reseonance(s).
     114           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
     115             : 
     116             :   // For Higgs decay hand over to standard routine.
     117           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
     118           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
     119             : 
     120             :   // For top decay hand over to standard routine.
     121           0 :   if (idMother == 6)
     122           0 :     return weightTopDecay( process, iResBeg, iResEnd);
     123             : 
     124             :   // Else done.
     125           0 :   return 1.;
     126             : 
     127           0 : }
     128             : 
     129             : //==========================================================================
     130             : 
     131             : // Sigma1gg2H class.
     132             : // Cross section for g g -> H0, H1, H2 or A3 (H0 SM Higgs, H1, H2, A3 BSM).
     133             : 
     134             : //--------------------------------------------------------------------------
     135             : 
     136             : // Initialize process.
     137             : 
     138             : void Sigma1gg2H::initProc() {
     139             : 
     140             :   // Properties specific to Higgs state.
     141           0 :   if (higgsType == 0) {
     142           0 :     nameSave = "g g -> H (SM)";
     143           0 :     codeSave = 902;
     144           0 :     idRes    = 25;
     145           0 :   }
     146           0 :   else if (higgsType == 1) {
     147           0 :     nameSave = "g g -> h0(H1)";
     148           0 :     codeSave = 1002;
     149           0 :     idRes    = 25;
     150           0 :   }
     151           0 :   else if (higgsType == 2) {
     152           0 :     nameSave = "g g -> H0(H2)";
     153           0 :     codeSave = 1022;
     154           0 :     idRes    = 35;
     155           0 :   }
     156           0 :   else if (higgsType == 3) {
     157           0 :     nameSave = "g g -> A0(A3)";
     158           0 :     codeSave = 1042;
     159           0 :     idRes    = 36;
     160           0 :   }
     161             : 
     162             :   // Find pointer to H0, H1, H2 or A3 depending on idRes.
     163           0 :   HResPtr = particleDataPtr->particleDataEntryPtr(idRes);
     164             : 
     165             :   // Store H0, H1, H2 or A3 mass and width for propagator.
     166           0 :   mRes     = HResPtr->m0();
     167           0 :   GammaRes = HResPtr->mWidth();
     168           0 :   m2Res    = mRes*mRes;
     169           0 :   GamMRat  = GammaRes / mRes;
     170             : 
     171           0 : }
     172             : 
     173             : //--------------------------------------------------------------------------
     174             : 
     175             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
     176             : 
     177             : void Sigma1gg2H::sigmaKin() {
     178             : 
     179             :   // Incoming width for gluons, gives colour factor of 1/8 * 1/8.
     180           0 :   double widthIn  = HResPtr->resWidthChan( mH, 21, 21) / 64.;
     181             : 
     182             :   // Set up Breit-Wigner.
     183           0 :   double width    = HResPtr->resWidth(idRes, mH);
     184           0 :   double sigBW    = 8. * M_PI/ ( pow2(sH - m2Res) + pow2(mH * width) );
     185             : 
     186             :   // Width out only includes open channels.
     187           0 :   double widthOut = width * HResPtr->resOpenFrac(idRes);
     188             : 
     189             :   // Done.
     190           0 :   sigma = widthIn * sigBW * widthOut;
     191             : 
     192           0 : }
     193             : 
     194             : //--------------------------------------------------------------------------
     195             : 
     196             : // Select identity, colour and anticolour.
     197             : 
     198             : void Sigma1gg2H::setIdColAcol() {
     199             : 
     200             :   // Flavours trivial.
     201           0 :   setId( 21, 21, idRes);
     202             : 
     203             :   // Colour flow topology.
     204           0 :   setColAcol( 1, 2, 2, 1, 0, 0);
     205             : 
     206           0 : }
     207             : 
     208             : //--------------------------------------------------------------------------
     209             : 
     210             : // Evaluate weight for decay angles.
     211             : 
     212             : double Sigma1gg2H::weightDecay( Event& process, int iResBeg,
     213             :   int iResEnd) {
     214             : 
     215             :   // Identity of mother of decaying reseonance(s).
     216           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
     217             : 
     218             :   // For Higgs decay hand over to standard routine.
     219           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
     220           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
     221             : 
     222             :   // For top decay hand over to standard routine.
     223           0 :   if (idMother == 6)
     224           0 :     return weightTopDecay( process, iResBeg, iResEnd);
     225             : 
     226             :   // Else done.
     227           0 :   return 1.;
     228             : 
     229           0 : }
     230             : 
     231             : //==========================================================================
     232             : 
     233             : // Sigma1gmgm2H class.
     234             : // Cross section for gamma gamma -> H0, H1, H2 or H3.
     235             : // (H0 SM Higgs, H1, H2 and A3 BSM Higgses).
     236             : 
     237             : //--------------------------------------------------------------------------
     238             : 
     239             : // Initialize process.
     240             : 
     241             : void Sigma1gmgm2H::initProc() {
     242             : 
     243             :   // Properties specific to Higgs state.
     244           0 :   if (higgsType == 0) {
     245           0 :     nameSave = "gamma gamma -> H (SM)";
     246           0 :     codeSave = 903;
     247           0 :     idRes    = 25;
     248           0 :   }
     249           0 :   else if (higgsType == 1) {
     250           0 :     nameSave = "gamma gamma -> h0(H1)";
     251           0 :     codeSave = 1003;
     252           0 :     idRes    = 25;
     253           0 :   }
     254           0 :   else if (higgsType == 2) {
     255           0 :     nameSave = "gamma gamma -> H0(H2)";
     256           0 :     codeSave = 1023;
     257           0 :     idRes    = 35;
     258           0 :   }
     259           0 :   else if (higgsType == 3) {
     260           0 :     nameSave = "gamma gamma -> A0(A3)";
     261           0 :     codeSave = 1043;
     262           0 :     idRes    = 36;
     263           0 :   }
     264             : 
     265             :   // Find pointer to H0, H1, H2 or A3.
     266           0 :   HResPtr = particleDataPtr->particleDataEntryPtr(idRes);
     267             : 
     268             :   // Store H0, H1, H2 or A3 mass and width for propagator.
     269           0 :   mRes     = HResPtr->m0();
     270           0 :   GammaRes = HResPtr->mWidth();
     271           0 :   m2Res    = mRes*mRes;
     272           0 :   GamMRat  = GammaRes / mRes;
     273             : 
     274           0 : }
     275             : 
     276             : //--------------------------------------------------------------------------
     277             : 
     278             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
     279             : 
     280             : void Sigma1gmgm2H::sigmaKin() {
     281             : 
     282             :   // Incoming width for photons.
     283           0 :   double widthIn  = HResPtr->resWidthChan( mH, 22, 22);
     284             : 
     285             :   // Set up Breit-Wigner.
     286           0 :   double width    = HResPtr->resWidth(idRes, mH);
     287           0 :   double sigBW    = 8. * M_PI/ ( pow2(sH - m2Res) + pow2(mH * width) );
     288             : 
     289             :   // Width out only includes open channels.
     290           0 :   double widthOut = width * HResPtr->resOpenFrac(idRes);
     291             : 
     292             :   // Done.
     293           0 :   sigma = widthIn * sigBW * widthOut;
     294             : 
     295           0 : }
     296             : 
     297             : //--------------------------------------------------------------------------
     298             : 
     299             : // Select identity, colour and anticolour.
     300             : 
     301             : void Sigma1gmgm2H::setIdColAcol() {
     302             : 
     303             :   // Flavours trivial.
     304           0 :   setId( 22, 22, idRes);
     305             : 
     306             :   // Colour flow trivial.
     307           0 :   setColAcol( 0, 0, 0, 0, 0, 0);
     308             : 
     309           0 : }
     310             : 
     311             : //--------------------------------------------------------------------------
     312             : 
     313             : // Evaluate weight for decay angles.
     314             : 
     315             : double Sigma1gmgm2H::weightDecay( Event& process, int iResBeg,
     316             :   int iResEnd) {
     317             : 
     318             :   // Identity of mother of decaying reseonance(s).
     319           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
     320             : 
     321             :   // For Higgs decay hand over to standard routine.
     322           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
     323           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
     324             : 
     325             :   // For top decay hand over to standard routine.
     326           0 :   if (idMother == 6)
     327           0 :     return weightTopDecay( process, iResBeg, iResEnd);
     328             : 
     329             :   // Else done.
     330           0 :   return 1.;
     331             : 
     332           0 : }
     333             : 
     334             : //==========================================================================
     335             : 
     336             : // Sigma2ffbar2HZ class.
     337             : // Cross section for f fbar -> H0 Z0, H1 Z0, H2 Z0 or A3 Z0.
     338             : // (H0 SM Higgs, H1, H2 and A3 BSM Higgses).
     339             : 
     340             : //--------------------------------------------------------------------------
     341             : 
     342             : // Initialize process.
     343             : 
     344             : void Sigma2ffbar2HZ::initProc() {
     345             : 
     346             :   // Properties specific to Higgs state.
     347           0 :   if (higgsType == 0) {
     348           0 :      nameSave = "f fbar -> H0 Z0 (SM)";
     349           0 :      codeSave = 904;
     350           0 :      idRes    = 25;
     351           0 :      coup2Z   = 1.;
     352           0 :   }
     353           0 :   else if (higgsType == 1) {
     354           0 :     nameSave = "f fbar -> h0(H1) Z0";
     355           0 :     codeSave = 1004;
     356           0 :     idRes    = 25;
     357           0 :     coup2Z   = settingsPtr->parm("HiggsH1:coup2Z");
     358           0 :   }
     359           0 :   else if (higgsType == 2) {
     360           0 :     nameSave = "f fbar -> H0(H2) Z0";
     361           0 :     codeSave = 1024;
     362           0 :     idRes    = 35;
     363           0 :     coup2Z   = settingsPtr->parm("HiggsH2:coup2Z");
     364           0 :   }
     365           0 :   else if (higgsType == 3) {
     366           0 :     nameSave = "f fbar -> A0(A3) ZO";
     367           0 :     codeSave = 1044;
     368           0 :     idRes    = 36;
     369           0 :     coup2Z   = settingsPtr->parm("HiggsA3:coup2Z");
     370           0 :   }
     371             : 
     372             :   // Store Z0 mass and width for propagator. Common coupling factor.
     373           0 :   mZ           = particleDataPtr->m0(23);
     374           0 :   widZ         = particleDataPtr->mWidth(23);
     375           0 :   mZS          = mZ*mZ;
     376           0 :   mwZS         = pow2(mZ * widZ);
     377           0 :   thetaWRat    = 1. / (16. * couplingsPtr->sin2thetaW()
     378           0 :                  * couplingsPtr->cos2thetaW());
     379             : 
     380             :   // Secondary open width fraction.
     381           0 :   openFracPair = particleDataPtr->resOpenFrac(idRes, 23);
     382             : 
     383           0 : }
     384             : 
     385             : //--------------------------------------------------------------------------
     386             : 
     387             : // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
     388             : 
     389             : void Sigma2ffbar2HZ::sigmaKin() {
     390             : 
     391             :   // Evaluate differential cross section.
     392           0 :   sigma0 = (M_PI / sH2) * 8. * pow2(alpEM * thetaWRat * coup2Z)
     393           0 :     * (tH * uH - s3 * s4 + 2. * sH * s4) / (pow2(sH - mZS) + mwZS);
     394             : 
     395           0 : }
     396             : 
     397             : //--------------------------------------------------------------------------
     398             : 
     399             : // Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
     400             : 
     401             : double Sigma2ffbar2HZ::sigmaHat() {
     402             : 
     403             :   // Coupling a_f^2 + v_f^2 to s-channel Z0 and colour factor.
     404           0 :   int idAbs    = abs(id1);
     405           0 :   double sigma = sigma0 * couplingsPtr->vf2af2(idAbs);
     406           0 :   if (idAbs < 9) sigma /= 3.;
     407             : 
     408             :   // Secondary width for H0 and Z0 or H1 and Z0 or H2 and Z0 or A3 and Z0.
     409           0 :   sigma       *= openFracPair;
     410             : 
     411             :   // Answer.
     412           0 :   return sigma;
     413             : 
     414             : }
     415             : 
     416             : //--------------------------------------------------------------------------
     417             : 
     418             : // Select identity, colour and anticolour.
     419             : 
     420             : void Sigma2ffbar2HZ::setIdColAcol() {
     421             : 
     422             :   // Flavours trivial.
     423           0 :   setId( id1, id2, idRes, 23);
     424             : 
     425             :   // Colour flow topologies. Swap when antiquarks.
     426           0 :   if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
     427           0 :   else              setColAcol( 0, 0, 0, 0, 0, 0);
     428           0 :   if (id1 < 0) swapColAcol();
     429             : 
     430           0 : }
     431             : 
     432             : //--------------------------------------------------------------------------
     433             : 
     434             : // Evaluate weight for decay angles.
     435             : 
     436             : double Sigma2ffbar2HZ::weightDecay( Event& process, int iResBeg,
     437             :   int iResEnd) {
     438             : 
     439             :   // Identity of mother of decaying reseonance(s).
     440           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
     441             : 
     442             :   // For Higgs decay hand over to standard routine.
     443           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
     444           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
     445             : 
     446             :   // For top decay hand over to standard routine.
     447           0 :   if (idMother == 6)
     448           0 :     return weightTopDecay( process, iResBeg, iResEnd);
     449             : 
     450             :   // If not decay of Z0 created along with Higgs then done.
     451           0 :   if (iResBeg != 5 || iResEnd != 6) return 1.;
     452             : 
     453             :   // Order so that fbar(1) f(2) -> H() f'(3) fbar'(4).
     454           0 :   int i1       = (process[3].id() < 0) ? 3 : 4;
     455           0 :   int i2       = 7 - i1;
     456           0 :   int i3       = process[6].daughter1();
     457           0 :   int i4       = process[6].daughter2();
     458           0 :   if (process[i3].id() < 0) swap( i3, i4);
     459             : 
     460             :   // Find left- and righthanded couplings of fermion pairs.
     461           0 :   int    idAbs = process[i1].idAbs();
     462           0 :   double liS   = pow2( couplingsPtr->lf(idAbs) );
     463           0 :   double riS   = pow2( couplingsPtr->rf(idAbs) );
     464           0 :   idAbs        = process[i3].idAbs();
     465           0 :   double lfS   = pow2( couplingsPtr->lf(idAbs) );
     466           0 :   double rfS   = pow2( couplingsPtr->rf(idAbs) );
     467             : 
     468             :   // Evaluate relevant four-products.
     469           0 :   double pp13  = process[i1].p() * process[i3].p();
     470           0 :   double pp14  = process[i1].p() * process[i4].p();
     471           0 :   double pp23  = process[i2].p() * process[i3].p();
     472           0 :   double pp24  = process[i2].p() * process[i4].p();
     473             : 
     474             :   // Weight and maximum.
     475           0 :   double wt    = (liS * lfS + riS * rfS) * pp13 * pp24
     476           0 :                + (liS * rfS + riS * lfS) * pp14 * pp23;
     477           0 :   double wtMax = (liS + riS) * (lfS + rfS) * (pp13 + pp14) * (pp23 + pp24);
     478             : 
     479             :   // Done.
     480           0 :   return wt / wtMax;
     481             : 
     482           0 : }
     483             : 
     484             : //==========================================================================
     485             : 
     486             : // Sigma2ffbar2HW class.
     487             : // Cross section for f fbar -> H0 W+-, H1 W+-, H2 W+- or A3 W+-.
     488             : // (H0 SM Higgs, H1, H2 and A3 BSM Higgses).
     489             : 
     490             : //--------------------------------------------------------------------------
     491             : 
     492             : // Initialize process.
     493             : 
     494             : void Sigma2ffbar2HW::initProc() {
     495             : 
     496             :   // Properties specific to Higgs state.
     497           0 :   if (higgsType == 0) {
     498           0 :     nameSave = "f fbar -> H0 W+- (SM)";
     499           0 :     codeSave = 905;
     500           0 :     idRes    = 25;
     501           0 :     coup2W   = 1.;
     502           0 :   }
     503           0 :   else if (higgsType == 1) {
     504           0 :     nameSave = "f fbar -> h0(H1) W+-";
     505           0 :     codeSave = 1005;
     506           0 :     idRes    = 25;
     507           0 :     coup2W   = settingsPtr->parm("HiggsH1:coup2W");
     508           0 :   }
     509           0 :   else if (higgsType == 2) {
     510           0 :     nameSave = "f fbar -> H0(H2) W+-";
     511           0 :     codeSave = 1025;
     512           0 :     idRes    = 35;
     513           0 :     coup2W   = settingsPtr->parm("HiggsH2:coup2W");
     514           0 :   }
     515           0 :   else if (higgsType == 3) {
     516           0 :     nameSave = "f fbar -> A0(A3) W+-";
     517           0 :     codeSave = 1045;
     518           0 :     idRes    = 36;
     519           0 :     coup2W   = settingsPtr->parm("HiggsA3:coup2W");
     520           0 :   }
     521             : 
     522             :   // Store W+- mass and width for propagator. Common coupling factor.
     523           0 :   mW              = particleDataPtr->m0(24);
     524           0 :   widW            = particleDataPtr->mWidth(24);
     525           0 :   mWS             = mW*mW;
     526           0 :   mwWS            = pow2(mW * widW);
     527           0 :   thetaWRat       = 1. / (4. * couplingsPtr->sin2thetaW());
     528             : 
     529             :   // Secondary open width fractions.
     530           0 :   openFracPairPos = particleDataPtr->resOpenFrac(idRes,  24);
     531           0 :   openFracPairNeg = particleDataPtr->resOpenFrac(idRes, -24);
     532             : 
     533           0 : }
     534             : 
     535             : //--------------------------------------------------------------------------
     536             : 
     537             : // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
     538             : 
     539             : void Sigma2ffbar2HW::sigmaKin() {
     540             : 
     541             :   //  Evaluate differential cross section.
     542           0 :   sigma0 = (M_PI / sH2) * 2. * pow2(alpEM * thetaWRat * coup2W)
     543           0 :     * (tH * uH - s3 * s4 + 2. * sH * s4) / (pow2(sH - mWS) + mwWS);
     544             : 
     545           0 : }
     546             : 
     547             : //--------------------------------------------------------------------------
     548             : 
     549             : // Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
     550             : 
     551             : double Sigma2ffbar2HW::sigmaHat() {
     552             : 
     553             :   // CKM and colour factors.
     554           0 :   double sigma = sigma0;
     555           0 :   if (abs(id1) < 9) sigma *= couplingsPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
     556             : 
     557             :   // Secondary width for H0 and W+-.
     558           0 :   int idUp     = (abs(id1)%2 == 0) ? id1 : id2;
     559           0 :   sigma       *= (idUp > 0) ? openFracPairPos : openFracPairNeg;
     560             : 
     561             :   // Answer.
     562           0 :   return sigma;
     563             : 
     564             : }
     565             : 
     566             : //--------------------------------------------------------------------------
     567             : 
     568             : // Select identity, colour and anticolour.
     569             : 
     570             : void Sigma2ffbar2HW::setIdColAcol() {
     571             : 
     572             :   // Sign of outgoing W.
     573           0 :   int sign = 1 - 2 * (abs(id1)%2);
     574           0 :   if (id1 < 0) sign = -sign;
     575           0 :   setId( id1, id2, idRes, 24 * sign);
     576             : 
     577             :   // Colour flow topologies. Swap when antiquarks.
     578           0 :   if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
     579           0 :   else              setColAcol( 0, 0, 0, 0, 0, 0);
     580           0 :   if (id1 < 0) swapColAcol();
     581             : 
     582           0 : }
     583             : 
     584             : //--------------------------------------------------------------------------
     585             : 
     586             : // Evaluate weight for decay angles.
     587             : 
     588             : double Sigma2ffbar2HW::weightDecay( Event& process, int iResBeg,
     589             :   int iResEnd) {
     590             : 
     591             :   // Identity of mother of decaying reseonance(s).
     592           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
     593             : 
     594             :   // For Higgs decay hand over to standard routine.
     595           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
     596           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
     597             : 
     598             :   // For top decay hand over to standard routine.
     599           0 :   if (idMother == 6)
     600           0 :     return weightTopDecay( process, iResBeg, iResEnd);
     601             : 
     602             :   // If not decay of W+- created along with Higgs then done.
     603           0 :   if (iResBeg != 5 || iResEnd != 6) return 1.;
     604             : 
     605             :   // Order so that fbar(1) f(2) -> H() f'(3) fbar'(4).
     606           0 :   int i1       = (process[3].id() < 0) ? 3 : 4;
     607           0 :   int i2       = 7 - i1;
     608           0 :   int i3       = process[6].daughter1();
     609           0 :   int i4       = process[6].daughter2();
     610           0 :   if (process[i3].id() < 0) swap( i3, i4);
     611             : 
     612             :   // Evaluate relevant four-products.
     613           0 :   double pp13  = process[i1].p() * process[i3].p();
     614           0 :   double pp14  = process[i1].p() * process[i4].p();
     615           0 :   double pp23  = process[i2].p() * process[i3].p();
     616           0 :   double pp24  = process[i2].p() * process[i4].p();
     617             : 
     618             :   // Weight and maximum.
     619           0 :   double wt    = pp13 * pp24;
     620           0 :   double wtMax = (pp13 + pp14) * (pp23 + pp24);
     621             : 
     622             :   // Done.
     623           0 :   return wt / wtMax;
     624             : 
     625           0 : }
     626             : 
     627             : //==========================================================================
     628             : 
     629             : // Sigma3ff2HfftZZ class.
     630             : // Cross section for f f' -> H f f' (Z0 Z0 fusion of SM or BSM Higgs).
     631             : // (H can be H0 SM or H1, H2, A3 from BSM).
     632             : 
     633             : //--------------------------------------------------------------------------
     634             : 
     635             : // Initialize process.
     636             : 
     637             : void Sigma3ff2HfftZZ::initProc() {
     638             : 
     639             :   // Properties specific to Higgs state.
     640           0 :   if (higgsType == 0) {
     641           0 :     nameSave = "f f' -> H0 f f'(Z0 Z0 fusion) (SM)";
     642           0 :     codeSave = 906;
     643           0 :     idRes    = 25;
     644           0 :     coup2Z   = 1.;
     645           0 :   }
     646           0 :   else if (higgsType == 1) {
     647           0 :     nameSave = "f f' -> h0(H1) f f' (Z0 Z0 fusion)";
     648           0 :     codeSave = 1006;
     649           0 :     idRes    = 25;
     650           0 :     coup2Z  = settingsPtr->parm("HiggsH1:coup2Z");
     651           0 :   }
     652           0 :   else if (higgsType == 2) {
     653           0 :     nameSave = "f f' -> H0(H2) f f' (Z0 Z0 fusion)";
     654           0 :     codeSave = 1026;
     655           0 :     idRes    = 35;
     656           0 :     coup2Z  = settingsPtr->parm("HiggsH2:coup2Z");
     657           0 :   }
     658           0 :   else if (higgsType == 3) {
     659           0 :     nameSave = "f f' -> A0(A3) f f' (Z0 Z0 fusion)";
     660           0 :     codeSave = 1046;
     661           0 :     idRes    = 36;
     662           0 :     coup2Z  = settingsPtr->parm("HiggsA3:coup2Z");
     663           0 :   }
     664             : 
     665             :   // Common fixed mass and coupling factor.
     666           0 :   mZS = pow2( particleDataPtr->m0(23) );
     667           0 :   prefac = 0.25 * mZS * pow3( 4. * M_PI / (couplingsPtr->sin2thetaW()
     668           0 :            * couplingsPtr->cos2thetaW()) );
     669             : 
     670             :   // Secondary open width fraction.
     671           0 :   openFrac = particleDataPtr->resOpenFrac(idRes);
     672             : 
     673           0 : }
     674             : 
     675             : //--------------------------------------------------------------------------
     676             : 
     677             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
     678             : 
     679             : void Sigma3ff2HfftZZ::sigmaKin() {
     680             : 
     681             :   // Required four-vector products.
     682           0 :   double pp12 = 0.5 * sH;
     683           0 :   double pp14 = 0.5 * mH * p4cm.pNeg();
     684           0 :   double pp15 = 0.5 * mH * p5cm.pNeg();
     685           0 :   double pp24 = 0.5 * mH * p4cm.pPos();
     686           0 :   double pp25 = 0.5 * mH * p5cm.pPos();
     687           0 :   double pp45 = p4cm * p5cm;
     688             : 
     689             :   // Propagator factors and two possible numerators.
     690           0 :   double prop = pow2( (2. * pp14 + mZS) * (2. * pp25 + mZS) );
     691           0 :   sigma1      = prefac * pp12 * pp45  / prop;
     692           0 :   sigma2      = prefac * pp15 * pp24  / prop;
     693             : 
     694           0 : }
     695             : 
     696             : //--------------------------------------------------------------------------
     697             : 
     698             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
     699             : 
     700             : double Sigma3ff2HfftZZ::sigmaHat() {
     701             : 
     702             :   // Flavour-dependent coupling factors for two incoming flavours.
     703           0 :   int id1Abs = abs(id1);
     704           0 :   int id2Abs = abs(id2);
     705           0 :   double lf1S  = pow2( couplingsPtr->lf(id1Abs) );
     706           0 :   double rf1S  = pow2( couplingsPtr->rf(id1Abs) );
     707           0 :   double lf2S  = pow2( couplingsPtr->lf(id2Abs) );
     708           0 :   double rf2S  = pow2( couplingsPtr->rf(id2Abs) );
     709           0 :   double c1    = lf1S * lf2S + rf1S * rf2S;
     710           0 :   double c2    = lf1S * rf2S + rf1S * lf2S;
     711             : 
     712             :   // Combine couplings and kinematics factors.
     713           0 :   double sigma = pow3(alpEM) * (c1 * sigma1 + c2 * sigma2) * pow2(coup2Z);
     714             : 
     715             :   // Secondary width for H0, H1, H2 or A3.
     716           0 :   sigma       *= openFrac;
     717             : 
     718             :   // Answer.
     719           0 :   return sigma;
     720             : 
     721             : }
     722             : 
     723             : //--------------------------------------------------------------------------
     724             : 
     725             : // Select identity, colour and anticolour.
     726             : 
     727             : void Sigma3ff2HfftZZ::setIdColAcol() {
     728             : 
     729             :   // Trivial flavours: out = in.
     730           0 :   setId( id1, id2, idRes, id1, id2);
     731             : 
     732             :   // Colour flow topologies. Swap when antiquarks.
     733           0 :   if (abs(id1) < 9 && abs(id2) < 9 && id1*id2 > 0)
     734           0 :                          setColAcol( 1, 0, 2, 0, 0, 0, 1, 0, 2, 0);
     735           0 :   else if (abs(id1) < 9 && abs(id2) < 9)
     736           0 :                          setColAcol( 1, 0, 0, 2, 0, 0, 1, 0, 0, 2);
     737           0 :   else if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 0, 0, 1, 0, 0, 0);
     738           0 :   else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 0, 0, 1, 0);
     739           0 :   else                   setColAcol( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     740           0 :   if ( (abs(id1) < 9 && id1 < 0) || (abs(id1) > 10 && id2 < 0) )
     741           0 :     swapColAcol();
     742             : 
     743           0 : }
     744             : 
     745             : //--------------------------------------------------------------------------
     746             : 
     747             : // Evaluate weight for decay angles.
     748             : 
     749             : double Sigma3ff2HfftZZ::weightDecay( Event& process, int iResBeg,
     750             :   int iResEnd) {
     751             : 
     752             :   // Identity of mother of decaying reseonance(s).
     753           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
     754             : 
     755             :   // For Higgs decay hand over to standard routine.
     756           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
     757           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
     758             : 
     759             :   // For top decay hand over to standard routine.
     760           0 :   if (idMother == 6)
     761           0 :     return weightTopDecay( process, iResBeg, iResEnd);
     762             : 
     763             :   // Else done.
     764           0 :   return 1.;
     765             : 
     766           0 : }
     767             : 
     768             : //==========================================================================
     769             : 
     770             : // Sigma3ff2HfftWW class.
     771             : // Cross section for f_1 f_2 -> H0 f_3 f_4 (W+ W- fusion of SM or BSM Higgs).
     772             : 
     773             : //--------------------------------------------------------------------------
     774             : 
     775             : // Initialize process.
     776             : 
     777             : void Sigma3ff2HfftWW::initProc() {
     778             : 
     779             :   // Properties specific to Higgs state.
     780           0 :   if (higgsType == 0) {
     781           0 :     nameSave = "f_1 f_2 -> H0 f_3 f_4 (W+ W- fusion) (SM)";
     782           0 :     codeSave = 907;
     783           0 :     idRes    = 25;
     784           0 :     coup2W   = 1.;
     785           0 :   }
     786           0 :   else if (higgsType == 1) {
     787           0 :     nameSave = "f_1 f_2 -> h0(H1) f_3 f_4 (W+ W- fusion)";
     788           0 :     codeSave = 1007;
     789           0 :     idRes    = 25;
     790           0 :     coup2W   = settingsPtr->parm("HiggsH1:coup2W");
     791           0 :   }
     792           0 :   else if (higgsType == 2) {
     793           0 :     nameSave = "f_1 f_2 -> H0(H2) f_3 f_4 (W+ W- fusion)";
     794           0 :     codeSave = 1027;
     795           0 :     idRes    = 35;
     796           0 :     coup2W   = settingsPtr->parm("HiggsH2:coup2W");
     797           0 :   }
     798           0 :   else if (higgsType == 3) {
     799           0 :     nameSave = "f_1 f_2 -> A0(A3) f_3 f_4 (W+ W- fusion)";
     800           0 :     codeSave = 1047;
     801           0 :     idRes    = 36;
     802           0 :     coup2W   = settingsPtr->parm("HiggsA3:coup2W");
     803           0 :   }
     804             : 
     805             :   // Common fixed mass and coupling factor.
     806           0 :   mWS = pow2( particleDataPtr->m0(24) );
     807           0 :   prefac = mWS * pow3( 4. * M_PI / couplingsPtr->sin2thetaW() );
     808             : 
     809             :   // Secondary open width fraction.
     810           0 :   openFrac = particleDataPtr->resOpenFrac(idRes);
     811             : 
     812           0 : }
     813             : 
     814             : //--------------------------------------------------------------------------
     815             : 
     816             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
     817             : 
     818             : void Sigma3ff2HfftWW::sigmaKin() {
     819             : 
     820             :   // Required four-vector products.
     821           0 :   double pp12  = 0.5 * sH;
     822           0 :   double pp14  = 0.5 * mH * p4cm.pNeg();
     823           0 :   double pp25  = 0.5 * mH * p5cm.pPos();
     824           0 :   double pp45  = p4cm * p5cm;
     825             : 
     826             :   // Cross section: kinematics part. Combine with couplings.
     827           0 :   double prop  = pow2( (2. * pp14 + mWS) * (2. * pp25 + mWS) );
     828           0 :   sigma0       = prefac * pp12 * pp45 * pow2(coup2W) / prop;
     829             : 
     830           0 : }
     831             : 
     832             : //--------------------------------------------------------------------------
     833             : 
     834             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
     835             : 
     836             : double Sigma3ff2HfftWW::sigmaHat() {
     837             : 
     838             :   // Some flavour combinations not possible.
     839           0 :   int id1Abs = abs(id1);
     840           0 :   int id2Abs = abs(id2);
     841           0 :   if ( (id1Abs%2 == id2Abs%2 && id1 * id2 > 0)
     842           0 :     || (id1Abs%2 != id2Abs%2 && id1 * id2 < 0) ) return 0.;
     843             : 
     844             :   // Basic cross section. CKM factors for final states.
     845           0 :   double sigma = sigma0 * pow3(alpEM) * couplingsPtr->V2CKMsum(id1Abs)
     846           0 :     * couplingsPtr->V2CKMsum(id2Abs);
     847             : 
     848             :   // Secondary width for H0, H1, H2 or A3.
     849           0 :   sigma       *= openFrac;
     850             : 
     851             :   // Spin-state extra factor 2 per incoming neutrino.
     852           0 :   if (id1Abs == 12 || id1Abs == 14 || id1Abs == 16) sigma *= 2.;
     853           0 :   if (id2Abs == 12 || id2Abs == 14 || id2Abs == 16) sigma *= 2.;
     854             : 
     855             :   // Answer.
     856             :   return sigma;
     857             : 
     858           0 : }
     859             : 
     860             : //--------------------------------------------------------------------------
     861             : 
     862             : // Select identity, colour and anticolour.
     863             : 
     864             : void Sigma3ff2HfftWW::setIdColAcol() {
     865             : 
     866             :   // Pick out-flavours by relative CKM weights.
     867           0 :   id4 = couplingsPtr->V2CKMpick(id1);
     868           0 :   id5 = couplingsPtr->V2CKMpick(id2);
     869           0 :   setId( id1, id2, idRes, id4, id5);
     870             : 
     871             :   // Colour flow topologies. Swap when antiquarks.
     872           0 :   if (abs(id1) < 9 && abs(id2) < 9 && id1*id2 > 0)
     873           0 :                          setColAcol( 1, 0, 2, 0, 0, 0, 1, 0, 2, 0);
     874           0 :   else if (abs(id1) < 9 && abs(id2) < 9)
     875           0 :                          setColAcol( 1, 0, 0, 2, 0, 0, 1, 0, 0, 2);
     876           0 :   else if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 0, 0, 1, 0, 0, 0);
     877           0 :   else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 0, 0, 1, 0);
     878           0 :   else                   setColAcol( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     879           0 :   if ( (abs(id1) < 9 && id1 < 0) || (abs(id1) > 10 && id2 < 0) )
     880           0 :     swapColAcol();
     881             : 
     882           0 : }
     883             : 
     884             : //--------------------------------------------------------------------------
     885             : 
     886             : // Evaluate weight for decay angles.
     887             : 
     888             : double Sigma3ff2HfftWW::weightDecay( Event& process, int iResBeg,
     889             :   int iResEnd) {
     890             : 
     891             :   // Identity of mother of decaying reseonance(s).
     892           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
     893             : 
     894             :   // For Higgs decay hand over to standard routine.
     895           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
     896           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
     897             : 
     898             :   // For top decay hand over to standard routine.
     899           0 :   if (idMother == 6)
     900           0 :     return weightTopDecay( process, iResBeg, iResEnd);
     901             : 
     902             :   // Else done.
     903           0 :   return 1.;
     904             : 
     905           0 : }
     906             : 
     907             : //==========================================================================
     908             : 
     909             : // Sigma3gg2HQQbar class.
     910             : // Cross section for g g -> H0 Q Qbar (Q Qbar fusion of SM or BSM Higgs).
     911             : 
     912             : //--------------------------------------------------------------------------
     913             : 
     914             : // Initialize process.
     915             : 
     916             : void Sigma3gg2HQQbar::initProc() {
     917             : 
     918             :   // Properties specific to Higgs state for the "g g -> H ttbar" process.
     919             :   // (H can be H0 SM or H1, H2, A3 from BSM).
     920           0 :   if (higgsType == 0 && idNew == 6) {
     921           0 :     nameSave = "g g -> H t tbar (SM)";
     922           0 :     codeSave = 908;
     923           0 :     idRes    = 25;
     924           0 :     coup2Q   = 1.;
     925           0 :   }
     926           0 :   else if (higgsType == 1 && idNew == 6) {
     927           0 :     nameSave = "g g -> h0(H1) t tbar";
     928           0 :     codeSave = 1008;
     929           0 :     idRes    = 25;
     930           0 :     coup2Q   = settingsPtr->parm("HiggsH1:coup2u");
     931           0 :   }
     932           0 :   else if (higgsType == 2 && idNew == 6) {
     933           0 :     nameSave = "g g -> H0(H2) t tbar";
     934           0 :     codeSave = 1028;
     935           0 :     idRes    = 35;
     936           0 :     coup2Q   = settingsPtr->parm("HiggsH2:coup2u");
     937           0 :   }
     938           0 :   else if (higgsType == 3 && idNew == 6) {
     939           0 :     nameSave = "g g -> A0(A3) t tbar";
     940           0 :     codeSave = 1048;
     941           0 :     idRes    = 36;
     942           0 :     coup2Q   = settingsPtr->parm("HiggsA3:coup2u");
     943           0 :   }
     944             : 
     945             :   // Properties specific to Higgs state for the "g g -> H b bbar" process.
     946             :   // (H can be H0 SM or H1, H2, A3 from BSM).
     947           0 :   if (higgsType == 0 && idNew == 5) {
     948           0 :     nameSave = "g g -> H b bbar (SM)";
     949           0 :     codeSave = 912;
     950           0 :     idRes    = 25;
     951           0 :     coup2Q   = 1.;
     952           0 :   }
     953           0 :   else if (higgsType == 1 && idNew == 5) {
     954           0 :     nameSave = "g g -> h0(H1) b bbar";
     955           0 :     codeSave = 1012;
     956           0 :     idRes    = 25;
     957           0 :     coup2Q   = settingsPtr->parm("HiggsH1:coup2d");
     958           0 :   }
     959           0 :   else if (higgsType == 2 && idNew == 5) {
     960           0 :     nameSave = "g g -> H0(H2) b bbar";
     961           0 :     codeSave = 1032;
     962           0 :     idRes    = 35;
     963           0 :     coup2Q   = settingsPtr->parm("HiggsH2:coup2d");
     964           0 :   }
     965           0 :   else if (higgsType == 3 && idNew == 5) {
     966           0 :     nameSave = "g g -> A0(A3) b bbar";
     967           0 :     codeSave = 1052;
     968           0 :     idRes    = 36;
     969           0 :     coup2Q   = settingsPtr->parm("HiggsA3:coup2d");
     970           0 :   }
     971             : 
     972             :   // Common mass and coupling factors.
     973           0 :   double mWS      = pow2(particleDataPtr->m0(24));
     974           0 :   prefac          = (4. * M_PI / couplingsPtr->sin2thetaW()) * pow2(4. * M_PI)
     975           0 :                   * 0.25 / mWS;
     976             : 
     977             :   // Secondary open width fraction.
     978           0 :   openFracTriplet = particleDataPtr->resOpenFrac(idRes, idNew, -idNew);
     979             : 
     980           0 : }
     981             : 
     982             : //--------------------------------------------------------------------------
     983             : 
     984             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
     985             : 
     986             : void Sigma3gg2HQQbar::sigmaKin() {
     987             : 
     988             :   // Running mass of heavy quark.
     989           0 :   double mQ2run = pow2( particleDataPtr->mRun(idNew, mH) );
     990             : 
     991             :   // Linear combination of p_Q and p_Qbar to ensure common mass.
     992           0 :   double mQ2  = m4 * m5;
     993             :   double epsi = 0.;
     994           0 :   if (m4 != m5) {
     995           0 :     double s45  = (p4cm + p5cm).m2Calc();
     996           0 :     mQ2       = 0.5 * (s4 + s5) - 0.25 * pow2(s4 - s5) / s45;
     997           0 :     epsi      = 0.5 * (s5 - s4) / s45;
     998           0 :   }
     999             : 
    1000             :   // Set up kinematics: g(4) g(5) -> H(3) Q(1) Qbar(2) in outgoing sense.
    1001           0 :   Vec4 pTemp[6];
    1002           0 :   pTemp[4]   = Vec4( 0., 0., -0.5* mH, -0.5* mH);
    1003           0 :   pTemp[5]   = Vec4( 0., 0.,  0.5* mH, -0.5* mH);
    1004           0 :   pTemp[1]   = p4cm + epsi * (p4cm + p5cm);
    1005           0 :   pTemp[2]   = p5cm - epsi * (p4cm + p5cm);
    1006           0 :   pTemp[3]   = p3cm;
    1007             : 
    1008             :   // Four-product combinations.
    1009           0 :   double z1  = pTemp[1] * pTemp[2];
    1010           0 :   double z2  = pTemp[1] * pTemp[3];
    1011           0 :   double z3  = pTemp[1] * pTemp[4];
    1012           0 :   double z4  = pTemp[1] * pTemp[5];
    1013           0 :   double z5  = pTemp[2] * pTemp[3];
    1014           0 :   double z6  = pTemp[2] * pTemp[4];
    1015           0 :   double z7  = pTemp[2] * pTemp[5];
    1016           0 :   double z8  = pTemp[3] * pTemp[4];
    1017           0 :   double z9  = pTemp[3] * pTemp[5];
    1018           0 :   double z10 = pTemp[4] * pTemp[5];
    1019             : 
    1020             :   // Powers required as shorthand in matriz elements.
    1021           0 :   double mQ4  = mQ2 * mQ2;
    1022           0 :   double mQ6  = mQ2 * mQ4;
    1023           0 :   double z1S  = z1 * z1;
    1024           0 :   double z2S  = z2 * z2;
    1025           0 :   double z3S  = z3 * z3;
    1026           0 :   double z4S  = z4 * z4;
    1027           0 :   double z5S  = z5 * z5;
    1028           0 :   double z6S  = z6 * z6;
    1029           0 :   double z7S  = z7 * z7;
    1030           0 :   double z8S  = z8 * z8;
    1031           0 :   double z9S  = z9 * z9;
    1032           0 :   double z10S = z10 * z10;
    1033             : 
    1034             :   // Evaluate matriz elements for g + g -> Q + Qbar + H.
    1035             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1036           0 :   double fm[9][9];
    1037           0 :   fm[1][1] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+2*z2+z4+z9+2*
    1038           0 :   z7+z5)+8*mQ2*s3*(-z1-z4+2*z7)+16*mQ2*(z2*z9+4*z2*
    1039           0 :   z7+z2*z5-2*z4*z7-2*z9*z7)+8*s3*z4*z7-16*z2*z9*z7;
    1040           0 :   fm[1][2] = 16*mQ6+8*mQ4*(-2*z1+z2-2*z3-2*z4-4*z10+z9-z8+2
    1041           0 :   *z7-4*z6+z5)+8*mQ2*(-2*z1*z2-2*z2*z4-2*z2*z10+z2*z7-2*
    1042           0 :   z2*z6-2*z3*z7+2*z4*z7+4*z10*z7-z9*z7-z8*z7)+16*z2*z7*(z4+
    1043             :   z10);
    1044           0 :   fm[1][3] = 16*mQ6-4*mQ4*s3+8*mQ4*(-2*z1+2*z2-2*z3-4*
    1045           0 :   z4-8*z10+z9+z8-2*z7-4*z6+2*z5)-(4*mQ2*s3)*(z1+z4+z10
    1046           0 :   +z6)+8*mQ2*(-2*z1*z2-2*z1*z10+z1*z9+z1*z8-2*z1*z5+z2S
    1047           0 :   -4*z2*z4-5*z2*z10+z2*z8-z2*z7-3*z2*z6+z2*z5+z3*z9+2*z3*z7
    1048           0 :   -z3*z5+z4*z8+2*z4*z6-3*z4*z5-5*z10*z5+z9*z8+z9*z6+z9*z5+
    1049           0 :   z8*z7-4*z6*z5+z5S)-(16*z2*z5)*(z1+z4+z10+z6);
    1050           0 :   fm[1][4] = 16*mQ6+4*mQ4*s3+16*mQ4*(-z1+z2-z3-z4+z10-
    1051           0 :   z9-z8+2*z7+2*z6-z5)+4*mQ2*s3*(z1+z3+z4+z10+2*z7+2*z6
    1052           0 :   )+8*mQ2*(4*z1*z10+4*z1*z7+4*z1*z6+2*z2*z10-z2*z9-z2*z8+
    1053           0 :   4*z2*z7+4*z2*z6-z2*z5+4*z10*z5+4*z7*z5+4*z6*z5)-(8*s3*
    1054           0 :   z1)*(z10+z7+z6)+16*z2*z5*(z10+z7+z6);
    1055           0 :   fm[1][5] = 8*mQ4*(-2*z1-2*z4+z10-z9)+4*mQ2*(4*z1S-2*z1*
    1056           0 :   z2+8*z1*z3+6*z1*z10-2*z1*z9+4*z1*z8+4*z1*z7+4*z1*z6+2*z1*
    1057           0 :   z5+z2*z10+4*z3*z4-z3*z9+2*z3*z7+3*z4*z8-2*z4*z6+2*z4*z5-4
    1058           0 :   *z10*z7+3*z10*z5-3*z9*z6+3*z8*z7-4*z7S+4*z7*z5)+8*(z1S
    1059           0 :   *z9-z1S*z8-z1*z2*z7+z1*z2*z6+z1*z3*z9+z1*z3*z5-z1*z4*
    1060           0 :   z8-z1*z4*z5+z1*z10*z9+z1*z9*z7+z1*z9*z6-z1*z8*z7-z2*z3*z7
    1061           0 :   +z2*z4*z6-z2*z10*z7-z2*z7S+z3*z7*z5-z4*z10*z5-z4*z7*z5-
    1062           0 :   z4*z6*z5);
    1063           0 :   fm[1][6] = 16*mQ4*(-4*z1-z4+z9-z7)+4*mQ2*s3*(-2*z1-z4-
    1064           0 :   z7)+16*mQ2*(-2*z1S-3*z1*z2-2*z1*z4-3*z1*z9-2*z1*z7-3*
    1065           0 :   z1*z5-2*z2*z4-2*z7*z5)-8*s3*z4*z7+8*(-z1*z2*z9-2*z1*z2
    1066           0 :   *z5-z1*z9S-z1*z9*z5+z2S*z7-z2*z4*z5+z2*z9*z7-z2*z7*z5
    1067           0 :   +z4*z9*z5+z4*z5S);
    1068           0 :   fm[1][7] = 8*mQ4*(2*z3+z4+3*z10+z9+2*z8+3*z7+6*z6)+2*mQ2*
    1069           0 :   s3*(-2*z3-z4+3*z10+3*z7+6*z6)+4*mQ2*(4*z1*z10+4*z1*
    1070           0 :   z7+8*z1*z6+6*z2*z10+z2*z9+2*z2*z8+6*z2*z7+12*z2*z6-8*z3*
    1071           0 :   z7+4*z4*z7+4*z4*z6+4*z10*z5+4*z9*z7+4*z9*z6-8*z8*z7+4*z7*
    1072           0 :   z5+8*z6*z5)+4*s3*(-z1*z10-z1*z7-2*z1*z6+2*z3*z7-z4*z7-
    1073           0 :   z4*z6)+8*z2*(z10*z5+z9*z7+z9*z6-2*z8*z7+z7*z5+2*z6*z5);
    1074           0 :   fm[1][8] = 8*mQ4*(2*z3+z4+3*z10+2*z9+z8+3*z7+6*z6)+2*mQ2*
    1075           0 :   s3*(-2*z3-z4+2*z10+z7+2*z6)+4*mQ2*(4*z1*z10-2*z1*z9+
    1076           0 :   2*z1*z8+4*z1*z7+8*z1*z6+5*z2*z10+2*z2*z9+z2*z8+4*z2*z7+8*
    1077           0 :   z2*z6-z3*z9-8*z3*z7+2*z3*z5+2*z4*z9-z4*z8+4*z4*z7+4*z4*z6
    1078           0 :   +4*z4*z5+5*z10*z5+z9S-z9*z8+2*z9*z7+5*z9*z6+z9*z5-7*z8*
    1079           0 :   z7+2*z8*z5+2*z7*z5+10*z6*z5)+2*s3*(-z1*z10+z3*z7-2*z4*
    1080           0 :   z7+z4*z6)+4*(-z1*z9S+z1*z9*z8-2*z1*z9*z5-z1*z8*z5+2*z2*
    1081           0 :   z10*z5+z2*z9*z7+z2*z9*z6-2*z2*z8*z7+3*z2*z6*z5+z3*z9*z5+
    1082           0 :   z3*z5S+z4*z9*z5-2*z4*z8*z5+2*z4*z5S);
    1083           0 :   fm[2][2] = 16*mQ6+16*mQ4*(-z1+z3-z4-z10+z7-z6)+16*mQ2*(
    1084           0 :   z3*z10+z3*z7+z3*z6+z4*z7+z10*z7)-16*z3*z10*z7;
    1085           0 :   fm[2][3] = 16*mQ6+8*mQ4*(-2*z1+z2+2*z3-4*z4-4*z10-z9+z8-2
    1086           0 :   *z7-2*z6+z5)+8*mQ2*(-2*z1*z5+4*z3*z10-z3*z9-z3*z8-2*z3*
    1087           0 :   z7+2*z3*z6+z3*z5-2*z4*z5-2*z10*z5-2*z6*z5)+16*z3*z5*(z10+
    1088             :   z6);
    1089           0 :   fm[2][4] = 8*mQ4*(-2*z1-2*z3+z10-z8)+4*mQ2*(4*z1S-2*z1*
    1090           0 :   z2+8*z1*z4+6*z1*z10+4*z1*z9-2*z1*z8+4*z1*z7+4*z1*z6+2*z1*
    1091           0 :   z5+z2*z10+4*z3*z4+3*z3*z9-2*z3*z7+2*z3*z5-z4*z8+2*z4*z6-4
    1092           0 :   *z10*z6+3*z10*z5+3*z9*z6-3*z8*z7-4*z6S+4*z6*z5)+8*(-z1S
    1093           0 :   *z9+z1S*z8+z1*z2*z7-z1*z2*z6-z1*z3*z9-z1*z3*z5+z1*z4
    1094           0 :   *z8+z1*z4*z5+z1*z10*z8-z1*z9*z6+z1*z8*z7+z1*z8*z6+z2*z3*
    1095           0 :   z7-z2*z4*z6-z2*z10*z6-z2*z6S-z3*z10*z5-z3*z7*z5-z3*z6*
    1096           0 :   z5+z4*z6*z5);
    1097           0 :   fm[2][5] = 16*mQ4*z10+8*mQ2*(2*z1S+2*z1*z3+2*z1*z4+2*z1
    1098           0 :   *z10+2*z1*z7+2*z1*z6+z3*z7+z4*z6)+8*(-2*pow3(z1)-2*z1S*z3-
    1099           0 :   2*z1S*z4-2*z1S*z10-2*z1S*z7-2*z1S*z6-2*z1*z3*z4-
    1100           0 :   z1*z3*z10-2*z1*z3*z6-z1*z4*z10-2*z1*z4*z7-z1*z10S-z1*
    1101           0 :   z10*z7-z1*z10*z6-2*z1*z7*z6+z3S*z7-z3*z4*z7-z3*z4*z6+z3
    1102           0 :   *z10*z7+z3*z7S-z3*z7*z6+z4S*z6+z4*z10*z6-z4*z7*z6+z4*
    1103             :   z6S);
    1104           0 :   fm[2][6] = 8*mQ4*(-2*z1+z10-z9-2*z7)+4*mQ2*(4*z1S+2*z1*
    1105           0 :   z2+4*z1*z3+4*z1*z4+6*z1*z10-2*z1*z9+4*z1*z8+8*z1*z6-2*z1*
    1106           0 :   z5+4*z2*z4+3*z2*z10+2*z2*z7-3*z3*z9-2*z3*z7-4*z4S-4*z4*
    1107           0 :   z10+3*z4*z8+2*z4*z6+z10*z5-z9*z6+3*z8*z7+4*z7*z6)+8*(z1S
    1108           0 :   *z9-z1S*z8-z1*z2*z7+z1*z2*z6+z1*z3*z9+z1*z3*z5+z1*z4*
    1109           0 :   z9-z1*z4*z8-z1*z4*z5+z1*z10*z9+z1*z9*z6-z1*z8*z7-z2*z3*z7
    1110           0 :   -z2*z4*z7+z2*z4*z6-z2*z10*z7+z3*z7*z5-z4S*z5-z4*z10*z5-
    1111             :   z4*z6*z5);
    1112           0 :   fm[2][7] = 8*mQ4*(z3+2*z4+3*z10+z7+2*z6)+4*mQ2*(-4*z1*z3-
    1113           0 :   2*z1*z4-2*z1*z10+z1*z9-z1*z8-4*z1*z7-2*z1*z6+z2*z3+2*z2*
    1114           0 :   z4+3*z2*z10+z2*z7+2*z2*z6-6*z3*z4-6*z3*z10-2*z3*z9-2*z3*
    1115           0 :   z7-4*z3*z6-z3*z5-6*z4S-6*z4*z10-3*z4*z9-z4*z8-4*z4*z7-2
    1116           0 :   *z4*z6-2*z4*z5-3*z10*z9-3*z10*z8-6*z10*z7-6*z10*z6+z10*z5
    1117           0 :   +z9*z7-2*z8*z7-2*z8*z6-6*z7*z6+z7*z5-6*z6S+2*z6*z5)+4*(
    1118           0 :   -z1S*z9+z1S*z8-2*z1*z2*z10-3*z1*z2*z7-3*z1*z2*z6+z1*
    1119           0 :   z3*z9-z1*z3*z5+z1*z4*z9+z1*z4*z8+z1*z4*z5+z1*z10*z9+z1*
    1120           0 :   z10*z8-z1*z9*z6+z1*z8*z6+z2*z3*z7-3*z2*z4*z7-z2*z4*z6-3*
    1121           0 :   z2*z10*z7-3*z2*z10*z6-3*z2*z7*z6-3*z2*z6S-2*z3*z4*z5-z3
    1122           0 :   *z10*z5-z3*z6*z5-z4S*z5-z4*z10*z5+z4*z6*z5);
    1123           0 :   fm[2][8] = 8*mQ4*(z3+2*z4+3*z10+z7+2*z6)+4*mQ2*(-4*z1*z3-
    1124           0 :   2*z1*z4-2*z1*z10-z1*z9+z1*z8-4*z1*z7-2*z1*z6+z2*z3+2*z2*
    1125           0 :   z4+z2*z10-z2*z7-2*z2*z6-6*z3*z4-6*z3*z10-2*z3*z9+z3*z8-2*
    1126           0 :   z3*z7-4*z3*z6+z3*z5-6*z4S-6*z4*z10-2*z4*z9-4*z4*z7-2*z4
    1127           0 :   *z6+2*z4*z5-3*z10*z9-3*z10*z8-6*z10*z7-6*z10*z6+3*z10*z5-
    1128           0 :   z9*z6-2*z8*z7-3*z8*z6-6*z7*z6+z7*z5-6*z6S+2*z6*z5)+4*(
    1129           0 :   z1S*z9-z1S*z8-z1*z2*z7+z1*z2*z6-3*z1*z3*z5+z1*z4*z9-
    1130           0 :   z1*z4*z8-3*z1*z4*z5+z1*z10*z9+z1*z10*z8-2*z1*z10*z5+z1*z9
    1131           0 :   *z6+z1*z8*z7+z1*z8*z6-z2*z4*z7+z2*z4*z6-z2*z10*z7-z2*z10*
    1132           0 :   z6-2*z2*z7*z6-z2*z6S-3*z3*z4*z5-3*z3*z10*z5+z3*z7*z5-3*
    1133           0 :   z3*z6*z5-3*z4S*z5-3*z4*z10*z5-z4*z6*z5);
    1134           0 :   fm[3][3] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+z2+2*z3+z8+z6
    1135           0 :   +2*z5)+8*mQ2*s3*(-z1+2*z3-z6)+16*mQ2*(z2*z5-2*z3*
    1136           0 :   z8-2*z3*z6+4*z3*z5+z8*z5)+8*s3*z3*z6-16*z3*z8*z5;
    1137           0 :   fm[3][4] = 16*mQ4*(-4*z1-z3+z8-z6)+4*mQ2*s3*(-2*z1-z3-
    1138           0 :   z6)+16*mQ2*(-2*z1S-3*z1*z2-2*z1*z3-3*z1*z8-2*z1*z6-3*
    1139           0 :   z1*z5-2*z2*z3-2*z6*z5)-8*s3*z3*z6+8*(-z1*z2*z8-2*z1*z2
    1140           0 :   *z5-z1*z8S-z1*z8*z5+z2S*z6-z2*z3*z5+z2*z8*z6-z2*z6*z5
    1141           0 :   +z3*z8*z5+z3*z5S);
    1142           0 :   fm[3][5] = 8*mQ4*(-2*z1+z10-z8-2*z6)+4*mQ2*(4*z1S+2*z1*
    1143           0 :   z2+4*z1*z3+4*z1*z4+6*z1*z10+4*z1*z9-2*z1*z8+8*z1*z7-2*z1*
    1144           0 :   z5+4*z2*z3+3*z2*z10+2*z2*z6-4*z3S-4*z3*z10+3*z3*z9+2*z3
    1145           0 :   *z7-3*z4*z8-2*z4*z6+z10*z5+3*z9*z6-z8*z7+4*z7*z6)+8*(-z1S
    1146           0 :   *z9+z1S*z8+z1*z2*z7-z1*z2*z6-z1*z3*z9+z1*z3*z8-z1*z3
    1147           0 :   *z5+z1*z4*z8+z1*z4*z5+z1*z10*z8-z1*z9*z6+z1*z8*z7+z2*z3*
    1148           0 :   z7-z2*z3*z6-z2*z4*z6-z2*z10*z6-z3S*z5-z3*z10*z5-z3*z7*
    1149           0 :   z5+z4*z6*z5);
    1150           0 :   fm[3][6] = 16*mQ6+4*mQ4*s3+16*mQ4*(-z1-z2+2*z3+2*z4+
    1151           0 :   z10-z9-z8-z7-z6+z5)+4*mQ2*s3*(z1+2*z3+2*z4+z10+z7+z6
    1152           0 :   )+8*mQ2*(4*z1*z3+4*z1*z4+4*z1*z10+4*z2*z3+4*z2*z4+4*z2*
    1153           0 :   z10-z2*z5+4*z3*z5+4*z4*z5+2*z10*z5-z9*z5-z8*z5)-(8*s3*
    1154           0 :   z1)*(z3+z4+z10)+16*z2*z5*(z3+z4+z10);
    1155           0 :   fm[3][7] = 8*mQ4*(3*z3+6*z4+3*z10+z9+2*z8+2*z7+z6)+2*mQ2*
    1156           0 :   s3*(z3+2*z4+2*z10-2*z7-z6)+4*mQ2*(4*z1*z3+8*z1*z4+4*
    1157           0 :   z1*z10+2*z1*z9-2*z1*z8+2*z2*z3+10*z2*z4+5*z2*z10+2*z2*z9+
    1158           0 :   z2*z8+2*z2*z7+4*z2*z6-7*z3*z9+2*z3*z8-8*z3*z7+4*z3*z6+4*
    1159           0 :   z3*z5+5*z4*z8+4*z4*z6+8*z4*z5+5*z10*z5-z9*z8-z9*z6+z9*z5+
    1160           0 :   z8S-z8*z7+2*z8*z6+2*z8*z5)+2*s3*(-z1*z10+z3*z7-2*z3*
    1161           0 :   z6+z4*z6)+4*(-z1*z2*z9-2*z1*z2*z8+z1*z9*z8-z1*z8S+z2S
    1162           0 :   *z7+2*z2S*z6+3*z2*z4*z5+2*z2*z10*z5-2*z2*z9*z6+z2*z8*z7
    1163           0 :   +z2*z8*z6-2*z3*z9*z5+z3*z8*z5+z4*z8*z5);
    1164           0 :   fm[3][8] = 8*mQ4*(3*z3+6*z4+3*z10+2*z9+z8+2*z7+z6)+2*mQ2*
    1165           0 :   s3*(3*z3+6*z4+3*z10-2*z7-z6)+4*mQ2*(4*z1*z3+8*z1*z4+
    1166           0 :   4*z1*z10+4*z2*z3+8*z2*z4+4*z2*z10-8*z3*z9+4*z3*z8-8*z3*z7
    1167           0 :   +4*z3*z6+6*z3*z5+4*z4*z8+4*z4*z6+12*z4*z5+6*z10*z5+2*z9*
    1168           0 :   z5+z8*z5)+4*s3*(-z1*z3-2*z1*z4-z1*z10+2*z3*z7-z3*z6-z4
    1169           0 :   *z6)+8*z5*(z2*z3+2*z2*z4+z2*z10-2*z3*z9+z3*z8+z4*z8);
    1170           0 :   fm[4][4] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+2*z2+z3+z8+2*
    1171           0 :   z6+z5)+8*mQ2*s3*(-z1-z3+2*z6)+16*mQ2*(z2*z8+4*z2*
    1172           0 :   z6+z2*z5-2*z3*z6-2*z8*z6)+8*s3*z3*z6-16*z2*z8*z6;
    1173           0 :   fm[4][5] = 16*mQ6+8*mQ4*(-2*z1+z2-2*z3-2*z4-4*z10-z9+z8-4
    1174           0 :   *z7+2*z6+z5)+8*mQ2*(-2*z1*z2-2*z2*z3-2*z2*z10-2*z2*z7+
    1175           0 :   z2*z6+2*z3*z6-2*z4*z6+4*z10*z6-z9*z6-z8*z6)+16*z2*z6*(z3+
    1176             :   z10);
    1177           0 :   fm[4][6] = 16*mQ6-4*mQ4*s3+8*mQ4*(-2*z1+2*z2-4*z3-2*
    1178           0 :   z4-8*z10+z9+z8-4*z7-2*z6+2*z5)-(4*mQ2*s3)*(z1+z3+z10
    1179           0 :   +z7)+8*mQ2*(-2*z1*z2-2*z1*z10+z1*z9+z1*z8-2*z1*z5+z2S
    1180           0 :   -4*z2*z3-5*z2*z10+z2*z9-3*z2*z7-z2*z6+z2*z5+z3*z9+2*z3*z7
    1181           0 :   -3*z3*z5+z4*z8+2*z4*z6-z4*z5-5*z10*z5+z9*z8+z9*z6+z8*z7+
    1182           0 :   z8*z5-4*z7*z5+z5S)-(16*z2*z5)*(z1+z3+z10+z7);
    1183           0 :   fm[4][7] = 8*mQ4*(-z3-2*z4-3*z10-2*z9-z8-6*z7-3*z6)+2*mQ2
    1184           0 :   *s3*(z3+2*z4-3*z10-6*z7-3*z6)+4*mQ2*(-4*z1*z10-8*z1*
    1185           0 :   z7-4*z1*z6-6*z2*z10-2*z2*z9-z2*z8-12*z2*z7-6*z2*z6-4*z3*
    1186           0 :   z7-4*z3*z6+8*z4*z6-4*z10*z5+8*z9*z6-4*z8*z7-4*z8*z6-8*z7*
    1187           0 :   z5-4*z6*z5)+4*s3*(z1*z10+2*z1*z7+z1*z6+z3*z7+z3*z6-2*
    1188           0 :   z4*z6)+8*z2*(-z10*z5+2*z9*z6-z8*z7-z8*z6-2*z7*z5-z6*z5);
    1189           0 :   fm[4][8] = 8*mQ4*(-z3-2*z4-3*z10-z9-2*z8-6*z7-3*z6)+2*mQ2
    1190           0 :   *s3*(z3+2*z4-2*z10-2*z7-z6)+4*mQ2*(-4*z1*z10-2*z1*z9
    1191           0 :   +2*z1*z8-8*z1*z7-4*z1*z6-5*z2*z10-z2*z9-2*z2*z8-8*z2*z7-4
    1192           0 :   *z2*z6+z3*z9-2*z3*z8-4*z3*z7-4*z3*z6-4*z3*z5+z4*z8+8*z4*
    1193           0 :   z6-2*z4*z5-5*z10*z5+z9*z8+7*z9*z6-2*z9*z5-z8S-5*z8*z7-2
    1194           0 :   *z8*z6-z8*z5-10*z7*z5-2*z6*z5)+2*s3*(z1*z10-z3*z7+2*z3
    1195           0 :   *z6-z4*z6)+4*(-z1*z9*z8+z1*z9*z5+z1*z8S+2*z1*z8*z5-2*z2
    1196           0 :   *z10*z5+2*z2*z9*z6-z2*z8*z7-z2*z8*z6-3*z2*z7*z5+2*z3*z9*
    1197           0 :   z5-z3*z8*z5-2*z3*z5S-z4*z8*z5-z4*z5S);
    1198           0 :   fm[5][5] = 16*mQ6+16*mQ4*(-z1-z3+z4-z10-z7+z6)+16*mQ2*(
    1199           0 :   z3*z6+z4*z10+z4*z7+z4*z6+z10*z6)-16*z4*z10*z6;
    1200           0 :   fm[5][6] = 16*mQ6+8*mQ4*(-2*z1+z2-4*z3+2*z4-4*z10+z9-z8-2
    1201           0 :   *z7-2*z6+z5)+8*mQ2*(-2*z1*z5-2*z3*z5+4*z4*z10-z4*z9-z4*
    1202           0 :   z8+2*z4*z7-2*z4*z6+z4*z5-2*z10*z5-2*z7*z5)+16*z4*z5*(z10+
    1203             :   z7);
    1204           0 :   fm[5][7] = 8*mQ4*(-2*z3-z4-3*z10-2*z7-z6)+4*mQ2*(2*z1*z3+
    1205           0 :   4*z1*z4+2*z1*z10+z1*z9-z1*z8+2*z1*z7+4*z1*z6-2*z2*z3-z2*
    1206           0 :   z4-3*z2*z10-2*z2*z7-z2*z6+6*z3S+6*z3*z4+6*z3*z10+z3*z9+
    1207           0 :   3*z3*z8+2*z3*z7+4*z3*z6+2*z3*z5+6*z4*z10+2*z4*z8+4*z4*z7+
    1208           0 :   2*z4*z6+z4*z5+3*z10*z9+3*z10*z8+6*z10*z7+6*z10*z6-z10*z5+
    1209           0 :   2*z9*z7+2*z9*z6-z8*z6+6*z7S+6*z7*z6-2*z7*z5-z6*z5)+4*(-
    1210           0 :   z1S*z9+z1S*z8+2*z1*z2*z10+3*z1*z2*z7+3*z1*z2*z6-z1*z3
    1211           0 :   *z9-z1*z3*z8-z1*z3*z5-z1*z4*z8+z1*z4*z5-z1*z10*z9-z1*z10*
    1212           0 :   z8-z1*z9*z7+z1*z8*z7+z2*z3*z7+3*z2*z3*z6-z2*z4*z6+3*z2*
    1213           0 :   z10*z7+3*z2*z10*z6+3*z2*z7S+3*z2*z7*z6+z3S*z5+2*z3*z4
    1214           0 :   *z5+z3*z10*z5-z3*z7*z5+z4*z10*z5+z4*z7*z5);
    1215           0 :   fm[5][8] = 8*mQ4*(-2*z3-z4-3*z10-2*z7-z6)+4*mQ2*(2*z1*z3+
    1216           0 :   4*z1*z4+2*z1*z10-z1*z9+z1*z8+2*z1*z7+4*z1*z6-2*z2*z3-z2*
    1217           0 :   z4-z2*z10+2*z2*z7+z2*z6+6*z3S+6*z3*z4+6*z3*z10+2*z3*z8+
    1218           0 :   2*z3*z7+4*z3*z6-2*z3*z5+6*z4*z10-z4*z9+2*z4*z8+4*z4*z7+2*
    1219           0 :   z4*z6-z4*z5+3*z10*z9+3*z10*z8+6*z10*z7+6*z10*z6-3*z10*z5+
    1220           0 :   3*z9*z7+2*z9*z6+z8*z7+6*z7S+6*z7*z6-2*z7*z5-z6*z5)+4*(
    1221           0 :   z1S*z9-z1S*z8-z1*z2*z7+z1*z2*z6+z1*z3*z9-z1*z3*z8+3*
    1222           0 :   z1*z3*z5+3*z1*z4*z5-z1*z10*z9-z1*z10*z8+2*z1*z10*z5-z1*z9
    1223           0 :   *z7-z1*z9*z6-z1*z8*z7-z2*z3*z7+z2*z3*z6+z2*z10*z7+z2*z10*
    1224           0 :   z6+z2*z7S+2*z2*z7*z6+3*z3S*z5+3*z3*z4*z5+3*z3*z10*z5+
    1225           0 :   z3*z7*z5+3*z4*z10*z5+3*z4*z7*z5-z4*z6*z5);
    1226           0 :   fm[6][6] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+z2+2*z4+z9+z7
    1227           0 :   +2*z5)+8*mQ2*s3*(-z1+2*z4-z7)+16*mQ2*(z2*z5-2*z4*
    1228           0 :   z9-2*z4*z7+4*z4*z5+z9*z5)+8*s3*z4*z7-16*z4*z9*z5;
    1229           0 :   fm[6][7] = 8*mQ4*(-6*z3-3*z4-3*z10-2*z9-z8-z7-2*z6)+2*mQ2
    1230           0 :   *s3*(-2*z3-z4-2*z10+z7+2*z6)+4*mQ2*(-8*z1*z3-4*z1*z4
    1231           0 :   -4*z1*z10+2*z1*z9-2*z1*z8-10*z2*z3-2*z2*z4-5*z2*z10-z2*z9
    1232           0 :   -2*z2*z8-4*z2*z7-2*z2*z6-5*z3*z9-4*z3*z7-8*z3*z5-2*z4*z9+
    1233           0 :   7*z4*z8-4*z4*z7+8*z4*z6-4*z4*z5-5*z10*z5-z9S+z9*z8-2*z9
    1234           0 :   *z7+z9*z6-2*z9*z5+z8*z7-z8*z5)+2*s3*(z1*z10-z3*z7+2*z4
    1235           0 :   *z7-z4*z6)+4*(2*z1*z2*z9+z1*z2*z8+z1*z9S-z1*z9*z8-2*
    1236           0 :   z2S*z7-z2S*z6-3*z2*z3*z5-2*z2*z10*z5-z2*z9*z7-z2*z9*z6+
    1237           0 :   2*z2*z8*z7-z3*z9*z5-z4*z9*z5+2*z4*z8*z5);
    1238           0 :   fm[6][8] = 8*mQ4*(-6*z3-3*z4-3*z10-z9-2*z8-z7-2*z6)+2*mQ2
    1239           0 :   *s3*(-6*z3-3*z4-3*z10+z7+2*z6)+4*mQ2*(-8*z1*z3-4*z1*
    1240           0 :   z4-4*z1*z10-8*z2*z3-4*z2*z4-4*z2*z10-4*z3*z9-4*z3*z7-12*
    1241           0 :   z3*z5-4*z4*z9+8*z4*z8-4*z4*z7+8*z4*z6-6*z4*z5-6*z10*z5-z9
    1242           0 :   *z5-2*z8*z5)+4*s3*(2*z1*z3+z1*z4+z1*z10+z3*z7+z4*z7-2*
    1243           0 :   z4*z6)+8*z5*(-2*z2*z3-z2*z4-z2*z10-z3*z9-z4*z9+2*z4*z8);
    1244           0 :   fm[7][7] = 72*mQ4*z10+18*mQ2*s3*z10+8*mQ2*(z1*z10+9*
    1245           0 :   z2*z10+7*z3*z7+2*z3*z6+2*z4*z7+7*z4*z6+z10*z5+2*z9*z7+7*
    1246           0 :   z9*z6+7*z8*z7+2*z8*z6)+2*s3*(-z1*z10-7*z3*z7-2*z3*z6-2
    1247           0 :   *z4*z7-7*z4*z6)+4*z2*(z10*z5+2*z9*z7+7*z9*z6+7*z8*z7+2*z8
    1248             :   *z6);
    1249           0 :   fm[7][8] = 72*mQ4*z10+2*mQ2*s3*z10+4*mQ2*(2*z1*z10+
    1250           0 :   10*z2*z10+7*z3*z9+2*z3*z8+14*z3*z7+4*z3*z6+2*z4*z9+7*z4*
    1251           0 :   z8+4*z4*z7+14*z4*z6+10*z10*z5+z9S+7*z9*z8+2*z9*z7+7*z9*
    1252           0 :   z6+z8S+7*z8*z7+2*z8*z6)+2*s3*(7*z1*z10-7*z3*z7-2*z3*
    1253           0 :   z6-2*z4*z7-7*z4*z6)+2*(-2*z1*z9S-14*z1*z9*z8-2*z1*z8S
    1254           0 :   +2*z2*z10*z5+2*z2*z9*z7+7*z2*z9*z6+7*z2*z8*z7+2*z2*z8*z6+
    1255           0 :   7*z3*z9*z5+2*z3*z8*z5+2*z4*z9*z5+7*z4*z8*z5);
    1256           0 :   fm[8][8] = 72*mQ4*z10+18*mQ2*s3*z10+8*mQ2*(z1*z10+z2
    1257           0 :   *z10+7*z3*z9+2*z3*z8+7*z3*z7+2*z3*z6+2*z4*z9+7*z4*z8+2*z4
    1258           0 :   *z7+7*z4*z6+9*z10*z5)+2*s3*(-z1*z10-7*z3*z7-2*z3*z6-2*
    1259           0 :   z4*z7-7*z4*z6)+4*z5*(z2*z10+7*z3*z9+2*z3*z8+2*z4*z9+7*z4*
    1260             :   z8);
    1261           0 :   double fm99 = -4*mQ4*z10-mQ2*s3*z10+4*mQ2*(-z1*z10-z2*z10+
    1262           0 :   z3*z7+z4*z6-z10*z5+z9*z6+z8*z7)+s3*(z1*z10-z3*z7-z4*z6
    1263           0 :   )+2*z2*(-z10*z5+z9*z6+z8*z7);
    1264           0 :   double fm910 = -4*mQ4*z10-mQ2*s3*z10+2*mQ2*(-2*z1*z10-2*z2*
    1265           0 :   z10+2*z3*z9+2*z3*z7+2*z4*z6-2*z10*z5+z9*z8+2*z8*z7)+s3
    1266           0 :   *(z1*z10-z3*z7-z4*z6)+2*(-z1*z9*z8-z2*z10*z5+z2*z8*z7+z3*
    1267             :   z9*z5);
    1268           0 :   double fmxx = -4*mQ4*z10-mQ2*s3*z10+2*mQ2*(-2*z1*z10-2*z2*
    1269           0 :   z10+2*z4*z8+2*z4*z6+2*z3*z7-2*z10*z5+z9*z8+2*z9*z6)+s3
    1270           0 :   *(z1*z10-z3*z7-z4*z6)+2*(-z1*z9*z8-z2*z10*z5+z2*z9*z6+z4*
    1271             :   z8*z5);
    1272           0 :   fm910 = 0.5*(fmxx+fm910);
    1273           0 :   double fm1010 = -4*mQ4*z10-mQ2*s3*z10+4*mQ2*(-z1*z10-z2*z10+
    1274           0 :   z3*z7+z4*z6-z10*z5+z9*z3+z8*z4)+s3*(z1*z10-z3*z7-z4*z6
    1275           0 :   )+2*z5*(-z10*z2+z9*z3+z8*z4);
    1276           0 :   fm[7][7] -= 2. * fm99;
    1277           0 :   fm[7][8] -= 2. * fm910;
    1278           0 :   fm[8][8] -= 2. * fm1010;
    1279             : 
    1280             :   // Propagators.
    1281           0 :   double ss1 = (pTemp[1] + pTemp[3]).m2Calc() - mQ2;
    1282           0 :   double ss2 = (pTemp[1] + pTemp[4]).m2Calc() - mQ2;
    1283           0 :   double ss3 = (pTemp[1] + pTemp[5]).m2Calc() - mQ2;
    1284           0 :   double ss4 = (pTemp[2] + pTemp[3]).m2Calc() - mQ2;
    1285           0 :   double ss5 = (pTemp[2] + pTemp[4]).m2Calc() - mQ2;
    1286           0 :   double ss6 = (pTemp[2] + pTemp[5]).m2Calc() - mQ2;
    1287           0 :   double ss7 = sH;
    1288             : 
    1289             :   // Propagator combinations.
    1290           0 :   double dz[9];
    1291           0 :   dz[1]      = ss1 * ss6;
    1292           0 :   dz[2]      = ss2 * ss6;
    1293           0 :   dz[3]      = ss2 * ss4;
    1294           0 :   dz[4]      = ss1 * ss5;
    1295           0 :   dz[5]      = ss3 * ss5;
    1296           0 :   dz[6]      = ss3 * ss4;
    1297           0 :   dz[7]      = ss7 * ss1;
    1298           0 :   dz[8]      = ss7 * ss4;
    1299             : 
    1300             :   // Colour factors.
    1301           0 :   double clr[9][9];
    1302           0 :   for (int i = 1; i < 4; ++i)
    1303           0 :   for (int j = 1; j < 4; ++j) {
    1304           0 :     clr[i][j]     = 16. / 3.;
    1305           0 :     clr[i][j+3]   = -2. / 3.;
    1306           0 :     clr[i+3][j]   = -2. / 3.;
    1307           0 :     clr[i+3][j+3] = 16. / 3.;
    1308             :   }
    1309           0 :   for (int i = 1; i < 4; ++i)
    1310           0 :   for (int j = 1; j < 3; ++j) {
    1311           0 :     clr[i][j+6]   = -6.;
    1312           0 :     clr[i+3][j+6] = 6.;
    1313           0 :     clr[j+6][i]   = -6.;
    1314           0 :     clr[j+6][i+3] = 6.;
    1315             :   }
    1316           0 :   for (int i = 1; i < 3; ++i)
    1317           0 :   for (int j = 1; j < 3; ++j)
    1318           0 :     clr[i+6][j+6] = 12.;
    1319             : 
    1320             :   // Produce final result: matrix elements * colours * propagators.
    1321             :   double wtSum = 0.;
    1322           0 :   for (int i = 1; i < 9; ++i)
    1323           0 :   for (int j = i; j < 9; ++j) {
    1324           0 :     double fac = (j == i) ? 4. : 8.;
    1325           0 :     wtSum += fm[i][j] * fac * clr[i][j] / (dz[i] * dz[j]);
    1326             :   }
    1327           0 :   wtSum *= -1./256.;
    1328             : 
    1329             :   // Combine factors.
    1330           0 :   sigma  = prefac * alpEM * pow2(alpS) * mQ2run * wtSum *pow2(coup2Q);
    1331             : 
    1332             :   // Secondary width for H, Q and Qbar (latter for top only).
    1333             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1334           0 :   sigma *= openFracTriplet;
    1335             : 
    1336           0 : }
    1337             : 
    1338             : //--------------------------------------------------------------------------
    1339             : 
    1340             : // Select identity, colour and anticolour.
    1341             : 
    1342             : void Sigma3gg2HQQbar::setIdColAcol() {
    1343             : 
    1344             :   // Pick out-flavours by relative CKM weights.
    1345           0 :   setId( id1, id2, idRes, idNew, -idNew);
    1346             : 
    1347             :   // Colour flow topologies.
    1348           0 :   if (rndmPtr->flat() < 0.5) setColAcol( 1, 2, 2, 3, 0, 0, 1, 0, 0, 3);
    1349           0 :   else                    setColAcol( 1, 2, 3, 1, 0, 0, 3, 0, 0, 2);
    1350             : 
    1351           0 : }
    1352             : 
    1353             : //--------------------------------------------------------------------------
    1354             : 
    1355             : // Evaluate weight for decay angles.
    1356             : 
    1357             : double Sigma3gg2HQQbar::weightDecay( Event& process, int iResBeg,
    1358             :   int iResEnd) {
    1359             : 
    1360             :   // Identity of mother of decaying reseonance(s).
    1361           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    1362             : 
    1363             :   // For Higgs decay hand over to standard routine.
    1364           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    1365           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    1366             : 
    1367             :   // For top decay hand over to standard routine.
    1368           0 :   if (idMother == 6)
    1369           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    1370             : 
    1371             :   // Else done.
    1372           0 :   return 1.;
    1373             : 
    1374           0 : }
    1375             : 
    1376             : //==========================================================================
    1377             : 
    1378             : // Sigma3qqbar2HQQbar class.
    1379             : // Cross section for q qbar -> H0 Q Qbar (Q Qbar fusion of SM Higgs).
    1380             : // REDUCE output and part of the rest courtesy Z. Kunszt,
    1381             : // see Z. Kunszt, Nucl. Phys. B247 (1984) 339.
    1382             : 
    1383             : //--------------------------------------------------------------------------
    1384             : 
    1385             : // Initialize process.
    1386             : 
    1387             : void Sigma3qqbar2HQQbar::initProc() {
    1388             : 
    1389             :   // Properties specific to Higgs state for the "q qbar -> H ttbar" process.
    1390             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1391             : 
    1392           0 :   if (higgsType == 0 && idNew == 6) {
    1393           0 :     nameSave = "q qbar -> H t tbar (SM)";
    1394           0 :     codeSave = 909;
    1395           0 :     idRes    = 25;
    1396           0 :     coup2Q   = 1.;
    1397           0 :   }
    1398           0 :   else if (higgsType == 1 && idNew == 6) {
    1399           0 :     nameSave = "q qbar -> h0(H1) t tbar";
    1400           0 :     codeSave = 1009;
    1401           0 :     idRes    = 25;
    1402           0 :     coup2Q   = settingsPtr->parm("HiggsH1:coup2u");
    1403           0 :   }
    1404           0 :   else if (higgsType == 2 && idNew == 6) {
    1405           0 :     nameSave = "q qbar -> H0(H2) t tbar";
    1406           0 :     codeSave = 1029;
    1407           0 :     idRes    = 35;
    1408           0 :     coup2Q   = settingsPtr->parm("HiggsH2:coup2u");
    1409           0 :   }
    1410           0 :   else if (higgsType == 3 && idNew == 6) {
    1411           0 :     nameSave = "q qbar -> A0(A3) t tbar";
    1412           0 :     codeSave = 1049;
    1413           0 :     idRes    = 36;
    1414           0 :     coup2Q   = settingsPtr->parm("HiggsA3:coup2u");
    1415           0 :   }
    1416             : 
    1417             :  // Properties specific to Higgs state for the "q qbar -> H b bbar" process.
    1418             :  // (H can be H0 SM or H1, H2, A3 from BSM).
    1419           0 :   if (higgsType == 0 && idNew == 5) {
    1420           0 :     nameSave = "q qbar -> H b bbar (SM)";
    1421           0 :     codeSave = 913;
    1422           0 :     idRes    = 25;
    1423           0 :     coup2Q   = 1.;
    1424           0 :   }
    1425           0 :   else if (higgsType == 1 && idNew == 5) {
    1426           0 :     nameSave = "q qbar -> h0(H1) b bbar";
    1427           0 :     codeSave = 1013;
    1428           0 :     idRes    = 25;
    1429           0 :     coup2Q   = settingsPtr->parm("HiggsH1:coup2d");
    1430           0 :   }
    1431           0 :   else if (higgsType == 2 && idNew == 5) {
    1432           0 :     nameSave = "q qbar -> H0(H2) b bbar";
    1433           0 :     codeSave = 1033;
    1434           0 :     idRes    = 35;
    1435           0 :     coup2Q   = settingsPtr->parm("HiggsH2:coup2d");
    1436           0 :   }
    1437           0 :   else if (higgsType == 3 && idNew == 5) {
    1438           0 :     nameSave = "q qbar -> A0(A3) b bbar";
    1439           0 :     codeSave = 1053;
    1440           0 :     idRes    = 36;
    1441           0 :     coup2Q   = settingsPtr->parm("HiggsA3:coup2d");
    1442           0 :   }
    1443             : 
    1444             :   // Common mass and coupling factors.
    1445           0 :   double mWS      = pow2(particleDataPtr->m0(24));
    1446           0 :   prefac          = (4. * M_PI / couplingsPtr->sin2thetaW()) * pow2(4. * M_PI)
    1447           0 :                   * 0.25 / mWS;
    1448             : 
    1449             :   // Secondary open width fraction.
    1450           0 :   openFracTriplet = particleDataPtr->resOpenFrac(idRes, idNew, -idNew);
    1451             : 
    1452           0 : }
    1453             : 
    1454             : //--------------------------------------------------------------------------
    1455             : 
    1456             : // Evaluate sigma(sHat), part independent of incoming flavour.
    1457             : 
    1458             : void Sigma3qqbar2HQQbar::sigmaKin() {
    1459             : 
    1460             :   // Running mass of heavy quark.
    1461           0 :   double mQ2run = pow2( particleDataPtr->mRun(idNew, mH) );
    1462             : 
    1463             :   // Linear combination of p_Q and p_Qbar to ensure common mass.
    1464           0 :   double mQ2  = m4 * m5;
    1465             :   double epsi = 0.;
    1466           0 :   if (m4 != m5) {
    1467           0 :     double s45  = (p4cm + p5cm).m2Calc();
    1468           0 :     mQ2       = 0.5 * (s4 + s5) - 0.25 * pow2(s4 - s5) / s45;
    1469           0 :     epsi      = 0.5 * (s5 - s4) / s45;
    1470           0 :   }
    1471             : 
    1472             :   // Set up kinematics: q(4) qbar(5) -> H(3) Q(1) Qbar(2) in outgoing sense.
    1473           0 :   Vec4 pTemp[6];
    1474           0 :   pTemp[4]   = Vec4( 0., 0., -0.5* mH, -0.5* mH);
    1475           0 :   pTemp[5]   = Vec4( 0., 0.,  0.5* mH, -0.5* mH);
    1476           0 :   pTemp[1]   = p4cm + epsi * (p4cm + p5cm);
    1477           0 :   pTemp[2]   = p5cm - epsi * (p4cm + p5cm);
    1478           0 :   pTemp[3]   = p3cm;
    1479             : 
    1480             :   // Four-product combinations.
    1481           0 :   double z1  = pTemp[1] * pTemp[2];
    1482           0 :   double z2  = pTemp[1] * pTemp[3];
    1483           0 :   double z3  = pTemp[1] * pTemp[4];
    1484           0 :   double z4  = pTemp[1] * pTemp[5];
    1485           0 :   double z5  = pTemp[2] * pTemp[3];
    1486           0 :   double z6  = pTemp[2] * pTemp[4];
    1487           0 :   double z7  = pTemp[2] * pTemp[5];
    1488           0 :   double z8  = pTemp[3] * pTemp[4];
    1489           0 :   double z9  = pTemp[3] * pTemp[5];
    1490           0 :   double z10 = pTemp[4] * pTemp[5];
    1491             : 
    1492             :   // Powers required as shorthand in matriz elements.
    1493           0 :   double mQ4  = mQ2 * mQ2;
    1494             : 
    1495             :   // Evaluate matrix elements for q + qbar -> Q + Qbar + H.
    1496             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1497           0 :   double a11 = -8.*mQ4*z10-2.*mQ2*s3*z10-(8.*mQ2)*(z2*z10+z3
    1498           0 :   *z7+z4*z6+z9*z6+z8*z7)+2.*s3*(z3*z7+z4*z6)-(4.*z2)*(z9
    1499           0 :   *z6+z8*z7);
    1500           0 :   double a12 = -8.*mQ4*z10+4.*mQ2*(-z2*z10-z3*z9-2.*z3*z7-z4*z8-
    1501           0 :   2.*z4*z6-z10*z5-z9*z8-z9*z6-z8*z7)+2.*s3*(-z1*z10+z3*z7
    1502           0 :   +z4*z6)+2.*(2.*z1*z9*z8-z2*z9*z6-z2*z8*z7-z3*z9*z5-z4*z8*
    1503             :   z5);
    1504           0 :   double a22 = -8.*mQ4*z10-2.*mQ2*s3*z10-(8.*mQ2)*(z3*z9+z3*
    1505           0 :   z7+z4*z8+z4*z6+z10*z5)+2.*s3*(z3*z7+z4*z6)-(4.*z5)*(z3
    1506           0 :   *z9+z4*z8);
    1507             : 
    1508             :   // Propagators and propagator combinations.
    1509           0 :   double ss1 = (pTemp[1] + pTemp[3]).m2Calc() - mQ2;
    1510           0 :   double ss4 = (pTemp[2] + pTemp[3]).m2Calc() - mQ2;
    1511           0 :   double ss7 = sH;
    1512           0 :   double dz7 = ss7 * ss1;
    1513           0 :   double dz8 = ss7 * ss4;
    1514             : 
    1515             :   // Produce final result: matrix elements * propagators.
    1516           0 :   a11 /=  (dz7 * dz7);
    1517           0 :   a12 /=  (dz7 * dz8);
    1518           0 :   a22 /=  (dz8 * dz8);
    1519           0 :   double wtSum = -(a11 + a22 + 2.*a12) * (8./9.);
    1520             : 
    1521             :   // Combine factors.
    1522           0 :   sigma = prefac * alpEM * pow2(alpS) * mQ2run * wtSum * pow2(coup2Q);
    1523             : 
    1524             :   // Secondary width for H, Q and Qbar (latter for top only).
    1525             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1526           0 :   sigma *= openFracTriplet;
    1527             : 
    1528           0 : }
    1529             : 
    1530             : //--------------------------------------------------------------------------
    1531             : 
    1532             : // Select identity, colour and anticolour.
    1533             : 
    1534             : void Sigma3qqbar2HQQbar::setIdColAcol() {
    1535             : 
    1536             :   // Pick out-flavours by relative CKM weights.
    1537           0 :   setId( id1, id2, idRes, idNew, -idNew);
    1538             : 
    1539             :   // Colour flow topologies.
    1540           0 :   if (id1 > 0) setColAcol( 1, 0, 0, 2, 0, 0, 1, 0, 0, 2);
    1541           0 :   else         setColAcol( 0, 1, 2, 0, 0, 0, 2, 0, 0, 1);
    1542             : 
    1543           0 : }
    1544             : 
    1545             : //--------------------------------------------------------------------------
    1546             : 
    1547             : // Evaluate weight for decay angles.
    1548             : 
    1549             : double Sigma3qqbar2HQQbar::weightDecay( Event& process, int iResBeg,
    1550             :   int iResEnd) {
    1551             : 
    1552             :   // Identity of mother of decaying reseonance(s).
    1553           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    1554             : 
    1555             :   // For Higgs decay hand over to standard routine.
    1556           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    1557           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    1558             : 
    1559             :   // For top decay hand over to standard routine.
    1560           0 :   if (idMother == 6)
    1561           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    1562             : 
    1563             :   // Else done.
    1564           0 :   return 1.;
    1565             : 
    1566           0 : }
    1567             : 
    1568             : //==========================================================================
    1569             : 
    1570             : // Sigma2qg2Hq class.
    1571             : // Cross section for q g -> H q.
    1572             : // (H can be H0 SM or H1, H2, A3 from BSM).
    1573             : 
    1574             : //--------------------------------------------------------------------------
    1575             : 
    1576             : // Initialize process.
    1577             : 
    1578             : void Sigma2qg2Hq::initProc() {
    1579             : 
    1580             :   // Properties specific to Higgs state for the "c g -> H c" process.
    1581             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1582           0 :   if (higgsType == 0 && idNew == 4) {
    1583           0 :     nameSave = "c g -> H c (SM)";
    1584           0 :     codeSave = 911;
    1585           0 :     idRes    = 25;
    1586           0 :   }
    1587           0 :   else if (higgsType == 1 && idNew == 4) {
    1588           0 :     nameSave = "c g -> h0(H1) c";
    1589           0 :     codeSave = 1011;
    1590           0 :     idRes    = 25;
    1591           0 :   }
    1592           0 :   else if (higgsType == 2 && idNew == 4) {
    1593           0 :     nameSave = "c g -> H0(H2) c";
    1594           0 :     codeSave = 1031;
    1595           0 :     idRes    = 35;
    1596           0 :   }
    1597           0 :   else if (higgsType == 3 && idNew == 4) {
    1598           0 :     nameSave = "c g -> A0(A3) c";
    1599           0 :     codeSave = 1051;
    1600           0 :     idRes    = 36;
    1601           0 :   }
    1602             : 
    1603             :  // Properties specific to Higgs state for the "b g -> H b" process.
    1604             :  // (H can be H0 SM or H1, H2, A3 from BSM).
    1605           0 :  if (higgsType == 0 && idNew == 5) {
    1606           0 :     nameSave = "b g -> H b (SM)";
    1607           0 :     codeSave = 911;
    1608           0 :     idRes    = 25;
    1609           0 :   }
    1610           0 :   else if (higgsType == 1 && idNew == 5) {
    1611           0 :     nameSave = "b g -> h0(H1) b";
    1612           0 :     codeSave = 1011;
    1613           0 :     idRes    = 25;
    1614           0 :   }
    1615           0 :   else if (higgsType == 2 && idNew == 5) {
    1616           0 :     nameSave = "b g -> H0(H2) b";
    1617           0 :     codeSave = 1031;
    1618           0 :     idRes    = 35;
    1619           0 :   }
    1620           0 :   else if (higgsType == 3 && idNew == 5) {
    1621           0 :     nameSave = "b g -> A0(A3) b";
    1622           0 :     codeSave = 1051;
    1623           0 :     idRes    = 36;
    1624           0 :   }
    1625             : 
    1626             :   // Standard parameters.
    1627           0 :   m2W       = pow2( particleDataPtr->m0(24) );
    1628           0 :   thetaWRat = 1. / (24. * couplingsPtr->sin2thetaW());
    1629             : 
    1630             :   // Secondary open width fraction.
    1631           0 :   openFrac = particleDataPtr->resOpenFrac(idRes);
    1632             : 
    1633             : 
    1634           0 : }
    1635             : 
    1636             : //--------------------------------------------------------------------------
    1637             : 
    1638             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
    1639             : 
    1640             : void Sigma2qg2Hq::sigmaKin() {
    1641             : 
    1642             :   // Running mass provides coupling.
    1643           0 :   double m2Run = pow2( particleDataPtr->mRun(idNew, mH) );
    1644             : 
    1645             :   // Cross section, including couplings and kinematics.
    1646           0 :   sigma = (M_PI / sH2) * alpS * alpEM * thetaWRat * (m2Run/m2W)
    1647           0 :     * (sH / (s4 - uH) + 2. * s4 * (s3 - uH) / pow2(s4 - uH)
    1648           0 :       + (s4 - uH) / sH - 2. * s4 / (s4 - uH)
    1649           0 :       + 2. * (s3 - uH)  * (s3 - s4 - sH) / ((s4 - uH) * sH) );
    1650             : 
    1651             :   // Include secondary width for H0, H1, H2 or A3. Done.
    1652           0 :   sigma *= openFrac;
    1653             : 
    1654           0 : }
    1655             : 
    1656             : //--------------------------------------------------------------------------
    1657             : 
    1658             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
    1659             : 
    1660             : double Sigma2qg2Hq::sigmaHat() {
    1661             : 
    1662             :   // Check that specified flavour present.
    1663           0 :   if (abs(id1) != idNew && abs(id2) != idNew) return 0.;
    1664             : 
    1665             :   // Answer.
    1666           0 :   return sigma;
    1667             : 
    1668           0 : }
    1669             : 
    1670             : 
    1671             : //--------------------------------------------------------------------------
    1672             : 
    1673             : // Select identity, colour and anticolour.
    1674             : 
    1675             : void Sigma2qg2Hq::setIdColAcol() {
    1676             : 
    1677             :   // Flavour set up for q g -> H0 q.
    1678           0 :   int idq = (id2 == 21) ? id1 : id2;
    1679           0 :   setId( id1, id2, idRes, idq);
    1680             : 
    1681             :   // tH defined between f and f': must swap tHat <-> uHat if q g in.
    1682           0 :   swapTU = (id2 == 21);
    1683             : 
    1684             :   // Colour flow topologies. Swap when antiquarks.
    1685           0 :   if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
    1686           0 :   else           setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
    1687           0 :   if (idq < 0) swapColAcol();
    1688             : 
    1689           0 : }
    1690             : 
    1691             : //--------------------------------------------------------------------------
    1692             : 
    1693             : // Evaluate weight for decay angles.
    1694             : 
    1695             : double Sigma2qg2Hq::weightDecay( Event& process, int iResBeg,
    1696             :   int iResEnd) {
    1697             : 
    1698             :   // Identity of mother of decaying reseonance(s).
    1699           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    1700             : 
    1701             :   // For Higgs decay hand over to standard routine.
    1702           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    1703           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    1704             : 
    1705             :   // For top decay hand over to standard routine.
    1706           0 :   if (idMother == 6)
    1707           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    1708             : 
    1709             :   // Else done.
    1710           0 :   return 1.;
    1711             : 
    1712           0 : }
    1713             : 
    1714             : //==========================================================================
    1715             : 
    1716             : // Sigma2gg2Hglt class.
    1717             : // Cross section for g g -> H g (H SM Higgs or BSM Higgs) via top loop.
    1718             : // (H can be H0 SM or H1, H2, A3 from BSM).
    1719             : 
    1720             : //--------------------------------------------------------------------------
    1721             : 
    1722             : // Initialize process.
    1723             : 
    1724             : void Sigma2gg2Hglt::initProc() {
    1725             : 
    1726             :   // Properties specific to Higgs state.
    1727           0 :   if (higgsType == 0) {
    1728           0 :     nameSave = "g g -> H g (SM; top loop)";
    1729           0 :     codeSave = 914;
    1730           0 :     idRes    = 25;
    1731           0 :   }
    1732           0 :   else if (higgsType == 1) {
    1733           0 :     nameSave = "g g -> h0(H1) g (BSM; top loop)";
    1734           0 :     codeSave = 1014;
    1735           0 :     idRes    = 25;
    1736           0 :   }
    1737           0 :   else if (higgsType == 2) {
    1738           0 :     nameSave = "g g -> H0(H2) g (BSM; top loop)";
    1739           0 :     codeSave = 1034;
    1740           0 :     idRes    = 35;
    1741           0 :   }
    1742           0 :   else if (higgsType == 3) {
    1743           0 :     nameSave = "g g -> A0(A3) g (BSM; top loop)";
    1744           0 :     codeSave = 1054;
    1745           0 :     idRes    = 36;
    1746           0 :   }
    1747             : 
    1748             :   // Normalization factor by g g -> H partial width.
    1749             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1750           0 :   double mHiggs = particleDataPtr->m0(idRes);
    1751           0 :   widHgg = particleDataPtr->resWidthChan(idRes, mHiggs, 21, 21);
    1752             : 
    1753             :    // Secondary open width fraction.
    1754           0 :   openFrac = particleDataPtr->resOpenFrac(idRes);
    1755             : 
    1756           0 : }
    1757             : 
    1758             : //--------------------------------------------------------------------------
    1759             : 
    1760             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
    1761             : 
    1762             : void Sigma2gg2Hglt::sigmaKin() {
    1763             : 
    1764             :   // Evaluate cross section. Secondary width for H0, H1, H2 or A3.
    1765           0 :   sigma  = (M_PI / sH2) * (3. / 16.) * alpS * (widHgg / m3)
    1766           0 :     * (sH2 * sH2 + tH2 * tH2 + uH2 * uH2 + pow4(s3))
    1767           0 :     / (sH * tH * uH * s3);
    1768           0 :   sigma *= openFrac;
    1769             : 
    1770           0 : }
    1771             : 
    1772             : //--------------------------------------------------------------------------
    1773             : 
    1774             : // Select identity, colour and anticolour.
    1775             : 
    1776             : void Sigma2gg2Hglt::setIdColAcol() {
    1777             : 
    1778             :   // Flavour set up for g g -> H g trivial.
    1779             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1780           0 :   setId( 21, 21, idRes, 21);
    1781             : 
    1782             :   // Colour flow topologies: random choice between two mirrors.
    1783           0 :   if (rndmPtr->flat() < 0.5) setColAcol( 1, 2, 2, 3, 0, 0, 1, 3);
    1784           0 :   else                    setColAcol( 1, 2, 3, 1, 0, 0, 3, 2);
    1785             : 
    1786           0 : }
    1787             : 
    1788             : //--------------------------------------------------------------------------
    1789             : 
    1790             : // Evaluate weight for decay angles.
    1791             : 
    1792             : double Sigma2gg2Hglt::weightDecay( Event& process, int iResBeg,
    1793             :   int iResEnd) {
    1794             : 
    1795             :   // Identity of mother of decaying reseonance(s).
    1796           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    1797             : 
    1798             :   // For Higgs decay hand over to standard routine.
    1799           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    1800           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    1801             : 
    1802             :   // For top decay hand over to standard routine.
    1803           0 :   if (idMother == 6)
    1804           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    1805             : 
    1806             :   // Else done.
    1807           0 :   return 1.;
    1808             : 
    1809           0 : }
    1810             : 
    1811             : //==========================================================================
    1812             : 
    1813             : // Sigma2qg2Hqlt class.
    1814             : // Cross section for q g -> H q (H SM or BSM Higgs) via top loop.
    1815             : // (H can be H0 SM or H1, H2, A3 from BSM).
    1816             : 
    1817             : //--------------------------------------------------------------------------
    1818             : 
    1819             : // Initialize process.
    1820             : 
    1821             : void Sigma2qg2Hqlt::initProc() {
    1822             : 
    1823             :   // Properties specific to Higgs state.
    1824           0 :   if (higgsType == 0) {
    1825           0 :     nameSave = "q g -> H q (SM; top loop)";
    1826           0 :     codeSave = 915;
    1827           0 :     idRes    = 25;
    1828           0 :   }
    1829           0 :   else if (higgsType == 1) {
    1830           0 :     nameSave = "q g -> h0(H1) q (BSM; top loop)";
    1831           0 :     codeSave = 1015;
    1832           0 :     idRes    = 25;
    1833           0 :   }
    1834           0 :   else if (higgsType == 2) {
    1835           0 :     nameSave = "q g -> H0(H2) q (BSM; top loop)";
    1836           0 :     codeSave = 1035;
    1837           0 :     idRes    = 35;
    1838           0 :   }
    1839           0 :   else if (higgsType == 3) {
    1840           0 :     nameSave = "q g -> A0(A3) q (BSM; top loop)";
    1841           0 :     codeSave = 1055;
    1842           0 :     idRes    = 36;
    1843           0 :   }
    1844             : 
    1845             :   // Normalization factor by g g -> H partial width.
    1846             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1847           0 :   double mHiggs = particleDataPtr->m0(idRes);
    1848           0 :   widHgg = particleDataPtr->resWidthChan(idRes, mHiggs, 21, 21);
    1849             : 
    1850             :   // Secondary open width fraction.
    1851           0 :   openFrac = particleDataPtr->resOpenFrac(idRes);
    1852             : 
    1853           0 : }
    1854             : 
    1855             : //--------------------------------------------------------------------------
    1856             : 
    1857             : // Evaluate sigmaHat(sHat, part independent of incoming flavour).
    1858             : 
    1859             : void Sigma2qg2Hqlt::sigmaKin() {
    1860             : 
    1861             :   // Evaluate cross section. Secondary width for H0, H1, H2 or A3.
    1862           0 :   sigma  = (M_PI / sH2) * (1. / 12.) * alpS * (widHgg / m3)
    1863           0 :     * (sH2 + uH2) / (-tH * s3);
    1864           0 :   sigma *= openFrac;
    1865             : 
    1866           0 : }
    1867             : 
    1868             : //--------------------------------------------------------------------------
    1869             : 
    1870             : // Select identity, colour and anticolour.
    1871             : 
    1872             : void Sigma2qg2Hqlt::setIdColAcol() {
    1873             : 
    1874             :   // Flavour set up for q g -> H q.
    1875             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1876           0 :   int idq = (id2 == 21) ? id1 : id2;
    1877           0 :   setId( id1, id2, idRes, idq);
    1878             : 
    1879             :   // tH defined between f and f': must swap tHat <-> uHat if q g in.
    1880           0 :   swapTU = (id2 == 21);
    1881             : 
    1882             :   // Colour flow topologies. Swap when antiquarks.
    1883           0 :   if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
    1884           0 :   else           setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
    1885           0 :   if (idq < 0) swapColAcol();
    1886             : 
    1887           0 : }
    1888             : 
    1889             : //--------------------------------------------------------------------------
    1890             : 
    1891             : // Evaluate weight for decay angles.
    1892             : 
    1893             : double Sigma2qg2Hqlt::weightDecay( Event& process, int iResBeg,
    1894             :   int iResEnd) {
    1895             : 
    1896             :   // Identity of mother of decaying reseonance(s).
    1897           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    1898             : 
    1899             :   // For Higgs decay hand over to standard routine.
    1900           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    1901           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    1902             : 
    1903             :   // For top decay hand over to standard routine.
    1904           0 :   if (idMother == 6)
    1905           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    1906             : 
    1907             :   // Else done.
    1908           0 :   return 1.;
    1909             : 
    1910           0 : }
    1911             : 
    1912             : //==========================================================================
    1913             : 
    1914             : // Sigma2qqbar2Hglt class.
    1915             : // Cross section for q qbar -> H g (H SM or BSM Higgs) via top loop.
    1916             : // (H can be H0 SM or H1, H2, A3 from BSM).
    1917             : 
    1918             : //--------------------------------------------------------------------------
    1919             : 
    1920             : // Initialize process.
    1921             : 
    1922             : void Sigma2qqbar2Hglt::initProc() {
    1923             : 
    1924             :   // Properties specific to Higgs state.
    1925           0 :   if (higgsType == 0) {
    1926           0 :     nameSave = "q qbar -> H g (SM; top loop)";
    1927           0 :     codeSave = 916;
    1928           0 :     idRes    = 25;
    1929           0 :   }
    1930           0 :   else if (higgsType == 1) {
    1931           0 :     nameSave = "q qbar -> h0(H1) g (BSM; top loop)";
    1932           0 :     codeSave = 1016;
    1933           0 :     idRes    = 25;
    1934           0 :   }
    1935           0 :   else if (higgsType == 2) {
    1936           0 :     nameSave = "q qbar -> H0(H2) g (BSM; top loop)";
    1937           0 :     codeSave = 1036;
    1938           0 :     idRes    = 35;
    1939           0 :   }
    1940           0 :   else if (higgsType == 3) {
    1941           0 :     nameSave = "q qbar -> A0(A3) g (BSM; top loop)";
    1942           0 :     codeSave = 1056;
    1943           0 :     idRes    = 36;
    1944           0 :   }
    1945             : 
    1946             :   // Normalization factor by g g -> H partial width.
    1947             :   // (H can be H0 SM or H1, H2, A3 from BSM).
    1948           0 :   double mHiggs = particleDataPtr->m0(idRes);
    1949           0 :   widHgg = particleDataPtr->resWidthChan(idRes, mHiggs, 21, 21);
    1950             : 
    1951             :   // Secondary open width fraction.
    1952           0 :   openFrac = particleDataPtr->resOpenFrac(idRes);
    1953             : 
    1954             : 
    1955           0 : }
    1956             : 
    1957             : //--------------------------------------------------------------------------
    1958             : 
    1959             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
    1960             : 
    1961             : void Sigma2qqbar2Hglt::sigmaKin() {
    1962             : 
    1963             :   // Evaluate cross section. Secondary width for H0, H1, H2 or A3.
    1964           0 :   sigma  = (M_PI / sH2) * (2. / 9.) * alpS * (widHgg / m3)
    1965           0 :     * (tH2 + uH2) / (sH * s3);
    1966           0 :   sigma *= openFrac;
    1967             : 
    1968           0 : }
    1969             : 
    1970             : //--------------------------------------------------------------------------
    1971             : 
    1972             : // Select identity, colour and anticolour.
    1973             : 
    1974             : void Sigma2qqbar2Hglt::setIdColAcol() {
    1975             : 
    1976             :   // Flavours trivial.
    1977           0 :   setId( id1, id2, idRes, 21);
    1978             : 
    1979             :   // Colour flow topologies. Swap when antiquarks.
    1980           0 :   setColAcol( 1, 0, 0, 2, 0, 0, 1, 2);
    1981           0 :   if (id1 < 0) swapColAcol();
    1982             : 
    1983           0 : }
    1984             : 
    1985             : //--------------------------------------------------------------------------
    1986             : 
    1987             : // Evaluate weight for decay angles.
    1988             : 
    1989             : double Sigma2qqbar2Hglt::weightDecay( Event& process, int iResBeg,
    1990             :   int iResEnd) {
    1991             : 
    1992             :   // Identity of mother of decaying reseonance(s).
    1993           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    1994             : 
    1995             :   // For Higgs decay hand over to standard routine.
    1996           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    1997           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    1998             : 
    1999             :   // For top decay hand over to standard routine.
    2000           0 :   if (idMother == 6)
    2001           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    2002             : 
    2003             :   // Else done.
    2004           0 :   return 1.;
    2005             : 
    2006           0 : }
    2007             : 
    2008             : 
    2009             : //==========================================================================
    2010             : 
    2011             : // Sigma1ffbar2Hchg class.
    2012             : // Cross section for f fbar -> H+- (f is quark or lepton).
    2013             : 
    2014             : //--------------------------------------------------------------------------
    2015             : 
    2016             : // Initialize process.
    2017             : 
    2018             : void Sigma1ffbar2Hchg::initProc() {
    2019             : 
    2020             :   // Find pointer to H+-.
    2021           0 :   HResPtr = particleDataPtr->particleDataEntryPtr(37);
    2022             : 
    2023             :   // Store H+- mass and width for propagator.
    2024           0 :   mRes      = HResPtr->m0();
    2025           0 :   GammaRes  = HResPtr->mWidth();
    2026           0 :   m2Res     = mRes*mRes;
    2027           0 :   GamMRat   = GammaRes / mRes;
    2028             : 
    2029             :   // Couplings.
    2030           0 :   m2W       = pow2(particleDataPtr->m0(24));
    2031           0 :   thetaWRat = 1. / (8. * couplingsPtr->sin2thetaW());
    2032           0 :   tan2Beta  = pow2(settingsPtr->parm("HiggsHchg:tanBeta"));
    2033             : 
    2034           0 : }
    2035             : 
    2036             : //--------------------------------------------------------------------------
    2037             : 
    2038             : // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
    2039             : 
    2040             : void Sigma1ffbar2Hchg::sigmaKin() {
    2041             : 
    2042             :   // Set up Breit-Wigner. Width out only includes open channels.
    2043           0 :   sigBW    = 4. * M_PI / ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
    2044           0 :   widthOutPos = HResPtr->resWidthOpen( 37, mH);
    2045           0 :   widthOutNeg = HResPtr->resWidthOpen(-37, mH);
    2046             : 
    2047           0 : }
    2048             : 
    2049             : //--------------------------------------------------------------------------
    2050             : 
    2051             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
    2052             : 
    2053             : double Sigma1ffbar2Hchg::sigmaHat() {
    2054             : 
    2055             :   // Only allow generation-diagonal states.
    2056           0 :   int id1Abs     = abs(id1);
    2057           0 :   int id2Abs     = abs(id2);
    2058           0 :   int idUp       = max(id1Abs, id2Abs);
    2059           0 :   int idDn       = min(id1Abs, id2Abs);
    2060           0 :   if (idUp%2 != 0 || idUp - idDn != 1) return 0.;
    2061             : 
    2062             :   // Calculate mass-dependent incoming width. Total cross section.
    2063           0 :   double m2RunUp = pow2(particleDataPtr->mRun(idUp, mH));
    2064           0 :   double m2RunDn = pow2(particleDataPtr->mRun(idDn, mH));
    2065           0 :   double widthIn = alpEM * thetaWRat * (mH/m2W)
    2066           0 :      * (m2RunDn * tan2Beta + m2RunUp / tan2Beta);
    2067           0 :   int idUpChg    = (id1Abs%2 == 0) ? id1 : id2;
    2068           0 :   double sigma   = (idUpChg > 0) ? widthIn * sigBW * widthOutPos
    2069           0 :                                  : widthIn * sigBW * widthOutNeg;
    2070             : 
    2071             :   // Colour factor. Answer.
    2072           0 :   if (idUp < 9) sigma /= 3.;
    2073             :   return sigma;
    2074             : 
    2075           0 : }
    2076             : 
    2077             : //--------------------------------------------------------------------------
    2078             : 
    2079             : // Select identity, colour and anticolour.
    2080             : 
    2081             : void Sigma1ffbar2Hchg::setIdColAcol() {
    2082             : 
    2083             :   // Charge of Higgs. Fill flavours.
    2084           0 :   int idUpChg = (abs(id1)%2 == 0) ? id1 : id2;
    2085           0 :   int idHchg  = (idUpChg > 0) ? 37 : -37;
    2086           0 :   setId( id1, id2, idHchg);
    2087             : 
    2088             :   // Colour flow topologies. Swap when antiquarks.
    2089           0 :   if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
    2090           0 :   else              setColAcol( 0, 0, 0, 0, 0, 0);
    2091           0 :   if (id1 < 0) swapColAcol();
    2092             : 
    2093           0 : }
    2094             : 
    2095             : //--------------------------------------------------------------------------
    2096             : 
    2097             : // Evaluate weight for decay angles.
    2098             : 
    2099             : double Sigma1ffbar2Hchg::weightDecay( Event& process, int iResBeg,
    2100             :   int iResEnd) {
    2101             : 
    2102             :   // Identity of mother of decaying reseonance(s).
    2103           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    2104             : 
    2105             :   // For Higgs decay hand over to standard routine.
    2106           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    2107           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    2108             : 
    2109             :   // For top decay hand over to standard routine.
    2110           0 :   if (idMother == 6)
    2111           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    2112             : 
    2113             :   // Else done.
    2114           0 :   return 1.;
    2115             : 
    2116           0 : }
    2117             : 
    2118             : //==========================================================================
    2119             : 
    2120             : // Sigma2qg2Hq class.
    2121             : // Cross section for q g -> H+- q'.
    2122             : 
    2123             : //--------------------------------------------------------------------------
    2124             : 
    2125             : // Initialize process.
    2126             : 
    2127             : void Sigma2qg2Hchgq::initProc() {
    2128             : 
    2129             :   // Standard parameters.
    2130           0 :   m2W       = pow2( particleDataPtr->m0(24) );
    2131           0 :   thetaWRat = 1. / (24. * couplingsPtr->sin2thetaW());
    2132           0 :   tan2Beta  = pow2(settingsPtr->parm("HiggsHchg:tanBeta"));
    2133             : 
    2134             :   // Incoming flavour within same doublet. Uptype and downtype flavours.
    2135           0 :   idOld     = (idNew%2 == 0) ? idNew - 1 : idNew + 1;
    2136           0 :   idUp      = max(idOld, idNew);
    2137           0 :   idDn      = min(idOld, idNew);
    2138             : 
    2139             :   // Secondary open width fraction.
    2140           0 :   openFracPos = (idOld%2 == 0) ? particleDataPtr->resOpenFrac( 37,  idNew)
    2141           0 :                                : particleDataPtr->resOpenFrac(-37,  idNew);
    2142           0 :   openFracNeg = (idOld%2 == 0) ? particleDataPtr->resOpenFrac(-37, -idNew)
    2143           0 :                                : particleDataPtr->resOpenFrac( 37, -idNew);
    2144             : 
    2145           0 : }
    2146             : 
    2147             : //--------------------------------------------------------------------------
    2148             : 
    2149             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
    2150             : 
    2151             : void Sigma2qg2Hchgq::sigmaKin() {
    2152             : 
    2153             :   // Running masses provides coupling.
    2154           0 :   double m2RunUp = pow2(particleDataPtr->mRun(idUp, mH));
    2155           0 :   double m2RunDn = pow2(particleDataPtr->mRun(idDn, mH));
    2156             : 
    2157             :   // Cross section, including couplings and kinematics.
    2158           0 :   sigma = (M_PI / sH2) * alpS * alpEM * thetaWRat
    2159           0 :     * (m2RunDn * tan2Beta + m2RunUp / tan2Beta) / m2W
    2160           0 :     * (sH / (s4 - uH) + 2. * s4 * (s3 - uH) / pow2(s4 - uH)
    2161           0 :       + (s4 - uH) / sH - 2. * s4 / (s4 - uH)
    2162           0 :       + 2. * (s3 - uH)  * (s3 - s4 - sH) / ((s4 - uH) * sH) );
    2163             : 
    2164           0 : }
    2165             : 
    2166             : //--------------------------------------------------------------------------
    2167             : 
    2168             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
    2169             : 
    2170             : double Sigma2qg2Hchgq::sigmaHat() {
    2171             : 
    2172             :   // Check that specified flavour present.
    2173           0 :   if (abs(id1) != idOld && abs(id2) != idOld) return 0.;
    2174             : 
    2175             :   // Answer.
    2176           0 :   return (id1 == idOld || id2 == idOld) ? sigma * openFracPos
    2177           0 :                                         : sigma * openFracNeg;
    2178             : 
    2179           0 : }
    2180             : 
    2181             : //--------------------------------------------------------------------------
    2182             : 
    2183             : // Select identity, colour and anticolour.
    2184             : 
    2185             : void Sigma2qg2Hchgq::setIdColAcol() {
    2186             : 
    2187             :   // Flavour set up for q g -> H+- q'.
    2188           0 :   int idq = (id2 == 21) ? id1 : id2;
    2189           0 :   id3     = ( (idq > 0 && idOld%2 == 0) || (idq < 0 && idOld%2 != 0) )
    2190             :             ? 37 : -37;
    2191           0 :   id4     = (idq > 0) ? idNew : -idNew;
    2192           0 :   setId( id1, id2, id3, id4);
    2193             : 
    2194             :   // tH defined between f and f': must swap tHat <-> uHat if q g in.
    2195           0 :   swapTU = (id2 == 21);
    2196             : 
    2197             :   // Colour flow topologies. Swap when antiquarks.
    2198           0 :   if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
    2199           0 :   else           setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
    2200           0 :   if (idq < 0) swapColAcol();
    2201             : 
    2202           0 : }
    2203             : 
    2204             : //--------------------------------------------------------------------------
    2205             : 
    2206             : // Evaluate weight for decay angles.
    2207             : 
    2208             : double Sigma2qg2Hchgq::weightDecay( Event& process, int iResBeg,
    2209             :   int iResEnd) {
    2210             : 
    2211             :   // Identity of mother of decaying reseonance(s).
    2212           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    2213             : 
    2214             :   // For Higgs decay hand over to standard routine.
    2215           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    2216           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    2217             : 
    2218             :   // For top decay hand over to standard routine.
    2219           0 :   if (idMother == 6)
    2220           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    2221             : 
    2222             :   // Else done.
    2223           0 :   return 1.;
    2224             : 
    2225           0 : }
    2226             : 
    2227             : //==========================================================================
    2228             : 
    2229             : // Sigma2ffbar2A3H12 class.
    2230             : // Cross section for f fbar -> A0(H_3) h0(H_1) or A0(H_3) H0(H_2).
    2231             : 
    2232             : //--------------------------------------------------------------------------
    2233             : 
    2234             : // Initialize process.
    2235             : 
    2236             : void Sigma2ffbar2A3H12::initProc() {
    2237             : 
    2238             :   // Set up whether h0(H_1) or H0(H_2).
    2239           0 :   higgs12    = (higgsType == 1) ? 25 : 35;
    2240           0 :   codeSave   = (higgsType == 1) ? 1081 : 1082;
    2241           0 :   nameSave   = (higgsType == 1) ? "f fbar -> A0(H3) h0(H1)"
    2242             :                                 : "f fbar -> A0(H3) H0(H2)";
    2243           0 :   coupZA3H12 = (higgsType == 1) ? settingsPtr->parm("HiggsA3:coup2H1Z")
    2244           0 :                                 : settingsPtr->parm("HiggsA3:coup2H2Z");
    2245             : 
    2246             :   // Standard parameters.
    2247           0 :   double mZ  = particleDataPtr->m0(23);
    2248           0 :   double GammaZ = particleDataPtr->mWidth(23);
    2249           0 :   m2Z        = mZ * mZ;
    2250           0 :   mGammaZ    = mZ * GammaZ;
    2251           0 :   thetaWRat  = 1. / (4. * couplingsPtr->sin2thetaW()
    2252           0 :              * couplingsPtr->cos2thetaW());
    2253             : 
    2254             :   // Secondary open width fraction.
    2255           0 :   openFrac   = particleDataPtr->resOpenFrac(36, higgs12);
    2256             : 
    2257           0 : }
    2258             : 
    2259             : //--------------------------------------------------------------------------
    2260             : 
    2261             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
    2262             : 
    2263             : void Sigma2ffbar2A3H12::sigmaKin() {
    2264             : 
    2265             :   // Common kinematics factora.
    2266           0 :   sigma0 = (M_PI / sH2) * pow2(alpEM * thetaWRat * coupZA3H12)
    2267           0 :     * (uH * tH - s3 * s4) / ( pow2(sH - m2Z) + pow2(mGammaZ) );
    2268             : 
    2269           0 : }
    2270             : 
    2271             : //--------------------------------------------------------------------------
    2272             : 
    2273             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
    2274             : 
    2275             : double Sigma2ffbar2A3H12::sigmaHat() {
    2276             : 
    2277             :   // Couplings for incoming flavour.
    2278           0 :   int idAbs    = abs(id1);
    2279           0 :   double lIn   = couplingsPtr->lf(idAbs);
    2280           0 :   double rIn   = couplingsPtr->rf(idAbs);
    2281             : 
    2282             :   // Combine to total cross section. Colour factor.
    2283           0 :   double sigma = (pow2(lIn) + pow2(rIn)) * sigma0 * openFrac;
    2284           0 :   if (idAbs < 9) sigma /= 3.;
    2285           0 :   return sigma;
    2286             : 
    2287           0 : }
    2288             : 
    2289             : //--------------------------------------------------------------------------
    2290             : 
    2291             : // Select identity, colour and anticolour.
    2292             : 
    2293             : void Sigma2ffbar2A3H12::setIdColAcol() {
    2294             : 
    2295             :   // Flavours trivial
    2296           0 :   setId( id1, id2, 36, higgs12);
    2297             : 
    2298             :   // Colour flow topologies. Swap when antiquarks.
    2299           0 :   if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
    2300           0 :   else              setColAcol( 0, 0, 0, 0, 0, 0);
    2301           0 :   if (id1 < 0) swapColAcol();
    2302             : 
    2303           0 : }
    2304             : 
    2305             : //--------------------------------------------------------------------------
    2306             : 
    2307             : // Evaluate weight for decay angles.
    2308             : 
    2309             : double Sigma2ffbar2A3H12::weightDecay( Event& process, int iResBeg,
    2310             :   int iResEnd) {
    2311             : 
    2312             :   // Identity of mother of decaying reseonance(s).
    2313           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    2314             : 
    2315             :   // For Higgs decay hand over to standard routine.
    2316           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    2317           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    2318             : 
    2319             :   // For top decay hand over to standard routine.
    2320           0 :   if (idMother == 6)
    2321           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    2322             : 
    2323             :   // Else done.
    2324           0 :   return 1.;
    2325             : 
    2326           0 : }
    2327             : 
    2328             : //==========================================================================
    2329             : 
    2330             : // Sigma2ffbar2HchgH12 class.
    2331             : // Cross section for f fbar -> H+- h0(H_1) or H+- H0(H_2).
    2332             : 
    2333             : //--------------------------------------------------------------------------
    2334             : 
    2335             : // Initialize process.
    2336             : 
    2337             : void Sigma2ffbar2HchgH12::initProc() {
    2338             : 
    2339             :   // Set up whether h0(H_1) or H0(H_2).
    2340           0 :   higgs12    = (higgsType == 1) ? 25 : 35;
    2341           0 :   codeSave   = (higgsType == 1) ? 1083 : 1084;
    2342           0 :   nameSave   = (higgsType == 1) ? "f fbar' -> H+- h0(H1)"
    2343             :                                 : "f fbar' -> H+- H0(H2)";
    2344           0 :   coupWHchgH12 = (higgsType == 1) ? settingsPtr->parm("HiggsHchg:coup2H1W")
    2345           0 :                                   : settingsPtr->parm("HiggsHchg:coup2H2W");
    2346             : 
    2347             :   // Standard parameters.
    2348           0 :   double mW  = particleDataPtr->m0(24);
    2349           0 :   double GammaW = particleDataPtr->mWidth(24);
    2350           0 :   m2W        = mW * mW;
    2351           0 :   mGammaW    = mW * GammaW;
    2352           0 :   thetaWRat  = 1. / (2. * couplingsPtr->sin2thetaW());
    2353             : 
    2354             :   // Secondary open width fraction.
    2355           0 :   openFracPos   = particleDataPtr->resOpenFrac( 37, higgs12);
    2356           0 :   openFracNeg   = particleDataPtr->resOpenFrac(-37, higgs12);
    2357             : 
    2358           0 : }
    2359             : 
    2360             : //--------------------------------------------------------------------------
    2361             : 
    2362             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
    2363             : 
    2364             : void Sigma2ffbar2HchgH12::sigmaKin() {
    2365             : 
    2366             :   // Common kinematics factora.
    2367           0 :   sigma0 = 0.5 * (M_PI / sH2) * pow2(alpEM * thetaWRat * coupWHchgH12)
    2368           0 :     * (uH * tH - s3 * s4) / ( pow2(sH - m2W) + pow2(mGammaW) );
    2369             : 
    2370           0 : }
    2371             : 
    2372             : //--------------------------------------------------------------------------
    2373             : 
    2374             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
    2375             : 
    2376             : double Sigma2ffbar2HchgH12::sigmaHat() {
    2377             : 
    2378             :   // Combine to total cross section. CKM and colour factor.
    2379           0 :   int idUp = (abs(id1)%2 == 0) ? id1 : id2;
    2380           0 :   double sigma = (idUp > 0) ? sigma0 * openFracPos : sigma0 * openFracNeg;
    2381           0 :   if (abs(id1) < 9) sigma *= couplingsPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
    2382           0 :   return sigma;
    2383             : 
    2384             : }
    2385             : 
    2386             : //--------------------------------------------------------------------------
    2387             : 
    2388             : // Select identity, colour and anticolour.
    2389             : 
    2390             : void Sigma2ffbar2HchgH12::setIdColAcol() {
    2391             : 
    2392             :   // Charge of Higgs. Fill flavours.
    2393           0 :   int idUpChg = (abs(id1)%2 == 0) ? id1 : id2;
    2394           0 :   int idHchg  = (idUpChg > 0) ? 37 : -37;
    2395           0 :   setId( id1, id2, idHchg, higgs12);
    2396             : 
    2397             :   // Colour flow topologies. Swap when antiquarks.
    2398           0 :   if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
    2399           0 :   else              setColAcol( 0, 0, 0, 0, 0, 0);
    2400           0 :   if (id1 < 0) swapColAcol();
    2401             : 
    2402           0 : }
    2403             : 
    2404             : //--------------------------------------------------------------------------
    2405             : 
    2406             : // Evaluate weight for decay angles.
    2407             : 
    2408             : double Sigma2ffbar2HchgH12::weightDecay( Event& process, int iResBeg,
    2409             :   int iResEnd) {
    2410             : 
    2411             :   // Identity of mother of decaying reseonance(s).
    2412           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    2413             : 
    2414             :   // For Higgs decay hand over to standard routine.
    2415           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    2416           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    2417             : 
    2418             :   // For top decay hand over to standard routine.
    2419           0 :   if (idMother == 6)
    2420           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    2421             : 
    2422             :   // Else done.
    2423           0 :   return 1.;
    2424             : 
    2425           0 : }
    2426             : 
    2427             : //==========================================================================
    2428             : 
    2429             : // Sigma2ffbar2HposHneg class.
    2430             : // Cross section for q g -> H+- q'.
    2431             : 
    2432             : //--------------------------------------------------------------------------
    2433             : 
    2434             : // Initialize process.
    2435             : 
    2436             : void Sigma2ffbar2HposHneg::initProc() {
    2437             : 
    2438             :   // Standard parameters.
    2439           0 :   double mZ = particleDataPtr->m0(23);
    2440           0 :   double GammaZ = particleDataPtr->mWidth(23);
    2441           0 :   m2Z       = mZ * mZ;
    2442           0 :   mGammaZ   = mZ * GammaZ;
    2443           0 :   thetaWRat = 1. / (4. * couplingsPtr->sin2thetaW()
    2444           0 :             * couplingsPtr->cos2thetaW());
    2445             : 
    2446             :   // Charged Higgs coupling to gamma and Z0.
    2447           0 :   eH        = -1.;
    2448           0 :   lH        = -1. + 2. * couplingsPtr->sin2thetaW();
    2449             : 
    2450             :   // Secondary open width fraction.
    2451           0 :   openFrac  = particleDataPtr->resOpenFrac(37, -37);
    2452             : 
    2453           0 : }
    2454             : 
    2455             : //--------------------------------------------------------------------------
    2456             : 
    2457             : // Evaluate sigmaHat(sHat), part independent of incoming flavour.
    2458             : 
    2459             : void Sigma2ffbar2HposHneg::sigmaKin() {
    2460             : 
    2461             :   // Common kinematics factora.
    2462           0 :   double preFac = M_PI * pow2(alpEM) * ((uH * tH - s3 * s4) / sH2);
    2463           0 :   double propZ  = 1. / ( pow2(sH - m2Z) + pow2(mGammaZ) );
    2464             : 
    2465             :   // Separate parts for gamma*, interference and Z0.
    2466           0 :   gamSig    = preFac * 2. * pow2(eH) / sH2;
    2467           0 :   intSig    = preFac * 2. * eH * lH * thetaWRat * propZ * (sH - m2Z) / sH;
    2468           0 :   resSig    = preFac * pow2(lH * thetaWRat) * propZ;
    2469             : 
    2470           0 : }
    2471             : 
    2472             : //--------------------------------------------------------------------------
    2473             : 
    2474             : // Evaluate sigmaHat(sHat), including incoming flavour dependence.
    2475             : 
    2476             : double Sigma2ffbar2HposHneg::sigmaHat() {
    2477             : 
    2478             :   // Couplings for incoming flavour.
    2479           0 :   int idAbs    = abs(id1);
    2480           0 :   double eIn   = couplingsPtr->ef(idAbs);
    2481           0 :   double lIn   = couplingsPtr->lf(idAbs);
    2482           0 :   double rIn   = couplingsPtr->rf(idAbs);
    2483             : 
    2484             :   // Combine to total cross section. Colour factor.
    2485           0 :   double sigma = (pow2(eIn) * gamSig + eIn * (lIn + rIn) * intSig
    2486           0 :     + (pow2(lIn) + pow2(rIn)) * resSig) * openFrac;
    2487           0 :   if (idAbs < 9) sigma /= 3.;
    2488           0 :   return sigma;
    2489             : 
    2490           0 : }
    2491             : 
    2492             : //--------------------------------------------------------------------------
    2493             : 
    2494             : // Select identity, colour and anticolour.
    2495             : 
    2496             : void Sigma2ffbar2HposHneg::setIdColAcol() {
    2497             : 
    2498             :   // Flavours trivial
    2499           0 :   setId( id1, id2, 37, -37);
    2500             : 
    2501             :   // Colour flow topologies. Swap when antiquarks.
    2502           0 :   if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
    2503           0 :   else              setColAcol( 0, 0, 0, 0, 0, 0);
    2504           0 :   if (id1 < 0) swapColAcol();
    2505             : 
    2506           0 : }
    2507             : 
    2508             : //--------------------------------------------------------------------------
    2509             : 
    2510             : // Evaluate weight for decay angles.
    2511             : 
    2512             : double Sigma2ffbar2HposHneg::weightDecay( Event& process, int iResBeg,
    2513             :   int iResEnd) {
    2514             : 
    2515             :   // Identity of mother of decaying reseonance(s).
    2516           0 :   int idMother = process[process[iResBeg].mother1()].idAbs();
    2517             : 
    2518             :   // For Higgs decay hand over to standard routine.
    2519           0 :   if (idMother == 25 || idMother == 35 || idMother == 36)
    2520           0 :     return weightHiggsDecay( process, iResBeg, iResEnd);
    2521             : 
    2522             :   // For top decay hand over to standard routine.
    2523           0 :   if (idMother == 6)
    2524           0 :     return weightTopDecay( process, iResBeg, iResEnd);
    2525             : 
    2526             :   // Else done.
    2527           0 :   return 1.;
    2528             : 
    2529           0 : }
    2530             : 
    2531             : //==========================================================================
    2532             : 
    2533             : } // end namespace Pythia8

Generated by: LCOV version 1.11