CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
PFConversionProducer Class Reference

#include <PFConversionProducer.h>

Inheritance diagram for PFConversionProducer:
edm::stream::EDProducer<>

Public Member Functions

 PFConversionProducer (const edm::ParameterSet &)
 Constructor. More...
 
 ~PFConversionProducer () override
 Destructor. More...
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 

Private Member Functions

void beginRun (const edm::Run &, const edm::EventSetup &) override
 
void endRun (const edm::Run &, const edm::EventSetup &) override
 
void produce (edm::Event &, const edm::EventSetup &) override
 Produce the PFRecTrack collection. More...
 

Private Attributes

edm::EDGetTokenT< reco::ConversionCollectionpfConversionContainer_
 
PFTrackTransformerpfTransformer_
 PFTrackTransformer. More...
 
edm::EDGetTokenT< reco::VertexCollectionvtx_h
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
typedef CacheContexts< T... > CacheTypes
 
typedef CacheTypes::GlobalCache GlobalCache
 
typedef AbilityChecker< T... > HasAbility
 
typedef CacheTypes::LuminosityBlockCache LuminosityBlockCache
 
typedef LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCacheLuminosityBlockContext
 
typedef CacheTypes::LuminosityBlockSummaryCache LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache, GlobalCacheRunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 

Detailed Description

Definition at line 14 of file PFConversionProducer.h.

Constructor & Destructor Documentation

PFConversionProducer::PFConversionProducer ( const edm::ParameterSet iConfig)
explicit

Constructor.

Definition at line 22 of file PFConversionProducer.cc.

References edm::ParameterSet::getParameter(), pfConversionContainer_, and vtx_h.

22  :
23  pfTransformer_(nullptr)
24 {
25  produces<reco::PFRecTrackCollection>();
26  produces<reco::PFConversionCollection>();
27 
28  pfConversionContainer_ =consumes<reco::ConversionCollection>(iConfig.getParameter< InputTag >("conversionCollection"));
29 
30  vtx_h=consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("PrimaryVertexLabel"));
31 }
T getParameter(std::string const &) const
edm::EDGetTokenT< reco::ConversionCollection > pfConversionContainer_
edm::EDGetTokenT< reco::VertexCollection > vtx_h
PFTrackTransformer * pfTransformer_
PFTrackTransformer.
PFConversionProducer::~PFConversionProducer ( )
override

Destructor.

Definition at line 33 of file PFConversionProducer.cc.

References pfTransformer_.

34 {
35  delete pfTransformer_;
36 }
PFTrackTransformer * pfTransformer_
PFTrackTransformer.

Member Function Documentation

void PFConversionProducer::beginRun ( const edm::Run run,
const edm::EventSetup iSetup 
)
overrideprivate

Definition at line 181 of file PFConversionProducer.cc.

References edm::EventSetup::get(), MagneticField::inTesla(), seedCreatorFromRegionConsecutiveHitsEDProducer_cff::magneticField, PFTrackTransformer::OnlyProp(), and pfTransformer_.

183 {
185  iSetup.get<IdealMagneticFieldRecord>().get(magneticField);
188 }
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
T get() const
Definition: EventSetup.h:68
PFTrackTransformer * pfTransformer_
PFTrackTransformer.
void PFConversionProducer::endRun ( const edm::Run run,
const edm::EventSetup iSetup 
)
overrideprivate

Definition at line 192 of file PFConversionProducer.cc.

References pfTransformer_.

193  {
194  delete pfTransformer_;
195  pfTransformer_=nullptr;
196 }
PFTrackTransformer * pfTransformer_
PFTrackTransformer.
void PFConversionProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivate

Produce the PFRecTrack collection.

Definition at line 39 of file PFConversionProducer.cc.

References PFTrackTransformer::addPoints(), reco::Conversion::arbitratedMergedEcalGeneral, TransientTrackBuilder::build(), vertices_cff::chi2, ChiSquaredProbability(), MillePedeFileConverter_cfg::e, reco::PFTrajectoryPoint::ECALEntrance, cropTnPTrees::frac, edm::EventSetup::get(), edm::Event::getByToken(), edm::Event::getRefBeforePut(), reco::Conversion::highPurity, training_settings::idx, edm::HandleBase::isValid(), reco::PFTrajectoryPoint::isValid(), TrackingRecHit::isValid(), edm::Ref< C, T, F >::key(), reco::PFRecTrack::KF, eostools::move(), ndof, AlCaHLTBitMon_ParallelJobs::p, pfConversionContainer_, pfTransformer_, edm::Event::put(), MetAnalyzer::pv(), jets_cff::quality, edm::second(), TrackingRecHit::sharesInput(), IPTools::signedTransverseImpactParameter(), TrackingRecHit::some, and vtx_h.

40 {
41 
42  //create the empty collections
43  auto pfConversionColl = std::make_unique<reco::PFConversionCollection>();
44  auto pfRecTrackColl = std::make_unique<reco::PFRecTrackCollection>();
45 
47  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", builder);
48  TransientTrackBuilder thebuilder = *(builder.product());
51  iEvent.getByToken(pfConversionContainer_, convCollH);
52 
53  const reco::ConversionCollection& convColl = *(convCollH.product());
54 
56  iEvent.getByToken(vtx_h, vertex);
57  //Find PV for IP calculation, if there is no PV in collection than use dummy
59  const reco::Vertex* pv=&dummy;
60  if (vertex.isValid())
61  {
62  pv = &*vertex->begin();
63  }
64  else
65  { // create a dummy PV
67  e(0, 0) = 0.0015 * 0.0015;
68  e(1, 1) = 0.0015 * 0.0015;
69  e(2, 2) = 15. * 15.;
70  reco::Vertex::Point p(0, 0, 0);
71  dummy = reco::Vertex(p, e, 0, 0, 0);
72  }
73 
74  int idx = 0; //index of track in PFRecTrack collection
75  multimap<unsigned int, unsigned int> trackmap; //Map of Collections and tracks
76  std::vector<unsigned int> conv_coll(0);
77 
78  // CLEAN CONVERSION COLLECTION FOR DUPLICATES
79  for( unsigned int icoll1=0; icoll1 < convColl.size(); icoll1++)
80  {
81  if (( !convColl[icoll1].quality(reco::Conversion::arbitratedMergedEcalGeneral)) || (!convColl[icoll1].quality(reco::Conversion::highPurity))) continue;
82 
83  bool greater_prob=false;
84  std::vector<edm::RefToBase<reco::Track> > tracksRefColl1 = convColl[icoll1].tracks();
85  for(unsigned it1 = 0; it1 < tracksRefColl1.size(); it1++)
86  {
87  reco::TrackRef trackRef1 = (tracksRefColl1[it1]).castTo<reco::TrackRef>();
88 
89  for( unsigned int icoll2=0; icoll2 < convColl.size(); icoll2++)
90  {
91  if(icoll1==icoll2)continue;
92  if (( !convColl[icoll2].quality(reco::Conversion::arbitratedMergedEcalGeneral)) || (!convColl[icoll2].quality(reco::Conversion::highPurity))) continue;
93  std::vector<edm::RefToBase<reco::Track> > tracksRefColl2 = convColl[icoll2].tracks();
94  for(unsigned it2 = 0; it2 < tracksRefColl2.size(); it2++)
95  {
96  reco::TrackRef trackRef2 = (tracksRefColl2[it2]).castTo<reco::TrackRef>();
97  double like1=-999;
98  double like2=-999;
99  //number of shared hits
100  int shared=0;
101  for(trackingRecHit_iterator iHit1=trackRef1->recHitsBegin(); iHit1!=trackRef1->recHitsEnd(); iHit1++)
102  {
103  const TrackingRecHit *h_1=(*iHit1);
104  if(h_1->isValid()){
105  for(trackingRecHit_iterator iHit2=trackRef2->recHitsBegin(); iHit2!=trackRef2->recHitsEnd(); iHit2++)
106  {
107  const TrackingRecHit *h_2=(*iHit2);
108  if(h_2->isValid() && h_1->sharesInput(h_2, TrackingRecHit::some))shared++;//count number of shared hits
109  }
110  }
111  }
112  float frac=0;
113  //number of valid hits in tracks that are duplicates
114  float size1=trackRef1->found();
115  float size2=trackRef2->found();
116  //divide number of shared hits by the total number of hits for the track with less hits
117  if(size1>size2)frac=(double)shared/size2;
118  else frac=(double)shared/size1;
119  if(frac>0.9)
120  {
121  like1=ChiSquaredProbability(convColl[icoll1].conversionVertex().chi2(), convColl[icoll1].conversionVertex().ndof());
122  like2=ChiSquaredProbability(convColl[icoll2].conversionVertex().chi2(), convColl[icoll2].conversionVertex().ndof());
123  }
124  if(like2>like1)
125  {greater_prob=true; break;}
126  }//end loop over tracks in collection 2
127 
128  if(greater_prob)break; //if a duplicate track is found in a collection with greater Chi^2 probability for Vertex fit then break out of comparison loop
129  }//end loop over collection 2 checking
130  if(greater_prob)break;//if a duplicate track is found in a collection with greater Chi^2 probability for Vertex fit then one does not need to check the other track the collection will not be stored
131  } //end loop over tracks in collection 1
132  if(!greater_prob)conv_coll.push_back(icoll1);
133  }//end loop over collection 1
134 
135  //Finally fill empty collections
136  for(unsigned iColl=0; iColl<conv_coll.size(); iColl++)
137  {
138  unsigned int collindex=conv_coll[iColl];
139  //std::cout<<"Filling this collection"<<collindex<<endl;
140  std::vector<reco::PFRecTrackRef> pfRecTkcoll;
141 
142  std::vector<edm::RefToBase<reco::Track> > tracksRefColl = convColl[collindex].tracks();
143  // convert the secondary tracks
144  for(unsigned it = 0; it < tracksRefColl.size(); it++)
145  {
146  reco::TrackRef trackRef = (tracksRefColl[it]).castTo<reco::TrackRef>();
147  reco::PFRecTrack pfRecTrack( trackRef->charge(),
149  trackRef.key(),
150  trackRef );
151  //std::cout<<"Track Pt "<<trackRef->pt()<<std::endl;
152  Trajectory FakeTraj;
153  bool valid = pfTransformer_->addPoints( pfRecTrack, *trackRef, FakeTraj);
154  if(valid)
155  {
156  double stip=-999;
157  const reco::PFTrajectoryPoint& atECAL=pfRecTrack.extrapolatedPoint(reco::PFTrajectoryPoint::ECALEntrance);
158  //if extrapolation to ECAL is valid then calculate STIP
159  if(atECAL.isValid())
160  {
161  GlobalVector direction(pfRecTrack.extrapolatedPoint(reco::PFTrajectoryPoint::ECALEntrance).position().x(),
162  pfRecTrack.extrapolatedPoint(reco::PFTrajectoryPoint::ECALEntrance).position().y(),
163  pfRecTrack.extrapolatedPoint(reco::PFTrajectoryPoint::ECALEntrance).position().z());
164  stip = IPTools::signedTransverseImpactParameter(thebuilder.build(*trackRef), direction, *pv).second.significance();
165  }
166  pfRecTrack.setSTIP(stip);
167  pfRecTkcoll.push_back(reco::PFRecTrackRef( pfTrackRefProd, idx++));
168  pfRecTrackColl->push_back(pfRecTrack);
169  }
170  }//end loop over tracks
171  //store reference to the Conversion collection
172  reco::ConversionRef niRef(convCollH, collindex);
173  pfConversionColl->push_back( reco::PFConversion( niRef, pfRecTkcoll ));
174  }//end loop over collections
175  iEvent.put(std::move(pfRecTrackColl));
176  iEvent.put(std::move(pfConversionColl));
177 }
reconstructed track used as an input to particle flow
Definition: PFRecTrack.h:22
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
edm::EDGetTokenT< reco::ConversionCollection > pfConversionContainer_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
std::pair< bool, Measurement1D > signedTransverseImpactParameter(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:50
bool addPoints(reco::PFRecTrack &pftrack, const reco::Track &track, const Trajectory &traj, bool msgwarning=true) const
Add points to a PFTrack. return false if a TSOS is invalid.
reco::TransientTrack build(const reco::Track *p) const
virtual bool sharesInput(const TrackingRecHit *other, SharedInputType what) const
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:43
key_type key() const
Accessor for product key.
Definition: Ref.h:263
std::vector< Conversion > ConversionCollection
collectin of Conversion objects
Definition: ConversionFwd.h:9
U second(std::pair< T, U > const &p)
def pv(vc)
Definition: MetAnalyzer.py:7
math::XYZPoint Point
point in the space
Definition: Vertex.h:39
float ChiSquaredProbability(double chiSquared, double nrDOF)
edm::EDGetTokenT< reco::VertexCollection > vtx_h
bool isValid() const
Definition: HandleBase.h:74
RefProd< PROD > getRefBeforePut()
Definition: Event.h:167
bool isValid() const
is this point valid ?
bool isValid() const
T get() const
Definition: EventSetup.h:68
PFTrackTransformer * pfTransformer_
PFTrackTransformer.
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
std::vector< PFRecTrack > PFRecTrackCollection
collection of PFRecTrack objects
Definition: PFRecTrackFwd.h:9
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

edm::EDGetTokenT<reco::ConversionCollection> PFConversionProducer::pfConversionContainer_
private

Definition at line 32 of file PFConversionProducer.h.

Referenced by PFConversionProducer(), and produce().

PFTrackTransformer* PFConversionProducer::pfTransformer_
private
edm::EDGetTokenT<reco::VertexCollection> PFConversionProducer::vtx_h
private

Definition at line 33 of file PFConversionProducer.h.

Referenced by PFConversionProducer(), and produce().