[Rivet-svn] r3379 - in trunk: data/anainfo src/Analyses

blackhole at projects.hepforge.org blackhole at projects.hepforge.org
Thu 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