CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoEgamma/EgammaPhotonProducers/src/ConversionTrackProducer.cc

Go to the documentation of this file.
00001 //
00002 // Package:         RecoTracker/FinalTrackSelectors
00003 // Class:           ConversionTrackProducer
00004 // 
00005 // Description:     Trivial producer of ConversionTrack collection from an edm::View of a track collection
00006 //                  (ConversionTrack is a simple wrappper class containing a TrackBaseRef and some additional flags)
00007 //
00008 // Original Author: J.Bendavid
00009 //
00010 // $Author: bendavid $
00011 // $Date: 2010/11/22 02:02:08 $
00012 // $Revision: 1.3 $
00013 //
00014 
00015 #include <memory>
00016 #include <string>
00017 #include <iostream>
00018 #include <cmath>
00019 #include <vector>
00020 
00021 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00022 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
00023 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00024 #include "DataFormats/GsfTrackReco/interface/GsfTrackFwd.h"
00025 #include "TrackingTools/GsfTracking/interface/TrajGsfTrackAssociation.h"
00026 #include "RecoEgamma/EgammaPhotonProducers/interface/ConversionTrackProducer.h"
00027 #include "DataFormats/Common/interface/Handle.h"
00028 
00029 
00030 #include "FWCore/Framework/interface/ESHandle.h"
00031 
00032 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00033 
00034     
00035   ConversionTrackProducer::ConversionTrackProducer(edm::ParameterSet const& conf) : 
00036     conf_(conf)
00037   {
00038     produces<reco::ConversionTrackCollection>();
00039    
00040   }
00041 
00042 
00043   // Virtual destructor needed.
00044   ConversionTrackProducer::~ConversionTrackProducer() { }  
00045 
00046   // Functions that gets called by framework every event
00047   void ConversionTrackProducer::produce(edm::Event& e, const edm::EventSetup& es)
00048   {
00049     // retrieve producer name of input TrackCollection(s)
00050     std::string trackProducer = conf_.getParameter<std::string>("TrackProducer");
00051     bool useTrajectory = conf_.getParameter<bool>("useTrajectory");
00052     bool setTrackerOnly = conf_.getParameter<bool>("setTrackerOnly");
00053     bool setArbitratedEcalSeeded = conf_.getParameter<bool>("setArbitratedEcalSeeded");    
00054     bool setArbitratedMerged = conf_.getParameter<bool>("setArbitratedMerged");
00055     bool setArbitratedMergedEcalGeneral = conf_.getParameter<bool>("setArbitratedMergedEcalGeneral");    
00056     
00057     //get input collection (through edm::View)
00058     edm::Handle<edm::View<reco::Track> > hTrks;
00059     e.getByLabel(trackProducer, hTrks);
00060 
00061     //get association maps between trajectories and tracks and build temporary maps
00062     edm::Handle< TrajTrackAssociationCollection > hTTAss;
00063     edm::Handle< edm::AssociationMap<edm::OneToOne<std::vector<Trajectory>,
00064                                           reco::GsfTrackCollection,unsigned short> > > hTTAssGsf;    
00065                                           
00066     std::map<reco::TrackRef,edm::Ref<std::vector<Trajectory> > > tracktrajmap;
00067     std::map<reco::GsfTrackRef,edm::Ref<std::vector<Trajectory> > > gsftracktrajmap;
00068                                           
00069     if (useTrajectory) {
00070       if (hTrks->size()>0) {
00071         if (dynamic_cast<const reco::GsfTrack*>(&hTrks->at(0))) {
00072           //fill map for gsf tracks
00073           e.getByLabel(trackProducer, hTTAssGsf);     
00074           for ( edm::AssociationMap<edm::OneToOne<std::vector<Trajectory>,
00075                     reco::GsfTrackCollection,unsigned short> >::const_iterator iPair = hTTAssGsf->begin();
00076             iPair != hTTAssGsf->end(); ++iPair) {
00077         
00078             gsftracktrajmap[iPair->val] = iPair->key;
00079 
00080           }
00081                 
00082         }
00083         else {
00084           //fill map for standard tracks
00085           e.getByLabel(trackProducer, hTTAss);
00086           for ( TrajTrackAssociationCollection::const_iterator iPair = hTTAss->begin();
00087             iPair != hTTAss->end();
00088             ++iPair) {
00089         
00090             tracktrajmap[iPair->val] = iPair->key;
00091 
00092           }
00093         }
00094       }
00095     }
00096 
00097     // Step B: create empty output collection
00098     outputTrks = std::auto_ptr<reco::ConversionTrackCollection>(new reco::ConversionTrackCollection);    
00099     
00100     // Simple conversion of tracks to conversion tracks, setting appropriate flags from configuration
00101     for (edm::RefToBaseVector<reco::Track>::const_iterator it = hTrks->refVector().begin(); it != hTrks->refVector().end(); ++it) {
00102       reco::ConversionTrack convTrack(*it);
00103       convTrack.setIsTrackerOnly(setTrackerOnly);
00104       convTrack.setIsArbitratedEcalSeeded(setArbitratedEcalSeeded);
00105       convTrack.setIsArbitratedMerged(setArbitratedMerged);
00106       convTrack.setIsArbitratedMergedEcalGeneral(setArbitratedMergedEcalGeneral);
00107             
00108       //fill trajectory association if configured, using correct map depending on track type
00109       if (useTrajectory) {
00110         if (gsftracktrajmap.size()) {
00111           convTrack.setTrajRef(gsftracktrajmap.find(it->castTo<reco::GsfTrackRef>())->second);
00112         }
00113         else {
00114           convTrack.setTrajRef(tracktrajmap.find(it->castTo<reco::TrackRef>())->second);
00115         }
00116       }
00117       
00118       outputTrks->push_back(convTrack);
00119     }
00120     
00121     e.put(outputTrks);
00122     return;
00123 
00124   }//end produce