817 const float BARL = 1.4442;
819 const float END_HI = 2.5;
825 LogInfo(
"TkConvValidator") <<
"TkConvValidator Analyzing event number: " << e.
id() <<
" Global Counter " <<
nEvt_ <<
"\n";
842 if (!convHandle.isValid()) {
843 edm::LogError(
"ConversionsProducer") <<
"Error! Can't get the collection "<< std::endl;
851 if (!photonHandle.isValid()) {
852 edm::LogError(
"PhotonProducer") <<
"Error! Can't get the Photon collection "<< std::endl;
861 if (!vertexHandle.isValid()) {
862 edm::LogError(
"TrackerOnlyConversionProducer") <<
"Error! Can't get the product primary Vertex Collection "<<
"\n";
867 bool valid_pvtx =
false;
871 if (the_pvtx.isValid() && fabs(the_pvtx.position().z())<=15 && the_pvtx.position().Rho()<=2){
878 if (!bsHandle.isValid()) {
880 <<
"Error! Can't get the product primary Vertex Collection "<<
"\n";
894 std::vector<SimTrack> theSimTracks;
895 std::vector<SimVertex> theSimVertices;
909 tpForEfficiency = *(TPHandleForEff.product());
911 tpForFakeRate = *(TPHandleForFakeRate.product());
916 theSimTracks.insert(theSimTracks.end(),SimTk->begin(),SimTk->end());
917 theSimVertices.insert(theSimVertices.end(),SimVtx->begin(),SimVtx->end());
933 std::map<const reco::Track*,TrackingParticleRef> myAss;
934 std::map<const reco::Track*,TrackingParticleRef>::const_iterator itAss;
936 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
939 float mcPhi= (*mcPho).fourMomentum().phi();
941 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
950 if ( fabs(
mcEta_) > END_HI )
continue;
958 bool goodSimConversion=
false;
959 bool visibleConversion=
false;
960 bool visibleConversionsWithTwoSimTracks=
false;
961 if ( (*mcPho).isAConversion() == 1 ) {
971 if ( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
972 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) visibleConversion=
true;
977 for(
size_t i = 0;
i < tpForEfficiency.size(); ++
i){
979 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
980 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
981 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
987 if (
theConvTP_.
size() == 2 ) visibleConversionsWithTwoSimTracks=
true;
988 goodSimConversion=
false;
990 if ( visibleConversion && visibleConversionsWithTwoSimTracks ) goodSimConversion=
true;
991 if ( goodSimConversion ) {
1009 if ( ! (visibleConversion && visibleConversionsWithTwoSimTracks ) )
continue;
1012 if ( fabs(
mcEta_) <=1.) {
1025 bool recomatch =
false;
1026 float chi2Prob = 0.;
1029 for (reco::ConversionCollection::const_iterator
conv = convHandle->begin();
conv!=convHandle->end();++
conv) {
1040 std::vector<edm::RefToBase<reco::Track> >
tracks = aConv.
tracks();
1045 if (tracks.size() !=2 || !(vtx.
isValid()))
continue;
1056 double lxy = (themom.x()*dbsx + themom.y()*dbsy)/themom.rho();
1076 bool isAssociated =
false;
1080 std::vector<std::pair<RefToBase<reco::Track>,
double> > trackV1, trackV2;
1082 int tp_1 = 0, tp_2 = 1;
1084 trackV1 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q1[
theConvTP_[0]];
1086 trackV1 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q1[
theConvTP_[1]];
1090 trackV2 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q2[
theConvTP_[1]];
1092 trackV2 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q2[
theConvTP_[0]];
1095 if (!(trackV1.size()&&trackV2.size()))
1097 if (tp_1 == tp_2)
continue;
1103 myAss.insert( std::make_pair (tr1.
get(),
theConvTP_[tp_1] ) );
1104 myAss.insert( std::make_pair (tr2.
get(),
theConvTP_[tp_2]) );
1112 isAssociated =
true;
1135 if ( chi2Prob > 0) {
1142 if ( chi2Prob > 0.0005) {
1157 for (reco::ConversionCollection::const_iterator
conv = convHandle->begin();
conv!=convHandle->end();++
conv) {
1167 std::vector<edm::RefToBase<reco::Track> > tracks = aConv.
tracks();
1171 if (tracks.size() !=2 || !(vtx.
isValid()))
continue;
1182 double lxy = (themom.x()*dbsx + themom.y()*dbsy)/themom.rho();
1186 bool phoIsInBarrel=
false;
1187 bool phoIsInEndcap=
false;
1206 if (
sqrt(p1AtVtx.perp2()) >
sqrt(p2AtVtx.perp2()) )
1207 dPhiTracksAtVtx = p1AtVtx.phi() - p2AtVtx.phi();
1209 dPhiTracksAtVtx = p2AtVtx.phi() - p1AtVtx.phi();
1215 if (fabs(refittedMom.eta())< 1.479 ) {
1224 double Mindeltaeta = 999999;
1225 double Mindeltaphi = 999999;
1226 bool matchConvSC=
false;
1227 reco::PhotonCollection::const_iterator iMatchingSC;
1228 for( reco::PhotonCollection::const_iterator iPho = photonCollection.begin(); iPho != photonCollection.end(); iPho++) {
1232 double deltaeta =
abs( aPho.
superCluster()->position().eta() -ConvEta);
1233 if (
abs(deltaeta)<
abs(Mindeltaeta) &&
abs(deltaphi)<
abs(Mindeltaphi)) {
1234 Mindeltaphi=
abs(deltaphi);
1235 Mindeltaeta=
abs(deltaeta);
1236 iMatchingSC = iPho ;
1239 if (
abs(Mindeltaeta)<0.1 &&
abs(Mindeltaphi)<0.1) {
1253 int ilead = 0, itrail = 1;
1254 if (tk2->
pt() > tk1->
pt()) {
1290 if ( matchConvSC ) {
1311 if ( phoIsInBarrel ) {
1336 if ( matchConvSC ) {
1345 if ( phoIsInEndcap ) {
1361 if ( matchConvSC ) {
1377 for (
unsigned int i=0;
i<tracks.size();
i++) {
1380 d0 = - tracks[
i]->dxy(the_pvtx.position());
1382 d0 = tracks[
i]->d0();
1402 bool associated =
false;
1406 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
1407 mcConvPt_= (*mcPho).fourMomentum().et();
1408 float mcPhi= (*mcPho).fourMomentum().phi();
1409 simPV_Z = (*mcPho).primaryVertex().z();
1411 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
1413 mcConvR_= (*mcPho).vertex().perp();
1419 if ( fabs(
mcEta_) > END_HI )
continue;
1425 if ( (*mcPho).isAConversion() != 1 )
continue;
1426 if (!( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
1427 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) )
1432 for(
size_t i = 0;
i < tpForFakeRate.size(); ++
i){
1434 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1435 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1436 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1449 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1[tk1];
1450 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2[tk2];
1451 if (!(tp1.size()&&tp2.size())){
1455 if (tp1.size()&&tp2.size()) {
1458 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11&& tpr1->pdgId()*tpr2->pdgId()<0) {
1459 if ( (tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()==1) &&
1460 (tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()==1)) {
1461 if (tpr1->parentVertex().
key()==tpr2->parentVertex().
key() && ((*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22)) {
1462 mcConvR_ =
sqrt(tpr1->parentVertex()->position().Perp2());
1463 mcConvZ_ = tpr1->parentVertex()->position().z();
1464 mcConvX_ = tpr1->parentVertex()->position().x();
1465 mcConvY_ = tpr1->parentVertex()->position().y();
1466 mcConvEta_ = tpr1->parentVertex()->position().eta();
1467 mcConvPhi_ = tpr1->parentVertex()->position().phi();
1468 mcConvPt_ =
sqrt((*tpr1->parentVertex()->sourceTracks_begin())->momentum().Perp2());
1488 for(
size_t i = 0;
i < tpForFakeRate.size(); ++
i){
1496 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
1497 mcConvPt_= (*mcPho).fourMomentum().et();
1498 float mcPhi= (*mcPho).fourMomentum().phi();
1499 simPV_Z = (*mcPho).primaryVertex().z();
1501 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
1503 mcConvR_= (*mcPho).vertex().perp();
1506 mcConvZ_= (*mcPho).vertex().z();
1509 if ( fabs(
mcEta_) > END_HI )
continue;
1515 if ( (*mcPho).isAConversion() != 1 )
continue;
1516 if (!( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
1517 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) )
1522 for(
size_t i = 0;
i < tpForFakeRate.size(); ++
i){
1524 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1525 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1526 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1545 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1incl[tk1];
1546 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2incl[tk2];
1547 if (!(tp1.size()&&tp2.size())){
1551 if (tp1.size()&&tp2.size()) {
1554 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11 && tpr1->pdgId()*tpr2->pdgId()<0) {
1555 if ( ((tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()>=1) && (*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22) &&
1556 ((tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()>=1) && (*tpr2->parentVertex()->sourceTracks_begin())->
pdgId()==22) ) {
1587 if ( associated ) match=1;
1616 if ( matchConvSC ) {
1629 if ( phoIsInBarrel ) {
1645 if ( matchConvSC ) {
1657 if ( phoIsInEndcap ) {
1673 if ( matchConvSC ) {
1716 if ( phoIsInBarrel ) {
1723 if ( phoIsInEndcap ) {
1735 for (
unsigned int i=0;
i<tracks.size();
i++) {
1738 itAss= myAss.find( tfrb.get() );
1752 d0 = - tracks[
i]->dxy(the_pvtx.position());
1754 d0 = tracks[
i]->d0();
1762 if ( itAss == myAss.end() )
continue;
1765 float simPt =
sqrt( ((*itAss).second)->momentum().perp2() );
1767 float ptres= recPt - simPt ;
1774 if ( phoIsInBarrel ) {
1778 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_
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]
MonitorElement * h_DCotTracks_[3][3]
std::vector< TrackingParticle > TrackingParticleCollection
const_iterator end() const
last iterator over the map (read only)
static HepMC::IO_HEPEVT conv
MonitorElement * nHitsVsEta_[3]
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]
std::vector< GenJet > GenJetCollection
collection of GenJet objects
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]
reco::SuperClusterRef superCluster() const
Ref to SuperCluster.
std::vector< Vertex > VertexCollection
collection of Vertex objects
MonitorElement * h_convVtxdX_endcap_
MonitorElement * h_convVtxdR_endcap_
edm::EDGetTokenT< reco::VertexCollection > offline_pvToken_
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_
edm::EDGetTokenT< edm::HepMCProduct > hepMC_Token_
MonitorElement * h_convVtxYvsX_
TrackAssociatorBase * theTrackAssociator_
MonitorElement * p_convVtxdZVsR_
MonitorElement * p_convVtxdRVsR_
MonitorElement * h_convR_[3][3]
float etaTransformation(float a, float b)
float phiNormalization(float &a)
const T & max(const T &a, const T &b)
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< TrackingParticleCollection > tpSelForEff_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)
const HitPattern & trackerExpectedHitsInner() const
Access the hit pattern counting (in the Tracker) the number of expected crossed layers before the fir...
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]
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
edm::EDGetTokenT< TrackingParticleCollection > tpSelForFake_Token_
virtual reco::RecoToSimCollection associateRecoToSim(edm::Handle< edm::View< reco::Track > > &tCH, edm::Handle< TrackingParticleCollection > &tPCH, const edm::Event *event, const edm::EventSetup *setup) const
compare reco to sim the handle of reco::Track and TrackingParticle collections
MonitorElement * h_simConvVtxYvsX_
MonitorElement * h_convEta2_[3][3]
MonitorElement * h_nHitsBeforeVtx_[3]
MonitorElement * p2_convVtxdRVsRZ_
MonitorElement * p_Chi2VsEta_[3]
virtual reco::SimToRecoCollection associateSimToReco(edm::Handle< edm::View< reco::Track > > &tCH, edm::Handle< TrackingParticleCollection > &tPCH, const edm::Event *event, const edm::EventSetup *setup) const
compare reco to sim the handle of reco::Track and TrackingParticle collections
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
void clear()
Clear the vector.
XYZVectorD XYZVector
spatial vector with cartesian internal representation
MonitorElement * h_convVtxdZ_barrel_
key_type key() const
Accessor for product key.
MonitorElement * h2_convVtxRrecVsTrue_
MonitorElement * h_AllSimConv_[5]
Denominator for efficiencies.
MonitorElement * h_convRplot_
MonitorElement * p_nHitsVsR_[3]
std::vector< Photon > PhotonCollection
collectin of Photon objects
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]
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]
MonitorElement * p_convVtxdRVsEta_
MonitorElement * h_dlClosestHitToVtx_[3]
MonitorElement * h_TkD0_[3]
MonitorElement * h2_convVtxdRVsEta_
edm::EDGetTokenT< reco::GenJetCollection > genjets_Token_
value_type const * get() 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]