136 unsigned int CutIndex = 100000;
137 double CutGSFECAL = 10000. ;
140 bool DebugSetLinksSummary =
false;
141 bool DebugSetLinksDetailed =
false;
147 bool IsThereAGSFTrack =
false;
148 bool IsThereAGoodGSFTrack =
false;
150 vector<unsigned int> trackIs(0);
151 vector<unsigned int> gsfIs(0);
152 vector<unsigned int> ecalIs(0);
154 std::vector<bool> localactive(elements.
size(),
true);
158 std::multimap<double, unsigned int> kfElems;
159 for(
unsigned int iEle=0; iEle<elements.
size(); iEle++) {
160 localactive[iEle] = active[iEle];
161 bool thisIsAMuon =
false;
164 case PFBlockElement::TRACK:
168 if ( !thisIsAMuon && active[iEle] ) {
169 trackIs.push_back( iEle );
170 if (DebugSetLinksDetailed)
171 cout<<
"TRACK, stored index, continue "<< iEle << endl;
174 case PFBlockElement::GSF:
180 thisIsAMuon = !kfElems.empty() ?
183 if ( !thisIsAMuon && active[iEle] ) {
184 IsThereAGSFTrack =
true;
185 gsfIs.push_back( iEle );
186 if (DebugSetLinksDetailed)
187 cout<<
"GSF, stored index, continue "<< iEle << endl;
191 if ( active[iEle] ) {
192 ecalIs.push_back( iEle );
193 if (DebugSetLinksDetailed)
194 cout<<
"ECAL, stored index, continue "<< iEle << endl;
203 if(IsThereAGSFTrack) {
214 if (DebugSetLinksDetailed) {
215 cout<<
"#########################################################"<<endl;
216 cout<<
"##### Process Block: #####"<<endl;
217 cout<<
"#########################################################"<<endl;
222 for(
unsigned int iEle=0; iEle<trackIs.size(); iEle++) {
223 std::multimap<double, unsigned int> gsfElems;
228 if(gsfElems.empty()){
231 std::multimap<double, unsigned int> ecalKfElems;
236 if(!ecalKfElems.empty()) {
237 unsigned int ecalKf_index = ecalKfElems.begin()->second;
238 if(localactive[ecalKf_index]==
true) {
242 bool isGsfLinked =
false;
243 for(
unsigned int iGsf=0; iGsf<gsfIs.size(); iGsf++) {
251 std::multimap<double, unsigned int> ecalGsfElems;
256 if(!ecalGsfElems.empty()) {
257 if (ecalGsfElems.begin()->second == ecalKf_index) {
262 if(isGsfLinked ==
false) {
269 int nexhits = refKf->hitPattern().numberOfLostHits(HitPattern::MISSING_INNER_HITS);
271 bool isGoodTrack=
false;
276 bool trackIsFromPrimaryVertex =
false;
278 if ( (*trackIt).castTo<
TrackRef>() == refKf ) {
279 trackIsFromPrimaryVertex =
true;
285 && nexhits == 0 && trackIsFromPrimaryVertex) {
286 localactive[ecalKf_index] =
false;
298 for(
unsigned int iEle=0; iEle<gsfIs.size(); iEle++) {
300 if (!localactive[(gsfIs[iEle])])
continue;
302 localactive[gsfIs[iEle]] =
false;
303 bool ClosestEcalWithKf =
false;
305 if (DebugSetLinksDetailed)
cout <<
" Gsf Index " << gsfIs[iEle] << endl;
312 IsThereAGoodGSFTrack =
true;
314 float etaOut_gsf = GsfEl->
Pout().eta();
315 float diffOutEcalEta = fabs(eta_gsf-etaOut_gsf);
317 float Pin_gsf = 0.01;
319 Pin_gsf = RefGSF->pMode();
323 unsigned int KfGsf_index = CutIndex;
324 unsigned int KfGsf_secondIndex = CutIndex;
325 std::multimap<double, unsigned int> kfElems;
330 std::multimap<double, unsigned int> ecalKfElems;
331 if (!kfElems.empty()) {
335 for(std::multimap<double, unsigned int>::iterator itkf = kfElems.begin();
336 itkf != kfElems.end(); ++itkf) {
344 if(localactive[itkf->second] ==
true) {
346 KfGsf_index = itkf->second;
347 localactive[KfGsf_index] =
false;
355 KfGsf_secondIndex = itkf->second;
361 std::multimap<double, unsigned int> ecalGsfElems;
366 double ecalGsf_dist = CutGSFECAL;
367 unsigned int ClosestEcalGsf_index = CutIndex;
368 if (!ecalGsfElems.empty()) {
369 if(localactive[(ecalGsfElems.begin()->second)] ==
true) {
371 bool compatibleEPout =
true;
372 if(diffOutEcalEta > 0.3) {
373 reco::PFClusterRef clusterRef = elements[(ecalGsfElems.begin()->second)].clusterRef();
374 float EoPout = (clusterRef->energy())/(GsfEl->
Pout().t());
376 compatibleEPout =
false;
378 if(compatibleEPout) {
379 ClosestEcalGsf_index = ecalGsfElems.begin()->second;
380 ecalGsf_dist = block.
dist(gsfIs[iEle],ClosestEcalGsf_index,
385 std::multimap<double, unsigned int> ecalOtherGsfElems;
391 if(!ecalOtherGsfElems.empty()) {
396 if(ecalOtherGsfElems.begin()->second != gsfIs[iEle]&&
398 ecalGsf_dist = CutGSFECAL;
399 ClosestEcalGsf_index = CutIndex;
407 else if(!ecalKfElems.empty()) {
408 if(localactive[(ecalKfElems.begin()->second)] ==
true) {
409 ClosestEcalGsf_index = ecalKfElems.begin()->second;
410 ecalGsf_dist = block.
dist(gsfIs[iEle],ClosestEcalGsf_index,
412 ClosestEcalWithKf =
true;
415 std::multimap<double, unsigned int> ecalOtherGsfElems;
420 if(!ecalOtherGsfElems.empty()) {
424 if(ecalOtherGsfElems.begin()->second != gsfIs[iEle] &&
426 ecalGsf_dist = CutGSFECAL;
427 ClosestEcalGsf_index = CutIndex;
428 ClosestEcalWithKf =
false;
434 if (DebugSetLinksDetailed)
435 cout <<
" Closest Ecal to the Gsf/Kf: index " << ClosestEcalGsf_index
436 <<
" dist " << ecalGsf_dist << endl;
441 std::multimap<double, unsigned int> bremElems;
448 multimap<unsigned int,unsigned int> cleanedEcalBremElems;
449 vector<unsigned int> keyBremIndex(0);
450 unsigned int latestBrem_trajP = 0;
451 unsigned int latestBrem_index = CutIndex;
452 for(std::multimap<double, unsigned int>::iterator ieb = bremElems.begin();
453 ieb != bremElems.end(); ++ieb ) {
454 unsigned int brem_index = ieb->second;
455 if(localactive[brem_index] ==
false)
continue;
459 std::multimap<double, unsigned int> ecalBremsElems;
466 for (std::multimap<double, unsigned int>::iterator ie = ecalBremsElems.begin();
467 ie != ecalBremsElems.end();ie++) {
468 unsigned int ecalBrem_index = ie->second;
469 if(localactive[ecalBrem_index] ==
false)
continue;
472 float ecalBrem_dist = block.
dist(brem_index,ecalBrem_index,
476 if (ecalBrem_index == ClosestEcalGsf_index && (ecalBrem_dist + 0.0012) > ecalGsf_dist)
continue;
479 std::multimap<double, unsigned int> sortedBremElems;
485 bool isGoodBrem =
false;
486 unsigned int sortedBrem_index = CutIndex;
487 for (std::multimap<double, unsigned int>::iterator ibs = sortedBremElems.begin();
488 ibs != sortedBremElems.end();ibs++) {
489 unsigned int temp_sortedBrem_index = ibs->second;
490 std::multimap<double, unsigned int> sortedGsfElems;
495 bool enteredInPrimaryGsf =
false;
496 for (std::multimap<double, unsigned int>::iterator igs = sortedGsfElems.begin();
497 igs != sortedGsfElems.end();igs++) {
502 if(igs->second == gsfIs[iEle]) {
504 sortedBrem_index = temp_sortedBrem_index;
506 enteredInPrimaryGsf =
true;
510 if(enteredInPrimaryGsf)
518 std::multimap<double, unsigned int> ecalOtherGsfElems;
523 if (!ecalOtherGsfElems.empty()) {
526 if(ecalOtherGsfElems.begin()->second != gsfIs[iEle] &&
536 elements[ecalBrem_index].clusterRef();
542 if(sortedBremEcal_deta < 0.015) {
544 cleanedEcalBremElems.
insert(pair<unsigned int,unsigned int>(sortedBrem_index,ecalBrem_index));
547 if (BremTrajP > latestBrem_trajP) {
548 latestBrem_trajP = BremTrajP;
549 latestBrem_index = sortedBrem_index;
551 if (DebugSetLinksDetailed)
552 cout <<
" brem Index " << sortedBrem_index
553 <<
" associated cluster " << ecalBrem_index <<
" BremTrajP " << BremTrajP <<endl;
558 localactive[ecalBrem_index] =
false;
559 bool alreadyfound =
false;
560 for(
unsigned int ii=0;
ii<keyBremIndex.size();
ii++) {
561 if (sortedBrem_index == keyBremIndex[
ii]) alreadyfound =
true;
563 if (alreadyfound ==
false) {
564 keyBremIndex.push_back(sortedBrem_index);
565 localactive[sortedBrem_index] =
false;
574 vector<unsigned int> GsfElemIndex(0);
575 vector<unsigned int> EcalIndex(0);
578 if (ClosestEcalGsf_index < CutIndex) {
579 GsfElemIndex.push_back(ClosestEcalGsf_index);
580 localactive[ClosestEcalGsf_index] =
false;
581 for (std::multimap<double, unsigned int>::iterator
ii = ecalGsfElems.begin();
582 ii != ecalGsfElems.end();
ii++) {
583 if(localactive[
ii->second]) {
585 std::multimap<double, unsigned int> ecalOtherGsfElems;
590 if(!ecalOtherGsfElems.empty()) {
591 if(ecalOtherGsfElems.begin()->second != gsfIs[iEle])
continue;
596 float etacl = clusterRef->eta();
597 if( fabs(eta_gsf-etacl) < 0.05) {
598 GsfElemIndex.push_back(
ii->second);
599 localactive[
ii->second] =
false;
600 if (DebugSetLinksDetailed)
601 cout <<
" ExtraCluster From Gsf " <<
ii->second << endl;
638 if(GsfElemIndex.empty()){
639 if(latestBrem_index < CutIndex) {
640 unsigned int ckey = cleanedEcalBremElems.count(latestBrem_index);
642 unsigned int temp_cal =
643 cleanedEcalBremElems.find(latestBrem_index)->second;
644 GsfElemIndex.push_back(temp_cal);
645 if (DebugSetLinksDetailed)
646 cout <<
"******************** Gsf Cluster From Brem " << temp_cal
647 <<
" Latest Brem index " << latestBrem_index
648 <<
" ************************* " << endl;
651 pair<multimap<unsigned int,unsigned int>::iterator,multimap<unsigned int,unsigned int>::iterator> ret;
652 ret = cleanedEcalBremElems.equal_range(latestBrem_index);
653 multimap<unsigned int,unsigned int>::iterator it;
654 for(it=ret.first; it!=ret.second; ++it) {
655 GsfElemIndex.push_back((*it).second);
656 if (DebugSetLinksDetailed)
657 cout <<
"******************** Gsf Cluster From Brem " << (*it).second
658 <<
" Latest Brem index " << latestBrem_index
659 <<
" ************************* " << endl;
663 unsigned int elToErase = 0;
664 for(
unsigned int i = 0;
i<keyBremIndex.size();
i++) {
665 if(latestBrem_index == keyBremIndex[
i]) {
669 keyBremIndex.erase(keyBremIndex.begin()+elToErase);
677 for(
unsigned int iConv=0; iConv<gsfIs.size(); iConv++) {
685 if (DebugSetLinksDetailed)
686 cout <<
" PFElectronAlgo:: I'm running on convGsfBrem " << endl;
688 float conv_dist = block.
dist(gsfIs[iConv],gsfIs[iEle],
693 std::multimap<double, unsigned int> ecalConvElems;
698 if(!ecalConvElems.empty()) {
700 if(localactive[(ecalConvElems.begin()->second)] ==
true) {
701 if (DebugSetLinksDetailed)
702 cout <<
" PFElectronAlgo:: convGsfBrem has a ECAL cluster linked and free" << endl;
704 std::multimap<double, unsigned int> ecalOtherGsfPrimElems;
706 ecalOtherGsfPrimElems,
709 if(!ecalOtherGsfPrimElems.empty()) {
710 unsigned int gsfprimcheck_index = ecalOtherGsfPrimElems.begin()->second;
716 if (DebugSetLinksDetailed)
717 cout <<
" PFElectronAlgo: !!!!!!! convGsfBrem ECAL cluster has been stored !!!!!!! " 718 <<
" Energy " << clusterRef->energy() <<
" eta,phi " << clusterRef->position().eta()
719 <<
", " << clusterRef->position().phi() << endl;
721 GsfElemIndex.push_back(ecalConvElems.begin()->second);
722 convGsfTrack_.emplace_back(ecalConvElems.begin()->second,gsfIs[iConv]);
723 localactive[ecalConvElems.begin()->second] =
false;
735 EcalIndex.insert(EcalIndex.end(),GsfElemIndex.begin(),GsfElemIndex.end());
740 for(
unsigned int i =0;
i<keyBremIndex.size();
i++) {
741 unsigned int ikey = keyBremIndex[
i];
742 unsigned int ckey = cleanedEcalBremElems.count(ikey);
743 vector<unsigned int> BremElemIndex(0);
745 unsigned int temp_cal =
746 cleanedEcalBremElems.find(ikey)->second;
747 BremElemIndex.push_back(temp_cal);
750 pair<multimap<unsigned int,unsigned int>::iterator,multimap<unsigned int,unsigned int>::iterator> ret;
751 ret = cleanedEcalBremElems.equal_range(ikey);
752 multimap<unsigned int,unsigned int>::iterator it;
753 for(it=ret.first; it!=ret.second; ++it) {
754 BremElemIndex.push_back((*it).second);
757 EcalIndex.insert(EcalIndex.end(),BremElemIndex.begin(),BremElemIndex.end());
758 associatedToBrems_.insert(pair<
unsigned int,vector<unsigned int> >(ikey,BremElemIndex));
763 vector<unsigned int> convBremKFTrack;
764 convBremKFTrack.clear();
765 if (!kfElems.empty()) {
766 for(std::multimap<double, unsigned int>::iterator itkf = kfElems.begin();
767 itkf != kfElems.end(); ++itkf) {
775 std::multimap<double, unsigned int> ecalConvElems;
780 if(!ecalConvElems.empty()) {
785 float secpin = trkRef->p();
789 float eneclust =clust->
clusterRef()->energy();
795 std::multimap<double, unsigned int> hcalConvElems;
805 float enehcalclust = -1;
806 if(!hcalConvElems.empty()) {
809 enehcalclust =clusthcal->
clusterRef()->energy();
811 if( (enehcalclust / (enehcalclust+eneclust) ) > 0.1 && isGoodTrack) {
813 if(enehcalclust > eneclust)
815 if(secpin > (enehcalclust+eneclust) )
821 if(localactive[(ecalConvElems.begin()->second)] ==
false) {
823 if(isHoE || isPoHE) {
824 if (DebugSetLinksDetailed)
825 cout <<
"PFElectronAlgo:: LOCKED ECAL REJECTED TRACK FOR H/E or P/(H+E) " 826 <<
" H/H+E " << enehcalclust/(enehcalclust+eneclust)
827 <<
" H/E " << enehcalclust/eneclust
828 <<
" P/(H+E) " << secpin/(enehcalclust+eneclust)
829 <<
" HCAL ENE " << enehcalclust
830 <<
" ECAL ENE " << eneclust
831 <<
" secPIN " << secpin
832 <<
" Algo Track " << trkRef->algo() << endl;
837 for(
unsigned int iecal =0; iecal < EcalIndex.size(); iecal++) {
840 if(EcalIndex[iecal] == ecalConvElems.begin()->second) {
841 if (DebugSetLinksDetailed)
842 cout <<
" PFElectronAlgo:: Conv Brem Recovery locked cluster and I will lock also the KF track " << endl;
843 convBremKFTrack.push_back(itkf->second);
852 if (DebugSetLinksDetailed)
853 cout <<
"PFElectronAlgo:: FREE ECAL REJECTED TRACK FOR H/H+E " 854 <<
" H/H+E " << (enehcalclust / (enehcalclust+eneclust) )
855 <<
" H/E " << enehcalclust/eneclust
856 <<
" P/(H+E) " << secpin/(enehcalclust+eneclust)
857 <<
" HCAL ENE " << enehcalclust
858 <<
" ECAL ENE " << eneclust
859 <<
" secPIN " << secpin
860 <<
" Algo Track " << trkRef->algo() << endl;
865 std::multimap<double, unsigned int> ecalOtherKFPrimElems;
867 ecalOtherKFPrimElems,
870 if(!ecalOtherKFPrimElems.empty()) {
874 bool isFromGSF =
false;
875 for(std::multimap<double, unsigned int>::iterator itclos = kfElems.begin();
876 itclos != kfElems.end(); ++itclos) {
877 if(ecalOtherKFPrimElems.begin()->second == itclos->second) {
887 float Epin = eneclust/secpin;
890 float totenergy = 0.;
891 for(
unsigned int ikeyecal = 0;
892 ikeyecal<EcalIndex.size(); ikeyecal++){
894 bool foundcluster =
false;
896 for(
unsigned int i2 = 0; i2<ikeyecal-1; i2++) {
897 if(EcalIndex[ikeyecal] == EcalIndex[i2])
901 if(foundcluster)
continue;
904 totenergy += clusasso->
clusterRef()->energy();
909 if(totenergy == 0.) {
910 if (DebugSetLinksDetailed)
911 cout <<
"PFElectronAlgo:: REJECTED_NULLTOT totenergy " << totenergy << endl;
917 double res_before = fabs((totenergy-Pin_gsf)/Pin_gsf);
918 double res_after = fabs(((totenergy+eneclust)-Pin_gsf)/Pin_gsf);
920 if(res_before < res_after) {
921 if (DebugSetLinksDetailed)
922 cout <<
"PFElectronAlgo::REJECTED_RES totenergy " << totenergy <<
" Pin_gsf " << Pin_gsf <<
" cluster to secondary " << eneclust
923 <<
" Res before " << res_before <<
" res_after " << res_after << endl;
928 if (DebugSetLinksDetailed)
929 cout <<
"PFElectronAlgo:: conv brem found asso to ECAL linked to a secondary KF " << endl;
930 convBremKFTrack.push_back(itkf->second);
931 GsfElemIndex.push_back(ecalConvElems.begin()->second);
932 EcalIndex.push_back(ecalConvElems.begin()->second);
933 localactive[(ecalConvElems.begin()->second)] =
false;
934 localactive[(itkf->second)] =
false;
945 double sumEtEcalInTheCone = 0.;
950 double PhiFC = clust->
clusterRef()->position().Phi();
951 double EtaFC = clust->
clusterRef()->position().Eta();
954 for(
unsigned int iEcal=0; iEcal<ecalIs.size(); iEcal++) {
955 bool foundcluster =
false;
956 for(
unsigned int ikeyecal = 0;
957 ikeyecal<EcalIndex.size(); ikeyecal++){
958 if(ecalIs[iEcal] == EcalIndex[ikeyecal])
963 if(foundcluster ==
false) {
966 double eta_clust = clustExt->
clusterRef()->position().Eta();
967 double phi_clust = clustExt->
clusterRef()->position().Phi();
968 double theta_clust = clustExt->
clusterRef()->position().Theta();
969 double deta_clust = eta_clust - EtaFC;
970 double dphi_clust = phi_clust - PhiFC;
971 if ( dphi_clust < -
M_PI )
972 dphi_clust = dphi_clust + 2.*
M_PI;
973 else if ( dphi_clust >
M_PI )
974 dphi_clust = dphi_clust - 2.*
M_PI;
975 double DR =
sqrt(deta_clust*deta_clust+
976 dphi_clust*dphi_clust);
980 vector<double> ps1Ene(0);
981 vector<double> ps2Ene(0);
985 double ET_calib = EE_calib*
sin(theta_clust);
986 sumEtEcalInTheCone += ET_calib;
992 unsigned int sumNTracksInTheCone = 0;
993 double sumPtTracksInTheCone = 0.;
994 for(
unsigned int iTrack=0; iTrack<trackIs.size(); iTrack++) {
996 if(localactive[(trackIs[iTrack])]==
true) {
1001 double deta_trk = trkref->eta() - RefGSF->etaMode();
1002 double dphi_trk = trkref->phi() - RefGSF->phiMode();
1003 if ( dphi_trk < -
M_PI )
1004 dphi_trk = dphi_trk + 2.*
M_PI;
1005 else if ( dphi_trk >
M_PI )
1006 dphi_trk = dphi_trk - 2.*
M_PI;
1007 double DR =
sqrt(deta_trk*deta_trk+
1010 int NValPixelHit = trkref->hitPattern().numberOfValidPixelHits();
1012 if(DR < coneTrackIsoForEgammaSC_ && NValPixelHit >=3) {
1013 sumNTracksInTheCone++;
1014 sumPtTracksInTheCone+=trkref->pt();
1021 bool isBarrelIsolated =
false;
1022 if( fabs(EtaFC < 1.478) &&
1025 isBarrelIsolated =
true;
1028 bool isEndcapIsolated =
false;
1029 if( fabs(EtaFC >= 1.478) &&
1032 isEndcapIsolated =
true;
1036 if(DebugSetLinksDetailed) {
1037 if(fabs(EtaFC < 1.478) && isBarrelIsolated ==
false) {
1038 cout <<
"**** PFElectronAlgo:: SUPERCLUSTER FOUND BUT FAILS ISOLATION:BARREL *** " 1039 <<
" sumEtEcalInTheCone " <<sumEtEcalInTheCone
1040 <<
" sumNTracksInTheCone " << sumNTracksInTheCone
1041 <<
" sumPtTracksInTheCone " << sumPtTracksInTheCone << endl;
1043 if(fabs(EtaFC >= 1.478) && isEndcapIsolated ==
false) {
1044 cout <<
"**** PFElectronAlgo:: SUPERCLUSTER FOUND BUT FAILS ISOLATION:ENDCAP *** " 1045 <<
" sumEtEcalInTheCone " <<sumEtEcalInTheCone
1046 <<
" sumNTracksInTheCone " << sumNTracksInTheCone
1047 <<
" sumPtTracksInTheCone " << sumPtTracksInTheCone << endl;
1054 if(isBarrelIsolated || isEndcapIsolated ) {
1058 double totenergy = 0.;
1059 for(
unsigned int ikeyecal = 0;
1060 ikeyecal<EcalIndex.size(); ikeyecal++){
1062 bool foundcluster =
false;
1064 for(
unsigned int i2 = 0; i2<ikeyecal-1; i2++) {
1065 if(EcalIndex[ikeyecal] == EcalIndex[i2])
1066 foundcluster =
true;;
1069 if(foundcluster)
continue;
1072 totenergy += clusasso->
clusterRef()->energy();
1078 for(
unsigned int ikeyecal = 0;
1079 ikeyecal<EcalIndex.size(); ikeyecal++){
1081 bool foundcluster =
false;
1083 for(
unsigned int i2 = 0; i2<ikeyecal-1; i2++) {
1084 if(EcalIndex[ikeyecal] == EcalIndex[i2])
1085 foundcluster =
true;
1088 if(foundcluster)
continue;
1091 std::multimap<double, unsigned int> ecalFromSuperClusterElems;
1093 ecalFromSuperClusterElems,
1096 if(!ecalFromSuperClusterElems.empty()) {
1097 for(std::multimap<double, unsigned int>::iterator itsc = ecalFromSuperClusterElems.begin();
1098 itsc != ecalFromSuperClusterElems.end(); ++itsc) {
1099 if(localactive[itsc->second] ==
false) {
1103 std::multimap<double, unsigned int> ecalOtherKFPrimElems;
1105 ecalOtherKFPrimElems,
1106 reco::PFBlockElement::TRACK,
1108 if(!ecalOtherKFPrimElems.empty()) {
1109 if(localactive[ecalOtherKFPrimElems.begin()->second] ==
true) {
1110 if (DebugSetLinksDetailed)
1111 cout <<
"**** PFElectronAlgo:: SUPERCLUSTER FOUND BUT FAILS KF VETO *** " << endl;
1115 bool isInTheEtaRange =
false;
1118 double deta_clustToAdd = clustToAdd->
clusterRef()->position().Eta() - EtaFC;
1119 double ene_clustToAdd = clustToAdd->
clusterRef()->energy();
1121 if(fabs(deta_clustToAdd) < 0.05)
1122 isInTheEtaRange =
true;
1125 bool isBetterEpin =
false;
1126 if(isInTheEtaRange ==
false ) {
1127 if (DebugSetLinksDetailed)
1128 cout <<
"**** PFElectronAlgo:: SUPERCLUSTER FOUND BUT FAILS GAMMA DETA RANGE *** " 1129 << fabs(deta_clustToAdd) << endl;
1131 if(KfGsf_index < CutIndex) {
1133 double res_before_gsf = fabs((totenergy-Pin_gsf)/Pin_gsf);
1134 double res_after_gsf = fabs(((totenergy+ene_clustToAdd)-Pin_gsf)/Pin_gsf);
1139 double Pin_kf = trackEl->
trackRef()->p();
1140 double res_before_kf = fabs((totenergy-Pin_kf)/Pin_kf);
1141 double res_after_kf = fabs(((totenergy+ene_clustToAdd)-Pin_kf)/Pin_kf);
1144 if(res_after_gsf < res_before_gsf && res_after_kf < res_before_kf ) {
1145 isBetterEpin =
true;
1148 if (DebugSetLinksDetailed)
1149 cout <<
"**** PFElectronAlgo:: SUPERCLUSTER FOUND AND FAILS ALSO RES_EPIN" 1150 <<
" tot energy " << totenergy
1151 <<
" Pin_gsf " << Pin_gsf
1152 <<
" Pin_kf " << Pin_kf
1153 <<
" cluster from SC to ADD " << ene_clustToAdd
1154 <<
" Res before GSF " << res_before_gsf <<
" res_after_gsf " << res_after_gsf
1155 <<
" Res before KF " << res_before_kf <<
" res_after_kf " << res_after_kf << endl;
1160 if(isInTheEtaRange || isBetterEpin) {
1161 if (DebugSetLinksDetailed)
1162 cout <<
"!!!! PFElectronAlgo:: ECAL from SUPERCLUSTER FOUND !!!!! " << endl;
1163 GsfElemIndex.push_back(itsc->second);
1164 EcalIndex.push_back(itsc->second);
1165 localactive[(itsc->second)] =
false;
1174 if(KfGsf_index < CutIndex)
1175 GsfElemIndex.push_back(KfGsf_index);
1176 else if(KfGsf_secondIndex < CutIndex)
1177 GsfElemIndex.push_back(KfGsf_secondIndex);
1180 GsfElemIndex.insert(GsfElemIndex.end(),convBremKFTrack.begin(),convBremKFTrack.end());
1181 GsfElemIndex.insert(GsfElemIndex.end(),keyBremIndex.begin(),keyBremIndex.end());
1182 associatedToGsf_.insert(pair<
unsigned int, vector<unsigned int> >(gsfIs[iEle],GsfElemIndex));
1185 for(
unsigned int ikeyecal = 0;
1186 ikeyecal<EcalIndex.size(); ikeyecal++){
1189 vector<unsigned int> EcalElemsIndex(0);
1191 std::multimap<double, unsigned int> PS1Elems;
1196 for( std::multimap<double, unsigned int>::iterator it = PS1Elems.begin();
1197 it != PS1Elems.end();it++) {
1198 unsigned int index = it->second;
1199 if(localactive[index] ==
true) {
1202 std::multimap<double, unsigned> sortedECAL;
1207 unsigned jEcal = sortedECAL.begin()->second;
1208 if ( jEcal != EcalIndex[ikeyecal])
continue;
1211 EcalElemsIndex.push_back(index);
1212 localactive[
index] =
false;
1216 std::multimap<double, unsigned int> PS2Elems;
1221 for( std::multimap<double, unsigned int>::iterator it = PS2Elems.begin();
1222 it != PS2Elems.end();it++) {
1223 unsigned int index = it->second;
1224 if(localactive[index] ==
true) {
1226 std::multimap<double, unsigned> sortedECAL;
1231 unsigned jEcal = sortedECAL.begin()->second;
1232 if ( jEcal != EcalIndex[ikeyecal])
continue;
1234 EcalElemsIndex.push_back(index);
1235 localactive[
index] =
false;
1242 std::multimap<double, unsigned int> hcalGsfElems;
1247 for( std::multimap<double, unsigned int>::iterator it = hcalGsfElems.begin();
1248 it != hcalGsfElems.end();it++) {
1249 unsigned int index = it->second;
1262 EcalElemsIndex.push_back(index);
1263 localactive[
index] =
false;
1268 if(hcalGsfElems.empty() && ClosestEcalWithKf ==
true) {
1269 std::multimap<double, unsigned int> hcalKfElems;
1274 for( std::multimap<double, unsigned int>::iterator it = hcalKfElems.begin();
1275 it != hcalKfElems.end();it++) {
1276 unsigned int index = it->second;
1277 if(localactive[index] ==
true) {
1280 std::multimap<double, unsigned> sortedKf;
1283 reco::PFBlockElement::TRACK,
1285 unsigned jKf = sortedKf.begin()->second;
1286 if ( jKf != KfGsf_index)
continue;
1287 EcalElemsIndex.push_back(index);
1288 localactive[
index] =
false;
1293 std::multimap<double, unsigned int> kfEtraElems;
1296 reco::PFBlockElement::TRACK,
1298 if(!kfEtraElems.empty()) {
1299 for( std::multimap<double, unsigned int>::iterator it = kfEtraElems.begin();
1300 it != kfEtraElems.end();it++) {
1301 unsigned int index = it->second;
1309 bool thisIsAMuon =
false;
1311 if (DebugSetLinksDetailed && thisIsAMuon)
1312 cout <<
" This is a Muon: index " << index << endl;
1313 if(localactive[index] ==
true && !thisIsAMuon) {
1314 if(index != KfGsf_index) {
1317 std::multimap<double, unsigned> sortedECAL;
1322 unsigned jEcal = sortedECAL.begin()->second;
1323 if ( jEcal != EcalIndex[ikeyecal])
continue;
1324 EcalElemsIndex.push_back(index);
1325 localactive[
index] =
false;
1332 associatedToEcal_.insert(pair<
unsigned int,vector<unsigned int> >(EcalIndex[ikeyecal],EcalElemsIndex));
1341 if (DebugSetLinksSummary) {
1342 if(IsThereAGoodGSFTrack) {
1343 if (DebugSetLinksSummary)
cout <<
" -- The Link Summary --" << endl;
1344 for(
map<
unsigned int,vector<unsigned int> >::iterator it = associatedToGsf_.begin();
1345 it != associatedToGsf_.end(); it++) {
1347 if (DebugSetLinksSummary)
cout <<
" AssoGsf " << it->first << endl;
1348 vector<unsigned int> eleasso = it->second;
1349 for(
unsigned int i=0;
i<eleasso.size();
i++) {
1352 if (DebugSetLinksSummary)
1353 cout <<
" AssoGsfElements BREM " << eleasso[
i] << endl;
1356 if (DebugSetLinksSummary)
1357 cout <<
" AssoGsfElements ECAL " << eleasso[
i] << endl;
1359 else if(type == reco::PFBlockElement::TRACK) {
1360 if (DebugSetLinksSummary)
1361 cout <<
" AssoGsfElements KF " << eleasso[
i] << endl;
1364 if (DebugSetLinksSummary)
1365 cout <<
" AssoGsfElements ????? " << eleasso[
i] << endl;
1370 for(
map<
unsigned int,vector<unsigned int> >::iterator it = associatedToBrems_.begin();
1371 it != associatedToBrems_.end(); it++) {
1372 if (DebugSetLinksSummary)
cout <<
" AssoBrem " << it->first << endl;
1373 vector<unsigned int> eleasso = it->second;
1374 for(
unsigned int i=0;
i<eleasso.size();
i++) {
1377 if (DebugSetLinksSummary)
1378 cout <<
" AssoBremElements ECAL " << eleasso[
i] << endl;
1381 if (DebugSetLinksSummary)
1382 cout <<
" AssoBremElements ????? " << eleasso[
i] << endl;
1387 for(
map<
unsigned int,vector<unsigned int> >::iterator it = associatedToEcal_.begin();
1388 it != associatedToEcal_.end(); it++) {
1389 if (DebugSetLinksSummary)
cout <<
" AssoECAL " << it->first << endl;
1390 vector<unsigned int> eleasso = it->second;
1391 for(
unsigned int i=0;
i<eleasso.size();
i++) {
1394 if (DebugSetLinksSummary)
1395 cout <<
" AssoECALElements PS1 " << eleasso[
i] << endl;
1398 if (DebugSetLinksSummary)
1399 cout <<
" AssoECALElements PS2 " << eleasso[
i] << endl;
1402 if (DebugSetLinksSummary)
1403 cout <<
" AssoECALElements HCAL " << eleasso[
i] << endl;
1406 if (DebugSetLinksSummary)
1407 cout <<
" AssoHCALElements ????? " << eleasso[
i] << endl;
1411 if (DebugSetLinksSummary)
1412 cout <<
"-- End Summary --" << endl;
1417 return IsThereAGoodGSFTrack;
std::vector< std::pair< unsigned int, unsigned int > > fifthStepKfTrack_
const math::XYZTLorentzVector & Pout() const
const math::XYZPointF & positionAtECALEntrance() const
const reco::GsfTrackRef & GsftrackRef() const
bool isNonnull() const
Checks for non-null.
trackRef_iterator tracks_end() const
last iterator over tracks
static bool isMuon(const reco::PFBlockElement &elt)
std::vector< std::pair< unsigned int, unsigned int > > convGsfTrack_
const PFClusterRef & clusterRef() const override
const math::XYZPointF & positionAtECALEntrance() const
const reco::TrackRef & trackRef() const override
Sin< T >::type sin(const T &t)
std::map< unsigned int, Link > LinkData
std::shared_ptr< PFEnergyCalibration > thePFEnergyCalibration_
bool isPrimaryTrack(const reco::PFBlockElementTrack &KfEl, const reco::PFBlockElementGsfTrack &GsfEl)
const edm::OwnVector< reco::PFBlockElement > & elements() const
const LinkData & linkData() const
unsigned int indTrajPoint() const
double coneEcalIsoForEgammaSC_
bool trackType(TrackType trType) const override
double sumEtEcalIsoForEgammaSC_barrel_
double sumEtEcalIsoForEgammaSC_endcap_
double sumPtTrackIsoForEgammaSC_endcap_
void associatedElements(unsigned i, const LinkData &linkData, std::multimap< double, unsigned > &sortedAssociates, reco::PFBlockElement::Type type=PFBlockElement::NONE, LinkTest test=LINKTEST_RECHIT) const
std::vector< TrackBaseRef >::const_iterator trackRef_iterator
The iteratator for the vector<TrackRef>
double sumPtTrackIsoForEgammaSC_barrel_
double dist(unsigned ie1, unsigned ie2, const LinkData &linkData, LinkTest test) const
trackRef_iterator tracks_begin() const
first iterator over tracks
unsigned int nTrackIsoForEgammaSC_
void insert(const_iterator i, D *&d)
bool applyCrackCorrections_
bool useEGammaSupercluster_