Rivet analyses
Calo-based underlying event at 900 GeV and 7 TeV in ATLAS
Experiment: ATLAS (LHC)
Inspire ID: 891834
Status: VALIDATED
Authors: - Jinlong Zhang - Andy Buckley
References: - Expt page: ATLAS-STDM-2010-05 - arXiv: 1103.1816
Beams: p+ p+
Beam energies: (450.0, 450.0); (3500.0, 3500.0)GeV
Run details: - pp QCD interactions at 900 GeV and 7 TeV. Diffractive events should be included, but only influence the lowest bins. Multiple kinematic cuts should not be required.
Underlying event measurements with the ATLAS detector at the LHC at center-of-mass energies of 900 GeV and 7 TeV, using calorimeter clusters rather than charged tracks.
Source
code:ATLAS_2011_I891834.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
namespace Rivet {
/// @brief Calo-based underlying event at 900 GeV and 7 TeV in ATLAS
///
/// @author Jinlong Zhang
class ATLAS_2011_I891834 : public Analysis {
public:
RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2011_I891834);
void init() {
const FinalState fs500(Cuts::abseta < 2.5 && Cuts::pT >= 500*MeV);
declare(fs500, "FS500");
const FinalState fslead(Cuts::abseta < 2.5 && Cuts::pT >= 1.0*GeV);
declare(fslead, "FSlead");
for (double eVal : allowedEnergies()) {
const string en = toString(round(eVal));
if (isCompatibleWithSqrtS(eVal)) _sqs = en;
bool is7TeV(en == "7000");
// N profiles, 500 MeV pT cut
book(_h[en+"N_transverse"], 1+is7TeV, 1, 1);
// pTsum profiles, 500 MeV pT cut
book(_h[en+"ptsum_transverse"], 3+is7TeV, 1, 1);
// N vs. Delta(phi) profiles, 500 MeV pT cut
book(_h[en+"N_vs_dPhi_1"], 13+is7TeV, 1, 1);
book(_h[en+"N_vs_dPhi_2"], 13+is7TeV, 1, 2);
book(_h[en+"N_vs_dPhi_3"], 13+is7TeV, 1, 3);
}
raiseBeamErrorIf(_sqs.empty());
}
void analyze(const Event& event) {
// Require at least one cluster in the event with pT >= 1 GeV
const FinalState& fslead = apply<FinalState>(event, "FSlead");
if (fslead.size() < 1) vetoEvent;
// These are the particles with pT > 500 MeV
const FinalState& chargedNeutral500 = apply<FinalState>(event, "FS500");
// Identify leading object and its phi and pT
Particles particles500 = chargedNeutral500.particlesByPt();
Particle p_lead = particles500[0];
const double philead = p_lead.phi();
const double etalead = p_lead.eta();
const double pTlead = p_lead.pT();
MSG_DEBUG("Leading object: pT = " << pTlead << ", eta = " << etalead << ", phi = " << philead);
// Iterate over all > 500 MeV particles and count particles and scalar pTsum in the three regions
vector<double> num500(3, 0), ptSum500(3, 0.0);
// Temporary histos that bin N in dPhi.
// NB. Only one of each needed since binnings are the same for the energies and pT cuts
YODA::Histo1D htemp(_h[_sqs+"N_vs_dPhi_1"]->xEdges(),"tmp");
for (const Particle& p : particles500) {
const double pT = p.pT();
const double dPhi = deltaPhi(philead, p.phi());
const int ir = region_index(dPhi);
num500[ir] += 1;
ptSum500[ir] += pT;
// Fill temp histos to bin N in dPhi
if (p.genParticle() != p_lead.genParticle()) { // We don't want to fill all those zeros from the leading track...
htemp.fill(dPhi);
}
}
// Now fill underlying event histograms
// The densities are calculated by dividing the UE properties by dEta*dPhi
// -- each region has a dPhi of 2*PI/3 and dEta is two times 2.5
const double dEtadPhi = (2*2.5 * 2*PI/3.0);
_h[_sqs+"N_transverse"]->fill(pTlead/GeV, num500[1]/dEtadPhi);
_h[_sqs+"ptsum_transverse"]->fill(pTlead/GeV, ptSum500[1]/GeV/dEtadPhi);
// Update the "proper" dphi profile histograms
// Note that we fill dN/dEtadPhi: dEta = 2*2.5, dPhi = 2*PI/nBins
// The values tabulated in the note are for an (undefined) signed Delta(phi) rather than
// |Delta(phi)| and so differ by a factor of 2: we have to actually norm for angular range = 2pi
for (const auto& b : htemp.bins()) {
double mean = b.xMid(), value = 0.;
if (b.numEntries() > 0) {
mean = b.xMean();
value = b.sumW()/b.xWidth()/10.0;
}
if (pTlead/GeV >= 1.0) _h[_sqs+"N_vs_dPhi_1"]->fill(mean, value);
if (pTlead/GeV >= 2.0) _h[_sqs+"N_vs_dPhi_2"]->fill(mean, value);
if (pTlead/GeV >= 3.0) _h[_sqs+"N_vs_dPhi_3"]->fill(mean, value);
}
}
// Little helper function to identify Delta(phi) regions
inline int region_index(double dphi) {
assert(inRange(dphi, 0.0, PI, CLOSED, CLOSED));
if (dphi < PI/3.0) return 0;
if (dphi < 2*PI/3.0) return 1;
return 2;
}
private:
string _sqs = "";
map<string,Profile1DPtr> _h;
};
RIVET_DECLARE_ALIASED_PLUGIN(ATLAS_2011_I891834, ATLAS_2011_S8994773);
}Aliases: - ATLAS_2011_S8994773