rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CDF_1996_S3349578

Further properties of high-mass multijet events
Experiment: CDF (Tevatron Run 1)
Inspire ID: 418504
Status: VALIDATED
Authors:
  • Frank Siegert
References: Beams: p- p+
Beam energies: (900.0, 900.0) GeV
Run details:
  • Pure QCD events without underlying event (the paper states that UE was corrected for). Several runs with different kinematic cuts might be needed to fill the 2,3,4,5 and 6-jet properly.

Multijet distributions corresponding to ($4N-4$) variables that span the $N$-body parameter space in inclusive $N = 3$-, 4-, and 5-jet events.

Source code: CDF_1996_S3349578.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/FastJets.hh"
  5#include "Rivet/Projections/SmearedJets.hh"
  6
  7namespace Rivet {
  8
  9
 10  /// @brief CDF properties of high-mass multi-jet events
 11  class CDF_1996_S3349578 : public Analysis {
 12  public:
 13
 14    RIVET_DEFAULT_ANALYSIS_CTOR(CDF_1996_S3349578);
 15
 16
 17    /// @name Analysis methods
 18    //@{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22
 23      /// Initialise and register projections here
 24      const FinalState fs(Cuts::abseta < 4.2);
 25      FastJets fj(fs, FastJets::CDFJETCLU, 0.7);
 26      declare(fj, "Jets");
 27
 28      // Smear energy and mass with the 10% uncertainty quoted in the paper
 29      SmearedJets sj_E(fj, [](const Jet& jet){ return P4_SMEAR_MASS_GAUSS(P4_SMEAR_E_GAUSS(jet, 0.1*jet.E()), 0.1*jet.mass()); });
 30      declare(sj_E, "SmearedJets");
 31
 32      /// Book histograms here, e.g.:
 33      book(_h_3_mNJ ,1, 1, 1);
 34      book(_h_3_X3 ,2, 1, 1);
 35      book(_h_3_X4 ,3, 1, 1);
 36      book(_h_3_costheta3 ,8, 1, 1);
 37      book(_h_3_psi3 ,9, 1, 1);
 38      book(_h_3_f3 ,14, 1, 1);
 39      book(_h_3_f4 ,14, 1, 2);
 40      book(_h_3_f5 ,14, 1, 3);
 41
 42      book(_h_4_mNJ ,1, 1, 2);
 43      book(_h_4_X3 ,4, 1, 1);
 44      book(_h_4_X4 ,5, 1, 1);
 45      book(_h_4_costheta3 ,10, 1, 1);
 46      book(_h_4_psi3 ,11, 1, 1);
 47      book(_h_4_f3 ,15, 1, 1);
 48      book(_h_4_f4 ,15, 1, 2);
 49      book(_h_4_f5 ,15, 1, 3);
 50      book(_h_4_XA ,17, 1, 1);
 51      book(_h_4_psiAB ,19, 1, 1);
 52      book(_h_4_fA ,21, 1, 1);
 53      book(_h_4_fB ,21, 1, 2);
 54
 55      book(_h_5_mNJ ,1, 1, 3);
 56      book(_h_5_X3 ,6, 1, 1);
 57      book(_h_5_X4 ,7, 1, 1);
 58      book(_h_5_costheta3 ,12, 1, 1);
 59      book(_h_5_psi3 ,13, 1, 1);
 60      book(_h_5_f3 ,16, 1, 1);
 61      book(_h_5_f4 ,16, 1, 2);
 62      book(_h_5_f5 ,16, 1, 3);
 63      book(_h_5_XA ,18, 1, 1);
 64      book(_h_5_XC ,18, 1, 2);
 65      book(_h_5_psiAB ,20, 1, 1);
 66      book(_h_5_psiCD ,20, 1, 2);
 67      book(_h_5_fA ,22, 1, 1);
 68      book(_h_5_fB ,23, 1, 1);
 69      book(_h_5_fC ,24, 1, 1);
 70      book(_h_5_fD ,25, 1, 1);
 71    }
 72
 73
 74    void analyze(const Event& event) {
 75      Jets jets;
 76      FourMomentum jetsystem(0.0, 0.0, 0.0, 0.0);
 77      for (const Jet& jet : apply<JetAlg>(event, "SmearedJets").jets(Cuts::Et > 20.0*GeV, cmpMomByEt)) {
 78        bool separated = true;
 79        for (const Jet& ref : jets) {
 80          if (deltaR(jet, ref) < 0.9) {
 81            separated = false;
 82            break;
 83          }
 84        }
 85        if (!separated) continue;
 86        jets.push_back(jet);
 87        jetsystem += jet.momentum();
 88        if (jets.size() >= 5) break;
 89      }
 90
 91      if (jets.size() > 4) {
 92        _fiveJetAnalysis(jets);
 93        jets.resize(4);
 94      }
 95      if (jets.size() > 3) {
 96        _fourJetAnalysis(jets);
 97        jets.resize(3);
 98      }
 99      if (jets.size() > 2) {
100        _threeJetAnalysis(jets);
101      }
102    }
103
104
105    void _threeJetAnalysis(const Jets& jets) {
106      MSG_DEBUG("3 jet analysis");
107
108      double sumEt = 0.0;
109      FourMomentum jetsystem(0.0, 0.0, 0.0, 0.0);
110      for (const Jet& jet : jets) {
111        sumEt += jet.Et();
112        jetsystem += jet.momentum();
113      }
114      if (sumEt < 420.0*GeV) return;
115
116      const double m3J = _safeMass(jetsystem);
117      if (m3J < 600*GeV) return;
118
119      const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(jetsystem.betaVec());
120      vector<FourMomentum> jets3;
121      for (Jet jet : jets) {
122        jets3.push_back(cms_boost.transform(jet.momentum()));
123      }
124      std::sort(jets3.begin(), jets3.end(), FourMomentum::byEDescending());
125      FourMomentum p3(jets3[0]), p4(jets3[1]), p5(jets3[2]);
126
127      FourMomentum pAV = cms_boost.transform(_avg_beam_in_lab(m3J, jetsystem.rapidity()));
128      double costheta3 = pAV.p3().unit().dot(p3.p3().unit());
129      if (fabs(costheta3) > 0.6) return;
130
131      double X3 = 2.0*p3.E()/m3J;
132      if (X3 > 0.9) return;
133
134      const double X4 = 2.0*p4.E()/m3J;
135      const double psi3 = _psi(p3, pAV, p4, p5);
136      const double f3 = _safeMass(p3)/m3J;
137      const double f4 = _safeMass(p4)/m3J;
138      const double f5 = _safeMass(p5)/m3J;
139
140      _h_3_mNJ->fill(m3J);
141      _h_3_X3->fill(X3);
142      _h_3_X4->fill(X4);
143      _h_3_costheta3->fill(costheta3);
144      _h_3_psi3->fill(psi3);
145      _h_3_f3->fill(f3);
146      _h_3_f4->fill(f4);
147      _h_3_f5->fill(f5);
148
149    }
150
151
152    void _fourJetAnalysis(const Jets& jets) {
153      MSG_DEBUG("4 jet analysis");
154
155      double sumEt=0.0;
156      FourMomentum jetsystem(0.0, 0.0, 0.0, 0.0);
157      for (const Jet& jet : jets) {
158        sumEt+=jet.Et();
159        jetsystem+=jet.momentum();
160      }
161      if (sumEt < 420.0*GeV) return;
162
163      const double m4J = _safeMass(jetsystem);
164      if (m4J < 650*GeV) return;
165
166      const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(jetsystem.betaVec());
167      vector<FourMomentum> jets4;
168      for (Jet jet : jets) {
169        jets4.push_back(cms_boost.transform(jet.momentum()));
170      }
171      std::sort(jets4.begin(), jets4.end(), FourMomentum::byEDescending());
172
173      FourMomentum pA, pB;
174      vector<FourMomentum> jets3(_reduce(jets4, pA, pB));
175      std::sort(jets3.begin(), jets3.end(), FourMomentum::byEDescending());
176      FourMomentum p3(jets3[0]);
177      FourMomentum p4(jets3[1]);
178      FourMomentum p5(jets3[2]);
179
180      FourMomentum pAV = cms_boost.transform(_avg_beam_in_lab(m4J, jetsystem.rapidity()));
181      double costheta3=pAV.p3().unit().dot(p3.p3().unit());
182      if (fabs(costheta3)>0.8) {
183        return;
184      }
185
186      const double X3 = 2.0*p3.E()/m4J;
187      if (X3>0.9) {
188        return;
189      }
190
191      // fill histograms
192      const double X4 = 2.0*p4.E()/m4J;
193      const double psi3 = _psi(p3, pAV, p4, p5);
194      const double f3 = _safeMass(p3)/m4J;
195      const double f4 = _safeMass(p4)/m4J;
196      const double f5 = _safeMass(p5)/m4J;
197      const double fA = _safeMass(pA)/m4J;
198      const double fB = _safeMass(pB)/m4J;
199      const double XA = pA.E()/(pA.E()+pB.E());
200      const double psiAB = _psi(pA, pB, pA+pB, pAV);
201
202      _h_4_mNJ->fill(m4J);
203      _h_4_X3->fill(X3);
204      _h_4_X4->fill(X4);
205      _h_4_costheta3->fill(costheta3);
206      _h_4_psi3->fill(psi3);
207      _h_4_f3->fill(f3);
208      _h_4_f4->fill(f4);
209      _h_4_f5->fill(f5);
210      _h_4_XA->fill(XA);
211      _h_4_psiAB->fill(psiAB);
212      _h_4_fA->fill(fA);
213      _h_4_fB->fill(fB);
214    }
215
216
217    void _fiveJetAnalysis(const Jets& jets) {
218      MSG_DEBUG("5 jet analysis");
219
220      double sumEt=0.0;
221      FourMomentum jetsystem(0.0, 0.0, 0.0, 0.0);
222      for (const Jet& jet : jets) {
223        sumEt+=jet.Et();
224        jetsystem+=jet.momentum();
225      }
226      if (sumEt < 420.0*GeV) return;
227
228      const double m5J = _safeMass(jetsystem);
229      if (m5J < 750*GeV) return;
230
231      const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(jetsystem.betaVec());
232      vector<FourMomentum> jets5;
233      for (Jet jet : jets) {
234        jets5.push_back(cms_boost.transform(jet.momentum()));
235      }
236      std::sort(jets5.begin(), jets5.end(), FourMomentum::byEDescending());
237
238      FourMomentum pC, pD;
239      vector<FourMomentum> jets4(_reduce(jets5, pC, pD));
240      std::sort(jets4.begin(), jets4.end(), FourMomentum::byEDescending());
241
242      FourMomentum pA, pB;
243      vector<FourMomentum> jets3(_reduce(jets4, pA, pB));
244      std::sort(jets3.begin(), jets3.end(), FourMomentum::byEDescending());
245      FourMomentum p3(jets3[0]);
246      FourMomentum p4(jets3[1]);
247      FourMomentum p5(jets3[2]);
248
249      // fill histograms
250      FourMomentum pAV = cms_boost.transform(_avg_beam_in_lab(m5J, jetsystem.rapidity()));
251      const double costheta3 = pAV.p3().unit().dot(p3.p3().unit());
252      const double X3 = 2.0*p3.E()/m5J;
253      const double X4 = 2.0*p4.E()/m5J;
254      const double psi3 = _psi(p3, pAV, p4, p5);
255      const double f3 = _safeMass(p3)/m5J;
256      const double f4 = _safeMass(p4)/m5J;
257      const double f5 = _safeMass(p5)/m5J;
258      const double fA = _safeMass(pA)/m5J;
259      const double fB = _safeMass(pB)/m5J;
260      const double XA = pA.E()/(pA.E()+pB.E());
261      const double psiAB = _psi(pA, pB, pA+pB, pAV);
262      const double fC = _safeMass(pC)/m5J;
263      const double fD = _safeMass(pD)/m5J;
264      const double XC = pC.E()/(pC.E()+pD.E());
265      const double psiCD = _psi(pC, pD, pC+pD, pAV);
266
267      _h_5_mNJ->fill(m5J);
268      _h_5_X3->fill(X3);
269      _h_5_X4->fill(X4);
270      _h_5_costheta3->fill(costheta3);
271      _h_5_psi3->fill(psi3);
272      _h_5_f3->fill(f3);
273      _h_5_f4->fill(f4);
274      _h_5_f5->fill(f5);
275      _h_5_XA->fill(XA);
276      _h_5_psiAB->fill(psiAB);
277      _h_5_fA->fill(fA);
278      _h_5_fB->fill(fB);
279      _h_5_XC->fill(XC);
280      _h_5_psiCD->fill(psiCD);
281      _h_5_fC->fill(fC);
282      _h_5_fD->fill(fD);
283    }
284
285
286    /// Normalise histograms etc., after the run
287    void finalize() {
288
289      /// Normalise, scale and otherwise manipulate histograms here
290      normalize(_h_3_mNJ, 1.0);
291      normalize(_h_3_X3, 1.0);
292      normalize(_h_3_X4, 1.0);
293      normalize(_h_3_costheta3, 1.0);
294      normalize(_h_3_psi3, 1.0);
295      normalize(_h_3_f3, 1.0);
296      normalize(_h_3_f4, 1.0);
297      normalize(_h_3_f5, 1.0);
298
299      normalize(_h_4_mNJ, 1.0);
300      normalize(_h_4_X3, 1.0);
301      normalize(_h_4_X4, 1.0);
302      normalize(_h_4_costheta3, 1.0);
303      normalize(_h_4_psi3, 1.0);
304      normalize(_h_4_f3, 1.0);
305      normalize(_h_4_f4, 1.0);
306      normalize(_h_4_f5, 1.0);
307      normalize(_h_4_XA, 1.0);
308      normalize(_h_4_psiAB, 1.0);
309      normalize(_h_4_fA, 1.0);
310      normalize(_h_4_fB, 1.0);
311
312      normalize(_h_5_mNJ, 1.0);
313      normalize(_h_5_X3, 1.0);
314      normalize(_h_5_X4, 1.0);
315      normalize(_h_5_costheta3, 1.0);
316      normalize(_h_5_psi3, 1.0);
317      normalize(_h_5_f3, 1.0);
318      normalize(_h_5_f4, 1.0);
319      normalize(_h_5_f5, 1.0);
320      normalize(_h_5_XA, 1.0);
321      normalize(_h_5_XC, 1.0);
322      normalize(_h_5_psiAB, 1.0);
323      normalize(_h_5_psiCD, 1.0);
324      normalize(_h_5_fA, 1.0);
325      normalize(_h_5_fB, 1.0);
326      normalize(_h_5_fC, 1.0);
327      normalize(_h_5_fD, 1.0);
328
329    }
330
331    //@}
332
333
334  private:
335
336    vector<FourMomentum> _reduce(const vector<FourMomentum>& jets, FourMomentum& combined1, FourMomentum& combined2) {
337      double minMass2 = 1e9;
338      size_t idx1(jets.size()), idx2(jets.size());
339      for (size_t i=0; i<jets.size(); ++i) {
340        for (size_t j=i+1; j<jets.size(); ++j) {
341          double mass2 = FourMomentum(jets[i]+jets[j]).mass2();
342          if (mass2<minMass2) {
343            idx1=i;
344            idx2=j;
345          }
346        }
347      }
348      vector<FourMomentum> newjets;
349      for (size_t i=0; i<jets.size(); ++i) {
350        if (i!=idx1 && i!=idx2) newjets.push_back(jets[i]);
351      }
352      newjets.push_back(jets[idx1]+jets[idx2]);
353      combined1 = jets[idx1];
354      combined2 = jets[idx2];
355      return newjets;
356    }
357
358
359    FourMomentum _avg_beam_in_lab(const double& m, const double& y) {
360      const double mt = m/2.0;
361      FourMomentum beam1(mt, 0, 0, mt);
362      FourMomentum beam2(mt, 0, 0, -mt);
363      if (fabs(y)>1e-3) {
364        FourMomentum boostvec(cosh(y), 0.0, 0.0, sinh(y));
365        const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(boostvec.betaVec()).inverse();
366        beam1 = cms_boost.transform(beam1);
367        beam2 = cms_boost.transform(beam2);
368      }
369      return (beam1.E() > beam2.E()) ? beam1-beam2 : beam2-beam1;
370    }
371
372
373    double _psi(const FourMomentum& p1, const FourMomentum& p2,
374                const FourMomentum& p3, const FourMomentum& p4) {
375      Vector3 p1xp2 = p1.p3().cross(p2.p3());
376      Vector3 p3xp4 = p3.p3().cross(p4.p3());
377      return mapAngle0ToPi(acos(p1xp2.unit().dot(p3xp4.unit())));
378    }
379
380
381    double _safeMass(const FourMomentum& p) {
382      double mass2=p.mass2();
383      if (mass2>0.0) return sqrt(mass2);
384      else if (mass2<-1.0e-5) {
385        MSG_WARNING("m2 = " << m2 << ". Assuming m2=0.");
386        return 0.0;
387      }
388      else return 0.0;
389    }
390
391
392  private:
393
394    /// @name Histograms
395    //@{
396    Histo1DPtr _h_3_mNJ;
397    Histo1DPtr _h_3_X3;
398    Histo1DPtr _h_3_X4;
399    Histo1DPtr _h_3_costheta3;
400    Histo1DPtr _h_3_psi3;
401    Histo1DPtr _h_3_f3;
402    Histo1DPtr _h_3_f4;
403    Histo1DPtr _h_3_f5;
404
405    Histo1DPtr _h_4_mNJ;
406    Histo1DPtr _h_4_X3;
407    Histo1DPtr _h_4_X4;
408    Histo1DPtr _h_4_costheta3;
409    Histo1DPtr _h_4_psi3;
410    Histo1DPtr _h_4_f3;
411    Histo1DPtr _h_4_f4;
412    Histo1DPtr _h_4_f5;
413    Histo1DPtr _h_4_XA;
414    Histo1DPtr _h_4_psiAB;
415    Histo1DPtr _h_4_fA;
416    Histo1DPtr _h_4_fB;
417
418    Histo1DPtr _h_5_mNJ;
419    Histo1DPtr _h_5_X3;
420    Histo1DPtr _h_5_X4;
421    Histo1DPtr _h_5_costheta3;
422    Histo1DPtr _h_5_psi3;
423    Histo1DPtr _h_5_f3;
424    Histo1DPtr _h_5_f4;
425    Histo1DPtr _h_5_f5;
426    Histo1DPtr _h_5_XA;
427    Histo1DPtr _h_5_XC;
428    Histo1DPtr _h_5_psiAB;
429    Histo1DPtr _h_5_psiCD;
430    Histo1DPtr _h_5_fA;
431    Histo1DPtr _h_5_fB;
432    Histo1DPtr _h_5_fC;
433    Histo1DPtr _h_5_fD;
434    //@}
435
436  };
437
438
439
440  RIVET_DECLARE_ALIASED_PLUGIN(CDF_1996_S3349578, CDF_1996_I418504);
441
442}