Rivet analyses referenceCMS_2017_I1511284Measurement of the inclusive energy spectrum in the very forward direction in proton-proton collisions at 13 TeVExperiment: CMS (LHC) Inspire ID: 1511284 Status: VALIDATED Authors:
Beams: p+ p+ Beam energies: (6500.0, 6500.0) GeV Run details:
The differential cross section for inclusive particle production as a function of energy in proton-proton collisions at a center-of-mass energy of 13 TeV is measured in the very forward region of the CMS detector. The measurement is based on data collected with the CMS apparatus at the LHC, and corresponds to an integrated luminosity of 0.35 inverse microbarns. The energy is measured in the CASTOR calorimeter, which covers the pseudorapidity region −6.6<η<−5.2. The results are given as a function of the total energy deposited in CASTOR, as well as of its electromagnetic and hadronic components. The spectra are sensitive to the modeling of multiparton interactions in pp collisions, and provide new constraints for hadronic interaction models used in collider and in high energy cosmic ray physics. Source code: CMS_2017_I1511284.cc 1#include "Rivet/Analysis.hh"
2#include "Rivet/Projections/FinalState.hh"
3
4namespace Rivet {
5
6
7 /// Measurement of the inclusive energy spectrum in the very forward direction in pp collisions at 13 TeV
8 class CMS_2017_I1511284 : public Analysis {
9 public:
10
11 /// Constructor
12 CMS_2017_I1511284()
13 : Analysis("CMS_2017_I1511284")
14 { }
15
16
17 /// Book histograms and initialise projections
18 void init() {
19 declare(FinalState(), "FS");
20
21 book(_h_totEnergy, 1, 1, 1);
22 book(_h_emEnergy , 2, 1, 1);
23 book(_h_hadEnergy, 3, 1, 1);
24 }
25
26
27 /// Perform the per-event analysis
28 void analyze(const Event& event) {
29
30 const Particles fsparticles = apply<FinalState>(event, "FS").particles(cmpMomByRap);
31 if (fsparticles.size() < 2) vetoEvent; // need at least two particles to calculate gaps
32
33 double gapCenter = 0,largestGap = 0;
34 double previousRapidity = fsparticles.front().rapidity();
35 for (const Particle& p : fsparticles) {
36 const double gap = fabs(p.rapidity() - previousRapidity);
37 if (gap > largestGap) {
38 largestGap = gap; // largest gap
39 gapCenter = (p.rapidity()+previousRapidity)/2.; // find the center of the gap to separate the X and Y systems.
40 }
41 previousRapidity = p.rapidity();
42 }
43
44 FourMomentum mxFourVector, myFourVector;
45 for (const Particle& p : fsparticles)
46 (p.rapidity() > gapCenter ? mxFourVector : myFourVector) += p.momentum();
47 const double xiX = mxFourVector.mass2()/sqr(sqrtS());
48 const double xiY = myFourVector.mass2()/sqr(sqrtS());
49 const double xi = max(xiX, xiY);
50 if (xi < 1e-6) vetoEvent;
51
52 double totEnergy = 0, emEnergy = 0, hadEnergy = 0;
53 for (const Particle& p : fsparticles) {
54 if (!inRange(p.eta(), -6.6, -5.2)) continue; //< @todo Should be abseta()?
55 if (!p.isVisible() || p.abspid() == PID::MUON) continue;
56 totEnergy += p.energy();
57 if (p.abspid() == PID::ELECTRON || p.abspid() == PID::PHOTON || p.abspid() == 111) emEnergy += p.energy();
58 if (p.abspid() != PID::ELECTRON && p.abspid() != PID::PHOTON && p.abspid() != 111) hadEnergy += p.energy();
59 }
60
61 _h_totEnergy->fill(totEnergy/GeV);
62 _h_emEnergy->fill(emEnergy/GeV);
63 _h_hadEnergy->fill(hadEnergy/GeV);
64 }
65
66
67 /// Normalize histograms
68 void finalize() {
69 const double sf = crossSection()/microbarn/sumOfWeights();
70 scale(_h_totEnergy, sf);
71 scale(_h_emEnergy, sf);
72 scale(_h_hadEnergy, sf);
73 }
74
75
76 private:
77
78 Histo1DPtr _h_totEnergy, _h_emEnergy, _h_hadEnergy;
79
80 };
81
82
83 RIVET_DECLARE_PLUGIN(CMS_2017_I1511284);
84
85}
|