12 HEP::P4 PVtoH(
const Pythia8::Vec4 &pyv)
14 HEP::P4 newv(pyv.px(), pyv.py(), pyv.pz(), pyv.e());
20 Pythia8::Vec4 getMissingMomentum(Pythia8::Event &event)
22 Pythia8::Vec4 missingETvec;
23 std::vector<int> metaStableMothers;
25 for (
int i = 0; i <
event.size(); ++i) {
26 Pythia8::Particle ptc =
event[i];
27 if (!ptc.isFinal())
continue;
34 if (fabs(ptc.vProd().pz()) > 11000. || ptc.vProd().pT() > 7000.){
35 int mom = ptc.mother1();
37 if(std::find(metaStableMothers.begin(), metaStableMothers.end(), mom) == metaStableMothers.end()) {
38 metaStableMothers.push_back(mom);
45 if (ptc.idAbs() == 12 || ptc.idAbs() == 14 || ptc.idAbs() == 16){
47 missingETvec += ptc.p();
50 if (ptc.isHadron())
continue;
51 if (ptc.idAbs() == 22)
continue;
52 if (ptc.chargeType() !=0)
continue;
53 if (ptc.isVisible() && ptc.m() < 10.)
continue;
57 missingETvec += ptc.p();
61 for (
int imom = 0; imom < metaStableMothers.size(); ++imom) {
62 Pythia8::Particle ptc =
event[metaStableMothers[imom]];
66 if (ptc.idAbs() == 12 || ptc.idAbs() == 14 || ptc.idAbs() == 16){
68 missingETvec += ptc.p();
71 if (ptc.isHadron())
continue;
72 if (ptc.idAbs() == 22)
continue;
73 if (ptc.chargeType() !=0)
continue;
74 if (ptc.isVisible() && ptc.m() < 10.)
continue;
78 missingETvec += ptc.p();
86 void simplecalcMissingMomentum(
HEP::Event &OutEvt, std::mt19937 &engine)
93 pmiss+=invisible->mom();
103 bool isLLP(Pythia8::Particle *particle,
const Pythia8::Event &event)
106 if (particle->isHadron())
return false;
110 if (fabs(particle->m()) < 20.)
return false;
112 if (particle->isFinal())
return true;
114 Pythia8::Vec4 decayVertex = particle->vDec();
115 if(decayVertex.pAbs() < 0.001)
return false;
117 std::vector<int> daughters = particle->daughterListRecursive();
118 for (
int i = 0; i < daughters.size(); ++i){
119 int idaughter = daughters[i];
120 Pythia8::Particle daughterParticle =
event[idaughter];
121 if (daughterParticle.id() == particle->id())
return false;
128 bool isHSCP(Pythia8::Particle *particle,
const Pythia8::Event &event)
133 if (!particle->isCharged())
return false;
135 if (particle->colType() != 0)
return false;
136 if (particle->isHadron())
return false;
138 if (fabs(particle->m()) < 20.)
return false;
140 std::vector<int> daughters = particle->daughterListRecursive();
141 for (
int i = 0; i < daughters.size(); ++i){
142 int idaughter = daughters[i];
143 Pythia8::Particle daughterParticle =
event[idaughter];
144 if (daughterParticle.id() == particle->id())
return false;
151 bool decayBeforeEndHcal(Pythia8::Particle &particle)
154 if (particle.isFinal()){
return false;}
155 Pythia8::Vec4 decayVertex = particle.vDec();
156 if (decayVertex.pT() < 3.9e3 && abs(decayVertex.pz()) < 6.1e3){
return true;}
161 bool decayInsideAtlas(Pythia8::Particle &particle)
164 if (particle.isFinal()){
return false;}
165 Pythia8::Vec4 decayVertex = particle.vDec();
166 if (decayVertex.pT() < 12e3 && abs(decayVertex.pz()) < 23e3){
return true;}
171 bool ischargedTrackHadron(Pythia8::Particle* particle,
const Pythia8::Event &event)
173 if(!particle->isHadron()) {
return false;}
174 if(!particle->isCharged()) {
return false;}
176 Pythia8::Vec4 prodVertex = particle->vProd();
178 if( (prodVertex.pT() > 200.) || (abs(prodVertex.pz()) > 270.)) {
return false;}
180 if(particle->isFinal())
186 std::vector<int> daughters = particle->daughterListRecursive();
187 for (
int i = 0; i < daughters.size(); i++){
188 int idaughter = daughters[i];
189 const Pythia8::Particle* daughterParticle = &
event[idaughter];
190 if (daughterParticle->id() == particle->id())
return false;
193 if( (particle->vDec().pT() < 300.0) ){
return false;}
215 inline bool fromHadron(
int n,
const Pythia8::Event &evt) {
217 if (n == 0)
return false;
218 const Pythia8::Particle* p = &evt[n];
219 if (p->isParton())
return false;
220 if (p->isHadron())
return true;
223 for (
int mm : p->motherList()) {
225 if (fromHadron(mm, evt))
return true;
250 for(
int npart = 0; npart<
event.size(); npart++)
252 Pythia8::Particle* prt = &
event[npart];
264 if(prt->isHadron() && prt->isVisible())
269 Pythia8::Vec4 pos = prt->vProd();
270 if (pos.pAbs() > 0.0001)
272 newpart->set_prod(
HEP::P4(pos.px(),pos.py(),pos.pz(),pos.e()));
274 newpart->set_3Q(prt->chargeType());
277 if(newpart->
pT() > 1.0)
279 newPuE->add_charged_hadron(newpart);
288 newPuE->add_neutral_hadron(newpart->
mom());
298 Pythia8::Vec4 pos = prt->vProd();
301 if (pos.pAbs() > 0.0001)
303 newpart->set_prod(
HEP::P4(pos.px(),pos.py(),pos.pz(),pos.e()));
306 newpart->set_3Q(prt->chargeType());
307 newPuE->add_particle(newpart);
330 if(ischargedTrackHadron(prt,event))
333 Pythia8::Vec4 pos = prt->vProd();
334 Pythia8::Vec4 vdec = prt->vDec();
335 if(vdec.pT() < 33.0)
continue;
337 if (pos.pAbs() > 0.0001)
339 newpart->set_prod(
HEP::P4(pos.px(),pos.py(),pos.pz(),pos.e()));
341 newpart->set_decay(
HEP::P4(vdec.px(),vdec.py(),vdec.pz(),vdec.e()));
342 newpart->set_3Q(prt->chargeType());
345 newPuE->add_charged_hadron(newpart);
Simple event class, separating particles into classes.
Definition: heputil.h:227
void set_missingmom(const P4 &pmiss)
Set the missing momentum vector.
Definition: heputil.h:736
const std::vector< Particle * > & invisible_particles() const
Get invisible final state particles.
Definition: heputil.h:641
A 4-momentum class for vectors.
Definition: Vectors.h:45
void clear()
Set the components to zero.
Definition: Vectors.h:82
Definition: Particle.h:24
const P4 & mom() const
Get the 4 vector.
Definition: Particle.h:109
void set_prompt(bool isprompt=true)
Set promptness.
Definition: Particle.h:178
double pT() const
Get the squared transverse momentum.
Definition: Particle.h:165