128 if (allowMinApproach_){
191 if (!vertexHandle.isValid()) {
192 edm::LogError(
"TrackerOnlyConversionProducer") <<
"Error! Can't get the product primary Vertex Collection "<<
"\n";
215 std::multimap<double, reco::CaloClusterPtr> basicClusterPtrs;
219 for (
unsigned jj = 0; jj < 2; ++jj ){
220 for (
unsigned ii = 0; ii < bcHandle->size(); ++ii ) {
221 if (bcHandle->ptrAt(ii)->energy()>
energyBC_)
222 basicClusterPtrs.insert(std::make_pair(bcHandle->ptrAt(ii)->position().eta(), bcHandle->ptrAt(ii)));
224 bcHandle = bcEndcapHandle;
228 buildCollection( iEvent, iSetup, *trackCollectionHandle.product(), basicClusterPtrs, the_pvtx, outputConvPhotonCollection);
230 outputConvPhotonCollection_p->assign(outputConvPhotonCollection.begin(), outputConvPhotonCollection.end());
240 const std::multimap<double, reco::CaloClusterPtr>& basicClusterPtrs,
253 std::vector<math::XYZPoint> trackImpactPosition;
254 trackImpactPosition.reserve(allTracks.size());
255 std::vector<bool> trackValidECAL;
256 trackValidECAL.assign(allTracks.size(),
false);
258 std::vector<reco::CaloClusterPtr> trackMatchedBC;
260 trackMatchedBC.assign(allTracks.size(), empty_bc);
262 std::vector<int> bcHandleId;
263 bcHandleId.assign(allTracks.size(), -1);
265 std::multimap<double, int> trackInnerEta;
272 for (reco::ConversionTrackCollection::const_iterator tk_ref = allTracks.begin(); tk_ref != allTracks.end(); ++tk_ref ){
276 trackInnerEta.insert(std::make_pair(tk->
innerMomentum().eta(), tk_ref-allTracks.begin()));
282 trackImpactPosition.push_back(ew);
287 trackMatchedBC[tk_ref-allTracks.begin()] = closest_bc;
288 trackValidECAL[tk_ref-allTracks.begin()] =
true;
289 bcHandleId[tk_ref-allTracks.begin()] = (fabs(closest_bc->position().eta())>1.479)?1:0;
292 trackImpactPosition.push_back(ew);
305 for(reco::ConversionTrackCollection::const_iterator ll = allTracks.begin(); ll != allTracks.end(); ++ ll ) {
306 bool track1HighPurity=
true;
314 if (dynamic_cast<const reco::GsfTrack*>(left.
get())) {
322 if ((
allowTrackBC_ && !trackValidECAL[ll-allTracks.begin()]) )
326 if (!(
trackD0Cut(left, the_pvtx))) track1HighPurity=
false;
328 if (!(
trackD0Cut(left))) track1HighPurity=
false;
331 std::vector<int> right_candidates;
332 std::vector<double> right_candidate_theta, right_candidate_approach;
333 std::vector<std::pair<bool, reco::Vertex> > vertex_candidates;
336 for (reco::ConversionTrackCollection::const_iterator rr = ll+1; rr != allTracks.end(); ++ rr ) {
337 bool track2HighPurity =
true;
338 bool highPurityPair =
true;
344 if (dynamic_cast<const reco::GsfTrack*>(right.
get())) {
363 double approachDist = -999.;
371 bool goodVertex =
checkVertex(ttk_l, ttk_r, magField, theConversionVertex);
383 highPurityPair=
false;
387 if (!(
trackD0Cut(right, the_pvtx))) track2HighPurity=
false;
389 if (!(
trackD0Cut(right))) track2HighPurity=
false;
393 const std::pair<edm::RefToBase<reco::Track>,
reco::CaloClusterPtr> the_left = std::make_pair(left, trackMatchedBC[ll-allTracks.begin()]);
394 const std::pair<edm::RefToBase<reco::Track>,
reco::CaloClusterPtr> the_right = std::make_pair(right, trackMatchedBC[rr-allTracks.begin()]);
399 highPurityPair= highPurityPair && track1HighPurity && track2HighPurity &&
checkTrackPair(the_left, the_right) ;
400 highPurityPair = highPurityPair && goodVertex &&
checkPhi(left, right, trackerGeom, magField, theConversionVertex) ;
403 std::vector<edm::RefToBase<reco::Track> > trackPairRef;
404 trackPairRef.push_back(left);
405 trackPairRef.push_back(right);
407 std::vector<math::XYZVector> trackPin;
408 std::vector<math::XYZVector> trackPout;
409 std::vector<math::XYZPoint> trackInnPos;
410 std::vector<uint8_t> nHitsBeforeVtx;
411 std::vector<Measurement1DFloat> dlClosestHitToVtx;
422 if (ll->trajRef().isNonnull() && rr->trajRef().isNonnull()) {
423 std::pair<uint8_t,Measurement1DFloat> leftWrongHits = hitChecker.
nHitsBeforeVtx(*ll->trajRef().get(),theConversionVertex);
424 std::pair<uint8_t,Measurement1DFloat> rightWrongHits = hitChecker.
nHitsBeforeVtx(*rr->trajRef().get(),theConversionVertex);
425 nHitsBeforeVtx.push_back(leftWrongHits.first);
426 nHitsBeforeVtx.push_back(rightWrongHits.first);
427 dlClosestHitToVtx.push_back(leftWrongHits.second);
428 dlClosestHitToVtx.push_back(rightWrongHits.second);
435 if (theConversionVertex.
isValid()){
437 if (chi2Prob<
vtxChi2_) highPurityPair=
false;
441 std::vector<math::XYZPoint> trkPositionAtEcal;
442 std::vector<reco::CaloClusterPtr> matchingBC;
445 const int lbc_handle = bcHandleId[ll-allTracks.begin()],
446 rbc_handle = bcHandleId[rr-allTracks.begin()];
448 trkPositionAtEcal.push_back(trackImpactPosition[ll-allTracks.begin()]);
449 if (trackValidECAL[rr-allTracks.begin()])
450 trkPositionAtEcal.push_back(trackImpactPosition[rr-allTracks.begin()]);
452 matchingBC.push_back(trackMatchedBC[ll-allTracks.begin()]);
453 scPtrVec.
push_back(trackMatchedBC[ll-allTracks.begin()]);
454 if (trackValidECAL[rr-allTracks.begin()]){
455 matchingBC.push_back(trackMatchedBC[rr-allTracks.begin()]);
456 if (!(trackMatchedBC[rr-allTracks.begin()] == trackMatchedBC[ll-allTracks.begin()])
457 && lbc_handle == rbc_handle )
458 scPtrVec.
push_back(trackMatchedBC[rr-allTracks.begin()]);
461 const float minAppDist = approachDist;
465 reco::Conversion newCandidate(scPtrVec, trackPairRef, trkPositionAtEcal, theConversionVertex, matchingBC, minAppDist, trackInnPos, trackPin, trackPout, nHitsBeforeVtx, dlClosestHitToVtx, nSharedHits, dummy, algo );
468 bool generalTracksOnly = ll->isTrackerOnly() && rr->isTrackerOnly() && !
dynamic_cast<const reco::GsfTrack*
>(ll->trackRef().get()) && !dynamic_cast<const reco::GsfTrack*>(rr->trackRef().get());
469 bool arbitratedEcalSeeded = ll->isArbitratedEcalSeeded() && rr->isArbitratedEcalSeeded();
470 bool arbitratedMerged = ll->isArbitratedMerged() && rr->isArbitratedMerged();
471 bool arbitratedMergedEcalGeneral = ll->isArbitratedMergedEcalGeneral() && rr->isArbitratedMergedEcalGeneral();
478 outputConvPhotonCollection.push_back(newCandidate);
532 const float barrelRadius = 129.f;
533 const float barrelHalfLength = 270.9f;
534 const float endcapRadius = 171.1f;
535 const float endcapZ = 320.5f;
537 SimpleCylinderBounds( barrelRadius-epsilon, barrelRadius+epsilon, -barrelHalfLength, barrelHalfLength)));
548 stateAtECAL = propag.
propagate(myTSOS, *theBarrel_);
552 stateAtECAL = propag.
propagate(myTSOS, *thePositiveEtaEndcap_);
554 stateAtECAL = propag.
propagate(myTSOS, *theNegativeEtaEndcap_);
568 const double track_eta = trackImpactPosition.eta();
569 const double track_phi = trackImpactPosition.phi();
571 double min_eta = 999., min_phi = 999.;
573 for (std::multimap<double, reco::CaloClusterPtr>::const_iterator bc = bcMap.lower_bound(track_eta -
halfWayEta_);
574 bc != bcMap.upper_bound(track_eta +
halfWayEta_); ++bc){
576 const double delta_eta = track_eta-(ebc->position().eta());
579 if (fabs(min_eta)>fabs(delta_eta) && fabs(min_phi)>fabs(delta_phi)){
582 closest_bc = bc->second;
589 closestBC = closest_bc;
598 const double track_eta = trackImpactPosition.eta();
599 const double track_phi = trackImpactPosition.phi();
601 double min_eta = 999., min_phi = 999.;
604 bc != bcMap.
end(); ++bc){
606 const double delta_eta = track_eta-(ebc->position().eta());
609 if (fabs(min_eta)>fabs(delta_eta) && fabs(min_phi)>fabs(delta_phi)){
619 closestBC = closest_bc;
639 double recoPhoR = vtx.
position().Rho();
650 stateAtVtx1 = propag.
propagate(myTSOS1, *theBarrel_);
652 stateAtVtx1 = propag.
propagate(myTSOS1, *theDisk_);
657 stateAtVtx2 = propag.
propagate(myTSOS2, *theBarrel_);
659 stateAtVtx2 = propag.
propagate(myTSOS2, *theDisk_);
701 double rho = tangentPoint.
perp();
708 if (
std::abs(tangentPoint.
z()) > 300.0) {
712 std::pair<GlobalTrajectoryParameters,GlobalTrajectoryParameters> trajs = tangent.
trajectoryParameters();
715 if (
std::abs(trajs.first.position().z() - trajs.second.position().z()) >
dzCut_) {
720 float minApproach = tangent.
perpdist();
721 appDist = minApproach;
741 double total_e_bc = 0;
742 if (bc_l.
isNonnull()) total_e_bc += bc_l->energy();
745 total_e_bc += bc_r->energy();
761 std::vector<reco::TransientTrack> pair;
762 pair.push_back(ttk_l);
763 pair.push_back(ttk_r);
T getParameter(std::string const &) const
edm::InputTag bcBarrelCollection_
double d0Error() const
error on d0
double delta_eta(double eta1, double eta2)
double d0() const
dxy parameter in perigee convention (d0 = - dxy)
const TrackExtraRef & extra() const
reference to "extra" object
std::pair< GlobalTrajectoryParameters, GlobalTrajectoryParameters > trajectoryParameters() const
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
double dxyError() const
error on dxy
void push_back(Ptr< T > const &iPtr)
std::pair< uint8_t, Measurement1DFloat > nHitsBeforeVtx(const Trajectory &traj, const reco::Vertex &vtx, double sigmaTolerance=3.0) const
void setQuality(ConversionQuality q, bool b)
bool isValid() const
Tells whether the vertex is valid.
bool checkPhi(const edm::RefToBase< reco::Track > &tk_l, const edm::RefToBase< reco::Track > &tk_r, const TrackerGeometry *trackerGeom, const MagneticField *magField, const reco::Vertex &the_vertex)
Geom::Phi< T > phi() const
Global3DPoint GlobalPoint
reco::TransientTrack build(const reco::Track *p) const
ConversionVertexFinder * theVertexFinder_
static ConversionAlgorithm algoByName(const std::string &name)
GlobalPoint globalPosition() const
std::vector< Vertex > VertexCollection
collection of Vertex objects
const Point & position() const
position
std::vector< Conversion > ConversionCollection
collectin of Conversion objects
bool trackQualityFilter(const edm::RefToBase< reco::Track > &ref, bool isLeft)
TrajectoryStateOnSurface innermostMeasurementState() const
virtual GlobalPoint crossingPoint() const
virtual GlobalPoint crossingPoint() const
const_iterator begin() const
const math::XYZPoint & innerPosition() const
position of the innermost hit
TrackAlgorithm algo() const
bool isNonnull() const
Checks for non-null.
bool isNonnull() const
Checks for non-null.
std::vector< ConversionTrack > ConversionTrackCollection
collection of ConversionTracks
double dPhi(double phi1, double phi2)
TransientVertex run(std::vector< reco::TransientTrack > pair)
std::string vertexProducer_
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
edm::InputTag bcEndcapCollection_
Tan< T >::type tan(const T &t)
const_iterator end() const
double chi2() const
chi-squares
float ChiSquaredProbability(double chiSquared, double nrDOF)
unsigned int maxNumOfTrackInPU_
virtual void produce(edm::Event &, const edm::EventSetup &)
TrackerOnlyConversionProducer(const edm::ParameterSet &)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
uint8_t nSharedHits(const reco::Track &trk1, const reco::Track &trk2) const
double delta_phi(double ph11, double phi2)
virtual TrajectoryStateOnSurface propagate(const TrajectoryStateOnSurface &tsos, const Plane &plane) const
double deltaPhi(double phi1, double phi2)
bool getTrackImpactPosition(const reco::Track *tk_ref, const TrackerGeometry *trackerGeom, const MagneticField *magField, math::XYZPoint &ew)
bool trackD0Cut(const edm::RefToBase< reco::Track > &ref)
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
virtual bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb)
const Track & track() const
const TransientTrackBuilder * thettbuilder_
XYZPointD XYZPoint
point in space with cartesian internal representation
REF castTo() const
cast to a concrete type
T const * product() const
bool getMatchedBC(const std::multimap< double, reco::CaloClusterPtr > &bcMap, const math::XYZPoint &trackImpactPosition, reco::CaloClusterPtr &closestBC)
bool preselectTrackPair(const reco::TransientTrack &ttk_l, const reco::TransientTrack &ttk_r, double &appDist)
std::string ConvertedPhotonCollection_
~TrackerOnlyConversionProducer()
virtual bool status() const
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
bool checkTrackPair(const std::pair< edm::RefToBase< reco::Track >, reco::CaloClusterPtr > &ll, const std::pair< edm::RefToBase< reco::Track >, reco::CaloClusterPtr > &rr)
unsigned short found() const
Number of valid hits on track.
int charge() const
track electric charge
bool checkVertex(const reco::TransientTrack &ttk_l, const reco::TransientTrack &ttk_r, const MagneticField *magField, reco::Vertex &the_vertex)
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
void buildCollection(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::ConversionTrackCollection &allTracks, const std::multimap< double, reco::CaloClusterPtr > &basicClusterPtrs, const reco::Vertex &the_pvtx, reco::ConversionCollection &outputConvPhotonCollection)
virtual bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb)
value_type const * get() const
virtual bool status() const
GlobalVector globalDirection() const