55 LogInfo(
"PFElecTkProducer")<<
"PFElecTkProducer started";
58 (
"GsfTrackModuleLabel");
64 (
"PrimaryVertexLabel");
83 produces<GsfPFRecTrackCollection>();
84 produces<GsfPFRecTrackCollection>(
"Secondary" ).setBranchAlias(
"secondary" );
104 = iConfig.
getParameter<
double>(
"pf_convBremFinderID_mvaCut");
106 string mvaWeightFileConvBrem
107 = iConfig.
getParameter<
string>(
"pf_convBremFinderID_mvaWeightFile");
110 if(useConvBremFinder_)
133 <<
" in run "<<iEvent.
id().
run();
136 auto_ptr< GsfPFRecTrackCollection >
140 auto_ptr< GsfPFRecTrackCollection >
173 LogError(
"PFElecTkProducer")<<
" cannot get PFNuclear : "
175 <<
" please set useNuclear=False in RecoParticleFlow/PFTracking/python/pfTrackElec_cfi.py" << endl;
183 LogError(
"PFElecTkProducer")<<
" cannot get PFConversions : "
185 <<
" please set useConversions=False in RecoParticleFlow/PFTracking/python/pfTrackElec_cfi.py" << endl;
194 LogError(
"PFElecTkProducer")<<
" cannot get PFV0 : "
196 <<
" please set useV0=False RecoParticleFlow/PFTracking/python/pfTrackElec_cfi.py" << endl;
202 vector<Trajectory> tjvec(0);
207 <<
" cannot get Trajectories of : "
209 <<
" please set TrajInEvents = False in RecoParticleFlow/PFTracking/python/pfTrackElec_cfi.py" << endl;
211 tjvec= *(TrajectoryCollection.
product());
215 vector<reco::GsfPFRecTrack> selGsfPFRecTracks;
216 vector<reco::GsfPFRecTrack> primaryGsfPFRecTracks;
217 std::map<unsigned int, std::vector<reco::GsfPFRecTrack> > GsfPFMap;
220 for (
unsigned int igsf=0; igsf<gsftracks.size();igsf++) {
224 int kf_ind=
FindPfRef(PfRTkColl,gsftracks[igsf],
false);
235 bool isEcalDriven =
true;
236 bool isTrackerDriven =
true;
238 if (&(*trackRef->seedRef())==0) {
239 isEcalDriven =
false;
240 isTrackerDriven =
false;
244 if(SeedRef->caloCluster().
isNull())
245 isEcalDriven =
false;
246 if(SeedRef->ctfTrack().
isNull())
247 isTrackerDriven =
false;
250 if(isFifthStepTrack &&
252 isTrackerDriven ==
false &&
257 if(isFifthStepTrack &&
259 isEcalDriven ==
false &&
264 if(isFifthStepTrack &&
286 bool validgsfbrem =
false;
302 if(validgsfbrem && passSel)
303 selGsfPFRecTracks.push_back(
pftrack_);
307 unsigned int count_primary = 0;
308 if(selGsfPFRecTracks.size() > 0) {
309 for(
unsigned int ipfgsf=0; ipfgsf<selGsfPFRecTracks.size();ipfgsf++) {
311 vector<unsigned int> secondaries(0);
316 keepGsf =
resolveGsfTracks(selGsfPFRecTracks,ipfgsf,secondaries,theEcalClusters);
320 if(keepGsf ==
true) {
324 pfNuclears,pfConversions,pfV0,
326 theEcalClusters,selGsfPFRecTracks[ipfgsf])) {
328 for(
unsigned int ii = 0; ii<convBremPFRecTracks.size(); ii++) {
329 selGsfPFRecTracks[ipfgsf].addConvBremPFRecTrackRef(convBremPFRecTracks[ii]);
335 primaryGsfPFRecTracks.push_back(selGsfPFRecTracks[ipfgsf]);
341 unsigned int primGsfIndex = selGsfPFRecTracks[ipfgsf].trackId();
342 vector<reco::GsfPFRecTrack> trueGsfPFRecTracks;
343 if(secondaries.size() > 0) {
345 for(
unsigned int isecpfgsf=0; isecpfgsf<secondaries.size();isecpfgsf++) {
347 PFRecTrackRef refsecKF = selGsfPFRecTracks[(secondaries[isecpfgsf])].kfPFRecTrackRef();
349 unsigned int secGsfIndex = selGsfPFRecTracks[(secondaries[isecpfgsf])].trackId();
350 GsfTrackRef secGsfRef = selGsfPFRecTracks[(secondaries[isecpfgsf])].gsfTrackRef();
356 primGsfIndex, secGsfRef,
364 primGsfIndex, secGsfRef,
368 bool validgsfbrem =
false;
371 gsftracks[secGsfIndex],
376 gsftracks[secGsfIndex],
381 gsfPFRecTrackCollectionSecondary->push_back(
secpftrack_);
386 GsfPFMap.insert(pair<
unsigned int,std::vector<reco::GsfPFRecTrack> >(count_primary,trueGsfPFRecTracks));
387 trueGsfPFRecTracks.clear();
395 iEvent.
put(gsfPFRecTrackCollectionSecondary,
"Secondary");
401 for(
unsigned int iGSF = 0; iGSF<primaryGsfPFRecTracks.size();iGSF++){
402 gsfPFRecTrackCollection->push_back(primaryGsfPFRecTracks[iGSF]);
404 iEvent.
put(gsfPFRecTrackCollection);
406 selGsfPFRecTracks.clear();
408 primaryGsfPFRecTracks.clear();
414 std::vector<reco::GsfPFRecTrack>& gsfPFRecTrackPrimary,
415 const std::map<
unsigned int, std::vector<reco::GsfPFRecTrack> >& MapPrimSec) {
417 unsigned int csecgsf=0;
418 for (
std::map<
unsigned int, std::vector<reco::GsfPFRecTrack> >::const_iterator igsf = MapPrimSec.begin();
419 igsf != MapPrimSec.end(); igsf++,cgsf++) {
420 vector<reco::GsfPFRecTrack> SecGsfPF = igsf->second;
421 for (
unsigned int iSecGsf=0; iSecGsf < SecGsfPF.size(); iSecGsf++) {
423 gsfPFRecTrackPrimary[cgsf].addConvBremGsfPFRecTrackRef(refgprt);
437 if (&(*gsftk.
seedRef())==0)
return -1;
440 if (ElSeedRef->ctfTrack().
isNull()){
441 reco::PFRecTrackCollection::const_iterator pft=PfRTkColl.begin();
442 reco::PFRecTrackCollection::const_iterator pftend=PfRTkColl.end();
445 unsigned int ish_max=0;
449 for(;pft!=pftend;++pft){
452 float dph= fabs(pft->trackRef()->phi()-gsftk.
phi());
454 float det=fabs(pft->trackRef()->eta()-gsftk.
eta());
455 float dr =
sqrt(dph*dph+det*det);
458 pft->trackRef()->recHitsBegin();
460 pft->trackRef()->recHitsEnd();
464 for(;hhit!=hhit_end;++hhit){
465 if (!(*hhit)->isValid())
continue;
470 for(;hit!=hit_end;++hit){
471 if (!(hit->isValid()))
continue;
481 ((ish==ish_max)&&(dr<dr_min))){
491 if (ibest<0)
return -1;
493 if((ish_max==0) || (dr_min>0.05))
return -1;
494 if(otherColl && (ish_max==0))
return -1;
500 reco::PFRecTrackCollection::const_iterator pft=PfRTkColl.begin();
501 reco::PFRecTrackCollection::const_iterator pftend=PfRTkColl.end();
504 for(;pft!=pftend;++pft){
506 if (pft->trackRef()==ElSeedRef->ctfTrack()){
516 bool isFithStep =
false;
519 TrackRef kfref = pfKfTrack->trackRef();
520 unsigned int Algo = 0;
521 switch (kfref->algo()) {
522 case TrackBase::undefAlgorithm:
524 case TrackBase::iter0:
525 case TrackBase::iter1:
528 case TrackBase::iter2:
531 case TrackBase::iter3:
534 case TrackBase::iter4:
537 case TrackBase::iter5:
553 if (&(*gsftk.
seedRef())==0)
return false;
556 bool passCut =
false;
557 if (ElSeedRef->ctfTrack().
isNull()){
558 if(ElSeedRef->caloCluster().
isNull())
return passCut;
562 float caloEne = scRef->energy();
563 float feta = fabs(scRef->eta()-gsftk.
etaMode());
564 float fphi = fabs(scRef->phi()-gsftk.
phiMode());
579 vector<unsigned int> &secondaries,
582 bool n_keepGsf =
true;
586 if (&(*nGsfTrack->seedRef())==0)
return false;
592 float nPin = nGsfTrack->pMode();
593 if(inTSOS.isValid()){
595 nPin = ninnMom.
mag();
598 float neta = nGsfTrack->innerMomentum().eta();
599 float nphi = nGsfTrack->innerMomentum().phi();
605 cout <<
" PFElecTkProducer:: considering track " << nGsfTrack->pt()
606 <<
" eta,phi " << nGsfTrack->eta() <<
", " << nGsfTrack->phi() << endl;
609 for (
unsigned int igsf=0; igsf< GsfPFVec.size();igsf++) {
614 cout <<
" PFElecTkProducer:: and comparing with track " << iGsfTrack->pt()
615 <<
" eta,phi " << iGsfTrack->eta() <<
", " << iGsfTrack->phi() << endl;
617 float ieta = iGsfTrack->innerMomentum().eta();
618 float iphi = iGsfTrack->innerMomentum().phi();
619 float feta = fabs(neta - ieta);
620 float fphi = fabs(nphi - iphi);
625 if(feta < 0.5 && fabs(fphi) < 1.0) {
627 cout <<
" Entering angular superloose preselection " << endl;
631 float iPin = iGsfTrack->pMode();
634 iPin = i_innMom.
mag();
637 if (&(*iGsfTrack->seedRef())==0)
continue;
640 float SCEnergy = -1.;
642 bool areBothGsfEcalDriven =
false;;
643 bool isSameSC =
isSameEgSC(nElSeedRef,iElSeedRef,areBothGsfEcalDriven,SCEnergy);
646 if(areBothGsfEcalDriven ) {
648 float nEP = SCEnergy/nPin;
649 float iEP = SCEnergy/iPin;
651 cout <<
" Entering SAME supercluster case "
653 <<
" iEP " << iEP << endl;
661 bool isSameLayer =
false;
662 bool iGsfInnermostWithLostHits =
667 cout <<
" iGsf is InnerMostWithLostHits " << iGsfInnermostWithLostHits
668 <<
" isSameLayer " << isSameLayer << endl;
670 if (iGsfInnermostWithLostHits) {
674 else if(isSameLayer){
675 if(fabs(iEP-1) < fabs(nEP-1)) {
680 secondaries.push_back(igsf);
685 secondaries.push_back(igsf);
691 float minBremDphi =
minTangDist(GsfPFVec[ngsf],GsfPFVec[igsf]);
694 bool isBothGsfTrackerDriven =
false;
695 bool nEcalDriven =
false;
696 bool iEcalDriven =
false;
702 isBothGsfTrackerDriven,
709 bool isSameLayer =
false;
710 bool iGsfInnermostWithLostHits =
717 cout <<
" Sharing ECAL energy passed "
718 <<
" nEtot " << nETot
719 <<
" iEtot " << iETot << endl;
720 if(isBothGsfTrackerDriven)
721 cout <<
" Both Track are trackerDriven " << endl;
725 if (iGsfInnermostWithLostHits) {
729 else if(isSameLayer){
738 if(isBothGsfTrackerDriven ==
false) {
745 secondaries.push_back(igsf);
762 float nEP = ETot/nPin;
763 float iEP = ETot/iPin;
767 cout <<
" nETot " << nETot
768 <<
" iETot " << iETot
769 <<
" ETot " << ETot << endl
773 <<
" iEP " << iEP << endl;
776 if(fabs(iEP-1) < fabs(nEP-1)) {
781 secondaries.push_back(igsf);
786 secondaries.push_back(igsf);
791 bool secPushedBack =
false;
792 if(nEcalDriven ==
false && nETot == 0.) {
796 else if(iEcalDriven ==
false && iETot == 0.) {
797 secondaries.push_back(igsf);
798 secPushedBack =
true;
801 cout <<
" Close Tracks "
802 <<
" feta " << feta <<
" fabs(fphi) " << fabs(fphi)
803 <<
" minBremDphi " << minBremDphi
804 <<
" nETot " << nETot
805 <<
" iETot " << iETot
806 <<
" nLostHits " << nGsfTrack->trackerExpectedHitsInner().numberOfLostHits()
807 <<
" iLostHits " << iGsfTrack->trackerExpectedHitsInner().numberOfLostHits() << endl;
811 if (iGsfInnermostWithLostHits) {
815 else if(isSameLayer ==
false) {
816 if(secPushedBack ==
false)
817 secondaries.push_back(igsf);
821 else if(feta < 0.1 && minBremDphi < 0.2){
825 cout <<
" Close Tracks and failed all the conditions "
826 <<
" feta " << feta <<
" fabs(fphi) " << fabs(fphi)
827 <<
" minBremDphi " << minBremDphi
828 <<
" nETot " << nETot
829 <<
" iETot " << iETot
830 <<
" nLostHits " << nGsfTrack->trackerExpectedHitsInner().numberOfLostHits()
831 <<
" iLostHits " << iGsfTrack->trackerExpectedHitsInner().numberOfLostHits() << endl;
833 if(nEcalDriven ==
false && nETot == 0.) {
850 float minDeta = 1000.;
851 float minDphi = 1000.;
854 std::vector<reco::PFBrem> primPFBrem = primGsf.
PFRecBrem();
855 std::vector<reco::PFBrem> secPFBrem = secGsf.
PFRecBrem();
858 unsigned int cbrem = 0;
859 for (
unsigned isbrem = 0; isbrem < secPFBrem.size(); isbrem++) {
860 if(secPFBrem[isbrem].indTrajPoint() == 99)
continue;
863 if( ! atSecECAL.
isValid() )
continue;
867 unsigned int sbrem = 0;
868 for(
unsigned ipbrem = 0; ipbrem < primPFBrem.size(); ipbrem++) {
869 if(primPFBrem[ipbrem].indTrajPoint() == 99)
continue;
872 if( ! atPrimECAL.
isValid() )
continue;
878 float deta = fabs(primEta - secEta);
879 float dphi = fabs(primPhi - secPhi);
881 if(fabs(dphi) < minDphi) {
883 minDphi = fabs(dphi);
898 bool& bothGsfEcalDriven,
901 bool isSameSC =
false;
907 if(nscRef.
isNonnull() && iscRef.isNonnull()) {
908 bothGsfEcalDriven =
true;
909 if(nscRef == iscRef) {
912 SCEnergy = nscRef->energy();
924 bool& bothGsfTrackerDriven,
930 bool isSharingEnergy =
false;
933 bool oneEcalDriven =
true;
937 if(nSeedRef->caloCluster().
isNonnull()) {
939 nEnergy = scRef->energy();
941 gsfPfTrack = iGsfPFRecTrack;
943 else if(iSeedRef->caloCluster().
isNonnull()){
945 iEnergy = scRef->energy();
947 gsfPfTrack = nGsfPFRecTrack;
950 oneEcalDriven =
false;
956 vector<PFCluster> vecPFClusters;
957 vecPFClusters.clear();
959 for (PFClusterCollection::const_iterator clus = theEClus.begin();
960 clus != theEClus.end();
965 float deta = fabs(scRef->position().eta() - clust.
position().eta());
966 float dphi = fabs(scRef->position().phi() - clust.
position().phi());
971 if(deta < 0.5 && fabs(dphi) < 1.0) {
972 bool foundLink =
false;
977 iEnergy += clust.
energy();
979 nEnergy += clust.
energy();
980 vecPFClusters.push_back(clust);
984 if(foundLink ==
false) {
985 vector<PFBrem> primPFBrem = gsfPfTrack.
PFRecBrem();
986 for(
unsigned ipbrem = 0; ipbrem < primPFBrem.size(); ipbrem++) {
987 if(primPFBrem[ipbrem].indTrajPoint() == 99)
continue;
992 iEnergy += clust.
energy();
994 nEnergy += clust.
energy();
995 vecPFClusters.push_back(clust);
1002 if(vecPFClusters.size() > 0 ) {
1003 for(
unsigned int pf = 0; pf < vecPFClusters.size(); pf++) {
1006 isSharingEnergy =
true;
1015 bothGsfTrackerDriven =
true;
1016 vector<PFCluster> nPFCluster;
1017 vector<PFCluster> iPFCluster;
1022 for (PFClusterCollection::const_iterator clus = theEClus.begin();
1023 clus != theEClus.end();
1033 if(ndeta < 0.5 && fabs(ndphi) < 1.0) {
1034 bool foundNLink =
false;
1038 nPFCluster.push_back(clust);
1039 nEnergy += clust.
energy();
1042 if(foundNLink ==
false) {
1043 vector<PFBrem> primPFBrem = nGsfPFRecTrack.
PFRecBrem();
1044 for(
unsigned ipbrem = 0; ipbrem < primPFBrem.size(); ipbrem++) {
1045 if(primPFBrem[ipbrem].indTrajPoint() == 99)
continue;
1047 if(foundNLink ==
false) {
1050 nPFCluster.push_back(clust);
1051 nEnergy += clust.
energy();
1064 if(ideta < 0.5 && fabs(idphi) < 1.0) {
1065 bool foundILink =
false;
1068 iPFCluster.push_back(clust);
1069 iEnergy += clust.
energy();
1072 if(foundILink ==
false) {
1073 vector<PFBrem> primPFBrem = iGsfPFRecTrack.
PFRecBrem();
1074 for(
unsigned ipbrem = 0; ipbrem < primPFBrem.size(); ipbrem++) {
1075 if(primPFBrem[ipbrem].indTrajPoint() == 99)
continue;
1077 if(foundILink ==
false) {
1080 iPFCluster.push_back(clust);
1081 iEnergy += clust.
energy();
1091 if(nPFCluster.size() > 0 && iPFCluster.size() > 0) {
1092 for(
unsigned int npf = 0; npf < nPFCluster.size(); npf++) {
1093 for(
unsigned int ipf = 0; ipf < iPFCluster.size(); ipf++) {
1096 isSharingEnergy =
true;
1106 return isSharingEnergy;
1119 int gsfHitCounter1 = 0 ;
1122 ( elHitsIt1 = nGsfTrack->recHitsBegin() ;
1123 elHitsIt1 != nGsfTrack->recHitsEnd() ;
1124 elHitsIt1++, gsfHitCounter1++ )
1125 {
if (((**elHitsIt1).isValid())) break ; }
1127 int gsfHitCounter2 = 0 ;
1130 ( elHitsIt2 = iGsfTrack->recHitsBegin() ;
1131 elHitsIt2 != iGsfTrack->recHitsEnd() ;
1132 elHitsIt2++, gsfHitCounter2++ )
1133 {
if (((**elHitsIt2).isValid())) break ; }
1135 uint32_t gsfHit1 = gsfHitPattern1.
getHitPattern(gsfHitCounter1) ;
1136 uint32_t gsfHit2 = gsfHitPattern2.
getHitPattern(gsfHitCounter2) ;
1143 else if (gsfHitPattern1.
getLayer(gsfHit1)!=gsfHitPattern2.
getLayer(gsfHit2))
1145 return (gsfHitPattern2.
getLayer(gsfHit2)<gsfHitPattern1.
getLayer(gsfHit1));
1158 unsigned int nLostHits = nGsfTrack->trackerExpectedHitsInner().numberOfLostHits();
1159 unsigned int iLostHits = iGsfTrack->trackerExpectedHitsInner().numberOfLostHits();
1161 if (nLostHits!=iLostHits) {
1162 return (nLostHits > iLostHits);
1197 if (fileConvBremID) {
1198 fclose(fileConvBremID);
1201 string err =
"PFElecTkProducer: cannot open weight file '";
1204 throw invalid_argument( err );
const REPPoint & positionREP() const
trajectory position in (rho, eta, phi) base
bool trajinev_
Trajectory of GSfTracks in the event?
T getParameter(std::string const &) const
EventNumber_t event() const
const math::XYZPoint & position() const
cluster centroid position
reconstructed track used as an input to particle flow
static bool overlap(const reco::CaloCluster &sc1, const reco::CaloCluster &sc, float minfrac=0.01, bool debug=false)
void createGsfPFRecTrackRef(const edm::OrphanHandle< reco::GsfPFRecTrackCollection > &gsfPfHandle, std::vector< reco::GsfPFRecTrack > &gsfPFRecTrackPrimary, const std::map< unsigned int, std::vector< reco::GsfPFRecTrack > > &MapPrimSec)
uint32_t getSubStructure(uint32_t pattern) const
const TrackExtraRef & extra() const
reference to "extra" object
Particle flow cluster, see clustering algorithm in PFClusterAlgo.
bool useFifthStepForTrackDriven_
ConvBremPFTrackFinder * convBremFinder_
std::string path_mvaWeightFileConvBrem_
bool isFifthStep(reco::PFRecTrackRef pfKfTrack)
const std::vector< reco::PFBrem > & PFRecBrem() const
double phi() const
azimuthal angle of momentum vector
bool applySelection(reco::GsfTrack)
int FindPfRef(const reco::PFRecTrackCollection &PfRTkColl, reco::GsfTrack, bool)
~PFElecTkProducer()
Destructor.
uint32_t getLayer(uint32_t pattern) const
bool momentumFromModeCartesian(const TrajectoryStateOnSurface tsos, GlobalVector &momentum) const
reco::GsfPFRecTrack secpftrack_
edm::InputTag gsfTrackLabel_
edm::InputTag primVtxLabel_
PFTrackTransformer * pfTransformer_
PFTrackTransformer.
const MultiTrajectoryStateMode * mtsMode_
double mvaConvBremFinderID_
const std::vector< reco::PFRecTrackRef > & getConvBremPFRecTracks()
bool isSameEgSC(const reco::ElectronSeedRef &nSeedRef, const reco::ElectronSeedRef &iSeedRef, bool &bothGsfEcalDriven, float &SCEnergy)
bool isNonnull() const
Checks for non-null.
PFElecTkProducer(const edm::ParameterSet &)
Constructor.
edm::InputTag pfEcalClusters_
bool isNull() const
Checks for null.
double eta() const
pseudorapidity of momentum vector
std::vector< GsfPFRecTrack > GsfPFRecTrackCollection
collection of GsfPFRecTrack objects
void calculatePositionREP()
computes posrep_ once and for all
bool foundConvBremPFRecTrack(const edm::Handle< reco::PFRecTrackCollection > &thePfRecTrackCol, const edm::Handle< reco::VertexCollection > &primaryVertex, const edm::Handle< reco::PFDisplacedTrackerVertexCollection > &pfNuclears, const edm::Handle< reco::PFConversionCollection > &pfConversions, const edm::Handle< reco::PFV0Collection > &pfV0, bool useNuclear, bool useConversions, bool useV0, const reco::PFClusterCollection &theEClus, reco::GsfPFRecTrack gsfpfrectk)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
const reco::GsfTrackRef & gsfTrackRef() const
recHitContainer::const_iterator const_iterator
std::vector< GsfTrack > GsfTrackCollection
collection of GsfTracks
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
double energy() const
cluster energy
bool isInnerMostWithLostHits(const reco::GsfTrackRef &nGsfTrack, const reco::GsfTrackRef &iGsfTrack, bool &sameLayer)
edm::RefToBase< TrajectorySeed > seedRef() const
bool resolveGsfTracks(const std::vector< reco::GsfPFRecTrack > &GsfPFVec, unsigned int ngsf, std::vector< unsigned int > &secondaries, const reco::PFClusterCollection &theEClus)
bool isValid() const
is this point valid ?
XYZVectorD XYZVector
spatial vector with cartesian internal representation
T const * product() const
edm::InputTag pfTrackLabel_
T const * product() const
float minTangDist(const reco::GsfPFRecTrack primGsf, const reco::GsfPFRecTrack secGsf)
std::vector< Trajectory > TrajectoryCollection
virtual void beginRun(edm::Run &, const edm::EventSetup &)
double etaMode() const
pseudorapidity of momentum vector from mode
bool useFifthStepForEcalDriven_
reco::GsfPFRecTrack pftrack_
double phiMode() const
azimuthal angle of momentum vector from mode
bool useConvBremFinder_
Conv Brem Finder.
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
bool isSharingEcalEnergyWithEgSC(const reco::GsfPFRecTrack &nGsfPFRecTrack, const reco::GsfPFRecTrack &iGsfPFRecTrack, const reco::ElectronSeedRef &nSeedRef, const reco::ElectronSeedRef &iSeedRef, const reco::PFClusterCollection &theEClus, bool &bothGsfTrackerDriven, bool &nEcalDriven, bool &iEcalDriven, float &nEnergy, float &iEnergy)
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
virtual void produce(edm::Event &, const edm::EventSetup &)
Produce the PFRecTrack collection.
uint32_t getHitPattern(int position) const
static double testTrackAndClusterByRecHit(const reco::PFRecTrack &track, const reco::PFCluster &cluster, bool isBrem=false, bool debug=false)
std::vector< PFRecTrack > PFRecTrackCollection
collection of PFRecTrack objects
bool applyAngularGsfClean_
MultiTrajectoryStateTransform mtsTransform_
bool isInnerMost(const reco::GsfTrackRef &nGsfTrack, const reco::GsfTrackRef &iGsfTrack, bool &sameLayer)