Go to the documentation of this file.00001
00002
00003
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
00053
00054
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
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
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
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);