ATLAS Offline Software
Loading...
Searching...
No Matches
Sigma2qqbar2lStarlBar.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Single excited lepton production - similar to original pythia8 code,
6// but polarization of final state is reversed [to match Calchep distributions
7
9
10#include <iostream>
11#include <vector>
12
13namespace Pythia8 {
21}
22
23// This one line registers this process with the factory
24// An instance of this process can be created with
25// UserProcessFactory::create("qqbar2lStarlBar")
32
33namespace Pythia8 {
34
35 //**************************************************************************
36
37 // Sigma2qqbar2lStarlBar class.
38 // Cross section for q qbar -> lStar lBar
39
40 class Sigma2qqbar2lStarlBar: public Sigma2Process {
41
42 public:
43 //Constructor.
44 Sigma2qqbar2lStarlBar(int idlIn) : idl(idlIn),
45 idRes(0), codeSave(0),
46 Lambda(0.), preFac(0.), openFracPos(0.), openFracNeg(0.), sigma(0.), m2ResTimes4(0.){};
47
48 //*********
49
50 // Initialize process.
51
52 void initProc() {
53
54 // Set up process properties from the chosen lepton flavour.
55 idRes = 4000000 + idl;
56 codeSave = 4060 + idl;
57 if (idl == 11) nameSave = "q qbar -> e^*+- e^-+";
58 else if (idl == 12) nameSave = "q qbar -> nu_e^* nu_ebar";
59 else if (idl == 13) nameSave = "q qbar -> mu^*+- mu^-+";
60 else if (idl == 14) nameSave = "q qbar -> nu_mu^* nu_mubar";
61 else if (idl == 15) nameSave = "q qbar -> tau^*+- tau^-+";
62 else nameSave = "q qbar -> nu_tau^* nu_taubar";
63
64 // Secondary open width fractions.
65 openFracPos = particleDataPtr->resOpenFrac( idRes);
66 openFracNeg = particleDataPtr->resOpenFrac(-idRes);
67
68 // Locally stored properties and couplings.
69 Lambda = settingsPtr->parm("ExcitedFermion:Lambda");
70 preFac = (M_PI / pow4(Lambda)) * (openFracPos + openFracNeg) / 3.; // orig pythia
71 //preFac = (M_PI / pow4(Lambda)) * (openFracPos + openFracNeg) / 6.;
72
73 }
74
75 //*********
76 // Evaluate sigmaHat(sHat).
77 virtual double sigmaHat() {return sigma;}
78
79
80 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
81
82 void sigmaKin() {
83
84 // later this gets multiplied further with sH*(1-s3/sH)
85
86 sigma = preFac * (-uH) * (sH + tH) / sH2; // orig pythia
87 //sigma = preFac * (2. + s3/sH) *(1 - s3/sH) ;
88 //Baur sigma = preFac * ( 1 + 1./3.*(sH - s3)/(sH+s3) ) * (1 - s3/sH) * (1 + s3/sH);
89 }
90
91 //*********
92
93 // Select identity, colour and anticolour.
94
95 void setIdColAcol() {
96
97 // Flavours: either lepton or antilepton may be excited.
98 if (rndmPtr->flat() * (openFracPos + openFracNeg) < openFracPos) {
99 setId( id1, id2, idRes, -idl);
100 if (id1 < 0) swapTU = true;
101 } else {
102 setId( id1, id2, -idRes, idl);
103 if (id1 > 0) swapTU = true;
104 }
105
106 // Colour flow trivial.
107 if (id1 > 0) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
108 else setColAcol( 0, 1, 1, 0, 0, 0, 0, 0);
109
110 }
111
112 //**************************************************************************
113
114 double weightDecay( Event& process, int iResBeg,
115 int iResEnd) {
116
117 // l* should sit in entry 5. and 6 Sequential Z/W decay assumed isotropic.
118 if (iResBeg != 5 && iResEnd != 5 && iResBeg != 6 && iResEnd != 6 ) return 1.;
119
120 // Phase space factors.
121 double mr1 = pow2(process[7].m() / process[5].m());
122 double mr2 = pow2(process[8].m() / process[5].m());
123
124 // Reconstruct decay angle in l* CoM frame.
125 int idAbs3 = process[7].idAbs();
126 Vec4 pLStarCom = (idAbs3 < 20) ? process[8].p() : process[7].p();
127 //Vec4 pLStarCom = (idAbs3 < 20) ? process[7].p() : process[8].p(); // orig pythia
128 pLStarCom.bstback(process[5].p());
129 double cosThe = costheta(pLStarCom, process[5].p());
130 double wt = 1.;
131
132 // Decay, l* -> l + gamma/Z^0/W^+-).
133 int idBoson = (idAbs3 < 20) ? process[8].idAbs() : process[7].idAbs();
134 if (idBoson == 22) {
135 wt = 0.5 * (1. + cosThe);
136 } else if (idBoson == 23 || idBoson == 24) {
137 double mrB = (idAbs3 < 20) ? mr2 : mr1;
138 double kTrm = 0.5 * (mrB * (1. - cosThe));
139 wt = (1. + cosThe + kTrm) / (2 + mrB);
140 }
141
142 // Done.
143 return wt;
144 }
145
146 // Info on the subprocess.
147 virtual std::string name() const {return nameSave;}
148 virtual int code() const {return codeSave;}
149 virtual std::string inFlux() const {return "qqbarSame";}
150 virtual int id3Mass() const {return std::abs(idRes);}
151
152 //virtual bool convertM2() const {return false;} //true is only suitable for resonance production pp->A->ll
153 //virtual bool convert2mb() const {return true;}
154
155 // Parameters set at initialization or for current kinematics.
157 std::string nameSave;
160 };
161 //**************************************************************************
186
187}
#define M_PI
HWIdentifier id2
Pythia8_UserProcess::UserProcessFactory::Creator< Pythia8::Sigma2qqbar2nueStarnueBar > qqbar2nueStarnueBarCreator("qqbar2nueStarnueBar")
Pythia8_UserProcess::UserProcessFactory::Creator< Pythia8::Sigma2qqbar2nutauStarnutauBar > qqbar2nutauStarnutauBarCreator("qqbar2nutauStarnutauBar")
Pythia8_UserProcess::UserProcessFactory::Creator< Pythia8::Sigma2qqbar2eStareBar > qqbar2eStareBarCreator("qqbar2eStareBar")
Pythia8_UserProcess::UserProcessFactory::Creator< Pythia8::Sigma2qqbar2numuStarnumuBar > qqbar2numuStarnumuBarCreator("qqbar2numuStarnumuBar")
Pythia8_UserProcess::UserProcessFactory::Creator< Pythia8::Sigma2qqbar2muStarmuBar > qqbar2muStarmuBarCreator("qqbar2muStarmuBar")
Pythia8_UserProcess::UserProcessFactory::Creator< Pythia8::Sigma2qqbar2tauStartauBar > qqbar2tauStartauBarCreator("qqbar2tauStartauBar")
static const std::map< unsigned int, unsigned int > pow2
virtual std::string inFlux() const
double weightDecay(Event &process, int iResBeg, int iResEnd)
const std::string process
Author: James Monk (jmonk@cern.ch)