CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/RecoParticleFlow/PFTracking/plugins/PFDisplacedTrackerVertexProducer.cc

Go to the documentation of this file.
00001 #include <memory>
00002 #include "RecoParticleFlow/PFTracking/plugins/PFDisplacedTrackerVertexProducer.h"
00003 #include "RecoParticleFlow/PFTracking/interface/PFTrackTransformer.h"
00004 #include "DataFormats/ParticleFlowReco/interface/PFDisplacedTrackerVertex.h"
00005 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00006 #include "FWCore/Framework/interface/ESHandle.h"
00007 #include "MagneticField/Engine/interface/MagneticField.h"
00008 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00009 using namespace std;
00010 using namespace edm;
00011 PFDisplacedTrackerVertexProducer::PFDisplacedTrackerVertexProducer(const ParameterSet& iConfig):
00012   pfTransformer_(0)
00013 {
00014   produces<reco::PFRecTrackCollection>();
00015   produces<reco::PFDisplacedTrackerVertexCollection>();
00016 
00017   pfDisplacedVertexContainer_ = 
00018     iConfig.getParameter< InputTag >("displacedTrackerVertexColl");
00019 
00020   pfTrackContainer_ =
00021     iConfig.getParameter< InputTag >("trackColl");
00022 
00023 }
00024 
00025 PFDisplacedTrackerVertexProducer::~PFDisplacedTrackerVertexProducer()
00026 {
00027   delete pfTransformer_;
00028 }
00029 
00030 void
00031 PFDisplacedTrackerVertexProducer::produce(Event& iEvent, const EventSetup& iSetup)
00032 {
00033 
00034   //create the empty collections 
00035   auto_ptr< reco::PFDisplacedTrackerVertexCollection > 
00036     pfDisplacedTrackerVertexColl (new reco::PFDisplacedTrackerVertexCollection);
00037   auto_ptr< reco::PFRecTrackCollection > 
00038     pfRecTrackColl (new reco::PFRecTrackCollection);
00039   
00040   reco::PFRecTrackRefProd pfTrackRefProd = iEvent.getRefBeforePut<reco::PFRecTrackCollection>();
00041 
00042 
00043     
00044   Handle<reco::PFDisplacedVertexCollection> nuclCollH;
00045   iEvent.getByLabel(pfDisplacedVertexContainer_, nuclCollH);
00046   const reco::PFDisplacedVertexCollection& nuclColl = *(nuclCollH.product());
00047 
00048   Handle<reco::TrackCollection> trackColl;
00049   iEvent.getByLabel(pfTrackContainer_, trackColl);
00050 
00051   int idx = 0;
00052 
00053   //  cout << "Size of Displaced Vertices " 
00054   //     <<  nuclColl.size() << endl;
00055 
00056   // loop on all NuclearInteraction 
00057   for( unsigned int icoll=0; icoll < nuclColl.size(); icoll++) {
00058 
00059     reco::PFRecTrackRefVector pfRecTkcoll;
00060 
00061     std::vector<reco::Track> refittedTracks = nuclColl[icoll].refittedTracks();
00062 
00063     // convert the secondary tracks
00064     for(unsigned it = 0; it < refittedTracks.size(); it++){
00065 
00066       reco::TrackBaseRef trackBaseRef = nuclColl[icoll].originalTrack(refittedTracks[it]);
00067 
00068       //      cout << "track base pt = " << trackBaseRef->pt() << endl;
00069 
00070       reco::TrackRef trackRef(trackColl, trackBaseRef.key());
00071 
00072       //      cout << "track pt = " << trackRef->pt() << endl;
00073 
00074 
00075       reco::PFRecTrack pfRecTrack( trackBaseRef->charge(), 
00076                                    reco::PFRecTrack::KF, 
00077                                    trackBaseRef.key(), 
00078                                    trackRef );
00079 
00080       // cout << pfRecTrack << endl;
00081 
00082       Trajectory FakeTraj;
00083       bool valid = pfTransformer_->addPoints( pfRecTrack, *trackBaseRef, FakeTraj);
00084       if(valid) {
00085         pfRecTkcoll.push_back(reco::PFRecTrackRef( pfTrackRefProd, idx++));     
00086         pfRecTrackColl->push_back(pfRecTrack);
00087         //      cout << "after "<< pfRecTrack << endl;
00088           
00089       }
00090     }
00091     reco::PFDisplacedVertexRef niRef(nuclCollH, icoll);
00092     pfDisplacedTrackerVertexColl->push_back( reco::PFDisplacedTrackerVertex( niRef, pfRecTkcoll ));
00093   }
00094  
00095   iEvent.put(pfRecTrackColl);
00096   iEvent.put(pfDisplacedTrackerVertexColl);
00097 }
00098 
00099 // ------------ method called once each job just before starting event loop  ------------
00100 void 
00101 PFDisplacedTrackerVertexProducer::beginRun(const edm::Run& run,
00102                                            const EventSetup& iSetup)
00103 {
00104   ESHandle<MagneticField> magneticField;
00105   iSetup.get<IdealMagneticFieldRecord>().get(magneticField);
00106   pfTransformer_= new PFTrackTransformer(math::XYZVector(magneticField->inTesla(GlobalPoint(0,0,0))));
00107   pfTransformer_->OnlyProp();
00108 }
00109 
00110 // ------------ method called once each job just after ending the event loop  ------------
00111 void 
00112 PFDisplacedTrackerVertexProducer::endRun(const edm::Run& run,
00113                                          const EventSetup& iSetup) {
00114   delete pfTransformer_;
00115   pfTransformer_=nullptr;
00116 }