809 const float BARL = 1.4442;
811 const float END_HI = 2.5;
820 LogInfo(
"TkConvValidator") <<
"TkConvValidator Analyzing event number: " << e.
id() <<
" Global Counter " <<
nEvt_ <<
"\n";
838 edm::LogError(
"ConversionsProducer") <<
"Error! Can't get the collection "<< std::endl;
847 edm::LogError(
"PhotonProducer") <<
"Error! Can't get the Photon collection "<< std::endl;
857 edm::LogError(
"TrackerOnlyConversionProducer") <<
"Error! Can't get the product primary Vertex Collection "<<
"\n";
859 vertexCollection = *(vertexHandle.
product());
862 bool valid_pvtx =
false;
863 if (!vertexCollection.empty()){
864 the_pvtx = *(vertexCollection.begin());
875 <<
"Error! Can't get the product primary Vertex Collection "<<
"\n";
909 const std::vector<SimTrack> &theSimTracks= *SimTk;
910 const std::vector<SimVertex> &theSimVertices= *SimVtx;
929 std::map<const reco::Track*,TrackingParticleRef> myAss;
930 std::map<const reco::Track*,TrackingParticleRef>::const_iterator itAss;
932 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
935 float mcPhi= (*mcPho).fourMomentum().phi();
937 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
946 if ( fabs(
mcEta_) > END_HI )
continue;
954 bool goodSimConversion=
false;
955 bool visibleConversion=
false;
956 bool visibleConversionsWithTwoSimTracks=
false;
957 if ( (*mcPho).isAConversion() == 1 ) {
967 if ( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
968 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) visibleConversion=
true;
974 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
975 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
976 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
982 if (
theConvTP_.
size() == 2 ) visibleConversionsWithTwoSimTracks=
true;
983 goodSimConversion=
false;
985 if ( visibleConversion && visibleConversionsWithTwoSimTracks ) goodSimConversion=
true;
986 if ( goodSimConversion ) {
1004 if ( ! (visibleConversion && visibleConversionsWithTwoSimTracks ) )
continue;
1007 if ( fabs(
mcEta_) <=1.) {
1020 bool recomatch =
false;
1021 float chi2Prob = 0.;
1024 for (reco::ConversionCollection::const_iterator
conv = convHandle->begin();
conv!=convHandle->end();++
conv) {
1035 std::vector<edm::RefToBase<reco::Track> >
tracks = aConv.
tracks();
1040 if (tracks.size() !=2 || !(vtx.
isValid()))
continue;
1051 double lxy = (themom.x()*dbsx + themom.y()*dbsy)/themom.rho();
1071 bool isAssociated =
false;
1075 std::vector<std::pair<RefToBase<reco::Track>,
double> > trackV1, trackV2;
1077 int tp_1 = 0, tp_2 = 1;
1079 trackV1 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q1[
theConvTP_[0]];
1081 trackV1 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q1[
theConvTP_[1]];
1085 trackV2 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q2[
theConvTP_[1]];
1087 trackV2 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q2[
theConvTP_[0]];
1090 if (!(trackV1.size()&&trackV2.size()))
1092 if (tp_1 == tp_2)
continue;
1098 myAss.insert( std::make_pair (tr1.
get(),
theConvTP_[tp_1] ) );
1099 myAss.insert( std::make_pair (tr2.
get(),
theConvTP_[tp_2]) );
1107 isAssociated =
true;
1130 if ( chi2Prob > 0) {
1137 if ( chi2Prob > 0.0005) {
1152 for (reco::ConversionCollection::const_iterator
conv = convHandle->begin();
conv!=convHandle->end();++
conv) {
1162 std::vector<edm::RefToBase<reco::Track> > tracks = aConv.
tracks();
1166 if (tracks.size() !=2 || !(vtx.
isValid()))
continue;
1177 double lxy = (themom.x()*dbsx + themom.y()*dbsy)/themom.rho();
1181 bool phoIsInBarrel=
false;
1182 bool phoIsInEndcap=
false;
1201 if (
sqrt(p1AtVtx.perp2()) >
sqrt(p2AtVtx.perp2()) )
1202 dPhiTracksAtVtx = p1AtVtx.phi() - p2AtVtx.phi();
1204 dPhiTracksAtVtx = p2AtVtx.phi() - p1AtVtx.phi();
1210 if (fabs(refittedMom.eta())< 1.479 ) {
1219 double Mindeltaeta = 999999;
1220 double Mindeltaphi = 999999;
1221 bool matchConvSC=
false;
1222 reco::PhotonCollection::const_iterator iMatchingSC;
1223 for( reco::PhotonCollection::const_iterator iPho = photonCollection.begin(); iPho != photonCollection.end(); iPho++) {
1227 double deltaeta =
abs( aPho.
superCluster()->position().eta() -ConvEta);
1228 if (
abs(deltaeta)<
abs(Mindeltaeta) &&
abs(deltaphi)<
abs(Mindeltaphi)) {
1229 Mindeltaphi=
abs(deltaphi);
1230 Mindeltaeta=
abs(deltaeta);
1231 iMatchingSC = iPho ;
1234 if (
abs(Mindeltaeta)<0.1 &&
abs(Mindeltaphi)<0.1) {
1248 int ilead = 0, itrail = 1;
1249 if (tk2->
pt() > tk1->
pt()) {
1286 if ( matchConvSC ) {
1307 if ( phoIsInBarrel ) {
1332 if ( matchConvSC ) {
1341 if ( phoIsInEndcap ) {
1357 if ( matchConvSC ) {
1373 for (
unsigned int i=0;
i<tracks.size();
i++) {
1376 d0 = - tracks[
i]->dxy(the_pvtx.
position());
1378 d0 = tracks[
i]->d0();
1398 bool associated =
false;
1402 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
1403 mcConvPt_= (*mcPho).fourMomentum().et();
1404 float mcPhi= (*mcPho).fourMomentum().phi();
1405 simPV_Z = (*mcPho).primaryVertex().z();
1407 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
1409 mcConvR_= (*mcPho).vertex().perp();
1415 if ( fabs(
mcEta_) > END_HI )
continue;
1421 if ( (*mcPho).isAConversion() != 1 )
continue;
1422 if (!( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
1423 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) )
1429 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1430 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1431 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1442 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1[tk1];
1443 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2[tk2];
1444 if (!(tp1.size()&&tp2.size())){
1448 if (tp1.size()&&tp2.size()) {
1451 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11&& tpr1->pdgId()*tpr2->pdgId()<0) {
1452 if ( (tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()==1) &&
1453 (tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()==1)) {
1454 if (tpr1->parentVertex().
key()==tpr2->parentVertex().
key() && ((*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22)) {
1455 mcConvR_ =
sqrt(tpr1->parentVertex()->position().Perp2());
1456 mcConvZ_ = tpr1->parentVertex()->position().z();
1457 mcConvX_ = tpr1->parentVertex()->position().x();
1458 mcConvY_ = tpr1->parentVertex()->position().y();
1459 mcConvEta_ = tpr1->parentVertex()->position().eta();
1460 mcConvPhi_ = tpr1->parentVertex()->position().phi();
1461 mcConvPt_ =
sqrt((*tpr1->parentVertex()->sourceTracks_begin())->momentum().Perp2());
1486 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
1487 mcConvPt_= (*mcPho).fourMomentum().et();
1488 float mcPhi= (*mcPho).fourMomentum().phi();
1489 simPV_Z = (*mcPho).primaryVertex().z();
1491 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
1493 mcConvR_= (*mcPho).vertex().perp();
1496 mcConvZ_= (*mcPho).vertex().z();
1499 if ( fabs(
mcEta_) > END_HI )
continue;
1505 if ( (*mcPho).isAConversion() != 1 )
continue;
1506 if (!( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
1507 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) )
1513 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1514 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1515 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1534 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1incl[tk1];
1535 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2incl[tk2];
1536 if (!(tp1.size()&&tp2.size())){
1540 if (tp1.size()&&tp2.size()) {
1543 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11 && tpr1->pdgId()*tpr2->pdgId()<0) {
1544 if ( ((tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()>=1) && (*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22) &&
1545 ((tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()>=1) && (*tpr2->parentVertex()->sourceTracks_begin())->
pdgId()==22) ) {
1576 if ( associated ) match=1;
1605 if ( matchConvSC ) {
1618 if ( phoIsInBarrel ) {
1634 if ( matchConvSC ) {
1646 if ( phoIsInEndcap ) {
1662 if ( matchConvSC ) {
1705 if ( phoIsInBarrel ) {
1712 if ( phoIsInEndcap ) {
1724 for (
unsigned int i=0;
i<tracks.size();
i++) {
1727 itAss= myAss.find( tfrb.get() );
1741 d0 = - tracks[
i]->dxy(the_pvtx.
position());
1743 d0 = tracks[
i]->d0();
1751 if ( itAss == myAss.end() )
continue;
1754 float simPt =
sqrt( ((*itAss).second)->momentum().perp2() );
1756 float ptres= recPt - simPt ;
1763 if ( phoIsInBarrel ) {
1767 if ( phoIsInEndcap ) {
MonitorElement * h2_DPhiTracksAtVtxVsR_
MonitorElement * h2_dzPVVsR_
const reco::Vertex & conversionVertex() const
returns the reco conversion vertex
MonitorElement * h_maxDlClosestHitToVtx_[3][3]
MonitorElement * h_convPt_[3][3]
MonitorElement * p_convVtxdYVsY_
value_type const * get() const
T getParameter(std::string const &) const
MonitorElement * h2_DCotTracksVsR_
MonitorElement * h_convVtxdR_
MonitorElement * h2_DCotTracksVsEta_
MonitorElement * h_simConvVtxRvsZ_[4]
MonitorElement * h_convZplot_
MonitorElement * h_convSCdPhi_[3][3]
MonitorElement * h_SimConvTwoMTracksAndVtxPGT0_[5]
MonitorElement * h_SimConvTwoMTracksAndVtxPGT0005_[5]
reco::SuperClusterRef superCluster() const
Ref to SuperCluster.
MonitorElement * h_DCotTracks_[3][3]
const_iterator end() const
last iterator over the map (read only)
static HepMC::IO_HEPEVT conv
MonitorElement * nHitsVsEta_[3]
edm::EDGetTokenT< TrackingParticleRefVector > tpSelForFake_Token_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
MonitorElement * h_lxybs_[3][3]
edm::RefVector< TrackingParticleCollection > theConvTP_
MonitorElement * h_trailNHitsBeforeVtx_[3][3]
bool quality(ConversionQuality q) const
double y() const
y coordinate
math::XYZVector recalculateMomentumAtFittedVertex(const MagneticField &mf, const TrackerGeometry &trackerGeom, const edm::RefToBase< reco::Track > &tk, const reco::Vertex &vtx)
MonitorElement * p_Chi2VsR_[3]
bool isValid() const
Tells whether the vertex is valid.
MonitorElement * h_convVtxYvsX_zoom_[2]
edm::EDGetTokenT< reco::PhotonCollection > photonCollectionPr_Token_
MonitorElement * p_DCotTracksVsR_
MonitorElement * h_tkChi2_[3]
const std::vector< Measurement1DFloat > & dlClosestHitToVtx() const
Vector of signed decay length with uncertainty from nearest hit on track to the conversion vtx positi...
MonitorElement * h_convVtxdX_
const_iterator find(const key_type &k) const
find element with specified reference key
MonitorElement * h_convPtRes_[3]
MonitorElement * h_convEtaMatchSC_[3][3]
double zOfPrimaryVertexFromTracks(const math::XYZPoint &myBeamSpot=math::XYZPoint()) const
double distOfMinimumApproach() const
MonitorElement * h2_Chi2VsEta_[3]
MonitorElement * h_SimRecConvTwoMTracks_[5]
double pairCotThetaSeparation() const
Delta cot(Theta) where Theta is the angle in the (y,z) plane between the two tracks. Original tracks are used.
MonitorElement * h_vtxChi2Prob_[3][3]
std::vector< Vertex > VertexCollection
collection of Vertex objects
MonitorElement * h_convVtxdX_endcap_
MonitorElement * h_convVtxdR_endcap_
edm::EDGetTokenT< reco::VertexCollection > offline_pvToken_
key_type key() const
Accessor for product key.
MonitorElement * h_zPVFromTracks_[2]
MonitorElement * h_convVtxdY_barrel_
MonitorElement * h_tkChi2Large_[3]
edm::ParameterSet parameters_
edm::EDGetTokenT< edm::SimTrackContainer > g4_simTk_Token_
MonitorElement * p_DCotTracksVsEta_
edm::EDGetTokenT< edm::SimVertexContainer > g4_simVtx_Token_
const_iterator end() const
Termination of iteration.
const std::vector< Track > & refittedTracks() const
Returns the container of refitted tracks.
MonitorElement * h_maxDlClosestHitToVtxSig_[3][3]
MonitorElement * h_convVtxdR_barrel_
MonitorElement * h_leadExpectedHitsInner_[3][3]
double pairInvariantMass() const
if nTracks=2 returns the pair invariant mass. Original tracks are used here
const Point & position() const
position
math::XYZVectorF refittedPairMomentum() const
Conversion tracks momentum from the tracks refitted with vertex constraint.
std::vector< Conversion > ConversionCollection
collectin of Conversion objects
const_iterator begin() const
Initialize an iterator over the RefVector.
MonitorElement * h_convSCdEta_[3][3]
MonitorElement * h_sumNHitsBeforeVtx_[3][3]
MonitorElement * h_dzPVFromTracks_[2]
TrackAlgorithm algo() const
MonitorElement * h_nConv_[3][3]
info per conversion
edm::ESHandle< CaloGeometry > theCaloGeom_
MonitorElement * h_convVtxdY_
MonitorElement * p_DPhiTracksAtVtxVsEta_
MonitorElement * h_deltaExpectedHitsInner_[3][3]
MonitorElement * h_convVtxdEta_
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
MonitorElement * h_convVtxYvsX_
MonitorElement * p_convVtxdZVsR_
edm::EDGetTokenT< TrackingParticleRefVector > tpSelForEff_Token_
MonitorElement * p_convVtxdRVsR_
MonitorElement * h_convR_[3][3]
float etaTransformation(float a, float b)
float phiNormalization(float &a)
MonitorElement * h_VisSimConv_[6]
MonitorElement * h2_photonPtRecVsPtSim_
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
MonitorElement * h_EoverPTracks_[3][3]
edm::ESHandle< MagneticField > theMF_
PhotonMCTruthFinder * thePhotonMCTruthFinder_
double pt() const
track transverse momentum
MonitorElement * h_leadNHitsBeforeVtx_[3][3]
edm::EDGetTokenT< reco::TrackToTrackingParticleAssociator > trackAssociator_Token_
edm::EDGetTokenT< reco::ConversionCollection > conversionCollectionPr_Token_
MonitorElement * h_distMinAppTracks_[3][3]
MonitorElement * p_DPhiTracksAtVtxVsR_
Abs< T >::type abs(const T &t)
MonitorElement * h_SimConvEtaPix_[2]
double chi2() const
chi-squares
MonitorElement * h_convVtxdX_barrel_
MonitorElement * p_nHitsVsEta_[3]
MonitorElement * h_simTkPt_
float ChiSquaredProbability(double chiSquared, double nrDOF)
MonitorElement * p_convVtxdXVsX_
MonitorElement * h_convVtxdY_endcap_
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< float > > XYZVectorF
spatial vector with cartesian internal representation
MonitorElement * h_convEta_[3][3]
MonitorElement * h_simConvVtxYvsX_
MonitorElement * h_convEta2_[3][3]
MonitorElement * h_nHitsBeforeVtx_[3]
MonitorElement * p2_convVtxdRVsRZ_
MonitorElement * p_Chi2VsEta_[3]
double deltaPhi(double phi1, double phi2)
double x() const
x coordinate
MonitorElement * h_convVtxdZ_
MonitorElement * h_convVtxRvsZ_[3]
uint8_t nSharedHits() const
number of shared hits btw the two track
MonitorElement * h2_DPhiTracksAtVtxVsEta_
MonitorElement * h_convPhi_[3][3]
size_type size() const
map size
T const * product() const
void clear()
Clear the vector.
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
reco::RecoToSimCollection associateRecoToSim(const edm::Handle< edm::View< reco::Track > > &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
compare reco to sim the handle of reco::Track and TrackingParticle collections
XYZVectorD XYZVector
spatial vector with cartesian internal representation
MonitorElement * h_convVtxdZ_barrel_
std::vector< Photon > PhotonCollection
collectin of Photon objects
MonitorElement * h2_convVtxRrecVsTrue_
MonitorElement * h_AllSimConv_[5]
Denominator for efficiencies.
MonitorElement * h_convRplot_
MonitorElement * p_nHitsVsR_[3]
double maxPhoEtaForPurity
MonitorElement * p_dzPVVsR_
MonitorElement * h2_Chi2VsR_[3]
std::vector< PhotonMCTruth > find(const std::vector< SimTrack > &simTracks, const std::vector< SimVertex > &simVertices)
MonitorElement * h_convVtxdPhi_
MonitorElement * h_invMass_[3][3]
MonitorElement * h_convZ_[3][3]
MonitorElement * h_dlClosestHitToVtxSig_[3]
bool arbitratedEcalSeeded_
MonitorElement * h2_PtRecVsPtSim_[3]
MonitorElement * h_match_
double mcPhi_
global variable for the MC photon
MonitorElement * p_convVtxdZVsZ_
MonitorElement * h2_TkPtPull_[3]
void push_back(const RefToBase< T > &)
const std::vector< uint8_t > & nHitsBeforeVtx() const
Vector of the number of hits before the vertex along each track trajector.
MonitorElement * h_convVtxdZ_endcap_
MonitorElement * h2_convVtxdRVsR_
MonitorElement * h_DPhiTracksAtVtx_[3][3]
double y0() const
y coordinate
void push_back(value_type const &ref)
Add a Ref<C, T> to the RefVector.
size_type size() const
Size of the RefVector.
MonitorElement * nHitsVsR_[3]
MonitorElement * h_simTkEta_
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
MonitorElement * h_TkPtPull_[3]
MonitorElement * p2_convVtxdZVsRZ_
MonitorElement * h_SimConvTwoMTracks_[5]
reco::SimToRecoCollection associateSimToReco(const edm::Handle< edm::View< reco::Track > > &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
compare reco to sim the handle of reco::Track and TrackingParticle collections
MonitorElement * p_convVtxdRVsEta_
MonitorElement * h_dlClosestHitToVtx_[3]
MonitorElement * h_TkD0_[3]
MonitorElement * h2_convVtxdRVsEta_
T const * product() const
MonitorElement * h_nSharedHits_[3][3]
double dPhiTracksAtVtx() const
std::vector< edm::RefToBase< reco::Track > > const & tracks() const
vector of track to base references
MonitorElement * h_maxNHitsBeforeVtx_[3][3]
int numberOfHits(HitCategory category) const
double x0() const
x coordinate