CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoTracker/TrackProducer/plugins/FakeTrackProducers.cc

Go to the documentation of this file.
00001 
00002 //
00003 // $Id: FakeTrackProducers.cc,v 1.2 2013/02/27 14:58:17 muzaffar Exp $
00004 //
00005 
00015 #include "FWCore/Framework/interface/EDProducer.h"
00016 #include "FWCore/Framework/interface/Event.h"
00017 #include "FWCore/Framework/interface/EventSetup.h"
00018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00019 #include "FWCore/Utilities/interface/InputTag.h"
00020 
00021 #include "DataFormats/TrackReco/interface/Track.h"
00022 #include "DataFormats/TrackReco/interface/TrackExtra.h"
00023 #include "DataFormats/TrackCandidate/interface/TrackCandidate.h"
00024 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00025 #include "TrackingTools/TrackRefitter/interface/TrackTransformer.h"
00026 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00027 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00028 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
00029 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00030 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00031 #include "MagneticField/Engine/interface/MagneticField.h"
00032 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00033 #include "FWCore/Framework/interface/ESHandle.h"
00034 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00035 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00036 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00037 
00038 
00039 
00040 template<class T>
00041 class FakeTrackProducer : public edm::EDProducer {
00042     public:
00043       explicit FakeTrackProducer(const edm::ParameterSet & iConfig);
00044       virtual ~FakeTrackProducer() { }
00045 
00046       virtual void produce(edm::Event & iEvent, const edm::EventSetup & iSetup) override;
00047     private:
00049       edm::InputTag src_;
00050 
00052       //StringCutObjectSelector<T> selector_;
00053 
00054       // EventSetup
00055       edm::ESHandle<TrackerGeometry> theGeometry;
00056       edm::ESHandle<MagneticField>   theMagField;
00057 
00058       const PTrajectoryStateOnDet & getState(const TrajectorySeed &seed) const { return seed.startingState(); }
00059       const PTrajectoryStateOnDet & getState(const TrackCandidate &seed) const { return seed.trajectoryStateOnDet(); }
00060       TrajectorySeed::range  getHits (const TrajectorySeed &seed) const { return seed.recHits(); }
00061       TrajectorySeed::range  getHits (const TrackCandidate &seed) const { return seed.recHits(); }
00062 };
00063 
00064 
00065 template<typename T>
00066 FakeTrackProducer<T>::FakeTrackProducer(const edm::ParameterSet & iConfig) :
00067     src_(iConfig.getParameter<edm::InputTag>("src"))
00068     //,selector_(iConfig.existsAs<std::string>("cut") ? iConfig.getParameter<std::string>("cut") : "", true)
00069 {
00070     produces<std::vector<reco::Track> >(); 
00071     produces<std::vector<reco::TrackExtra> >();
00072     produces<edm::OwnVector<TrackingRecHit> >();
00073 }
00074 
00075 template<typename T>
00076 void 
00077 FakeTrackProducer<T>::produce(edm::Event & iEvent, const edm::EventSetup & iSetup) {
00078     using namespace edm;
00079     using namespace std;
00080 
00081 
00082     iSetup.get<TrackerDigiGeometryRecord>().get(theGeometry);
00083     iSetup.get<IdealMagneticFieldRecord>().get(theMagField);
00084 
00085     Handle<vector<T> > src;
00086     iEvent.getByLabel(src_, src);
00087 
00088     auto_ptr<vector<reco::Track> > out(new vector<reco::Track>());
00089     out->reserve(src->size());
00090     auto_ptr<vector<reco::TrackExtra> > outEx(new vector<reco::TrackExtra>());
00091     outEx->reserve(src->size());
00092     auto_ptr<OwnVector<TrackingRecHit> > outHits(new OwnVector<TrackingRecHit>());
00093 
00094     TrackingRecHitRefProd rHits = iEvent.getRefBeforePut<TrackingRecHitCollection>();
00095     reco::TrackExtraRefProd rTrackExtras = iEvent.getRefBeforePut<reco::TrackExtraCollection>();
00096     for (typename vector<T>::const_iterator it = src->begin(), ed = src->end(); it != ed; ++it) {
00097         const T &mu = *it;
00098         //if (!selector_(mu)) continue;
00099         const PTrajectoryStateOnDet & pstate = getState(mu);
00100         const GeomDet *det = theGeometry->idToDet(DetId(pstate.detId()));
00101         if (det == 0) { std::cerr << "ERROR:  bogus detid " << pstate.detId() << std::endl; continue; }
00102         TrajectoryStateOnSurface state = trajectoryStateTransform::transientState(pstate, & det->surface(), &*theMagField);
00103         GlobalPoint  gx = state.globalPosition();
00104         GlobalVector gp = state.globalMomentum();
00105         reco::Track::Point x(gx.x(), gx.y(), gx.z());
00106         reco::Track::Vector p(gp.x(), gp.y(), gp.z());
00107         int charge = state.localParameters().charge();
00108         out->push_back(reco::Track(1.0,1.0,x,p,charge,reco::Track::CovarianceMatrix()));
00109         TrajectorySeed::range hits = getHits(mu);
00110         out->back().setHitPattern(hits.first, hits.second);
00111         // Now Track Extra
00112         const TrackingRecHit *hit0 =  &*hits.first;
00113         const TrackingRecHit *hit1 = &*(hits.second-1);
00114         const GeomDet *det0 = theGeometry->idToDet(hit0->geographicalId());
00115         const GeomDet *det1 = theGeometry->idToDet(hit1->geographicalId());
00116         if (det0 == 0 || det1 == 0) { std::cerr << "ERROR:  bogus detids at beginning or end of range" << std::endl; continue; }
00117         GlobalPoint gx0 = det0->toGlobal(hit0->localPosition());
00118         GlobalPoint gx1 = det1->toGlobal(hit1->localPosition());
00119         reco::Track::Point x0(gx0.x(), gx0.y(), gx0.z());
00120         reco::Track::Point x1(gx1.x(), gx1.y(), gx1.z());
00121         if (x0.R() > x1.R()) std::swap(x0,x1);
00122         outEx->push_back( reco::TrackExtra(x1, p, true, x0, p, true, 
00123                                 reco::Track::CovarianceMatrix(), hit0->geographicalId().rawId(),
00124                                 reco::Track::CovarianceMatrix(), hit1->geographicalId().rawId(),
00125                                 alongMomentum) );
00126         out->back().setExtra( reco::TrackExtraRef( rTrackExtras, outEx->size()-1 ) );
00127         reco::TrackExtra &ex = outEx->back();    
00128         for (OwnVector<TrackingRecHit>::const_iterator it2 = hits.first; it2 != hits.second; ++it2) {
00129             outHits->push_back(*it2);
00130             ex.add( TrackingRecHitRef( rHits, outHits->size()-1 ) );
00131         } 
00132     }
00133 
00134     iEvent.put(out);
00135     iEvent.put(outEx);
00136     iEvent.put(outHits);
00137 }
00138 
00139 typedef  FakeTrackProducer<TrajectorySeed> FakeTrackProducerFromSeed;
00140 typedef  FakeTrackProducer<TrackCandidate> FakeTrackProducerFromCandidate;
00141 #include "FWCore/Framework/interface/MakerMacros.h"
00142 DEFINE_FWK_MODULE(FakeTrackProducerFromSeed);
00143 DEFINE_FWK_MODULE(FakeTrackProducerFromCandidate);