|
[Rivet-svn] r3379 - in trunk: data/anainfo src/Analysesblackhole at projects.hepforge.org blackhole at projects.hepforge.orgThu Sep 22 08:13:50 BST 2011
Author: richardn Date: Thu Sep 22 08:13:50 2011 New Revision: 3379 Log: added first version of ATLAS long lived charged particle search Added: trunk/data/anainfo/ATLAS_2011_S9108483.info - copied, changed from r3375, trunk/data/anainfo/ATLAS_2011_S8983313.info trunk/src/Analyses/ATLAS_2011_S9108483.cc - copied, changed from r3156, trunk/src/Analyses/ATLAS_2011_S8983313.cc Modified: trunk/data/anainfo/Makefile.am trunk/src/Analyses/Makefile.am Copied and modified: trunk/data/anainfo/ATLAS_2011_S9108483.info (from r3375, trunk/data/anainfo/ATLAS_2011_S8983313.info) ============================================================================== --- trunk/data/anainfo/ATLAS_2011_S8983313.info Mon Sep 19 16:28:16 2011 (r3375, copy source) +++ trunk/data/anainfo/ATLAS_2011_S9108483.info Thu Sep 22 08:13:50 2011 (r3379) @@ -1,34 +1,35 @@ -Name: ATLAS_2011_S8983313 +Name: ATLAS_2011_S9108483 Year: 2011 -Summary: 0-Lepton Squark and Gluino Search +Summary: Long-lived heavy charged particle search Experiment: ATLAS Collider: LHC -SpiresID: 8983313 -Status: VALIDATED +SpiresID: 9108483 +Status: UNVALIDATED Authors: - - David Grellscheid <david.grellscheid at durham.ac.uk> + - Peter Richardson <Peter.Richardson at durham.ac.uk> References: - - arXiv:1102.5290 + - arXiv:arXiv:1106.4495 RunInfo: BSM signal events at 7000 GeV. NumEvents: 25000 for BSM signals Beams: [p+, p+] Energies: [7000] Description: - '0-lepton search for squarks and gluinos by ATLAS at 7 TeV. - Event counts in four signal regions A-D are implemented as one-bin - histograms.' -BibKey: daCosta:2011qk -BibTeX: '@Article{daCosta:2011qk, - author = "da Costa, Joao Barreiro Guimaraes and others", - collaboration = "Atlas", - title = "{Search for squarks and gluinos using final states with - jets and missing transverse momentum with the ATLAS - detector in sqrt(s) = 7 TeV proton-proton collisions}", + 'ATLAS search for long-lived heavy charged particles for four different mass cuts. Currently only the slepton search is implemented.' +BibKey: Aad:2011hz +BibTeX: '@Article{Aad:2011hz, + author = "Aad, Georges and others", + collaboration = "ATLAS", + title = "{Search for Heavy Long-Lived Charged Particles with the + ATLAS detector in pp collisions at sqrt(s) = 7 TeV}", + journal = "Phys. Lett.", + volume = "B703", year = "2011", - eprint = "1102.5290", + pages = "428-446", + eprint = "1106.4495", archivePrefix = "arXiv", primaryClass = "hep-ex", - SLACcitation = "%%CITATION = 1102.5290;%%" + doi = "10.1016/j.physletb.2011.08.042", + SLACcitation = "%%CITATION = 1106.4495;%%" } ' Modified: trunk/data/anainfo/Makefile.am ============================================================================== --- trunk/data/anainfo/Makefile.am Thu Sep 22 07:56:37 2011 (r3378) +++ trunk/data/anainfo/Makefile.am Thu Sep 22 08:13:50 2011 (r3379) @@ -29,6 +29,7 @@ ATLAS_2011_S9128077.info \ ATLAS_2011_S9131140.info \ ATLAS_2011_I919017.info \ + ATLAS_2011_S9108483.info \ BELLE_2006_S6265367.info \ CDF_1988_S1865951.info \ CDF_1990_S2089246.info \ Copied and modified: trunk/src/Analyses/ATLAS_2011_S9108483.cc (from r3156, trunk/src/Analyses/ATLAS_2011_S8983313.cc) ============================================================================== --- trunk/src/Analyses/ATLAS_2011_S8983313.cc Sun Jun 12 08:44:11 2011 (r3156, copy source) +++ trunk/src/Analyses/ATLAS_2011_S9108483.cc Thu Sep 22 08:13:50 2011 (r3379) @@ -2,26 +2,25 @@ #include "Rivet/Analysis.hh" #include "Rivet/Tools/BinnedHistogram.hh" #include "Rivet/RivetAIDA.hh" +#include "Rivet/Math/Constants.hh" +#include "Rivet/Tools/ParticleIdUtils.hh" #include "Rivet/Tools/Logging.hh" -#include "Rivet/Projections/FinalState.hh" #include "Rivet/Projections/ChargedFinalState.hh" -#include "Rivet/Projections/VisibleFinalState.hh" -#include "Rivet/Projections/IdentifiedFinalState.hh" -#include "Rivet/Projections/FastJets.hh" -#include "Rivet/Tools/RivetMT2.hh" +#include "Rivet/Projections/NonHadronicFinalState.hh" +#include "Rivet/Projections/VetoedFinalState.hh" namespace Rivet { - class ATLAS_2011_S8983313 : public Analysis { + class ATLAS_2011_S9108483 : public Analysis { public: /// @name Constructors etc. //@{ /// Constructor - ATLAS_2011_S8983313() - : Analysis("ATLAS_2011_S8983313") + ATLAS_2011_S9108483() + : Analysis("ATLAS_2011_S9108483"), _wgtSum(0.) { /// Set whether your finalize method needs the generator cross section setNeedsCrossSection(false); @@ -38,294 +37,179 @@ /// Book histograms and initialise projections before the run void init() { - // projection to find the electrons - std::vector<std::pair<double, double> > eta_e; - eta_e.push_back(make_pair(-2.47,2.47)); - IdentifiedFinalState elecs(eta_e, 10.0*GeV); - elecs.acceptIdPair(ELECTRON); - addProjection(elecs, "elecs"); - - - - // veto region electrons - std::vector<std::pair<double, double> > eta_v_e; - eta_v_e.push_back(make_pair(-1.52,-1.37)); - eta_v_e.push_back(make_pair( 1.37, 1.52)); - IdentifiedFinalState veto_elecs(eta_v_e, 10.0*GeV); - veto_elecs.acceptIdPair(ELECTRON); - addProjection(veto_elecs, "veto_elecs"); - - - - // projection to find the muons - std::vector<std::pair<double, double> > eta_m; - eta_m.push_back(make_pair(-2.4,2.4)); - IdentifiedFinalState muons(eta_m, 10.0*GeV); - muons.acceptIdPair(MUON); - addProjection(muons, "muons"); - - - - /// Jet finder - addProjection(FastJets(FinalState(), FastJets::ANTIKT, 0.4), - "AntiKtJets04"); - - // all tracks (to do deltaR with leptons) - addProjection(ChargedFinalState(-3.0,3.0),"cfs"); - - // for pTmiss - addProjection(VisibleFinalState(-4.9,4.9),"vfs"); + // get the non-hadronic final-state particles + double etaMax = 2.5; + const NonHadronicFinalState nhfs(-etaMax,etaMax,13.*GeV); + addProjection(nhfs,"NHFS"); + // select the charged ones + const ChargedFinalState cfs(nhfs); + addProjection(cfs,"CFS"); + // and then veto electrons, and taus to be safe + VetoedFinalState vfs(cfs); + vfs.addVetoPairId(ELECTRON); + addProjection(vfs,"VFS"); /// Book histograms - _count_A = bookHistogram1D("count_A", 1, 0., 1.); - _count_B = bookHistogram1D("count_B", 1, 0., 1.); - _count_C = bookHistogram1D("count_C", 1, 0., 1.); - _count_D = bookHistogram1D("count_D", 1, 0., 1.); - - _hist_meff_A = bookHistogram1D("m_eff_A", 30, 0., 3000.); - _hist_mT2_B = bookHistogram1D("m_T2", 25, 0., 1000.); - _hist_meff_CD = bookHistogram1D("m_eff_C_D", 30, 0., 3000.); - _hist_eTmiss = bookHistogram1D("Et_miss", 20, 0., 1000.); + _count_trigger = bookHistogram1D("count_trigger" , 1, 0., 1.); + _count_event = bookHistogram1D("count_selection", 1, 0., 1.); + _count_quality = bookHistogram1D("count_quality" , 1, 0., 1.); + _count_beta = bookHistogram1D("count_beta" , 1, 0., 1.); + _count_90 = bookHistogram1D("count_90" , 1, 0., 1.); + _count_110 = bookHistogram1D("count_110", 1, 0., 1.); + _count_120 = bookHistogram1D("count_120", 1, 0., 1.); + _count_130 = bookHistogram1D("count_130", 1, 0., 1.); + + _hist_beta = bookHistogram1D("beta",1000, 0., 2.); + _hist_time = bookHistogram1D("time",1000, -50, 50.); + _hist_mass = bookHistogram1D("mass", 60, 5., 305.); } + double rndGauss(double sigma, double mean) { + double r = sqrt(-2.0*log(rand()/static_cast<double>(RAND_MAX))); + double phi = rand()/static_cast<double>(RAND_MAX)*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; + // event weight const double weight = event.weight(); - - ParticleVector veto_e - = applyProjection<IdentifiedFinalState>(event, "veto_elecs").particles(); - if ( ! veto_e.empty() ) { - MSG_DEBUG("electrons in veto region"); - vetoEvent; - } - - - Jets cand_jets; - foreach (const Jet& jet, - applyProjection<FastJets>(event, "AntiKtJets04").jetsByPt(20.0*GeV) ) { - if ( fabs( jet.momentum().eta() ) < 4.9 ) { - cand_jets.push_back(jet); - } - } - - ParticleVector cand_e = applyProjection<IdentifiedFinalState>(event, "elecs").particlesByPt(); - - - ParticleVector cand_mu; - ParticleVector chg_tracks = applyProjection<ChargedFinalState>(event, "cfs").particles(); - foreach ( const Particle & mu, - applyProjection<IdentifiedFinalState>(event, "muons").particlesByPt() ) { - double pTinCone = -mu.momentum().pT(); - foreach ( const Particle & track, chg_tracks ) { - if ( deltaR(mu.momentum(),track.momentum()) <= 0.2 ) - pTinCone += track.momentum().pT(); - } - if ( pTinCone < 1.8*GeV ) - cand_mu.push_back(mu); - } - - Jets cand_jets_2; - foreach ( const Jet& jet, cand_jets ) { - if ( fabs( jet.momentum().eta() ) >= 2.5 ) - cand_jets_2.push_back( jet ); - else { - bool away_from_e = true; - foreach ( const Particle & e, cand_e ) { - if ( deltaR(e.momentum(),jet.momentum()) <= 0.2 ) { - away_from_e = false; - break; + // get the charged final-state particles + ParticleVector charged = + applyProjection<VetoedFinalState>(event,"VFS").particles(); + // need at least two candidates + if(charged.size()<2) vetoEvent; + // number passing trigger + _count_trigger->fill(0.5,weight); + // Z mass veto + foreach ( const Particle & mu1,charged ) { + foreach ( 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,weight); + // now find the candidates + // loop over the particles and find muons and heavy charged particles + map<double,Particle> muonCandidates; + foreach ( const Particle & mu,charged ) { + // calculate the smeared momentum + double pT = mu.momentum().perp2(); + double pmag = sqrt(pT+sqr(mu.momentum().z())); + pT = sqrt(pT); + double deltap = sqrt( sqr(csag*sqr(pmag)) + + sqr(cms*mu.momentum().t()/GeV)); + double psmear = rndGauss(deltap,pmag); + // keep particles with pT>40 + if(psmear/pmag*mu.momentum().perp()<40.*GeV|| + psmear/pmag*mu.momentum().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,weight); + // 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.momentum().perp2(); + double pmag = sqrt(pT+sqr(it->second.momentum().z())); + pT = sqrt(pT); + // true time difference in ns + double deltaT =tr *(it->second.momentum().t()-pmag)/pT; + // smear it + deltaT = rndGauss(tsmear,deltaT); + // beta + double beta = 1./(1.+deltaT/tr*pT/pmag); + _hist_beta->fill(beta, weight); + _hist_time->fill(deltaT, weight); + // 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,weight); + if(mass>90. ) { + _count_90 ->fill(0.5,weight); + if(mass>110.) { + _count_110->fill(0.5,weight); + if(mass>120.) { + _count_120->fill(0.5,weight); + if(mass>130.) { + _count_130->fill(0.5,weight); + } } } - if ( away_from_e ) - cand_jets_2.push_back( jet ); - } - } - - ParticleVector recon_e, recon_mu; - - foreach ( const Particle & e, cand_e ) { - bool away = true; - foreach ( const Jet& jet, cand_jets_2 ) { - if ( deltaR(e.momentum(),jet.momentum()) < 0.4 ) { - away = false; - break; - } - } - if ( away ) - recon_e.push_back( e ); - } - - foreach ( const Particle & mu, cand_mu ) { - bool away = true; - foreach ( const Jet& jet, cand_jets_2 ) { - if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 ) { - away = false; - break; - } - } - if ( away ) - recon_mu.push_back( mu ); - } - - - // pTmiss - ParticleVector vfs_particles = applyProjection<VisibleFinalState>(event, "vfs").particles(); - FourMomentum pTmiss; - foreach ( const Particle & p, vfs_particles ) { - pTmiss -= p.momentum(); - } - double eTmiss = pTmiss.pT(); - - - // final jet filter - Jets recon_jets; - foreach ( const Jet& jet, cand_jets_2 ) { - if ( fabs( jet.momentum().eta() ) <= 2.5 ) - recon_jets.push_back( jet ); - } - - - // now only use recon_jets, recon_mu, recon_e - - if ( ! ( recon_mu.empty() && recon_e.empty() ) ) { - MSG_DEBUG("Charged leptons left after selection"); - vetoEvent; - } - - if ( eTmiss <= 100 * GeV ) { - MSG_DEBUG("Not enough eTmiss: " << eTmiss << " < 100"); - vetoEvent; - } - - - if ( recon_jets.empty() || recon_jets[0].momentum().pT() <= 120.0 * GeV ) { - MSG_DEBUG("No hard leading jet in " << recon_jets.size() << " jets"); - vetoEvent; - } - - // ==================== observables ==================== - - // Njets, min_dPhi - - int Njets = 0; - double min_dPhi = 999.999; - double pTmiss_phi = pTmiss.phi(); - foreach ( const Jet& jet, recon_jets ) { - if ( jet.momentum().pT() > 40 * GeV ) { - if ( Njets < 3 ) - min_dPhi = min( min_dPhi, - deltaPhi( pTmiss_phi, jet.momentum().phi() ) ); - ++Njets; } } - - if ( Njets < 2 ) { - MSG_DEBUG("Only " << Njets << " >40 GeV jets left"); - vetoEvent; - } - - if ( min_dPhi <= 0.4 ) { - MSG_DEBUG("dPhi too small"); - vetoEvent; - } - - // m_eff - - double m_eff_2j = eTmiss - + recon_jets[0].momentum().pT() - + recon_jets[1].momentum().pT(); - - double m_eff_3j = recon_jets.size() < 3 ? -999.0 : m_eff_2j + recon_jets[2].momentum().pT(); - - // etmiss / m_eff - - double et_meff_2j = eTmiss / m_eff_2j; - double et_meff_3j = eTmiss / m_eff_3j; - - FourMomentum a = recon_jets[0].momentum(); - FourMomentum b = recon_jets[1].momentum(); - - double m_T2 = mT2::mT2( a, - b, - pTmiss, - 0.0 ); // zero mass invisibles - - - // ==================== FILL ==================== - - MSG_DEBUG( "Trying to fill " - << Njets << ' ' - << m_eff_2j << ' ' - << et_meff_2j << ' ' - << m_eff_3j << ' ' - << et_meff_3j << ' ' - << m_T2 ); - - _hist_eTmiss->fill(eTmiss, weight); - - // AAAAAAAAAA - if ( et_meff_2j > 0.3 ) { - _hist_meff_A->fill(m_eff_2j, weight); - if ( m_eff_2j > 500 * GeV ) { - MSG_DEBUG("Hits A"); - _count_A->fill(0.5, weight); - } - } - - // BBBBBBBBBB - _hist_mT2_B->fill(m_T2, weight); - if ( m_T2 > 300 * GeV ) { - MSG_DEBUG("Hits B"); - _count_B->fill(0.5, weight); - } - - // need 3 jets for C and D - if ( Njets >= 3 && et_meff_3j > 0.25 ) { - - _hist_meff_CD->fill(m_eff_3j, weight); - - // CCCCCCCCCC - if ( m_eff_3j > 500 * GeV ) { - MSG_DEBUG("Hits C"); - _count_C->fill(0.5, weight); - } - - // DDDDDDDDDD - if ( m_eff_3j > 1000 * GeV ) { - MSG_DEBUG("Hits D"); - _count_D->fill(0.5, weight); - } - } - + if(!filled) vetoEvent; + // number passing beta cut + _count_beta->fill(0.5,weight); } //@} - void finalize() {} + void finalize() { + double fact = crossSection()/sumOfWeights()*37; + cerr << "testing " << crossSection() << " " + << sumOfWeights() << " " << fact << "\n"; + 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 //@{ - AIDA::IHistogram1D* _count_A; - AIDA::IHistogram1D* _count_B; - AIDA::IHistogram1D* _count_C; - AIDA::IHistogram1D* _count_D; - AIDA::IHistogram1D* _hist_meff_A; - AIDA::IHistogram1D* _hist_mT2_B; - AIDA::IHistogram1D* _hist_meff_CD; - AIDA::IHistogram1D* _hist_eTmiss; + AIDA::IHistogram1D* _hist_beta; + AIDA::IHistogram1D* _hist_time; + AIDA::IHistogram1D* _hist_mass; + AIDA::IHistogram1D* _count_trigger; + AIDA::IHistogram1D* _count_event; + AIDA::IHistogram1D* _count_quality; + AIDA::IHistogram1D* _count_beta; + AIDA::IHistogram1D* _count_90; + AIDA::IHistogram1D* _count_110; + AIDA::IHistogram1D* _count_120; + AIDA::IHistogram1D* _count_130; //@} + // som of weights + double _wgtSum; }; - - // This global object acts as a hook for the plugin system - AnalysisBuilder<ATLAS_2011_S8983313> plugin_ATLAS_2011_S8983313; + AnalysisBuilder<ATLAS_2011_S9108483> plugin_ATLAS_2011_S9108483; } Modified: trunk/src/Analyses/Makefile.am ============================================================================== --- trunk/src/Analyses/Makefile.am Thu Sep 22 07:56:37 2011 (r3378) +++ trunk/src/Analyses/Makefile.am Thu Sep 22 08:13:50 2011 (r3379) @@ -67,7 +67,8 @@ ATLAS_2011_S9019561.cc \ ATLAS_2011_S9041966.cc \ ATLAS_2011_CONF_2011_090.cc \ - ATLAS_2011_CONF_2011_098.cc + ATLAS_2011_CONF_2011_098.cc \ + ATLAS_2011_S9108483.cc endif
More information about the Rivet-svn mailing list |