stablejet is hosted by Hepforge, IPPP Durham
StableJet
SimpleEvent.cc
1 #include <cassert>
2 #include <cfloat>
3 #include <cmath>
4 
5 #include "SimpleEvent.hh"
6 #include "PythiaJetGun.hh"
7 
8 #include "geners/GenericIO.hh"
9 #include "geners/IOException.hh"
10 
11 using namespace geom3;
12 using namespace gs;
13 using namespace PythiaJetGun;
14 
15 bool SimulatedJet::write(std::ostream& of) const
16 {
17  parton.classId().write(of);
18  return parton.write(of) && write_item(of, jetParticles);
19 }
20 
21 void SimulatedJet::restore(const gs::ClassId& id, std::istream& in,
22  SimulatedJet* ptr)
23 {
24  static const ClassId myClassId(ClassId::makeId<SimulatedJet>());
25  myClassId.ensureSameId(id);
26 
27  ClassId partId(in, 1);
28  assert(ptr);
29  Particle::restore(partId, in, &ptr->parton);
30  restore_item(in, &ptr->jetParticles);
31 }
32 
33 rk::P4 SimulatedJet::jetSum() const
34 {
35  rk::P4 sum;
36  const unsigned npart = jetParticles.size();
37  for (unsigned j=0; j<npart; ++j)
38  sum += jetParticles[j].p4();
39  return sum;
40 }
41 
42 rk::P4 SimulatedJet::chargedSum() const
43 {
44  rk::P4 sum;
45  const unsigned npart = jetParticles.size();
46  for (unsigned j=0; j<npart; ++j)
47  if (jetParticles[j].charge() != 0.0)
48  sum += jetParticles[j].p4();
49  return sum;
50 }
51 
52 rk::P4 SimpleEvent::closestJet(const double eta, const double phi) const
53 {
54  const unsigned njets = size();
55  assert(njets);
56 
57  double bestDr = DBL_MAX;
58  rk::P4 bestJet;
59 
60  const geom3::UnitVector3 direction(cos(phi), sin(phi), sinh(eta));
61  for (unsigned i=0; i<njets; ++i)
62  {
63  const SimulatedJet& jet((*this)[i]);
64  rk::P4 jetSum(jet.jetSum());
65  const double dr = geom3::deltaR(direction, jetSum.momentum());
66  if (dr < bestDr)
67  {
68  bestDr = dr;
69  bestJet = jetSum;
70  }
71  }
72 
73  return bestJet;
74 }
75 
76 unsigned SimpleEvent::closestJetNumber(const unsigned thisJetNumber) const
77 {
78  rk::P4 thisSum(at(thisJetNumber).jetSum());
79  const double eta = thisSum.eta();
80  const double phi = thisSum.phi();
81  const unsigned njets = size();
82 
83  double bestDr = DBL_MAX;
84  unsigned bestJet = njets;
85 
86  const geom3::UnitVector3 direction(cos(phi), sin(phi), sinh(eta));
87  for (unsigned i=0; i<njets; ++i)
88  if (i != thisJetNumber)
89  {
90  const SimulatedJet& jet((*this)[i]);
91  rk::P4 jetSum(jet.jetSum());
92  const double dr = geom3::deltaR(direction, jetSum.momentum());
93  if (dr < bestDr)
94  {
95  bestDr = dr;
96  bestJet = i;
97  }
98  }
99 
100  return bestJet;
101 }
102 
103 double SimpleEvent::minDr() const
104 {
105  const unsigned njets = size();
106  if (njets < 2)
107  return 0.0;
108 
109  double dr, drmin = DBL_MAX;
110  for (unsigned i=0; i<njets-1; ++i)
111  {
112  const geom3::Vector3 p((*this)[i].jetSum().momentum());
113  for (unsigned j=i+1; j<njets; ++j)
114  {
115  dr = geom3::deltaR(p, (*this)[j].jetSum().momentum());
116  if (dr < drmin)
117  drmin = dr;
118  }
119  }
120  return drmin;
121 }
122 
123 bool SimpleEvent::operator==(const SimpleEvent& r) const
124 {
125  const unsigned n = size();
126  if (n != r.size())
127  return false;
128  for (unsigned i=0; i<n; ++i)
129  if ((*this)[i] != r[i])
130  return false;
131  return true;
132 }
133 
134 bool SimpleEvent::write(std::ostream& of) const
135 {
136  const unsigned sz = this->size();
137  write_pod(of, sz);
138 
139  if (sz)
140  {
141  const SimulatedJet* jets = &(*this)[0];
142  if (!jets->classId().write(of))
143  return false;
144  for (unsigned i=0; i<sz; ++i)
145  if (!jets[i].write(of))
146  return false;
147  }
148 
149  return !of.fail();
150 }
151 
152 void SimpleEvent::restore(const gs::ClassId& id, std::istream& in,
153  SimpleEvent* ptr)
154 {
155  static const ClassId myClassId(ClassId::makeId<SimpleEvent>());
156  myClassId.ensureSameId(id);
157 
158  assert(ptr);
159  ptr->clear();
160 
161  unsigned sz;
162  read_pod(in, &sz);
163 
164  if (sz)
165  {
166  ClassId clid(in, 1);
167  SimulatedJet jet;
168  for (unsigned i=0; i<sz; ++i)
169  {
170  SimulatedJet::restore(clid, in, &jet);
171  ptr->push_back(jet);
172  }
173  }
174 }
175 
176 bool phiAtRadius(const Particle& particle, const double B,
177  const double r, double *phi)
178 {
179  assert(r >= 0.0);
180  *phi = particle.p4().phi();
181  if (B == 0.0 || r == 0.0)
182  return true;
183  if (particle.charge() == 0.0)
184  return true;
185  const double a = particle.gyrationRadius(B);
186  const double twoa = 2.0*fabs(a);
187  if (r > twoa)
188  {
189  *phi = DBL_MAX;
190  return false;
191  }
192  if (r == twoa)
193  *phi += a/twoa*M_PI;
194  else
195  *phi += asin(r/2.0/a);
196  return true;
197 }