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";
837 if (!convHandle.isValid()) {
838 edm::LogError(
"ConversionsProducer") <<
"Error! Can't get the collection "<< std::endl;
846 if (!photonHandle.isValid()) {
847 edm::LogError(
"PhotonProducer") <<
"Error! Can't get the Photon collection "<< std::endl;
856 if (!vertexHandle.isValid()) {
857 edm::LogError(
"TrackerOnlyConversionProducer") <<
"Error! Can't get the product primary Vertex Collection "<<
"\n";
862 bool valid_pvtx =
false;
866 if (the_pvtx.isValid() && fabs(the_pvtx.position().z())<=15 && the_pvtx.position().Rho()<=2){
873 if (!bsHandle.isValid()) {
875 <<
"Error! Can't get the product primary Vertex Collection "<<
"\n";
889 std::vector<SimTrack> theSimTracks;
890 std::vector<SimVertex> theSimVertices;
904 tpForEfficiency = *(TPHandleForEff.product());
906 tpForFakeRate = *(TPHandleForFakeRate.product());
911 theSimTracks.insert(theSimTracks.end(),SimTk->begin(),SimTk->end());
912 theSimVertices.insert(theSimVertices.end(),SimVtx->begin(),SimVtx->end());
928 std::map<const reco::Track*,TrackingParticleRef> myAss;
929 std::map<const reco::Track*,TrackingParticleRef>::const_iterator itAss;
931 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
934 float mcPhi= (*mcPho).fourMomentum().phi();
936 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
945 if ( fabs(
mcEta_) > END_HI )
continue;
953 bool goodSimConversion=
false;
954 bool visibleConversion=
false;
955 bool visibleConversionsWithTwoSimTracks=
false;
956 if ( (*mcPho).isAConversion() == 1 ) {
966 if ( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
967 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) visibleConversion=
true;
972 for(
size_t i = 0;
i < tpForEfficiency.size(); ++
i){
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 ) ) )
1428 for(
size_t i = 0;
i < tpForFakeRate.size(); ++
i){
1430 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1431 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1432 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1445 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1[tk1];
1446 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2[tk2];
1447 if (!(tp1.size()&&tp2.size())){
1451 if (tp1.size()&&tp2.size()) {
1454 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11&& tpr1->pdgId()*tpr2->pdgId()<0) {
1455 if ( (tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()==1) &&
1456 (tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()==1)) {
1457 if (tpr1->parentVertex().
key()==tpr2->parentVertex().
key() && ((*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22)) {
1458 mcConvR_ =
sqrt(tpr1->parentVertex()->position().Perp2());
1459 mcConvZ_ = tpr1->parentVertex()->position().z();
1460 mcConvX_ = tpr1->parentVertex()->position().x();
1461 mcConvY_ = tpr1->parentVertex()->position().y();
1462 mcConvEta_ = tpr1->parentVertex()->position().eta();
1463 mcConvPhi_ = tpr1->parentVertex()->position().phi();
1464 mcConvPt_ =
sqrt((*tpr1->parentVertex()->sourceTracks_begin())->momentum().Perp2());
1484 for(
size_t i = 0;
i < tpForFakeRate.size(); ++
i){
1492 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
1493 mcConvPt_= (*mcPho).fourMomentum().et();
1494 float mcPhi= (*mcPho).fourMomentum().phi();
1495 simPV_Z = (*mcPho).primaryVertex().z();
1497 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
1499 mcConvR_= (*mcPho).vertex().perp();
1502 mcConvZ_= (*mcPho).vertex().z();
1505 if ( fabs(
mcEta_) > END_HI )
continue;
1511 if ( (*mcPho).isAConversion() != 1 )
continue;
1512 if (!( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
1513 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) )
1518 for(
size_t i = 0;
i < tpForFakeRate.size(); ++
i){
1520 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1521 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1522 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1541 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1incl[tk1];
1542 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2incl[tk2];
1543 if (!(tp1.size()&&tp2.size())){
1547 if (tp1.size()&&tp2.size()) {
1550 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11 && tpr1->pdgId()*tpr2->pdgId()<0) {
1551 if ( ((tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()>=1) && (*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22) &&
1552 ((tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()>=1) && (*tpr2->parentVertex()->sourceTracks_begin())->
pdgId()==22) ) {
1583 if ( associated ) match=1;
1612 if ( matchConvSC ) {
1625 if ( phoIsInBarrel ) {
1641 if ( matchConvSC ) {
1653 if ( phoIsInEndcap ) {
1669 if ( matchConvSC ) {
1712 if ( phoIsInBarrel ) {
1719 if ( phoIsInEndcap ) {
1731 for (
unsigned int i=0;
i<tracks.size();
i++) {
1734 itAss= myAss.find( tfrb.get() );
1748 d0 = - tracks[
i]->dxy(the_pvtx.position());
1750 d0 = tracks[
i]->d0();
1758 if ( itAss == myAss.end() )
continue;
1761 float simPt =
sqrt( ((*itAss).second)->momentum().perp2() );
1763 float ptres= recPt - simPt ;
1770 if ( phoIsInBarrel ) {
1774 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]
double lxy(const math::XYZPoint &myBeamSpot, const Conversion &conv)
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]
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]
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_
edm::EDGetTokenT< edm::HepMCProduct > hepMC_Token_
MonitorElement * h_convVtxYvsX_
MonitorElement * p_convVtxdZVsR_
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< TrackingParticleCollection > tpSelForEff_Token_
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]
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_
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
void clear()
Clear the vector.
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
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]
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_
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