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;
973 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
974 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
975 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
981 if (
theConvTP_.
size() == 2 ) visibleConversionsWithTwoSimTracks=
true;
982 goodSimConversion=
false;
984 if ( visibleConversion && visibleConversionsWithTwoSimTracks ) goodSimConversion=
true;
985 if ( goodSimConversion ) {
1003 if ( ! (visibleConversion && visibleConversionsWithTwoSimTracks ) )
continue;
1006 if ( fabs(
mcEta_) <=1.) {
1019 bool recomatch =
false;
1020 float chi2Prob = 0.;
1023 for (reco::ConversionCollection::const_iterator
conv = convHandle->begin();
conv!=convHandle->end();++
conv) {
1034 std::vector<edm::RefToBase<reco::Track> >
tracks = aConv.
tracks();
1039 if (tracks.size() !=2 || !(vtx.
isValid()))
continue;
1050 double lxy = (themom.x()*dbsx + themom.y()*dbsy)/themom.rho();
1070 bool isAssociated =
false;
1074 std::vector<std::pair<RefToBase<reco::Track>,
double> > trackV1, trackV2;
1076 int tp_1 = 0, tp_2 = 1;
1078 trackV1 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q1[
theConvTP_[0]];
1080 trackV1 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q1[
theConvTP_[1]];
1084 trackV2 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q2[
theConvTP_[1]];
1086 trackV2 = (std::vector<std::pair<RefToBase<reco::Track>,
double> >) q2[
theConvTP_[0]];
1089 if (!(trackV1.size()&&trackV2.size()))
1091 if (tp_1 == tp_2)
continue;
1097 myAss.insert( std::make_pair (tr1.
get(),
theConvTP_[tp_1] ) );
1098 myAss.insert( std::make_pair (tr2.
get(),
theConvTP_[tp_2]) );
1106 isAssociated =
true;
1129 if ( chi2Prob > 0) {
1136 if ( chi2Prob > 0.0005) {
1151 for (reco::ConversionCollection::const_iterator
conv = convHandle->begin();
conv!=convHandle->end();++
conv) {
1161 std::vector<edm::RefToBase<reco::Track> > tracks = aConv.
tracks();
1165 if (tracks.size() !=2 || !(vtx.
isValid()))
continue;
1176 double lxy = (themom.x()*dbsx + themom.y()*dbsy)/themom.rho();
1180 bool phoIsInBarrel=
false;
1181 bool phoIsInEndcap=
false;
1200 if (
sqrt(p1AtVtx.perp2()) >
sqrt(p2AtVtx.perp2()) )
1201 dPhiTracksAtVtx = p1AtVtx.phi() - p2AtVtx.phi();
1203 dPhiTracksAtVtx = p2AtVtx.phi() - p1AtVtx.phi();
1209 if (fabs(refittedMom.eta())< 1.479 ) {
1218 double Mindeltaeta = 999999;
1219 double Mindeltaphi = 999999;
1220 bool matchConvSC=
false;
1221 reco::PhotonCollection::const_iterator iMatchingSC;
1222 for( reco::PhotonCollection::const_iterator iPho = photonCollection.begin(); iPho != photonCollection.end(); iPho++) {
1226 double deltaeta =
abs( aPho.
superCluster()->position().eta() -ConvEta);
1227 if (
abs(deltaeta)<
abs(Mindeltaeta) &&
abs(deltaphi)<
abs(Mindeltaphi)) {
1228 Mindeltaphi=
abs(deltaphi);
1229 Mindeltaeta=
abs(deltaeta);
1230 iMatchingSC = iPho ;
1233 if (
abs(Mindeltaeta)<0.1 &&
abs(Mindeltaphi)<0.1) {
1247 int ilead = 0, itrail = 1;
1248 if (tk2->
pt() > tk1->
pt()) {
1285 if ( matchConvSC ) {
1306 if ( phoIsInBarrel ) {
1331 if ( matchConvSC ) {
1340 if ( phoIsInEndcap ) {
1356 if ( matchConvSC ) {
1372 for (
unsigned int i=0;
i<tracks.size();
i++) {
1375 d0 = - tracks[
i]->dxy(the_pvtx.position());
1377 d0 = tracks[
i]->d0();
1397 bool associated =
false;
1401 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
1402 mcConvPt_= (*mcPho).fourMomentum().et();
1403 float mcPhi= (*mcPho).fourMomentum().phi();
1404 simPV_Z = (*mcPho).primaryVertex().z();
1406 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
1408 mcConvR_= (*mcPho).vertex().perp();
1414 if ( fabs(
mcEta_) > END_HI )
continue;
1420 if ( (*mcPho).isAConversion() != 1 )
continue;
1421 if (!( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
1422 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) )
1428 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1429 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1430 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1443 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1[tk1];
1444 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2[tk2];
1445 if (!(tp1.size()&&tp2.size())){
1449 if (tp1.size()&&tp2.size()) {
1452 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11&& tpr1->pdgId()*tpr2->pdgId()<0) {
1453 if ( (tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()==1) &&
1454 (tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()==1)) {
1455 if (tpr1->parentVertex().
key()==tpr2->parentVertex().
key() && ((*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22)) {
1456 mcConvR_ =
sqrt(tpr1->parentVertex()->position().Perp2());
1457 mcConvZ_ = tpr1->parentVertex()->position().z();
1458 mcConvX_ = tpr1->parentVertex()->position().x();
1459 mcConvY_ = tpr1->parentVertex()->position().y();
1460 mcConvEta_ = tpr1->parentVertex()->position().eta();
1461 mcConvPhi_ = tpr1->parentVertex()->position().phi();
1462 mcConvPt_ =
sqrt((*tpr1->parentVertex()->sourceTracks_begin())->momentum().Perp2());
1487 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
1488 mcConvPt_= (*mcPho).fourMomentum().et();
1489 float mcPhi= (*mcPho).fourMomentum().phi();
1490 simPV_Z = (*mcPho).primaryVertex().z();
1492 mcEta_= (*mcPho).fourMomentum().pseudoRapidity();
1494 mcConvR_= (*mcPho).vertex().perp();
1497 mcConvZ_= (*mcPho).vertex().z();
1500 if ( fabs(
mcEta_) > END_HI )
continue;
1506 if ( (*mcPho).isAConversion() != 1 )
continue;
1507 if (!( ( fabs(
mcEta_) <= BARL && mcConvR_ <85 ) ||
1508 ( fabs(
mcEta_) > BARL && fabs(
mcEta_) <=END_HI && fabs( (*mcPho).vertex().z() ) < 210 ) ) )
1514 if ( fabs( tp->vx() - (*mcPho).vertex().x() ) < 0.0001 &&
1515 fabs( tp->vy() - (*mcPho).vertex().y() ) < 0.0001 &&
1516 fabs( tp->vz() - (*mcPho).vertex().z() ) < 0.0001) {
1535 std::vector<std::pair<TrackingParticleRef, double> > tp1 = p1incl[tk1];
1536 std::vector<std::pair<TrackingParticleRef, double> > tp2 = p2incl[tk2];
1537 if (!(tp1.size()&&tp2.size())){
1541 if (tp1.size()&&tp2.size()) {
1544 if (
abs(tpr1->pdgId())==11&&
abs(tpr2->pdgId())==11 && tpr1->pdgId()*tpr2->pdgId()<0) {
1545 if ( ((tpr1->parentVertex()->sourceTracks_end()-tpr1->parentVertex()->sourceTracks_begin()>=1) && (*tpr1->parentVertex()->sourceTracks_begin())->
pdgId()==22) &&
1546 ((tpr2->parentVertex()->sourceTracks_end()-tpr2->parentVertex()->sourceTracks_begin()>=1) && (*tpr2->parentVertex()->sourceTracks_begin())->
pdgId()==22) ) {
1577 if ( associated ) match=1;
1606 if ( matchConvSC ) {
1619 if ( phoIsInBarrel ) {
1635 if ( matchConvSC ) {
1647 if ( phoIsInEndcap ) {
1663 if ( matchConvSC ) {
1706 if ( phoIsInBarrel ) {
1713 if ( phoIsInEndcap ) {
1725 for (
unsigned int i=0;
i<tracks.size();
i++) {
1728 itAss= myAss.find( tfrb.get() );
1742 d0 = - tracks[
i]->dxy(the_pvtx.position());
1744 d0 = tracks[
i]->d0();
1752 if ( itAss == myAss.end() )
continue;
1755 float simPt =
sqrt( ((*itAss).second)->momentum().perp2() );
1757 float ptres= recPt - simPt ;
1764 if ( phoIsInBarrel ) {
1768 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]
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_
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]
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
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