23 DPtovPtCut_(std::vector<double>(4,static_cast<double>(999.))),
24 NHitCut_(std::vector<unsigned int>(4,static_cast<unsigned>(0))),
25 useIterTracking_(
true),
32 std::vector<unsigned int>& NHitCut,
33 bool useConvBremPFRecTracks,
35 int nuclearInteractionsPurity,
37 std::vector<double>& photonSelectionCuts) {
48 photonSelectionCuts[1], photonSelectionCuts[2],
49 photonSelectionCuts[3], photonSelectionCuts[4],
50 photonSelectionCuts[5], photonSelectionCuts[6],
51 photonSelectionCuts[7],
52 photonSelectionCuts[8],
53 photonSelectionCuts[9],
54 photonSelectionCuts[10]
72 cout<<
"~PFBlockAlgo - number of remaining elements: "
102 cout<<
" PFBlockAlgo::findBlocks() ----------------------"<<endl;
103 cout<<
" element "<<**ie<<endl;
104 cout<<
" creating new block"<<endl;
110 vector< PFBlockLink > links;
125 vector<PFBlockLink>& links ) {
129 if(
debug_ )
cout<<
"PFBlockAlgo::associate start ----"<<endl;
136 link( *last, *next, linktype, linktest, dist );
147 blocks_->back().addElement( *next );
159 (*next)->index() ) );
168 if(
debug_ )
cout<<
"adding to block element "<<(**next)<<endl;
170 blocks_->back().addElement( *next );
184 if( ie == last || ie == next ) {
196 if( (*ie)->locked() ) {
198 if(
debug_ )
cout<<
"element "<<(**ie)<<
"already used"<<endl;
206 if(
debug_ )
cout<<
"calling associate "<<(**next)<<
" & "<<(**ie)<<endl;
213 cout<<
"**** deleting element "<<endl;
221 cout<<
"**** removing element "<<endl;
225 IE iteratorToNextFreeElement =
elements_.erase( next );
228 if(
debug_ )
cout<<
"PFBlockAlgo::associate stop ----"<<endl;
231 return iteratorToNextFreeElement;
238 const vector<PFBlockLink>& links )
const {
245 unsigned elsize = els.
size();
246 unsigned ilStart = 0;
248 for(
unsigned i1=0; i1<elsize; ++i1 ) {
249 for(
unsigned i2=0; i2<i1; ++i2 ) {
258 = PFBlock::LINKTEST_RECHIT;
263 unsigned linksize = links.size();
264 for(
unsigned il = ilStart; il<linksize; ++il ) {
266 if ( links[il].element2() < i1 ) ilStart = il;
267 if ( links[il].element2() > i1 )
break;
268 if( (links[il].element1() == i2 &&
269 links[il].element2() == i1) ) {
271 dist = links[il].dist();
276 linktest = links[il].test();
279 cout <<
"Reading link vector: linktest used="
281 <<
" distance = " << dist
293 if (bTestLink)
link( & els[i1], & els[i2], linktype, linktest, dist);
300 cout <<
"Setting link between elements " << i1 <<
" and " << i2
301 <<
" of dist =" << dist <<
" computed from link test "
324 double& dist)
const {
330 linktest = PFBlock::LINKTEST_RECHIT;
336 ((1<< (type1-1) ) | (1<< (type2-1) ));
338 if(
debug_ )
std::cout <<
" PFBlockAlgo links type1 " << type1 <<
" type2 " << type2 << std::endl;
356 assert( !psref.
isNull() );
357 assert( !ecalref.
isNull() );
364 double ecalPhi = ecalref->positionREP().Phi();
365 double ecalEta = ecalref->positionREP().Eta();
368 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
369 for (; mlit != multilinks.end(); ++mlit)
370 if ((mlit->first == ecalPhi) && (mlit->second == ecalEta))
374 if (mlit != multilinks.end()){
375 double xPS = psref->position().X();
376 double yPS = psref->position().Y();
377 double xECAL = ecalref->position().X();
378 double yECAL = ecalref->position().Y();
397 assert( !trackref.
isNull() );
398 assert( !clusterref.
isNull() );
400 if(
debug_ )
std::cout <<
" Track pt " << trackref->trackRef()->pt() << std::endl;
407 double ecalphi = clusterref->positionREP().Phi();
408 double ecaleta = clusterref->positionREP().Eta();
411 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
412 for (; mlit != multilinks.end(); ++mlit)
413 if ((mlit->first == ecalphi) && (mlit->second == ecaleta))
418 if (mlit != multilinks.end()){
452 std::cout <<
" Here a link has been established"
453 <<
" between a track an Ecal with dist "
454 << dist << std::endl;
456 std::cout <<
" No link found " << std::endl;
468 assert( !trackref.
isNull() );
469 assert( !clusterref.
isNull() );
495 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
496 for (; mlit != multilinks.end(); ++mlit)
497 if ((mlit->first == trackphi) && (mlit->second == tracketa))
501 if (mlit != multilinks.end()){
510 if ( dHPhi >
M_PI ) dHPhi = dHPhi - 2.*
M_PI;
511 else if ( dHPhi < -
M_PI ) dHPhi = dHPhi + 2.*
M_PI;
513 std::cout <<
"Qu'est ce que c'est que ce gag ? "
514 << atHCALExit.
position().R() <<
" is larger than "
515 << atHCAL.
position().R() <<
" !" << std::endl;
518 tracketa += 0.1 * dHEta;
519 trackphi += 0.1 * dHPhi;
521 double clusterphi = clusterref->positionREP().Phi();
522 double clustereta = clusterref->positionREP().Eta();
544 assert( !trackref.
isNull() );
545 assert( !clusterref.
isNull() );
567 assert( !ecalref.
isNull() );
568 assert( !hcalref.
isNull() );
580 assert( !hcalref.
isNull() );
581 assert( !horef.
isNull() );
604 cout<<
"TRACKandTRACK"<<endl;
607 std::cout <<
" PFBlockLink::TRACKandTRACK dist " << dist << std::endl;
617 assert( !ecal1ref.
isNull() );
618 assert( !ecal2ref.
isNull() );
620 cout <<
" PFBlockLink::ECALandECAL" << endl;
628 assert( !clusterref.
isNull() );
630 const PFRecTrack * myTrack = &(GsfEl->GsftrackPF());
639 std::cout <<
" Here a link has been established"
640 <<
" between a GSF track an Ecal with dist "
641 << dist << std::endl;
651 assert( !trackref.
isNull() );
656 assert( !gsfref.
isNull() );
658 if(refkf.isNonnull()) {
661 if (kftrackref == gsftrackref) {
676 vector<PFRecTrackRef> pfrectrack_vec = GsfEl->GsftrackRefPF()->convBremPFRecTrackRef();
677 if(pfrectrack_vec.size() > 0){
678 for(
unsigned int iconv = 0; iconv < pfrectrack_vec.size(); ++iconv) {
681 if(kftrackref == (*pfrectrack_vec[iconv]).trackRef()) {
689 if(newTrackBaseRef == elemTrackBaseRef){
708 assert( !gsfref.
isNull() );
709 assert( !bremref.
isNull() );
710 if (gsfref == bremref) {
726 assert( !lowgsfref.
isNull() );
727 assert( !highgsfref.
isNull() );
733 if(lowgsfref->trackId() == highgsfref->trackId()) {
745 assert( !clusterref.
isNull() );
748 const PFRecTrack * myTrack = &(BremEl->trackPF());
760 std::cout <<
"ECALandBREM: dist testTrackAndClusterByRecHit "
761 << dist << std::endl;
768 assert( !clusterref.
isNull() );
770 const PFRecTrack * myTrack = &(GsfEl->GsftrackPF());
782 assert( !clusterref.
isNull() );
784 const PFRecTrack * myTrack = &(BremEl->trackPF());
796 assert( !clusterref.
isNull() );
800 assert (!scEl->superClusterRef().isNull());
880 switch (ps.
layer()) {
900 if( ! atPS.
isValid() )
return -1.;
902 double trackx = atPS.
position().X();
903 double tracky = atPS.
position().Y();
904 double trackz = atPS.
position().Z();
911 if( trackz*psz < 0.)
return -1.;
916 double dist =
std::sqrt( (psx-trackx)*(psx-trackx)
917 + (psy-tracky)*(psy-tracky));
918 if(
debug_)
cout<<
"testTrackAndPS "<< dist <<
" "<<endl;
920 cout<<
" trackx " << trackx
921 <<
" tracky " << tracky
938 double dist = fabs(ecal.
positionREP().Eta()) > 2.5 ?
947 if(
debug_)
cout<<
"testECALAndHCAL "<< dist <<
" "<<endl;
956 if ( dist < 0.2 )
return dist;
966 double dist = fabs(hcal.
positionREP().Eta()) < 1.5 ?
975 if(
debug_)
cout<<
"testHCALAndHO "<< dist <<
" "<<endl;
981 <<
" dist " << dist<<endl;
985 if ( dist < 0.20 )
return dist;
1003 if(testindex == -1.)
return dist;
1007 const std::vector<reco::PFClusterRef> & thePFClusters(
scpfcRefs_[testindex]);
1009 unsigned npf=thePFClusters.size();
1010 for(
unsigned i=0;
i<npf;++
i)
1012 if(thePFClusters[
i]==ecal2)
1015 ecal1->positionREP().Phi(),
1016 ecal2->positionREP().Eta(),
1017 ecal2->positionREP().Phi() );
1046 ecal1->position().phi(),
1047 ecal2->positionREP().Eta(),
1048 ecal2->positionREP().Phi() );
1076 double scale = z2/z1;
1077 double x1atPS2 = x1*
scale;
1078 double y1atPS2 = y1*
scale;
1081 double dx1dx1 = resPSpitch_*resPSpitch_*scale*
scale;
1082 double dy1dy1 = resPSlength_*resPSlength_*scale*
scale;
1084 double dy2dy2 = resPSpitch_*resPSpitch_;
1085 double dx2dx2 = resPSlength_*resPSlength_;
1090 double dist =
std::sqrt( (x2-x1atPS2)*(x2-x1atPS2)
1091 + (y2-y1atPS2)*(y2-y1atPS2));
1093 if(
debug_)
cout<<
"testPS1AndPS2 "<<dist<<
" "<<endl;
1095 cout<<
" x1atPS2 "<< x1atPS2 <<
" dx1 "<<resPSpitch_*scale
1096 <<
" y1atPS2 "<< y1atPS2 <<
" dy1 "<<resPSlength_*scale<< endl
1097 <<
" x2 " <<x2 <<
" dx2 "<<resPSlength_
1098 <<
" y2 " << y2 <<
" dy2 "<<resPSpitch_<< endl;
1124 if( ni1_TO_DISP == ni2_FROM_DISP ) { result = 1.0;
return result; }
1127 if( ni1_FROM_DISP == ni2_TO_DISP ) { result = 1.0;
return result; }
1130 if( ni1_FROM_DISP == ni2_FROM_DISP ) { result = 1.0;
return result; }
1136 if(
debug_ )
std::cout <<
" testLinkByVertex On Conversions " << std::endl;
1139 if(
debug_ )
std::cout <<
" PFBlockAlgo.cc testLinkByVertex Cconversion Refs are non null " << std::endl;
1142 if(
debug_ )
std::cout <<
" testLinkByVertex Cconversion Refs are equal " << std::endl;
1153 if(
debug_ )
std::cout <<
" PFBlockAlgo.cc testLinkByVertex V0 Refs are non null " << std::endl;
1156 if(
debug_ )
std::cout <<
" testLinkByVertex V0 Refs are equal " << std::endl;
1177 const Mask& trackMask,
1178 const Mask& gsftrackMask,
1179 const Mask& ecalMask,
1180 const Mask& hcalMask,
1182 const Mask& hfemMask,
1183 const Mask& hfhadMask,
1185 const Mask& phMask)
const {
1187 if( !trackMask.empty() &&
1188 trackMask.size() != tracks.size() ) {
1189 string err =
"PFBlockAlgo::setInput: ";
1190 err +=
"The size of the track mask is different ";
1191 err +=
"from the size of the track vector.";
1192 throw std::length_error( err.c_str() );
1195 if( !gsftrackMask.empty() &&
1196 gsftrackMask.size() != gsftracks.size() ) {
1197 string err =
"PFBlockAlgo::setInput: ";
1198 err +=
"The size of the gsf track mask is different ";
1199 err +=
"from the size of the gsftrack vector.";
1200 throw std::length_error( err.c_str() );
1203 if( !ecalMask.empty() &&
1204 ecalMask.size() != ecals.size() ) {
1205 string err =
"PFBlockAlgo::setInput: ";
1206 err +=
"The size of the ecal mask is different ";
1207 err +=
"from the size of the ecal clusters vector.";
1208 throw std::length_error( err.c_str() );
1211 if( !hcalMask.empty() &&
1212 hcalMask.size() != hcals.size() ) {
1213 string err =
"PFBlockAlgo::setInput: ";
1214 err +=
"The size of the hcal mask is different ";
1215 err +=
"from the size of the hcal clusters vector.";
1216 throw std::length_error( err.c_str() );
1219 if( !hoMask.empty() &&
1220 hoMask.size() != hos.size() ) {
1221 string err =
"PFBlockAlgo::setInput: ";
1222 err +=
"The size of the ho mask is different ";
1223 err +=
"from the size of the ho clusters vector.";
1224 throw std::length_error( err.c_str() );
1228 if( !hfemMask.empty() &&
1229 hfemMask.size() != hfems.size() ) {
1230 string err =
"PFBlockAlgo::setInput: ";
1231 err +=
"The size of the hfem mask is different ";
1232 err +=
"from the size of the hfem clusters vector.";
1233 throw std::length_error( err.c_str() );
1236 if( !hfhadMask.empty() &&
1237 hfhadMask.size() != hfhads.size() ) {
1238 string err =
"PFBlockAlgo::setInput: ";
1239 err +=
"The size of the hfhad mask is different ";
1240 err +=
"from the size of the hfhad clusters vector.";
1241 throw std::length_error( err.c_str() );
1244 if( !psMask.empty() &&
1245 psMask.size() != pss.size() ) {
1246 string err =
"PFBlockAlgo::setInput: ";
1247 err +=
"The size of the ps mask is different ";
1248 err +=
"from the size of the ps clusters vector.";
1249 throw std::length_error( err.c_str() );
1252 if( !phMask.empty() &&
1253 phMask.size() != egphh.size() ) {
1254 string err =
"PFBlockAlgo::setInput: ";
1255 err +=
"The size of the photon mask is different ";
1256 err +=
"from the size of the photon vector.";
1257 throw std::length_error( err.c_str() );
1264 if(! out)
return out;
1266 out<<
"====== Particle Flow Block Algorithm ======= ";
1268 out<<
"number of unassociated elements : "<<a.
elements_.size()<<endl;
1273 out<<
"\t"<<**ie <<endl;
1279 const std::auto_ptr< reco::PFBlockCollection >&
blocks
1282 if(!blocks.get() ) {
1283 out<<
"blocks already transfered"<<endl;
1286 out<<
"number of blocks : "<<blocks->size()<<endl;
1290 ib != blocks->end(); ++ib) {
1301 double P = trackref->p();
1302 double Pt = trackref->pt();
1303 double DPt = trackref->ptError();
1304 unsigned int NHit = trackref->hitPattern().trackerLayersWithMeasurement();
1305 unsigned int NLostHit = trackref->hitPattern().trackerLayersWithoutMeasurement();
1306 unsigned int LostHits = trackref->numberOfLostHits();
1307 double sigmaHad =
sqrt(1.20*1.20/P+0.06*0.06) / (1.+LostHits);
1310 unsigned int Algo = 0;
1311 switch (trackref->algo()) {
1312 case TrackBase::ctf:
1313 case TrackBase::iter0:
1314 case TrackBase::iter1:
1315 case TrackBase::iter2:
1318 case TrackBase::iter3:
1321 case TrackBase::iter4:
1324 case TrackBase::iter5:
1327 case TrackBase::iter6:
1336 if ( P < 0.05 )
return false;
1339 if ( Algo > 4 )
return false;
1341 if (
debug_)
cout <<
" PFBlockAlgo: PFrecTrack->Track Pt= "
1342 << Pt <<
" DPt = " << DPt << endl;
1347 if (
debug_)
cout <<
" PFBlockAlgo: skip badly measured track"
1351 <<
", N(hits) = " << NHit <<
" (Lost : " << LostHits <<
"/" << NLostHit <<
")"
1352 <<
", Algo = " << Algo
1384 for(
unsigned j=0;
j<muonh->size(); ++
j) {
1387 if( muonref->track() == trackref )
return j;
1397 for(
unsigned j=0;
j<muonh->size(); ++
j) {
1400 if( muonref->track() == trackref )
return j;
1415 if( type1==type2 ) {
1418 if( type1!=PFBlockElement::TRACK && type1!=PFBlockElement::GSF &&
1426 if( type1 ==PFBlockElement::TRACK) {
1427 if ( !((last)->isLinkedToDisplacedVertex()) || !((next)->isLinkedToDisplacedVertex()))
1432 if ((type1 == PFBlockElement::PS1 || type1 == PFBlockElement::PS2) && (type2 !=
PFBlockElement::ECAL))
return false;
1433 if ((type2 == PFBlockElement::PS1 || type2 == PFBlockElement::PS2) && (type1 !=
PFBlockElement::ECAL))
return false;
1434 if ((type1 == PFBlockElement::HFEM && type2 != PFBlockElement::HFHAD) || (type1 == PFBlockElement::HFHAD && type2 != PFBlockElement::HFEM))
return false;
1442 if ( type1 == PFBlockElement::PS1 || type1 == PFBlockElement::PS2)
1444 if ( type2 == PFBlockElement::PS1 || type2 == PFBlockElement::PS2)
PFLayer::Layer layer() const
cluster layer, see PFLayer.h in this directory
const std::auto_ptr< reco::PFBlockCollection > & blocks() const
const REPPoint & positionREP() const
trajectory position in (rho, eta, phi) base
std::vector< std::pair< double, double > > PFMultilinksType
Abstract This class is used by the KDTree Track / Ecal Cluster linker to store all found links...
Abstract base class for a PFBlock element (track, cluster...)
const math::XYZPoint & position() const
cluster centroid position
reconstructed track used as an input to particle flow
static double computeDist(double eta1, double phi1, double eta2, double phi2, bool etaPhi=true)
computes a chisquare
static bool overlap(const reco::CaloCluster &sc1, const reco::CaloCluster &sc, float minfrac=0.01, bool debug=false)
std::pair< ALIstring, ALIstring > pss
double testECALAndHCAL(const reco::PFCluster &ecal, const reco::PFCluster &hcal) const
bool useIterTracking_
Flag to turn off quality cuts which require iterative tracking (for heavy-ions)
Particle flow cluster, see clustering algorithm in PFClusterAlgo.
GsfPFRecTrackRef GsftrackRefPF() const
double testSuperClusterPFCluster(const reco::SuperClusterRef &sct1, const reco::PFClusterRef &elt2) const
test association between SuperClusters and ECAL
KDTreeLinkerTrackEcal TELinker_
double testHCALAndHO(const reco::PFCluster &hcal, const reco::PFCluster &ho) const
static double testECALAndPSByRecHit(const reco::PFCluster &clusterECAL, const reco::PFCluster &clusterPS, bool debug=false)
const math::XYZPoint & position() const
cartesian position (x, y, z)
KDTreeLinkerPSEcal PSELinker_
int nuclearInteractionsPurity_
void checkMaskSize(const reco::PFRecTrackCollection &tracks, const reco::GsfPFRecTrackCollection &gsftracks, const reco::PFClusterCollection &ecals, const reco::PFClusterCollection &hcals, const reco::PFClusterCollection &hos, const reco::PFClusterCollection &hfems, const reco::PFClusterCollection &hfhads, const reco::PFClusterCollection &pss, const reco::PhotonCollection &egphh, const Mask &trackMask, const Mask &gsftrackMask, const Mask &ecalMask, const Mask &hcalMask, const Mask &hoMask, const Mask &hfemMask, const Mask &hfhadMask, const Mask &psMask, const Mask &phMask) const
const edm::OwnVector< reco::PFBlockElement > & elements() const
std::auto_ptr< reco::PFBlockCollection > blocks_
const LinkData & linkData() const
std::vector< double > DPtovPtCut_
DPt/Pt cut for creating atrack element.
std::ostream & operator<<(std::ostream &out, const ALILine &li)
virtual PFDisplacedTrackerVertexRef displacedVertexRef(TrackType trType) const
double testTrackAndPS(const reco::PFRecTrack &track, const reco::PFCluster &ps) const
std::list< reco::PFBlockElement * >::const_iterator IEC
void setLink(unsigned i1, unsigned i2, double dist, LinkData &linkData, LinkTest test=LINKTEST_RECHIT) const
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
virtual VertexCompositeCandidateRef V0Ref() const
double testLinkBySuperCluster(const reco::PFClusterRef &elt1, const reco::PFClusterRef &elt2) const
test association by Supercluster between two ECAL
bool isNonnull() const
Checks for non-null.
bool isNull() const
Checks for null.
KDTreeLinkerTrackHcal THLinker_
double testPS1AndPS2(const reco::PFCluster &ps1, const reco::PFCluster &ps2) const
std::vector< GsfPFRecTrack > GsfPFRecTrackCollection
collection of GsfPFRecTrack objects
virtual reco::TrackRef trackRef() const
bool useConvBremPFRecTracks_
switch on/off Conversions Brem Recovery with KF Tracks
const REPPoint & positionREP() const
cluster position: rho, eta, phi
int muAssocToTrack(const reco::TrackRef &trackref, const edm::Handle< reco::MuonCollection > &muonh) const
void link(const reco::PFBlockElement *el1, const reco::PFBlockElement *el2, PFBlockLink::Type &linktype, reco::PFBlock::LinkTest &linktest, double &dist) const
check whether 2 elements are linked. Returns distance and linktype
virtual PFClusterRef clusterRef() const
virtual PFRecTrackRef trackRefPF() const
const reco::PFTrajectoryPoint & extrapolatedPoint(unsigned layerid) const
std::list< reco::PFBlockElement * >::iterator IE
define these in *Fwd files in DataFormats/ParticleFlowReco?
std::list< reco::PFBlockElement * > elements_
actually, particles will be created by a separate producer
virtual bool trackType(TrackType trType) const
block
Formating index page's pieces.
std::vector< PFBlock > PFBlockCollection
collection of PFBlock objects
std::vector< std::vector< reco::PFClusterRef > > scpfcRefs_
PF clusters corresponding to a given SC.
bool goodPtResolution(const reco::TrackRef &trackref)
open a resolution map
void packLinks(reco::PFBlock &block, const std::vector< PFBlockLink > &links) const
static const Mask dummyMask_
reco::PFBlockCollection::const_iterator IBC
IE associate(IE next, IE last, std::vector< PFBlockLink > &links)
const PhotonSelectorAlgo * photonSelector_
PhotonSelector.
double testLinkByVertex(const reco::PFBlockElement *elt1, const reco::PFBlockElement *elt2) const
bool isValid() const
is this point valid ?
static double testHFEMAndHFHADByRecHit(const reco::PFCluster &clusterHFEM, const reco::PFCluster &clusterHFHAD, bool debug=false)
test association between HFEM and HFHAD, by rechit
key_type key() const
Accessor for product key.
bool isMultilinksValide() const
bool linkPrefilter(const reco::PFBlockElement *last, const reco::PFBlockElement *next) const
Avoid to check links when not useful.
virtual bool trackType(TrackType trType) const
std::vector< Photon > PhotonCollection
collectin of Photon objects
void findBlocks()
build blocks
std::vector< int > pfcSCVec_
SC corresponding to the PF cluster.
Type
possible types. WARNING: have a look at PFBlockElement
void setParameters(std::vector< double > &DPtovPtCut, std::vector< unsigned > &NHitCut, bool useConvBremPFRecTracks, bool useIterTracking, int nuclearInteractionsPurity, bool useEGPhotons, std::vector< double > &photonSelectionCuts)
virtual ConversionRef convRef() const
GsfPFRecTrackRef GsftrackRefPF() const
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
virtual bool isLinkedToDisplacedVertex() const
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
void setUseOptimization(bool useKDTreeTrackEcalLinker)
bool debug_
if true, debug printouts activated
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 useEGPhotons_
Flag to turn off the import of EG Photons.
bool useKDTreeTrackEcalLinker_
std::vector< unsigned > NHitCut_
Number of layers crossed cut for creating atrack element.
const PFMultilinksType & getMultilinks() const