CMS 3D CMS Logo

Public Types | Public Member Functions | Private Attributes

SoftConversionProducer Class Reference

#include <SoftConversionProducer.h>

Inheritance diagram for SoftConversionProducer:
edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Types

typedef std::vector< std::pair
< reco::TrackRef,
reco::CaloClusterPtr > > 
TrackClusterMap

Public Member Functions

virtual void beginRun (edm::Run &r, edm::EventSetup const &es)
virtual void endRun (edm::Run &, edm::EventSetup const &)
bool NotAlreadyIn (const reco::Conversion &thisConv, const std::auto_ptr< reco::ConversionCollection > &outputColl) const
virtual void produce (edm::Event &evt, const edm::EventSetup &es)
 SoftConversionProducer (const edm::ParameterSet &ps)
bool trackQualityCut (const reco::TrackRef &trk)
 ~SoftConversionProducer ()

Private Attributes

edm::InputTag clusterBarrelCollection_
edm::InputTag clusterEndcapCollection_
double clustersMaxDeltaEta_
double clustersMaxDeltaPhi_
std::string clusterType_
edm::ParameterSet conf_
std::string conversionIOTrackProducer_
std::string conversionOITrackProducer_
std::string inOutTrackClusterAssociationCollection_
std::string outInTrackClusterAssociationCollection_
std::string softConversionCollection_
ConversionTrackEcalImpactPointtheEcalImpactPositionFinder_
edm::ESHandle
< GeometricSearchTracker
theGeomSearchTracker_
edm::ESHandle< MagneticFieldtheMF_
ConversionTrackPairFindertheTrackPairFinder_
ConversionVertexFindertheVertexFinder_
double trackMaxChi2_
double trackMinHits_

Detailed Description

Id:
SoftConversionProducer.h,v 1.8 2009/03/04 21:20:14 nancy Exp
Date:
2009/03/04 21:20:14
Revision:
1.8
Author:
Dongwook Jang, Carnegie Mellon University Modified version of ConvertedPhotonProducer

Definition at line 27 of file SoftConversionProducer.h.


Member Typedef Documentation

Definition at line 31 of file SoftConversionProducer.h.


Constructor & Destructor Documentation

SoftConversionProducer::SoftConversionProducer ( const edm::ParameterSet ps)

Definition at line 37 of file SoftConversionProducer.cc.

References clusterBarrelCollection_, clusterEndcapCollection_, clustersMaxDeltaEta_, clustersMaxDeltaPhi_, clusterType_, conf_, conversionIOTrackProducer_, conversionOITrackProducer_, edm::ParameterSet::getParameter(), inOutTrackClusterAssociationCollection_, LogDebug, outInTrackClusterAssociationCollection_, softConversionCollection_, theEcalImpactPositionFinder_, theTrackPairFinder_, theVertexFinder_, trackMaxChi2_, and trackMinHits_.

                                                                            : conf_(config) {

  LogDebug("SoftConversionProducer") << " SoftConversionProducer CTOR " << "\n";
  
  conversionOITrackProducer_              = conf_.getParameter<std::string>("conversionOITrackProducer");
  conversionIOTrackProducer_              = conf_.getParameter<std::string>("conversionIOTrackProducer");
  outInTrackClusterAssociationCollection_ = conf_.getParameter<std::string>("outInTrackClusterAssociationCollection");
  inOutTrackClusterAssociationCollection_ = conf_.getParameter<std::string>("inOutTrackClusterAssociationCollection");
  clusterType_                            = conf_.getParameter<std::string>("clusterType");
  clusterBarrelCollection_                = conf_.getParameter<edm::InputTag>("clusterBarrelCollection");
  clusterEndcapCollection_                = conf_.getParameter<edm::InputTag>("clusterEndcapCollection");
  softConversionCollection_               = conf_.getParameter<std::string>("softConversionCollection");
  trackMaxChi2_                           = conf_.getParameter<double>("trackMaxChi2");
  trackMinHits_                           = conf_.getParameter<double>("trackMinHits");
  clustersMaxDeltaEta_                    = conf_.getParameter<double>("clustersMaxDeltaEta");
  clustersMaxDeltaPhi_                    = conf_.getParameter<double>("clustersMaxDeltaPhi");
  
  theTrackPairFinder_ = 0;
  theVertexFinder_ = 0;
  theEcalImpactPositionFinder_ = 0;
  
  // Register the product
  produces< reco::ConversionCollection >(softConversionCollection_);

}
SoftConversionProducer::~SoftConversionProducer ( )

Definition at line 64 of file SoftConversionProducer.cc.

{}

Member Function Documentation

void SoftConversionProducer::beginRun ( edm::Run r,
edm::EventSetup const &  es 
) [virtual]

Reimplemented from edm::EDProducer.

Definition at line 67 of file SoftConversionProducer.cc.

References conf_, edm::EventSetup::get(), theEcalImpactPositionFinder_, theMF_, theTrackPairFinder_, and theVertexFinder_.

                                                                                      {
  
  //get magnetic field
  theEventSetup.get<IdealMagneticFieldRecord>().get(theMF_);  
  
  // instantiate the Track Pair Finder algorithm
  theTrackPairFinder_ = new ConversionTrackPairFinder ();

  // instantiate the Vertex Finder algorithm
  theVertexFinder_ = new ConversionVertexFinder (conf_);
  
  // instantiate the algorithm for finding the position of the track extrapolation at the Ecal front face
  theEcalImpactPositionFinder_ = new   ConversionTrackEcalImpactPoint ( &(*theMF_) );

}
void SoftConversionProducer::endRun ( edm::Run r,
edm::EventSetup const &  theEventSetup 
) [virtual]
bool SoftConversionProducer::NotAlreadyIn ( const reco::Conversion thisConv,
const std::auto_ptr< reco::ConversionCollection > &  outputColl 
) const

Definition at line 261 of file SoftConversionProducer.cc.

References conv, and reco::Conversion::tracks().

Referenced by produce().

                                                                                                         {

  if(outputColl->size() == 0) return true;

  reco::ConversionCollection::const_iterator it = outputColl->begin();
  reco::ConversionCollection::const_iterator it_end = outputColl->end();
  for( ; it != it_end; it++){
    const reco::Conversion& conv = *it;
    if((thisConv.tracks()[0] == conv.tracks()[0] && thisConv.tracks()[1] == conv.tracks()[1]) ||
       (thisConv.tracks()[0] == conv.tracks()[1] && thisConv.tracks()[1] == conv.tracks()[0]))
      return false;
  }// for
  
  return true;
}
void SoftConversionProducer::produce ( edm::Event evt,
const edm::EventSetup es 
) [virtual]

Implements edm::EDProducer.

Definition at line 94 of file SoftConversionProducer.cc.

References abs, TwoTrackMinimumDistance::calculate(), clusterBarrelCollection_, clusterEndcapCollection_, clustersMaxDeltaEta_, clustersMaxDeltaPhi_, clusterType_, conversionIOTrackProducer_, conversionOITrackProducer_, TwoTrackMinimumDistance::distance(), dPhi(), ExpressReco_HICollisions_FallBack::e, ConversionTrackEcalImpactPoint::find(), edm::EventSetup::get(), edm::Event::getByLabel(), TrajectoryStateOnSurface::globalParameters(), reco::TransientTrack::initialFreeState(), reco::TransientTrack::innermostMeasurementState(), inOutTrackClusterAssociationCollection_, reco::Vertex::isValid(), mag(), GlobalTrajectoryParameters::momentum(), NotAlreadyIn(), outInTrackClusterAssociationCollection_, GlobalTrajectoryParameters::position(), edm::PtrVector< T >::push_back(), edm::Event::put(), ConversionVertexFinder::run(), softConversionCollection_, theEcalImpactPositionFinder_, theVertexFinder_, and trackQualityCut().

                                                                                           {
  
  edm::Handle<reco::TrackCollection> outInTrkHandle;
  theEvent.getByLabel(conversionOITrackProducer_,  outInTrkHandle);
   
  edm::Handle<reco::TrackCaloClusterPtrAssociation> outInTrkClusterAssocHandle;
  theEvent.getByLabel( conversionOITrackProducer_, outInTrackClusterAssociationCollection_, outInTrkClusterAssocHandle);

  edm::Handle<reco::TrackCollection> inOutTrkHandle;
  theEvent.getByLabel(conversionIOTrackProducer_, inOutTrkHandle);
  
  edm::Handle<reco::TrackCaloClusterPtrAssociation> inOutTrkClusterAssocHandle;
  theEvent.getByLabel( conversionIOTrackProducer_, inOutTrackClusterAssociationCollection_, inOutTrkClusterAssocHandle);

  edm::Handle<edm::View<reco::CaloCluster> > clusterBarrelHandle;
  theEvent.getByLabel(clusterBarrelCollection_, clusterBarrelHandle);

  edm::Handle<edm::View<reco::CaloCluster> > clusterEndcapHandle;
  if(clusterType_ == "BasicCluster"){
    //theEvent.getByLabel(clusterEndcapProducer_, clusterEndcapCollection_, clusterEndcapHandle);
    theEvent.getByLabel(clusterEndcapCollection_, clusterEndcapHandle);
  }

  // create temporary map to loop over tracks conveniently
  TrackClusterMap trackClusterMap;

  int nTracksOI = (int) outInTrkHandle->size();
  //  std::cout << "  nTracksOI " <<  nTracksOI << std::endl;
  for(int itrk=0; itrk<nTracksOI; itrk++){
    reco::TrackRef tRef(outInTrkHandle,itrk);
    if(!trackQualityCut(tRef)) continue;
    reco::CaloClusterPtr cRef = (*outInTrkClusterAssocHandle)[tRef];
    trackClusterMap.push_back(make_pair(tRef,cRef));
  }

  int nTracksIO = (int) inOutTrkHandle->size();
  // std::cout << "  nTracksIO " <<  nTracksIO << std::endl;
  for(int itrk=0; itrk<nTracksIO; itrk++){
    reco::TrackRef tRef(inOutTrkHandle,itrk);
    if(!trackQualityCut(tRef)) continue;
    reco::CaloClusterPtr cRef = (*inOutTrkClusterAssocHandle)[tRef];
    trackClusterMap.push_back(make_pair(tRef,cRef));
  }

  // Transform Track into TransientTrack (needed by the Vertex fitter)
  edm::ESHandle<TransientTrackBuilder> theTransientTrackBuilder;
  theEventSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",theTransientTrackBuilder);

  // the output collection to be produced from this producer
  std::auto_ptr< reco::ConversionCollection > outputColl(new reco::ConversionCollection);

  // prepare iterator
  TrackClusterMap::iterator iter1    = trackClusterMap.begin();
  TrackClusterMap::iterator iter2    = trackClusterMap.begin();
  TrackClusterMap::iterator iter_end = trackClusterMap.end();



  // double-loop to make pairs
  for( ; iter1 != iter_end; iter1++) {
    //    std::cout << " back to start of loop 1 " << std::endl;
    const reco::TrackRef trk1 = iter1->first;

    for(iter2 = iter1+1; iter2 != iter_end; iter2++) {
      //      std::cout << " back to start of loop 2 " << std::endl;
      const reco::TrackRef trk2 = iter2->first;
      if(trk1 == trk2) continue;


      const reco::CaloClusterPtr cls1 = iter1->second;
      reco::TransientTrack tsk1 = theTransientTrackBuilder->build(*trk1);

      const reco::CaloClusterPtr cls2 = iter2->second;
      reco::TransientTrack tsk2 = theTransientTrackBuilder->build(*trk2);

      //      std::cout << " after transient " << std::endl;
      // std::cout << " eta1 " << cls1->position().Eta() << " eta2 " << cls2->position().Eta() << std::endl;

      if ( ( tsk1.innermostMeasurementState().globalParameters().position() - tsk2.innermostMeasurementState().globalParameters().position() ).mag() < 1e-7 &&
           ( tsk1.innermostMeasurementState().globalParameters().momentum() - tsk2.innermostMeasurementState().globalParameters().momentum() ).mag() < 1e-7 ) continue;


      double dEta = std::abs(cls1->position().Eta() - cls2->position().Eta());
      if(dEta > clustersMaxDeltaEta_) continue;
      double dPhi = std::abs(ROOT::Math::VectorUtil::DeltaPhi(cls1->position(),cls2->position()));
      if(dPhi > clustersMaxDeltaPhi_) continue;

      std::vector<reco::TransientTrack> toBeFitted;
      toBeFitted.push_back(tsk1);
      toBeFitted.push_back(tsk2);

      // 
      TwoTrackMinimumDistance md;
      md.calculate  (  tsk1.initialFreeState(),  tsk2.initialFreeState() );
      float minAppDist = md.distance(); 
 


      //      std::cout << " Before vertex " << std::endl;
      reco::Vertex theConversionVertex = (reco::Vertex) theVertexFinder_->run(toBeFitted);
      //std::cout << " After vertex " << std::endl;

      if(theConversionVertex.isValid()){
        //      std::cout << " valid vertex " << std::endl;
        reco::CaloClusterPtrVector scRefs;
        scRefs.push_back(cls1);
        scRefs.push_back(cls2);
        //std::cout << " after push back scref " << std::endl; 
        std::vector<reco::CaloClusterPtr> clusterRefs;
        clusterRefs.push_back(cls1);
        clusterRefs.push_back(cls2);
        //std::cout << " after push back slusterref " << std::endl; 
        std::vector<reco::TrackRef> trkRefs;
        trkRefs.push_back(trk1);
        trkRefs.push_back(trk2);

        std::vector<math::XYZVector> trackPin;
        std::vector<math::XYZVector> trackPout;
        trackPin.push_back( trk1->innerMomentum());
        trackPin.push_back( trk2->innerMomentum());
        trackPout.push_back( trk1->outerMomentum());
        trackPout.push_back( trk2->outerMomentum());

        //      std::cout << " Before impact finder " << std::endl;
        std::vector<math::XYZPoint> trkPositionAtEcal = theEcalImpactPositionFinder_->find(toBeFitted,clusterBarrelHandle);
        //      std::cout << " After impact finder " << std::endl;
        if((clusterType_ == "BasicCluster") && (std::abs(cls2->position().Eta()) > 1.5)){
          trkPositionAtEcal.clear();
          trkPositionAtEcal = theEcalImpactPositionFinder_->find(toBeFitted,clusterEndcapHandle);
        }

        double dummy = -9999.;
        std::vector<math::XYZPoint> dummyVec;
        reco::Conversion  newCandidate(scRefs,  trkRefs,  trkPositionAtEcal, theConversionVertex, clusterRefs,  minAppDist,dummyVec,  trackPin, trackPout, dummy );

        // Check this candidate is already in the collection.
        // This is checking that two tracks in a conversion candidate are identicial.

        if(NotAlreadyIn(newCandidate,outputColl)) outputColl->push_back(newCandidate);

        //      printf("=====> run(%d), event(%d) <=====\n",theEvent.id().run(),theEvent.id().event());
        //      printf("Found a softConverion with vtxR(%f), vtxEta(%f), pt(%f), pt1(%f), pt2(%f)\n",
        //      newCandidate.conversionVertex().position().rho(),newCandidate.conversionVertex().position().eta(),
        //      newCandidate.pairMomentum().perp(),trk1->momentum().rho(),trk2->momentum().rho());

        clusterRefs.clear();
        trkRefs.clear();
        trkPositionAtEcal.clear();
      }// if(theConversionVertex.isValid()

      toBeFitted.clear();

    }// end of iter2
  }// end of iter1

  //  std::cout << " Putting stuff in the event " << std::endl;
  // put the collection into the event
  theEvent.put( outputColl, softConversionCollection_);
  
}
bool SoftConversionProducer::trackQualityCut ( const reco::TrackRef trk)

Definition at line 256 of file SoftConversionProducer.cc.

References trackMaxChi2_, and trackMinHits_.

Referenced by produce().

                                                                   {
  return (trk->numberOfValidHits() >= trackMinHits_ && trk->normalizedChi2() < trackMaxChi2_);
}

Member Data Documentation

Definition at line 54 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 55 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 60 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 61 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

std::string SoftConversionProducer::clusterType_ [private]

Definition at line 53 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 63 of file SoftConversionProducer.h.

Referenced by beginRun(), and SoftConversionProducer().

Definition at line 48 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 47 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 51 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 50 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 57 of file SoftConversionProducer.h.

Referenced by produce(), and SoftConversionProducer().

Definition at line 69 of file SoftConversionProducer.h.

Referenced by beginRun(), endRun(), produce(), and SoftConversionProducer().

Definition at line 65 of file SoftConversionProducer.h.

Definition at line 64 of file SoftConversionProducer.h.

Referenced by beginRun().

Definition at line 67 of file SoftConversionProducer.h.

Referenced by beginRun(), endRun(), and SoftConversionProducer().

Definition at line 68 of file SoftConversionProducer.h.

Referenced by beginRun(), endRun(), produce(), and SoftConversionProducer().

Definition at line 58 of file SoftConversionProducer.h.

Referenced by SoftConversionProducer(), and trackQualityCut().

Definition at line 59 of file SoftConversionProducer.h.

Referenced by SoftConversionProducer(), and trackQualityCut().