CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PFTrackProducer.cc
Go to the documentation of this file.
1 #include <memory>
18 
19 
20 using namespace std;
21 using namespace edm;
22 using namespace reco;
24  pfTransformer_(0)
25 {
26  produces<reco::PFRecTrackCollection>();
27 
29  iConfig.getParameter< vector < InputTag > >("TkColList");
30 
31  useQuality_ = iConfig.getParameter<bool>("UseQuality");
32 
34  ("GsfTrackModuleLabel");
35 
36  trackQuality_=reco::TrackBase::qualityByName(iConfig.getParameter<std::string>("TrackQuality"));
37 
38  muonColl_ = iConfig.getParameter< InputTag >("MuColl");
39 
40  trajinev_ = iConfig.getParameter<bool>("TrajInEvents");
41 
42  gsfinev_ = iConfig.getParameter<bool>("GsfTracksInEvents");
43 
44 }
45 
47 {
48  delete pfTransformer_;
49 }
50 
51 void
53 {
54 
55  //create the empty collections
56  auto_ptr< reco::PFRecTrackCollection >
57  PfTrColl (new reco::PFRecTrackCollection);
58 
59  //read track collection
60  Handle<GsfTrackCollection> gsftrackcoll;
61  bool foundgsf = iEvent.getByLabel(gsfTrackLabel_,gsftrackcoll);
62  GsfTrackCollection gsftracks;
63  if(gsfinev_) {
64  if(!foundgsf )
65  LogError("PFTrackProducer")
66  <<" cannot get GsfTracks (probably in HI events): "
67  << " please set GsfTracksInEvents = False in RecoParticleFlow/PFTracking/python/pfTrack_cfi.py" << endl;
68  else
69  gsftracks = *(gsftrackcoll.product());
70  }
71 
72  // read muon collection
74  iEvent.getByLabel(muonColl_, recMuons);
75 
76 
77  for (unsigned int istr=0; istr<tracksContainers_.size();istr++){
78 
79  //Track collection
80  Handle<reco::TrackCollection> tkRefCollection;
81  iEvent.getByLabel(tracksContainers_[istr], tkRefCollection);
82  reco::TrackCollection Tk=*(tkRefCollection.product());
83 
84  vector<Trajectory> Tj(0);
85  if(trajinev_) {
86  //Trajectory collection
87  Handle<vector<Trajectory> > tjCollection;
88  bool found = iEvent.getByLabel(tracksContainers_[istr], tjCollection);
89  if(!found )
90  LogError("PFTrackProducer")
91  <<" cannot get Trajectories of: "
92  << tracksContainers_[istr]
93  << " please set TrajInEvents = False in RecoParticleFlow/PFTracking/python/pfTrack_cfi.py" << endl;
94 
95  Tj =*(tjCollection.product());
96  }
97 
98 
99  for(unsigned int i=0;i<Tk.size();i++){
100 
101  reco::TrackRef trackRef(tkRefCollection, i);
102 
103  if (useQuality_ &&
104  (!(Tk[i].quality(trackQuality_)))){
105 
106  bool isMuCandidate = false;
107 
108  //TrackRef trackRef(tkRefCollection, i);
109 
110  if(recMuons.isValid() ) {
111  for(unsigned j=0;j<recMuons->size(); j++) {
112  reco::MuonRef muonref( recMuons, j );
113  if (muonref->track().isNonnull())
114  if( muonref->track() == trackRef && muonref->isGlobalMuon()){
115  isMuCandidate=true;
116  //cout<<" SAVING TRACK "<<endl;
117  break;
118  }
119  }
120  }
121 
122  if(!isMuCandidate){
123  continue;
124  }
125 
126  }
127 
128 
129  // find the pre-id kf track
130  bool preId = false;
131  if(foundgsf) {
132  for (unsigned int igsf=0; igsf<gsftracks.size();igsf++) {
133  GsfTrackRef gsfTrackRef(gsftrackcoll, igsf);
134  if (gsfTrackRef->seedRef().isNull()) continue;
135  ElectronSeedRef ElSeedRef= gsfTrackRef->extra()->seedRef().castTo<ElectronSeedRef>();
136  if (ElSeedRef->ctfTrack().isNonnull()) {
137  if(ElSeedRef->ctfTrack() == trackRef) preId = true;
138  }
139  }
140  }
141  if(preId) {
142  // Set PFRecTrack of type KF_ElCAND
143  reco::PFRecTrack pftrack( trackRef->charge(),
145  i, trackRef );
146 
147  bool valid = false;
148  if(trajinev_) {
149  valid = pfTransformer_->addPoints( pftrack, *trackRef, Tj[i]);
150  }
151  else {
152  Trajectory FakeTraj;
153  valid = pfTransformer_->addPoints( pftrack, *trackRef, FakeTraj);
154  }
155  if(valid) {
156  PfTrColl->push_back(pftrack);
157  }
158 
159  }
160  else {
161  reco::PFRecTrack pftrack( trackRef->charge(),
163  i, trackRef );
164  bool valid = false;
165  if(trajinev_) {
166  valid = pfTransformer_->addPoints( pftrack, *trackRef, Tj[i]);
167  }
168  else {
169  Trajectory FakeTraj;
170  valid = pfTransformer_->addPoints( pftrack, *trackRef, FakeTraj);
171  }
172 
173  if(valid) {
174  PfTrColl->push_back(pftrack);
175  }
176  }
177  }
178  }
179  iEvent.put(PfTrColl);
180 }
181 
182 // ------------ method called once each job just before starting event loop ------------
183 void
185  const EventSetup& iSetup)
186 {
187  ESHandle<MagneticField> magneticField;
188  iSetup.get<IdealMagneticFieldRecord>().get(magneticField);
189  pfTransformer_= new PFTrackTransformer(math::XYZVector(magneticField->inTesla(GlobalPoint(0,0,0))));
190  if(!trajinev_)
192 }
193 
194 // ------------ method called once each job just after ending the event loop ------------
195 void
197  delete pfTransformer_;
198 }
virtual void produce(edm::Event &, const edm::EventSetup &)
Produce the PFRecTrack collection.
T getParameter(std::string const &) const
reconstructed track used as an input to particle flow
Definition: PFRecTrack.h:22
int i
Definition: DBlmapReader.cc:9
edm::InputTag muonColl_
PFTrackProducer(const edm::ParameterSet &)
Constructor.
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:10
std::vector< edm::InputTag > tracksContainers_
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:248
int iEvent
Definition: GenABIO.cc:243
bool isNull() const
Checks for null.
Definition: Ref.h:244
bool addPoints(reco::PFRecTrack &pftrack, const reco::Track &track, const Trajectory &traj) const
Add points to a PFTrack. return false if a TSOS is invalid.
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:84
bool useQuality_
TRACK QUALITY.
std::vector< GsfTrack > GsfTrackCollection
collection of GsfTracks
Definition: GsfTrackFwd.h:9
int j
Definition: DBlmapReader.cc:9
bool isValid() const
Definition: HandleBase.h:76
virtual void beginRun(edm::Run &, const edm::EventSetup &)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:359
edm::InputTag gsfTrackLabel_
static TrackQuality qualityByName(const std::string &name)
Definition: TrackBase.cc:46
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
PFTrackTransformer * pfTransformer_
PFTrackTransformer.
const T & get() const
Definition: EventSetup.h:55
virtual void endRun()
T const * product() const
Definition: Handle.h:74
reco::TrackBase::TrackQuality trackQuality_
std::vector< PFRecTrack > PFRecTrackCollection
collection of PFRecTrack objects
Definition: PFRecTrackFwd.h:9
Definition: Run.h:31
~PFTrackProducer()
Destructor.