118 "dEtacutForSCmatching");
120 "dPhicutForSCmatching");
167 auto outputConvPhotonCollection_p = std::make_unique<reco::ConversionCollection>();
176 std::multimap<float, edm::Ptr<reco::ConversionTrack> > convTrackMap;
177 for (
auto const&
t : trackCollectionHandle->ptrs())
178 convTrackMap.emplace(
t->track()->eta(),
t);
185 edm::LogError(
"ConversionProducer") <<
"Error! Can't get the product primary Vertex Collection " 190 vertexCollection = *(vertexHandle.
product());
199 if (!vertexCollection.empty())
200 the_pvtx = *(vertexCollection.begin());
208 std::multimap<double, reco::CaloClusterPtr> basicClusterPtrs;
209 std::multimap<double, reco::CaloClusterPtr> superClusterPtrs;
219 outputConvPhotonCollection);
221 outputConvPhotonCollection_p->assign(outputConvPhotonCollection.begin(), outputConvPhotonCollection.end());
226 std::multimap<double, reco::CaloClusterPtr>& basicClusterPtrs,
227 std::multimap<double, reco::CaloClusterPtr>& superClusterPtrs) {
231 if (!scBarrelHandle.
isValid()) {
232 edm::LogError(
"ConvertedPhotonProducer") <<
"Error! Can't get the barrel superclusters!";
238 if (!scEndcapHandle.
isValid()) {
239 edm::LogError(
"ConvertedPhotonProducer") <<
"Error! Can't get the endcap superclusters!";
246 if (!bcBarrelHandle.
isValid()) {
247 edm::LogError(
"ConvertedPhotonProducer") <<
"Error! Can't get the barrel basic clusters!";
251 if (!bcEndcapHandle.
isValid()) {
252 edm::LogError(
"ConvertedPhotonProducer") <<
"Error! Can't get the endcap basic clusters!";
255 if (bcBarrelHandle.
isValid()) {
256 for (
auto const&
handle : {bcBarrelHandle, bcEndcapHandle}) {
257 for (
auto const& bc :
handle->ptrs()) {
259 basicClusterPtrs.emplace(bc->position().eta(), bc);
264 if (scBarrelHandle.
isValid()) {
265 for (
auto const&
handle : {scBarrelHandle, scEndcapHandle}) {
266 for (
auto const&
sc :
handle->ptrs()) {
268 superClusterPtrs.emplace(
sc->position().
eta(),
sc);
277 const std::multimap<double, reco::CaloClusterPtr>& superClusterPtrs,
278 const std::multimap<double, reco::CaloClusterPtr>& basicClusterPtrs,
303 std::map<edm::Ptr<reco::ConversionTrack>,
math::XYZPointF> trackImpactPosition;
313 const reco::Track* tk = tk_ref->second->trackRef().get();
318 trackImpactPosition[tk_ref->second] = ew;
323 trackMatchedBC[tk_ref->second] = closest_bc;
334 bool track1HighPurity =
true;
342 if (dynamic_cast<const reco::GsfTrack*>(left.
get())) {
354 track1HighPurity =
false;
357 track1HighPurity =
false;
360 std::vector<int> right_candidates;
361 std::vector<double> right_candidate_theta, right_candidate_approach;
362 std::vector<std::pair<bool, reco::Vertex> > vertex_candidates;
366 std::multimap<float, edm::Ptr<reco::ConversionTrack> >::const_iterator
rr = ll;
368 for (; rr !=
allTracks.lower_bound(etasearch); ++
rr) {
369 bool track2HighPurity =
true;
370 bool highPurityPair =
true;
376 if (dynamic_cast<const reco::GsfTrack*>(right.
get())) {
393 double approachDist = -999.;
414 bool goodVertex =
checkVertex(ttk_l, ttk_r, magField, theConversionVertex);
424 highPurityPair =
false;
429 track2HighPurity =
false;
432 track2HighPurity =
false;
436 std::vector<edm::RefToBase<reco::Track> > trackPairRef;
437 trackPairRef.push_back(left);
438 trackPairRef.push_back(right);
440 std::vector<math::XYZVectorF> trackPin;
441 std::vector<math::XYZVectorF> trackPout;
442 std::vector<math::XYZPointF> trackInnPos;
443 std::vector<uint8_t> nHitsBeforeVtx;
444 std::vector<Measurement1DFloat> dlClosestHitToVtx;
455 nHitsBeforeVtx.push_back(leftWrongHits.first);
456 nHitsBeforeVtx.push_back(rightWrongHits.first);
457 dlClosestHitToVtx.push_back(leftWrongHits.second);
458 dlClosestHitToVtx.push_back(rightWrongHits.second);
464 if (theConversionVertex.
isValid()) {
467 highPurityPair =
false;
471 std::vector<math::XYZPointF> trkPositionAtEcal;
472 std::vector<reco::CaloClusterPtr> matchingBC;
478 std::map<edm::Ptr<reco::ConversionTrack>,
math::XYZPointF>::const_iterator trackImpactPositionLeft =
479 trackImpactPosition.find(ll->second);
480 std::map<edm::Ptr<reco::ConversionTrack>,
math::XYZPointF>::const_iterator trackImpactPositionRight =
481 trackImpactPosition.find(rr->second);
482 std::map<edm::Ptr<reco::ConversionTrack>,
reco::CaloClusterPtr>::const_iterator trackMatchedBCLeft =
483 trackMatchedBC.find(ll->second);
484 std::map<edm::Ptr<reco::ConversionTrack>,
reco::CaloClusterPtr>::const_iterator trackMatchedBCRight =
485 trackMatchedBC.find(rr->second);
487 if (trackImpactPositionLeft != trackImpactPosition.end()) {
488 trkPositionAtEcal.push_back(trackImpactPositionLeft->second);
492 if (trackImpactPositionRight != trackImpactPosition.end()) {
493 trkPositionAtEcal.push_back(trackImpactPositionRight->second);
496 double total_e_bc = 0.;
497 if (trackMatchedBCLeft != trackMatchedBC.end()) {
498 matchingBC.push_back(trackMatchedBCLeft->second);
499 total_e_bc += trackMatchedBCLeft->second->energy();
503 if (trackMatchedBCRight != trackMatchedBC.end()) {
504 matchingBC.push_back(trackMatchedBCRight->second);
505 total_e_bc += trackMatchedBCRight->second->energy();
509 highPurityPair =
false;
513 highPurityPair = highPurityPair && track1HighPurity && track2HighPurity && goodVertex &&
514 checkPhi(left, right, trackerGeom, magField, theConversionVertex);
527 const float minAppDist = approachDist;
546 if (
matchingSC(superClusterPtrs, newCandidate, scPtrVec))
550 bool generalTracksOnly = ll->second->isTrackerOnly() && rr->second->isTrackerOnly() &&
551 !
dynamic_cast<const reco::GsfTrack*
>(ll->second->trackRef().get()) &&
552 !dynamic_cast<const reco::GsfTrack*>(rr->second->trackRef().get());
553 bool gsfTracksOpenOnly = ll->second->isGsfTrackOpen() && rr->second->isGsfTrackOpen();
554 bool arbitratedEcalSeeded = ll->second->isArbitratedEcalSeeded() && rr->second->isArbitratedEcalSeeded();
555 bool arbitratedMerged = ll->second->isArbitratedMerged() && rr->second->isArbitratedMerged();
556 bool arbitratedMergedEcalGeneral =
557 ll->second->isArbitratedMergedEcalGeneral() && rr->second->isArbitratedMergedEcalGeneral();
565 outputConvPhotonCollection.push_back(newCandidate);
613 new SimpleCylinderBounds(barrelRadius - epsilon, barrelRadius + epsilon, -barrelHalfLength, barrelHalfLength)));
623 stateAtECAL = propag.
propagate(myTSOS, *theBarrel_);
627 stateAtECAL = propag.
propagate(myTSOS, *thePositiveEtaEndcap_);
629 stateAtECAL = propag.
propagate(myTSOS, *theNegativeEtaEndcap_);
644 double detaMin = 999.;
647 for (std::multimap<double, reco::CaloClusterPtr>::const_iterator scItr = scMap.begin(); scItr != scMap.end();
651 double sceta = sc->eta();
653 const double delta_eta = fabs(conveta - sceta);
654 if (fabs(delta_eta) < fabs(detaMin) && fabs(delta_phi) < fabs(dphiMin)) {
655 detaMin = fabs(delta_eta);
656 dphiMin = fabs(delta_phi);
671 const double track_eta = trackImpactPosition.eta();
672 const double track_phi = trackImpactPosition.phi();
674 double min_eta = 999., min_phi = 999.;
676 for (std::multimap<double, reco::CaloClusterPtr>::const_iterator bc = bcMap.lower_bound(track_eta -
halfWayEta_);
680 const double delta_eta = track_eta - (ebc->position().eta());
683 if (fabs(min_eta) > fabs(delta_eta) && fabs(min_phi) > fabs(delta_phi)) {
686 closest_bc = bc->second;
692 if (min_eta < 999.) {
693 closestBC = closest_bc;
715 double recoPhoR = vtx.
position().Rho();
722 recoPhoR - 0.001, recoPhoR + 0.001, -fabs(vtx.
position().z()), fabs(vtx.
position().z()))));
731 stateAtVtx1 = propag.
propagate(myTSOS1, *theBarrel_);
733 stateAtVtx1 = propag.
propagate(myTSOS1, *theDisk_);
738 stateAtVtx2 = propag.
propagate(myTSOS2, *theBarrel_);
740 stateAtVtx2 = propag.
propagate(myTSOS2, *theDisk_);
780 double rho = tangentPoint.
perp();
791 std::pair<GlobalTrajectoryParameters, GlobalTrajectoryParameters> trajs = tangent.
trajectoryParameters();
794 if (
std::abs(trajs.first.position().z() - trajs.second.position().z()) >
dzCut_) {
798 float minApproach = tangent.
perpdist();
799 appDist = minApproach;
816 double total_e_bc = 0;
818 total_e_bc += bc_l->energy();
821 total_e_bc += bc_r->energy();
837 std::vector<reco::TransientTrack> pair;
838 pair.push_back(ttk_l);
839 pair.push_back(ttk_r);
848 const float PI = 3.1415927;
851 const float R_ECAL = 136.5;
858 float ZEcal = R_ECAL * sinh(EtaParticle) + Zvertex;
861 Theta = atan(R_ECAL / ZEcal);
866 if (fabs(ETA) > etaBarrelEndcap) {
868 if (EtaParticle < 0.0)
870 float Zlen = Zend - Zvertex;
871 float RR = Zlen / sinh(EtaParticle);
872 Theta = atan(RR / Zend);
875 ETA = -
log(
tan(0.5 * Theta));
constexpr double deltaPhi(double phi1, double phi2)
value_type const * get() const
T getParameter(std::string const &) const
unsigned int maxNumOfTrackInPU_
ConversionVertexFinder * theVertexFinder_
double d0Error() const
error on d0
edm::EDGetTokenT< reco::VertexCollection > vertexProducer_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
bool isNonnull() const
Checks for non-null.
TransientVertex run(const std::vector< reco::TransientTrack > &pair)
double d0() const
dxy parameter in perigee convention (d0 = -dxy)
bool getTrackImpactPosition(const reco::Track *tk_ref, const TrackerGeometry *trackerGeom, const MagneticField *magField, math::XYZPointF &ew)
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)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
double dxyError() const
error on dxy
void push_back(Ptr< T > const &iPtr)
const TransientTrackBuilder * thettbuilder_
void setQuality(ConversionQuality q, bool b)
bool isValid() const
Tells whether the vertex is valid.
Geom::Phi< T > phi() const
Global3DPoint GlobalPoint
void buildCollection(edm::Event &iEvent, const edm::EventSetup &iSetup, const std::multimap< float, edm::Ptr< reco::ConversionTrack > > &allTracks, const std::multimap< double, reco::CaloClusterPtr > &superClusterPtrs, const std::multimap< double, reco::CaloClusterPtr > &basicClusterPtrs, const reco::Vertex &the_pvtx, reco::ConversionCollection &outputConvPhotonCollection)
reco::TransientTrack build(const reco::Track *p) const
double zOfPrimaryVertexFromTracks(const math::XYZPoint &myBeamSpot=math::XYZPoint()) const
static ConversionAlgorithm algoByName(const std::string &name)
void buildSuperAndBasicClusterGeoMap(const edm::Event &, std::multimap< double, reco::CaloClusterPtr > &basicClusterPtrs, std::multimap< double, reco::CaloClusterPtr > &superClusterPtrs)
GlobalPoint globalPosition() const
std::vector< Vertex > VertexCollection
collection of Vertex objects
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float > > XYZPointF
point in space with cartesian internal representation
const Point & position() const
position
math::XYZVectorF refittedPairMomentum() const
Conversion tracks momentum from the tracks refitted with vertex constraint.
std::pair< uint8_t, Measurement1DFloat > nHitsBeforeVtx(const reco::TrackExtra &track, const reco::Vertex &vtx, float sigmaTolerance=3.0) const
std::vector< Conversion > ConversionCollection
collectin of Conversion objects
TrajectoryStateOnSurface innermostMeasurementState() const
bool matchingSC(const std::multimap< double, reco::CaloClusterPtr > &scMap, reco::Conversion &conv, reco::CaloClusterPtrVector &mSC)
const math::XYZPoint & innerPosition() const
position of the innermost hit
TrackAlgorithm algo() const
bool status() const override
bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb) override
math::XYZVectorF toFConverterV(const math::XYZVector &val)
Tan< T >::type tan(const T &t)
static float etaBarrelEndcap
Abs< T >::type abs(const T &t)
float energy() const
Energy. Note this is taken from the first SimTrack only.
double chi2() const
chi-squares
float ChiSquaredProbability(double chiSquared, double nrDOF)
edm::EDGetTokenT< edm::View< reco::CaloCluster > > scEndcapProducer_
edm::EDGetTokenT< edm::View< reco::CaloCluster > > bcBarrelCollection_
bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb) override
edm::EDGetTokenT< edm::View< reco::CaloCluster > > bcEndcapCollection_
uint8_t nSharedHits(const reco::Track &trk1, const reco::Track &trk2) const
bool getMatchedBC(const std::multimap< double, reco::CaloClusterPtr > &bcMap, const math::XYZPointF &trackImpactPosition, reco::CaloClusterPtr &closestBC)
bool isNonnull() const
Checks for non-null.
bool checkTrackPair(const std::pair< edm::RefToBase< reco::Track >, reco::CaloClusterPtr > &ll, const std::pair< edm::RefToBase< reco::Track >, reco::CaloClusterPtr > &rr)
bool trackQualityFilter(const edm::RefToBase< reco::Track > &ref, bool isLeft)
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
T const * product() const
const Track & track() const
double dPhicutForSCmatching_
bool trackD0Cut(const edm::RefToBase< reco::Track > &ref)
GlobalPoint crossingPoint() const override
bool bypassPreselEcalEcal_
std::string ConvertedPhotonCollection_
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
edm::EDGetTokenT< edm::View< reco::ConversionTrack > > src_
edm::EDGetTokenT< edm::View< reco::CaloCluster > > scBarrelProducer_
~ConversionProducer() override
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
unsigned short found() const
Number of valid hits on track.
void produce(edm::Event &, const edm::EventSetup &) override
double etaTransformation(float EtaParticle, float Zvertex)
int charge() const
track electric charge
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
math::XYZPointF toFConverterP(const math::XYZPoint &val)
bool status() const override
GlobalPoint crossingPoint() const override
bool preselectTrackPair(const reco::TransientTrack &ttk_l, const reco::TransientTrack &ttk_r, double &appDist)
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
T const * product() const
void setMatchingSuperCluster(const reco::CaloClusterPtrVector &sc)
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)
double dEtacutForSCmatching_
GlobalVector globalDirection() const
ConversionProducer(const edm::ParameterSet &)
float eta() const
Momentum pseudorapidity. Note this is taken from the simtrack before the calorimeter.
bool checkVertex(const reco::TransientTrack &ttk_l, const reco::TransientTrack &ttk_r, const MagneticField *magField, reco::Vertex &the_vertex)