Rivet analyses
Long-lived heavy charged particle search
Experiment: ATLAS (LHC)
Inspire ID: 914491
Status: UNVALIDATED
Authors: - Peter Richardson
References: - Expt page: ATLAS-SUSY-2011-03 - arXiv: 1106.4495
Beams: p+ p+
Beam energies: (3500.0, 3500.0)GeV
Run details: - BSM signal events at 7000 GeV.
ATLAS search for long-lived heavy charged particles for four different mass cuts. Currently only the slepton search is implemented.
Source
code:ATLAS_2011_I914491.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Math/Constants.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/NonHadronicFinalState.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
#include "Rivet/Tools/Random.hh"
namespace Rivet {
class ATLAS_2011_I914491 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2011_I914491);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// get the non-hadronic final-state particles
double etaMax = 2.5;
const NonHadronicFinalState nhfs((Cuts::etaIn(-etaMax, etaMax) && Cuts::pT >= 13. * GeV));
declare(nhfs, "NHFS");
// select the charged ones
const ChargedFinalState cfs(nhfs);
declare(cfs, "CFS");
// and then veto electrons, and taus to be safe
VetoedFinalState vfs(cfs);
vfs.addVetoPairId(PID::ELECTRON);
declare(vfs, "VFS");
/// Book histograms
book(_count_trigger, "count_trigger", 1, 0., 1.);
book(_count_event, "count_selection", 1, 0., 1.);
book(_count_quality, "count_quality", 1, 0., 1.);
book(_count_beta, "count_beta", 1, 0., 1.);
book(_count_90, "count_90", 1, 0., 1.);
book(_count_110, "count_110", 1, 0., 1.);
book(_count_120, "count_120", 1, 0., 1.);
book(_count_130, "count_130", 1, 0., 1.);
book(_hist_beta, "beta", 1000, 0., 2.);
book(_hist_time, "time", 1000, -50, 50.);
book(_hist_mass, "mass", 60, 5., 305.);
}
double rndGauss(double sigma, double mean) {
double r = sqrt(-2.0 * log(rand01()));
double phi = rand01() * 2.0 * pi;
return mean + sigma * r * sin(phi);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// smearing parameters
// time measurement (in ns)
// const double tsmear=5.*0.7;
const double tsmear = 0.7;
// sagita error
const double csag = 1.1E-4;
// multiple scattering
const double cms = 2.0E-2;
// muon chamber radius (in metres)
const double radius = 10.e3;
// convert to ns
const double tr = radius / c_light;
// get the charged final-state particles
Particles charged = apply<VetoedFinalState>(event, "VFS").particles();
// need at least two candidates
if (charged.size() < 2) vetoEvent;
// number passing trigger
_count_trigger->fill(0.5);
// Z mass veto
for (const Particle& mu1 : charged) {
for (const Particle& mu2 : charged) {
double mass = (mu1.momentum() + mu2.momentum()).mass();
double diff = abs(mass - 91.18);
if (diff < 10.) vetoEvent;
}
}
// number passing first event selection
_count_event->fill(0.5);
// now find the candidates
// loop over the particles and find muons and heavy charged particles
map<double, Particle> muonCandidates;
for (const Particle& mu : charged) {
// calculate the smeared momentum
double pT = mu.pT2();
double pmag = sqrt(pT + sqr(mu.pz()));
double deltap = sqrt(sqr(csag * sqr(pmag)) + sqr(cms * mu.E() / GeV));
double psmear = rndGauss(deltap, pmag);
// keep particles with pT>40
if (psmear / pmag * mu.perp() < 40. * GeV || psmear / pmag * mu.perp() > 1000. * GeV) continue;
muonCandidates.insert(make_pair(psmear, mu));
}
// require two candidates
if (muonCandidates.size() < 2) vetoEvent;
// number passing "quality" cut
_count_quality->fill(0.5);
// now do the time of flight
bool filled = false;
for (map<double, Particle>::const_iterator it = muonCandidates.begin(); it != muonCandidates.end();
++it) {
// true magnitude and pT of momentum
double pT = it->second.pT2();
double pmag = sqrt(pT + sqr(it->second.pz()));
pT = sqrt(pT);
// true time difference in ns
double deltaT = tr * (it->second.E() - pmag) / pT;
// smear it
deltaT = rndGauss(tsmear, deltaT);
// beta
double beta = 1. / (1. + deltaT / tr * pT / pmag);
_hist_beta->fill(beta);
_hist_time->fill(deltaT);
// beta cut
if (beta < 0.95) continue;
// mass
double mass = 2. * pT * it->first * deltaT / tr * (1. + 0.5 * deltaT / tr * pT / pmag);
if (mass < 0.) continue;
mass = sqrt(mass);
filled = true;
_hist_mass->fill(mass);
if (mass > 90.) {
_count_90->fill(0.5);
if (mass > 110.) {
_count_110->fill(0.5);
if (mass > 120.) {
_count_120->fill(0.5);
if (mass > 130.) {
_count_130->fill(0.5);
}
}
}
}
}
if (!filled) vetoEvent;
// number passing beta cut
_count_beta->fill(0.5);
}
/// @}
void finalize() {
double fact = crossSection() / picobarn / sumOfWeights() * 37;
MSG_WARNING("testing " << crossSection() / picobarn << " " << sumOfWeights() << " " << fact);
scale(_hist_beta, fact);
scale(_hist_time, fact);
scale(_hist_mass, fact);
scale(_count_trigger, fact);
scale(_count_event, fact);
scale(_count_quality, fact);
scale(_count_beta, fact);
scale(_count_90, fact);
scale(_count_110, fact);
scale(_count_120, fact);
scale(_count_130, fact);
}
private:
/// @name Histograms
/// @{
Histo1DPtr _hist_beta;
Histo1DPtr _hist_time;
Histo1DPtr _hist_mass;
Histo1DPtr _count_trigger;
Histo1DPtr _count_event;
Histo1DPtr _count_quality;
Histo1DPtr _count_beta;
Histo1DPtr _count_90;
Histo1DPtr _count_110;
Histo1DPtr _count_120;
Histo1DPtr _count_130;
/// @}
};
RIVET_DECLARE_ALIASED_PLUGIN(ATLAS_2011_I914491, ATLAS_2011_S9108483);
}Aliases: - ATLAS_2011_S9108483