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