stablejet is hosted by Hepforge, IPPP Durham
StableJet
TransverseFuzzinessCalculator.cc
1 #include <cmath>
2 #include <cassert>
3 
4 #include "TransverseFuzzinessCalculator.h"
5 
6 namespace stab {
7  double TransverseFuzzinessCalculator::calculate(
8  const Event &initialParticles,
9  const Event &finalJets,
10  const double *weights,
11  const unsigned nJets, const unsigned nParts,
12  const bool lastFinalJetIsUnclustered,
13  double *jetFuzziness, const unsigned lenJetFuzziness) const
14  {
15  assert(weights);
16  assert(nJets);
17  assert(nParts);
18  assert(initialParticles.size() >= nParts);
19  assert(finalJets.size() >= nJets);
20  assert(jetFuzziness);
21  assert(lenJetFuzziness >= nJets);
22 
23  if (ptStorage_.size() < nParts)
24  ptStorage_.resize(nParts);
25  double* ptValues = &ptStorage_[0];
26  long double ptSum = 0.0L;
27  for (unsigned i=0; i<nParts; ++i)
28  {
29  const double pt = initialParticles[i].pt();
30  ptValues[i] = pt;
31  ptSum += pt;
32  }
33  assert(ptSum > 0.0L);
34 
35  double eventFuzzinesContribution;
36  long double fuzzySum = 0.0L;
37  for (unsigned i=0; i<nJets; ++i)
38  {
39  jetFuzziness[i] = 0.0;
40  eventFuzzinesContribution = 0.0;
41  singleJetFuzziness(ptValues, weights + i*nParts, nParts,
42  jetFuzziness+i, &eventFuzzinesContribution);
43  if ( addInQuadrature_ ) fuzzySum += eventFuzzinesContribution*eventFuzzinesContribution;
44  else fuzzySum += eventFuzzinesContribution;
45  }
46 
47  if (divideByNjets_)
48  fuzzySum /= nJets;
49  if ( addInQuadrature_)
50  fuzzySum = std::sqrt(fuzzySum);
51  if (divideByPt_)
52  fuzzySum /= ptSum;
53 
54  return fuzzySum;
55  }
56 
57  void TransverseFuzzinessCalculator::singleJetFuzziness(
58  const double *ptValues, const double *weights, const unsigned len,
59  double* thisJetFuzzines, double* eventFuzzinesContribution) const
60  {
61  long double numSum = 0.0L, denomSum = 0.0L;
62 
63  double sumW = 0.0;
64 
65  for (unsigned i=0; i<len; ++i)
66  {
67  const double w = weights[i];
68  sumW += w;
69  if (w > 0.0)
70  {
71  assert(ptValues[i]>0.0L);
72  assert(w <= 1.0);
73  const double weightedPt = w*ptValues[i];
74  denomSum += weightedPt;
75  numSum += weightedPt*(1.0 - w)*ptValues[i];
76  assert(denomSum > 0.0L);
77  }
78  }
79  if ( sumW == 0. ) {
80  *eventFuzzinesContribution=0.;
81  return ;
82  }
83  assert( sumW > 0. );
84  assert(denomSum > 0.0L);
85 
86  const double eUncert = sqrt(static_cast<double>(numSum));
87  *thisJetFuzzines = eUncert/static_cast<double>(denomSum);
88 
89  if (divideByPt_)
90  *eventFuzzinesContribution = eUncert;
91  else
92  *eventFuzzinesContribution = *thisJetFuzzines;
93  }
94 }