![]() |
![]() |
#include <RecoBTau/TrackIPProducer/src/TrackIPProducer.cc>
Public Member Functions | |
virtual void | produce (edm::Event &, const edm::EventSetup &) |
TrackIPProducer (const edm::ParameterSet &) | |
~TrackIPProducer () | |
Private Member Functions | |
void | checkEventSetup (const edm::EventSetup &iSetup) |
Private Attributes | |
edm::InputTag | m_associator |
unsigned long long | m_calibrationCacheId2D |
unsigned long long | m_calibrationCacheId3D |
bool | m_computeProbabilities |
const edm::ParameterSet & | m_config |
double | m_cutMaxChiSquared |
double | m_cutMaxLIP |
double | m_cutMaxTIP |
double | m_cutMinPt |
int | m_cutPixelHits |
int | m_cutTotalHits |
bool | m_directionWithTracks |
edm::InputTag | m_primaryVertexProducer |
HistogramProbabilityEstimator * | m_probabilityEstimator |
bool | m_useDB |
bool | m_useTrackQuality |
Implementation: <Notes on="" implementation>="">
Definition at line 14 of file TrackIPProducer.h.
TrackIPProducer::TrackIPProducer | ( | const edm::ParameterSet & | iConfig | ) | [explicit] |
Definition at line 54 of file TrackIPProducer.cc.
References edm::ParameterSet::getParameter(), m_associator, m_calibrationCacheId2D, m_calibrationCacheId3D, m_computeProbabilities, m_config, m_cutMaxChiSquared, m_cutMaxLIP, m_cutMaxTIP, m_cutMinPt, m_cutPixelHits, m_cutTotalHits, m_directionWithTracks, m_primaryVertexProducer, and m_useTrackQuality.
00054 : 00055 m_config(iConfig),m_probabilityEstimator(0) { 00056 00057 m_calibrationCacheId3D= 0; 00058 m_calibrationCacheId2D= 0; 00059 00060 m_associator = m_config.getParameter<InputTag>("jetTracks"); 00061 m_primaryVertexProducer = m_config.getParameter<InputTag>("primaryVertex"); 00062 00063 m_computeProbabilities = m_config.getParameter<bool>("computeProbabilities"); //FIXME: use or remove 00064 00065 m_cutPixelHits = m_config.getParameter<int>("minimumNumberOfPixelHits"); //FIXME: use or remove 00066 m_cutTotalHits = m_config.getParameter<int>("minimumNumberOfHits"); // used 00067 m_cutMaxTIP = m_config.getParameter<double>("maximumTransverseImpactParameter"); // used 00068 m_cutMinPt = m_config.getParameter<double>("minimumTransverseMomentum"); // used 00069 m_cutMaxChiSquared = m_config.getParameter<double>("maximumChiSquared"); //used 00070 m_cutMaxLIP = m_config.getParameter<double>("maximumLongitudinalImpactParameter"); //used 00071 m_directionWithTracks = m_config.getParameter<bool>("jetDirectionUsingTracks"); //used 00072 m_useTrackQuality = m_config.getParameter<bool>("useTrackQuality"); //used 00073 00074 00075 produces<reco::TrackIPTagInfoCollection>(); 00076 00077 }
TrackIPProducer::~TrackIPProducer | ( | ) |
Definition at line 79 of file TrackIPProducer.cc.
References m_probabilityEstimator.
00080 { 00081 delete m_probabilityEstimator; 00082 }
void TrackIPProducer::checkEventSetup | ( | const edm::EventSetup & | iSetup | ) | [private] |
Definition at line 264 of file TrackIPProducer.cc.
References edm::EventSetup::get(), m_calibrationCacheId2D, m_calibrationCacheId3D, m_probabilityEstimator, and edm::ESHandle< T >::product().
Referenced by produce().
00265 { 00266 using namespace edm; 00267 using namespace edm::eventsetup; 00268 const EventSetupRecord & re2D= iSetup.get<BTagTrackProbability2DRcd>(); 00269 const EventSetupRecord & re3D= iSetup.get<BTagTrackProbability3DRcd>(); 00270 unsigned long long cacheId2D= re2D.cacheIdentifier(); 00271 unsigned long long cacheId3D= re3D.cacheIdentifier(); 00272 00273 if(cacheId2D!=m_calibrationCacheId2D || cacheId3D!=m_calibrationCacheId3D ) //Calibration changed 00274 { 00275 //iSetup.get<BTagTrackProbabilityRcd>().get(calib); 00276 ESHandle<TrackProbabilityCalibration> calib2DHandle; 00277 iSetup.get<BTagTrackProbability2DRcd>().get(calib2DHandle); 00278 ESHandle<TrackProbabilityCalibration> calib3DHandle; 00279 iSetup.get<BTagTrackProbability3DRcd>().get(calib3DHandle); 00280 00281 const TrackProbabilityCalibration * ca2D= calib2DHandle.product(); 00282 const TrackProbabilityCalibration * ca3D= calib3DHandle.product(); 00283 00284 if(m_probabilityEstimator) delete m_probabilityEstimator; 00285 m_probabilityEstimator=new HistogramProbabilityEstimator(ca3D,ca2D); 00286 00287 } 00288 m_calibrationCacheId3D=cacheId3D; 00289 m_calibrationCacheId2D=cacheId2D; 00290 }
void TrackIPProducer::produce | ( | edm::Event & | iEvent, | |
const edm::EventSetup & | iSetup | |||
) | [virtual] |
Implements edm::EDProducer.
Definition at line 89 of file TrackIPProducer.cc.
References edm::RefVector< C, T, F >::begin(), TwoTrackMinimumDistance::calculate(), checkEventSetup(), IPTools::closestApproachToJet(), reco::TrackIPTagInfo::TrackIPData::closestToJetAxis, direction, reco::TrackIPTagInfo::TrackIPData::distanceToJetAxis, reco::TrackBase::dz(), e, edm::RefVector< C, T, F >::end(), cond::Error, reco::TransientTrack::field(), first, edm::EventSetup::get(), edm::Event::getByLabel(), TrajectoryStateOnSurface::globalPosition(), reco::TrackBase::hitPattern(), i, reco::TransientTrack::impactPointState(), reco::TrackIPTagInfo::TrackIPData::ip2d, reco::TrackIPTagInfo::TrackIPData::ip3d, TrajectoryStateOnSurface::isValid(), it, IPTools::jetTrackDistance(), prof2calltree::last, m_associator, m_computeProbabilities, m_cutMaxChiSquared, m_cutMaxLIP, m_cutMaxTIP, m_cutMinPt, m_cutPixelHits, m_cutTotalHits, m_directionWithTracks, m_primaryVertexProducer, m_probabilityEstimator, m_useTrackQuality, muonGeometry::mag(), n, reco::TrackBase::normalizedChi2(), reco::HitPattern::numberOfValidHits(), reco::HitPattern::numberOfValidPixelHits(), p, TwoTrackMinimumDistance::points(), HistogramProbabilityEstimator::probability(), reco::TrackBase::pt(), edm::Event::put(), pv, HLT_VtxMuL3::result, edm::second(), IPTools::signedDecayLength3D(), IPTools::signedImpactParameter3D(), IPTools::signedTransverseImpactParameter(), Measurement1D::significance(), track, tracks, and reco::Vertex::z().
00090 { 00091 using namespace edm; 00092 00093 if(m_computeProbabilities ) checkEventSetup(iSetup); //Update probability estimator if event setup is changed 00094 00095 //input objects 00096 Handle<reco::JetTracksAssociationCollection> jetTracksAssociation; 00097 iEvent.getByLabel(m_associator,jetTracksAssociation); 00098 00099 Handle<reco::VertexCollection> primaryVertex; 00100 iEvent.getByLabel(m_primaryVertexProducer,primaryVertex); 00101 00102 edm::ESHandle<TransientTrackBuilder> builder; 00103 iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",builder); 00104 // m_algo.setTransientTrackBuilder(builder.product()); 00105 00106 00107 //output collections 00108 reco::TrackIPTagInfoCollection * outCollection = new reco::TrackIPTagInfoCollection(); 00109 00110 //use first pv of the collection 00111 //FIXME: use BeamSpot when pv is missing 00112 const Vertex *pv; 00113 edm::Ref<VertexCollection> * pvRef; 00114 bool pvFound = (primaryVertex->size() != 0); 00115 if(pvFound) 00116 { 00117 pv = &(*primaryVertex->begin()); 00118 pvRef = new edm::Ref<VertexCollection>(primaryVertex,0); // we always use the first vertex at the moment 00119 } 00120 else 00121 { // create a dummy PV 00122 Vertex::Error e; 00123 e(0,0)=0.0015*0.0015; 00124 e(1,1)=0.0015*0.0015; 00125 e(2,2)=15.*15.; 00126 Vertex::Point p(0,0,0); 00127 pv= new Vertex(p,e,1,1,1); 00128 pvRef = new edm::Ref<VertexCollection>(); 00129 } 00130 00131 double pvZ=pv->z(); 00132 00133 00134 00135 00136 00137 int i=0; 00138 JetTracksAssociationCollection::const_iterator it = jetTracksAssociation->begin(); 00139 TwoTrackMinimumDistance minDist; 00140 for(; it != jetTracksAssociation->end(); it++, i++) 00141 { 00142 TrackRefVector tracks = it->second; 00143 math::XYZVector jetMomentum=it->first->momentum()/2.; 00144 if(m_directionWithTracks) 00145 { 00146 for (TrackRefVector::const_iterator itTrack = tracks.begin(); itTrack != tracks.end(); ++itTrack) { 00147 if((**itTrack).numberOfValidHits() >= m_cutTotalHits ) //minimal quality cuts 00148 jetMomentum+=(**itTrack).momentum(); 00149 } 00150 } 00151 else 00152 { 00153 jetMomentum=it->first->momentum(); 00154 } 00155 GlobalVector direction(jetMomentum.x(),jetMomentum.y(),jetMomentum.z()); 00156 TrackRefVector selectedTracks; 00157 vector<Measurement1D> ip3Dv,ip2Dv,dLenv,jetDistv; 00158 vector<float> prob2D,prob3D; 00159 vector<TrackIPTagInfo::TrackIPData> ipData; 00160 00161 multimap<float,int> significanceMap; 00162 int ind =0; 00163 for (TrackRefVector::const_iterator itTrack = tracks.begin(); itTrack != tracks.end(); ++itTrack) { 00164 const Track & track = **itTrack; 00165 const TransientTrack & transientTrack = builder->build(&(**itTrack)); 00166 /* cout << " pt " << track.pt() << 00167 " d0 " << fabs(track.d0()) << 00168 " #hit " << track.hitPattern().numberOfValidHits()<< 00169 " ipZ " << fabs(track.dz()-pvZ)<< 00170 " chi2 " << track.normalizedChi2()<< 00171 " #pixel " << track.hitPattern().numberOfValidPixelHits()<< endl; 00172 */ 00173 if( track.pt() > m_cutMinPt && // minimum pt 00174 // CHANGE: refer to PV 00175 // fabs(track.d0()) < m_cutMaxTIP && // max transverse i.p. 00176 fabs(IPTools::signedTransverseImpactParameter(transientTrack, direction, *pv).second.value()) 00177 < m_cutMaxTIP && // max transverse i.p. 00178 // end of correction 00179 track.hitPattern().numberOfValidHits() >= m_cutTotalHits && // min num tracker hits 00180 fabs(track.dz()-pvZ) < m_cutMaxLIP && // z-impact parameter, loose only to reject PU 00181 track.normalizedChi2() < m_cutMaxChiSquared && // normalized chi2 00182 track.hitPattern().numberOfValidPixelHits() >= m_cutPixelHits //min # pix hits 00183 ) // quality cuts 00184 { 00185 //Fill vectors 00186 //TODO: what if .first is false? 00187 ip3Dv.push_back(IPTools::signedImpactParameter3D(transientTrack,direction,*pv).second); 00188 ip2Dv.push_back(IPTools::signedTransverseImpactParameter(transientTrack,direction,*pv).second); 00189 dLenv.push_back(IPTools::signedDecayLength3D(transientTrack,direction,*pv).second); 00190 jetDistv.push_back(IPTools::jetTrackDistance(transientTrack,direction,*pv).second); 00191 TrackIPTagInfo::TrackIPData trackIp; 00192 trackIp.ip3d=IPTools::signedImpactParameter3D(transientTrack,direction,*pv).second; 00193 trackIp.ip2d=IPTools::signedTransverseImpactParameter(transientTrack,direction,*pv).second; 00194 TrajectoryStateOnSurface closest = IPTools::closestApproachToJet(transientTrack.impactPointState(), *pv, direction,transientTrack.field()); 00195 if(closest.isValid()) trackIp.closestToJetAxis=closest.globalPosition(); 00196 //TODO:cross check if it is the same using other methods 00197 trackIp.distanceToJetAxis=IPTools::jetTrackDistance(transientTrack,direction,*pv).second.value(); 00198 00199 significanceMap.insert(pair<float,int>(trackIp.ip3d.significance(), ind++) ); 00200 00201 ipData.push_back(trackIp); 00202 selectedTracks.push_back(*itTrack); 00203 00204 if(m_computeProbabilities) { 00205 //probability with 3D ip 00206 pair<bool,double> probability = m_probabilityEstimator->probability(m_useTrackQuality , 0,ipData.back().ip3d.significance(),track,*(it->first),*pv); 00207 if(probability.first) prob3D.push_back(probability.second); else prob3D.push_back(-1.); 00208 00209 //probability with 2D ip 00210 probability = m_probabilityEstimator->probability(m_useTrackQuality ,1,ipData.back().ip2d.significance(),track,*(it->first),*pv); 00211 if(probability.first) prob2D.push_back(probability.second); else prob2D.push_back(-1.); 00212 00213 } 00214 00215 } // quality cuts if 00216 00217 } //track loop 00218 00219 if(ipData.size() > 1) 00220 { 00221 multimap<float,int>::iterator last=significanceMap.end(); 00222 last--; 00223 int first=last->second; 00224 last--; 00225 int second=last->second; 00226 00227 for(int n=0;n< ipData.size();n++) 00228 { 00229 int use; 00230 if(n==first) use = second; else use = first; 00231 TrajectoryStateOnSurface trackState1 = builder->build(selectedTracks[n]).impactPointState(); 00232 TrajectoryStateOnSurface trackState2 = builder->build(selectedTracks[use]).impactPointState(); 00233 minDist.calculate(trackState1,trackState2); 00234 std::pair<GlobalPoint,GlobalPoint> points = minDist.points(); 00235 float distance = ( points.first - points.second ).mag(); 00236 ipData[n].closestToFirstTrack=points.first; 00237 ipData[n].distanceToFirstTrack=distance; 00238 00239 } 00240 } 00241 TrackIPTagInfo tagInfo(ipData,prob2D,prob3D,selectedTracks, 00242 edm::Ref<JetTracksAssociationCollection>(jetTracksAssociation,i), 00243 *pvRef); 00244 outCollection->push_back(tagInfo); 00245 } 00246 00247 std::auto_ptr<reco::TrackIPTagInfoCollection> result(outCollection); 00248 iEvent.put(result); 00249 00250 if(!pvFound) delete pv; //dummy pv deleted 00251 delete pvRef; 00252 }
edm::InputTag TrackIPProducer::m_associator [private] |
unsigned long long TrackIPProducer::m_calibrationCacheId2D [private] |
Definition at line 29 of file TrackIPProducer.h.
Referenced by checkEventSetup(), and TrackIPProducer().
unsigned long long TrackIPProducer::m_calibrationCacheId3D [private] |
Definition at line 30 of file TrackIPProducer.h.
Referenced by checkEventSetup(), and TrackIPProducer().
bool TrackIPProducer::m_computeProbabilities [private] |
const edm::ParameterSet& TrackIPProducer::m_config [private] |
double TrackIPProducer::m_cutMaxChiSquared [private] |
double TrackIPProducer::m_cutMaxLIP [private] |
double TrackIPProducer::m_cutMaxTIP [private] |
double TrackIPProducer::m_cutMinPt [private] |
int TrackIPProducer::m_cutPixelHits [private] |
int TrackIPProducer::m_cutTotalHits [private] |
bool TrackIPProducer::m_directionWithTracks [private] |
Definition at line 28 of file TrackIPProducer.h.
Referenced by checkEventSetup(), produce(), and ~TrackIPProducer().
bool TrackIPProducer::m_useDB [private] |
Definition at line 31 of file TrackIPProducer.h.
bool TrackIPProducer::m_useTrackQuality [private] |