Rivet analyses referenceATLAS_2011_I921594Inclusive isolated prompt photon analysis with full 2010 LHC dataExperiment: ATLAS (LHC 7TeV) Inspire ID: 921594 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
A measurement of the differential cross-section for the inclusive production of isolated prompt photons in collisions at a center-of-mass energy TeV is presented. The measurement covers the pseudorapidity ranges and in the transverse energy range GeV. The results are based on an integrated luminosity of 35 pb, collected with the ATLAS detector at the LHC. The yields of the signal photons are measured using a data-driven technique, based on the observed distribution of the hadronic energy in a narrow cone around the photon candidate and the photon selection criteria. The results are compared with next-to-leading order perturbative QCD calculations and found to be in good agreement over four orders of magnitude in cross-section. Source code: ATLAS_2011_I921594.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/LeadingParticlesFinalState.hh"
5#include "Rivet/Projections/FastJets.hh"
6
7namespace Rivet {
8
9
10 /// Inclusive isolated prompt photon analysis with full 2010 LHC data
11 class ATLAS_2011_I921594 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2011_I921594);
16
17
18 /// Book histograms and initialise projections before the run
19 void init() {
20
21 FinalState fs;
22 declare(fs, "FS");
23
24 // Consider the final state jets for the energy density calculation
25 FastJets fj(fs, JetAlg::KT, 0.5);
26 fj.useJetArea(new fastjet::AreaDefinition(fastjet::VoronoiAreaSpec()));
27 declare(fj, "KtJetsD05");
28
29 // Consider the leading pt photon with |eta|<2.37 and pT>45 GeV
30 LeadingParticlesFinalState photonfs(FinalState((Cuts::etaIn(-2.37, 2.37) && Cuts::pT >= 45*GeV)));
31 photonfs.addParticleId(PID::PHOTON);
32 declare(photonfs, "LeadingPhoton");
33
34 // Book the dsigma/dEt (in eta bins) histograms
35 size_t d = 1;
36 for (size_t i = 0; i < _eta_bins.size()-1; ++i) {
37 if (fuzzyEquals(_eta_bins[i], 1.37)) continue; // skip this bin
38 book(_h_Et_photon[i], d, 1, 1);
39 ++d;
40 }
41 }
42
43
44 /// Return eta bin for either dsigma/dET histogram (area_eta=false) or energy density correction (area_eta=true)
45 size_t _getEtaBin(double eta, bool area_eta) const {
46 const double aeta = fabs(eta);
47 return (!area_eta) ? binIndex(aeta, _eta_bins) : binIndex(aeta, _eta_bins_areaoffset);
48 }
49
50
51 /// Perform the per-event analysis
52 void analyze(const Event& event) {
53 // Retrieve leading photon
54 const Particles& photons = apply<LeadingParticlesFinalState>(event, "LeadingPhoton").particles();
55 if (photons.size() != 1) vetoEvent;
56 const Particle& leadingPhoton = photons[0];
57
58 // Veto events with photon in ECAL crack
59 if (inRange(leadingPhoton.abseta(), 1.37, 1.52)) vetoEvent;
60
61 // Compute isolation energy in cone of radius .4 around photon (all particles)
62 FourMomentum mom_in_EtCone;
63 Particles fs = apply<FinalState>(event, "FS").particles();
64 for (const Particle& p : fs) {
65 // Check if it's outside the cone of 0.4
66 if (deltaR(leadingPhoton, p) >= 0.4) continue;
67 // Don't count particles in the 5x7 central core
68 if (deltaEta(leadingPhoton, p) < .025*5.0*0.5 &&
69 deltaPhi(leadingPhoton, p) < (PI/128.)*7.0*0.5) continue;
70 // Increment isolation energy
71 mom_in_EtCone += p.momentum();
72 }
73
74 // Get the area-filtered jet inputs for computing median energy density, etc.
75 vector< vector<double> > ptDensities(_eta_bins_areaoffset.size()-1);
76 FastJets fast_jets = apply<FastJets>(event, "KtJetsD05");
77 const shared_ptr<fastjet::ClusterSequenceArea> clust_seq_area = fast_jets.clusterSeqArea();
78 for (const Jet& jet : fast_jets.jets()) {
79 const double area = clust_seq_area->area(jet); //< Implicit call to .pseudojet()
80 if (area > 1e-4 && jet.abseta() < _eta_bins_areaoffset.back())
81 ptDensities.at( _getEtaBin(jet.abseta(), true) ).push_back(jet.pT()/area);
82 }
83
84 // Compute the median energy density, etc.
85 vector<double> ptDensity;
86 for (size_t b = 0; b < _eta_bins_areaoffset.size()-1; b++) {
87 ptDensity += ptDensities[b].empty() ? 0 : median(ptDensities[b]);
88 }
89
90 // Compute the isolation energy correction (cone area*energy density)
91 const double ETCONE_AREA = M_PI*sqr(0.4) - (7.0*.025)*(5.0*PI/128.);
92 const double correction = ptDensity[_getEtaBin(leadingPhoton.abseta(), true)] * ETCONE_AREA;
93
94 // Apply isolation cut on area-corrected value
95 if (mom_in_EtCone.Et() - correction > 4*GeV) vetoEvent;
96
97 // Fill histograms
98 const size_t eta_bin = _getEtaBin(leadingPhoton.abseta(), false);
99 _h_Et_photon[eta_bin]->fill(leadingPhoton.Et());
100 }
101
102
103 /// Normalise histograms etc., after the run
104 void finalize() {
105 for (size_t i = 0; i < _eta_bins.size()-1; i++) {
106 if (fuzzyEquals(_eta_bins[i], 1.37)) continue;
107 scale(_h_Et_photon[i], crossSection()/picobarn/sumOfWeights());
108 }
109 }
110
111
112 private:
113
114 Histo1DPtr _h_Et_photon[5];
115
116 const vector<double> _eta_bins = {0.00, 0.60, 1.37, 1.52, 1.81, 2.37};
117 const vector<double> _eta_bins_areaoffset = {0.0, 1.5, 3.0};
118
119 };
120
121
122 RIVET_DECLARE_PLUGIN(ATLAS_2011_I921594);
123
124}
|