CMS 3D CMS Logo

Public Member Functions | Private Attributes

HLTDisplacedmumuFilter Class Reference

#include <HLTDisplacedmumuFilter.h>

Inheritance diagram for HLTDisplacedmumuFilter:
HLTFilter edm::EDFilter edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

virtual void beginJob ()
virtual void endJob ()
virtual bool filter (edm::Event &, const edm::EventSetup &)
 HLTDisplacedmumuFilter (const edm::ParameterSet &)
 ~HLTDisplacedmumuFilter ()

Private Attributes

edm::InputTag beamSpotTag_
edm::InputTag DisplacedVertexTag_
bool fastAccept_
double maxNormalisedChi2_
double minCosinePointingAngle_
double minLxySignificance_
edm::InputTag MuonTag_
bool saveTag_

Detailed Description

Definition at line 6 of file HLTDisplacedmumuFilter.h.


Constructor & Destructor Documentation

HLTDisplacedmumuFilter::HLTDisplacedmumuFilter ( const edm::ParameterSet iConfig) [explicit]

Definition at line 33 of file HLTDisplacedmumuFilter.cc.

                                                                            :
 
  fastAccept_ (iConfig.getParameter<bool>("FastAccept")),
  minLxySignificance_ (iConfig.getParameter<double>("MinLxySignificance")),
  maxNormalisedChi2_ (iConfig.getParameter<double>("MaxNormalisedChi2")), 
  minCosinePointingAngle_ (iConfig.getParameter<double>("MinCosinePointingAngle")),
  saveTag_ (iConfig.getUntrackedParameter<bool> ("SaveTag",false)),
  DisplacedVertexTag_(iConfig.getParameter<edm::InputTag>("DisplacedVertexTag")),
  beamSpotTag_ (iConfig.getParameter<edm::InputTag> ("BeamSpotTag")),
  MuonTag_ (iConfig.getParameter<edm::InputTag>("MuonTag"))
 
{

  produces<trigger::TriggerFilterObjectWithRefs>();
}
HLTDisplacedmumuFilter::~HLTDisplacedmumuFilter ( )

Definition at line 50 of file HLTDisplacedmumuFilter.cc.

{

}

Member Function Documentation

void HLTDisplacedmumuFilter::beginJob ( void  ) [virtual]

Reimplemented from edm::EDFilter.

Definition at line 57 of file HLTDisplacedmumuFilter.cc.

{

}
void HLTDisplacedmumuFilter::endJob ( void  ) [virtual]

Reimplemented from edm::EDFilter.

Definition at line 63 of file HLTDisplacedmumuFilter.cc.

{
        
}
bool HLTDisplacedmumuFilter::filter ( edm::Event iEvent,
const edm::EventSetup iSetup 
) [virtual]

Implements HLTFilter.

Definition at line 69 of file HLTDisplacedmumuFilter.cc.

References beamSpotTag_, DisplacedVertexTag_, reco::BeamSpot::dxdz(), reco::BeamSpot::dydz(), reco::Vertex::error(), Exception, edm::Ref< C, T, F >::get(), edm::Event::getByLabel(), LogDebug, maxNormalisedChi2_, minCosinePointingAngle_, minLxySignificance_, module(), MuonTag_, reco::Vertex::normalizedChi2(), path(), reco::Vertex::position(), edm::Event::put(), saveTag_, mathSSE::sqrt(), reco::Vertex::tracks_begin(), reco::Vertex::tracksSize(), trigger::TriggerMuon, reco::BeamSpot::x0(), reco::BeamSpot::y0(), and reco::BeamSpot::z0().

{


  // get beam spot
  reco::BeamSpot vertexBeamSpot;
  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
  iEvent.getByLabel(beamSpotTag_,recoBeamSpotHandle);
  vertexBeamSpot = *recoBeamSpotHandle;
 
  
  // get displaced vertices
  reco::VertexCollection displacedVertexColl;
  edm::Handle<reco::VertexCollection> displacedVertexCollHandle;
  bool foundVertexColl = iEvent.getByLabel(DisplacedVertexTag_, displacedVertexCollHandle);
  if(foundVertexColl) displacedVertexColl = *displacedVertexCollHandle;
  
 
  // get muon collection
  edm::Handle<reco::RecoChargedCandidateCollection> mucands;
  iEvent.getByLabel (MuonTag_,mucands);
 
  // All HLT filters must create and fill an HLT filter object,
  // recording any reconstructed physics objects satisfying (or not)
  // this HLT filter, and place it in the Event.
  

  // Ref to Candidate object to be recorded in filter object
  reco::RecoChargedCandidateRef ref1;
  reco::RecoChargedCandidateRef ref2;

  std::auto_ptr<trigger::TriggerFilterObjectWithRefs> filterobject (new trigger::TriggerFilterObjectWithRefs(path(),module()));
  if(saveTag_)    filterobject->addCollectionTag(MuonTag_);

  
  bool triggered = false;
 
  // loop over vertex collection
  for(reco::VertexCollection::iterator it = displacedVertexColl.begin(); it!= displacedVertexColl.end(); it++){
          reco::Vertex displacedVertex = *it;
        
          // check if the vertex actually consists of exactly two muon tracks, throw exception if not
          if(displacedVertex.tracksSize() != 2)  throw cms::Exception("BadLogic") << "HLTDisplacedmumuFilter: ERROR: the Jpsi vertex must have exactly two muons by definition. It now has n muons = "
                                                                                    << displacedVertex.tracksSize() << std::endl;
       
          float normChi2 = displacedVertex.normalizedChi2();
          if (normChi2 > maxNormalisedChi2_) continue;
 
          // get the two muons from the vertex
          reco::Vertex::trackRef_iterator trackIt =  displacedVertex.tracks_begin();
          reco::TrackRef vertextkRef1 =  (*trackIt).castTo<reco::TrackRef>() ;
          // the second one
          trackIt++;
          reco::TrackRef vertextkRef2 =  (*trackIt).castTo<reco::TrackRef>();
          
          // calculate two-track transverse momentum
          math::XYZVector pperp(vertextkRef1->px() + vertextkRef2->px(),
                                  vertextkRef1->py() + vertextkRef2->py(),
                                  0.);
          
        
          reco::Vertex::Point vpoint=displacedVertex.position();
          //translate to global point, should be improved
          GlobalPoint secondaryVertex (vpoint.x(), vpoint.y(), vpoint.z());

          reco::Vertex::Error verr = displacedVertex.error();
          // translate to global error, should be improved
          GlobalError err(verr.At(0,0), verr.At(1,0), verr.At(1,1), verr.At(2,0), verr.At(2,1), verr.At(2,2) );

          GlobalPoint displacementFromBeamspot( -1*((vertexBeamSpot.x0() -  secondaryVertex.x()) +  (secondaryVertex.z() - vertexBeamSpot.z0()) * vertexBeamSpot.dxdz()),
                                                  -1*((vertexBeamSpot.y0() - secondaryVertex.y())+  (secondaryVertex.z() - vertexBeamSpot.z0()) * vertexBeamSpot.dydz()), 0);
        
          float lxy = displacementFromBeamspot.perp();
          float lxyerr = sqrt(err.rerr(displacementFromBeamspot));
        
        
          //calculate the angle between the decay length and the mumu momentum
          reco::Vertex::Point vperp(displacementFromBeamspot.x(),displacementFromBeamspot.y(),0.);
         
          float cosAlpha = vperp.Dot(pperp)/(vperp.R()*pperp.R());
        
          // check thresholds
          if (cosAlpha < minCosinePointingAngle_) continue;
       
          if (lxy/lxyerr < minLxySignificance_) continue;
        
          triggered = true;
 
          // now add the muons that passed to the filter object
          
          reco::RecoChargedCandidateCollection::const_iterator cand1;
          reco::RecoChargedCandidateCollection::const_iterator cand2;     

          // first find these two tracks in the muon collection
          int iFoundRefs = 0;
          for (reco::RecoChargedCandidateCollection::const_iterator cand=mucands->begin(); cand!=mucands->end(); cand++) {
            reco::TrackRef tkRef = cand->get<reco::TrackRef>();
            if(tkRef == vertextkRef1) {cand1 = cand; iFoundRefs++;}
            if(tkRef == vertextkRef2) {cand2 = cand; iFoundRefs++;}
          }
          if(iFoundRefs != 2) throw cms::Exception("BadLogic") << "HLTDisplacedmumuFilter: ERROR: the Jpsi vertex must have exactly two muons by definition."  << std::endl; 
          
          ref1=reco::RecoChargedCandidateRef( edm::Ref<reco::RecoChargedCandidateCollection>    (mucands,distance(mucands->begin(), cand1)));
          filterobject->addObject(trigger::TriggerMuon,ref1);
          
          ref2=reco::RecoChargedCandidateRef( edm::Ref<reco::RecoChargedCandidateCollection> (mucands,distance(mucands->begin(),cand2 )));
          filterobject->addObject(trigger::TriggerMuon,ref2);
  }


  // put filter object into the Event
  
  iEvent.put(filterobject);
  LogDebug("HLTDisplacedMumuFilter") << " >>>>> Result of HLTDisplacedMumuFilter is "<< triggered <<std::endl; 

  return triggered;
}

Member Data Documentation

Definition at line 23 of file HLTDisplacedmumuFilter.h.

Referenced by filter().

Definition at line 22 of file HLTDisplacedmumuFilter.h.

Referenced by filter().

Definition at line 17 of file HLTDisplacedmumuFilter.h.

Definition at line 19 of file HLTDisplacedmumuFilter.h.

Referenced by filter().

Definition at line 20 of file HLTDisplacedmumuFilter.h.

Referenced by filter().

Definition at line 18 of file HLTDisplacedmumuFilter.h.

Referenced by filter().

Definition at line 24 of file HLTDisplacedmumuFilter.h.

Referenced by filter().

Definition at line 21 of file HLTDisplacedmumuFilter.h.

Referenced by filter().