Rivet analyses
Inclusive prompt photons at 8 TeV
Experiment: ATLAS (LHC)
Inspire ID: 1457605
Status: VALIDATED
Authors: - Mark Stockton
References: - Expt page: ATLAS-STDM-2014-09 - arXiv: 1605.03495
Beams: p+ p+
Beam energies: (4000.0, 4000.0)GeV
Run details: - Inclusive prompt photon production
A measurement of the cross section for the inclusive production of isolated prompt photons in proton-proton collisions at a centre-of-mass energy of $\sqrt{s} = 8$~TeV is presented. The measurement covers the pseudorapidity ranges |ηγ| < 1.37 1.56 < |ηγ| < 2.37 in the transverse energy range 25 < ETγ < 1500~GeV. The results are based on an integrated luminosity of 20.2~fb−1, recorded by the ATLAS detector at the LHC. Photon candidates are identified by combining information from the calorimeters and the inner tracker. The background is subtracted using a data-driven technique, based on the observed calorimeter shower-shape variables and the deposition of hadronic energy in a narrow cone around the photon candidate.
Source
code:ATLAS_2016_I1457605.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/PromptFinalState.hh"
#include "Rivet/Projections/LeadingParticlesFinalState.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// Inclusive isolated prompt photon analysis with 2012 LHC data
class ATLAS_2016_I1457605 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_I1457605);
/// Book histograms and initialise projections before the run
void init() {
FinalState fs;
declare(fs, "FS");
// Consider the final state jets for the energy density calculation
FastJets fj(fs, JetAlg::KT, 0.5);
fj.useJetArea(new fastjet::AreaDefinition(fastjet::VoronoiAreaSpec()));
declare(fj, "KtJetsD05");
// Consider the leading pt photon with |eta| < 2.37 and pT > 25 GeV
LeadingParticlesFinalState photonfs(PromptFinalState(FinalState(Cuts::abseta < 2.37 && Cuts::pT > 25*GeV)));
photonfs.addParticleId(PID::PHOTON);
declare(photonfs, "LeadingPhoton");
// Book the dsigma/dEt (in eta bins) histograms
for (size_t i = 0; i < _eta_bins.size() - 1; ++i) {
if (fuzzyEquals(_eta_bins[i], 1.37)) continue; // skip this bin
int offset = i > 2? 0 : 1;
book(_h_Et_photon[i] ,i + offset, 1, 1);
}
}
/// Return eta bin for either dsigma/dET histogram (area_eta=false) or energy density correction (area_eta=true)
size_t _getEtaBin(double eta_w, bool area_eta) const {
const double eta = fabs(eta_w);
if (!area_eta) {
return binIndex(eta, _eta_bins);
} else {
return binIndex(eta, _eta_bins_areaoffset);
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// Retrieve leading photon
Particles photons = apply<LeadingParticlesFinalState>(event, "LeadingPhoton").particles();
if (photons.size() < 1) vetoEvent;
const Particle& leadingPhoton = photons[0];
// Veto events with photon in ECAL crack
if (inRange(leadingPhoton.abseta(), 1.37, 1.56)) vetoEvent;
// Compute isolation energy in cone of radius .4 around photon (all particles)
FourMomentum mom_in_EtCone;
Particles fs = apply<FinalState>(event, "FS").particles();
for (const Particle& p : fs) {
// Check if it's outside the cone of 0.4
if (deltaR(leadingPhoton, p) >= 0.4) continue;
// Except muons or neutrinos
if (PID::isNeutrino(p.abspid()) || p.abspid() == PID::MUON) continue;
// Increment isolation energy
mom_in_EtCone += p.momentum();
}
// Remove the photon energy from the isolation
mom_in_EtCone -= leadingPhoton.momentum();
// Get the area-filtered jet inputs for computing median energy density, etc.
vector<double> ptDensity;
vector< vector<double> > ptDensities(_eta_bins_areaoffset.size()-1);
const FastJets& fast_jets = apply<FastJets>(event, "KtJetsD05");
const auto clust_seq_area = fast_jets.clusterSeqArea();
for (const Jet& jet : fast_jets.jets()) {
const double area = clust_seq_area->area(jet);
if (area > 1e-3 && jet.abseta() < _eta_bins_areaoffset.back())
ptDensities.at( _getEtaBin(jet.abseta(), true) ) += jet.pT()/area;
}
// Compute the median energy density, etc.
for (size_t b = 0; b < _eta_bins_areaoffset.size()-1; ++b) {
const int njets = ptDensities[b].size();
ptDensity += (njets > 0) ? median(ptDensities[b]) : 0.0;
}
// Compute the isolation energy correction (cone area*energy density)
const double etCone_area = PI * sqr(0.4);
const double correction = ptDensity[_getEtaBin(leadingPhoton.abseta(), true)] * etCone_area;
// Apply isolation cut on area-corrected value
// cut is Etiso < 4.8GeV + 4.2E-03 * Et_gamma.
if (mom_in_EtCone.Et() - correction > 4.8*GeV + 0.0042*leadingPhoton.Et()) vetoEvent;
// Fill histograms
const size_t eta_bin = _getEtaBin(leadingPhoton.abseta(), false);
_h_Et_photon[eta_bin]->fill(leadingPhoton.Et());
}
/// Normalise histograms etc., after the run
void finalize() {
double sf = crossSection() / (picobarn * sumOfWeights());
for (size_t i = 0; i < _eta_bins.size()-1; ++i) {
if (fuzzyEquals(_eta_bins[i], 1.37)) continue;
scale(_h_Et_photon[i], sf);
}
}
private:
Histo1DPtr _h_Et_photon[5];
const vector<double> _eta_bins = {0.00, 0.60, 1.37, 1.56, 1.81, 2.37 };
const vector<double> _eta_bins_areaoffset = {0.0, 1.5, 3.0};
};
RIVET_DECLARE_PLUGIN(ATLAS_2016_I1457605);
}