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,
38 bool useSuperClusters) {
49 photonSelectionCuts[1], photonSelectionCuts[2],
50 photonSelectionCuts[3], photonSelectionCuts[4],
51 photonSelectionCuts[5], photonSelectionCuts[6],
52 photonSelectionCuts[7],
53 photonSelectionCuts[8],
54 photonSelectionCuts[9],
55 photonSelectionCuts[10]
75 cout<<
"~PFBlockAlgo - number of remaining elements: "
105 cout<<
" PFBlockAlgo::findBlocks() ----------------------"<<endl;
106 cout<<
" element "<<**ie<<endl;
107 cout<<
" creating new block"<<endl;
113 vector< PFBlockLink >
links;
128 vector<PFBlockLink>&
links ) {
132 if(
debug_ )
cout<<
"PFBlockAlgo::associate start ----"<<endl;
139 link( *last, *next, linktype, linktest, dist );
150 blocks_->back().addElement( *next );
162 (*next)->index() ) );
171 if(
debug_ )
cout<<
"adding to block element "<<(**next)<<endl;
173 blocks_->back().addElement( *next );
187 if( ie == last || ie == next ) {
199 if( (*ie)->locked() ) {
201 if(
debug_ )
cout<<
"element "<<(**ie)<<
"already used"<<endl;
209 if(
debug_ )
cout<<
"calling associate "<<(**next)<<
" & "<<(**ie)<<endl;
216 cout<<
"**** deleting element "<<endl;
224 cout<<
"**** removing element "<<endl;
228 IE iteratorToNextFreeElement =
elements_.erase( next );
231 if(
debug_ )
cout<<
"PFBlockAlgo::associate stop ----"<<endl;
234 return iteratorToNextFreeElement;
241 const vector<PFBlockLink>&
links )
const {
247 unsigned elsize = els.
size();
248 unsigned ilStart = 0;
250 for(
unsigned i1=0; i1<elsize; ++i1 ) {
251 for(
unsigned i2=0; i2<i1; ++i2 ) {
260 = PFBlock::LINKTEST_RECHIT;
264 unsigned linksize = links.size();
265 for(
unsigned il = ilStart; il<linksize; ++il ) {
267 if ( links[il].element2() < i1 ) ilStart = il;
268 if ( links[il].element2() > i1 )
break;
269 if( (links[il].element1() == i2 &&
270 links[il].element2() == i1) ) {
272 dist = links[il].dist();
277 linktest = links[il].test();
280 cout <<
"Reading link vector: linktest used="
282 <<
" distance = " << dist
294 if (bTestLink)
link( & els[i1], & els[i2], linktype, linktest, dist);
301 cout <<
"Setting link between elements " << i1 <<
" and " << i2
302 <<
" of dist =" << dist <<
" computed from link test "
325 double& dist)
const {
331 linktest = PFBlock::LINKTEST_RECHIT;
337 ((1<< (type1-1) ) | (1<< (type2-1) ));
339 if(
debug_ )
std::cout <<
" PFBlockAlgo links type1 " << type1 <<
" type2 " << type2 << std::endl;
357 assert( !psref.
isNull() );
358 assert( !ecalref.
isNull() );
365 double ecalPhi = ecalref->positionREP().Phi();
366 double ecalEta = ecalref->positionREP().Eta();
369 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
370 for (; mlit != multilinks.end(); ++mlit)
371 if ((mlit->first == ecalPhi) && (mlit->second == ecalEta))
375 if (mlit != multilinks.end()){
376 double xPS = psref->position().X();
377 double yPS = psref->position().Y();
378 double xECAL = ecalref->position().X();
379 double yECAL = ecalref->position().Y();
398 assert( !trackref.
isNull() );
399 assert( !clusterref.
isNull() );
401 if(
debug_ )
std::cout <<
" Track pt " << trackref->trackRef()->pt() << std::endl;
408 double ecalphi = clusterref->positionREP().Phi();
409 double ecaleta = clusterref->positionREP().Eta();
412 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
413 for (; mlit != multilinks.end(); ++mlit)
414 if ((mlit->first == ecalphi) && (mlit->second == ecaleta))
419 if (mlit != multilinks.end()){
453 std::cout <<
" Here a link has been established"
454 <<
" between a track an Ecal with dist "
455 << dist << std::endl;
457 std::cout <<
" No link found " << std::endl;
469 assert( !trackref.
isNull() );
470 assert( !clusterref.
isNull() );
496 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
497 for (; mlit != multilinks.end(); ++mlit)
498 if ((mlit->first == trackphi) && (mlit->second == tracketa))
502 if (mlit != multilinks.end()){
511 if ( dHPhi >
M_PI ) dHPhi = dHPhi - 2.*
M_PI;
512 else if ( dHPhi < -
M_PI ) dHPhi = dHPhi + 2.*
M_PI;
514 std::cout <<
"Qu'est ce que c'est que ce gag ? "
515 << atHCALExit.
position().R() <<
" is larger than "
516 << atHCAL.
position().R() <<
" !" << std::endl;
519 tracketa += 0.1 * dHEta;
520 trackphi += 0.1 * dHPhi;
522 double clusterphi = clusterref->positionREP().Phi();
523 double clustereta = clusterref->positionREP().Eta();
545 assert( !trackref.
isNull() );
546 assert( !clusterref.
isNull() );
568 assert( !ecalref.
isNull() );
569 assert( !hcalref.
isNull() );
581 assert( !hcalref.
isNull() );
582 assert( !horef.
isNull() );
605 cout<<
"TRACKandTRACK"<<endl;
608 std::cout <<
" PFBlockLink::TRACKandTRACK dist " << dist << std::endl;
618 assert( !ecal1ref.
isNull() );
619 assert( !ecal2ref.
isNull() );
621 cout <<
" PFBlockLink::ECALandECAL" << endl;
629 assert( !clusterref.
isNull() );
631 const PFRecTrack * myTrack = &(GsfEl->GsftrackPF());
640 std::cout <<
" Here a link has been established"
641 <<
" between a GSF track an Ecal with dist "
642 << dist << std::endl;
652 assert( !trackref.
isNull() );
657 assert( !gsfref.
isNull() );
659 if(refkf.isNonnull()) {
662 if (kftrackref == gsftrackref) {
677 vector<PFRecTrackRef> pfrectrack_vec = GsfEl->GsftrackRefPF()->convBremPFRecTrackRef();
678 if(pfrectrack_vec.size() > 0){
679 for(
unsigned int iconv = 0; iconv < pfrectrack_vec.size(); ++iconv) {
682 if(kftrackref == (*pfrectrack_vec[iconv]).trackRef()) {
690 if(newTrackBaseRef == elemTrackBaseRef){
709 assert( !gsfref.
isNull() );
710 assert( !bremref.
isNull() );
711 if (gsfref == bremref) {
727 assert( !lowgsfref.
isNull() );
728 assert( !highgsfref.
isNull() );
734 if(lowgsfref->trackId() == highgsfref->trackId()) {
746 assert( !clusterref.
isNull() );
749 const PFRecTrack * myTrack = &(BremEl->trackPF());
761 std::cout <<
"ECALandBREM: dist testTrackAndClusterByRecHit "
762 << dist << std::endl;
769 assert( !clusterref.
isNull() );
771 const PFRecTrack * myTrack = &(GsfEl->GsftrackPF());
783 assert( !clusterref.
isNull() );
785 const PFRecTrack * myTrack = &(BremEl->trackPF());
797 assert( !clusterref.
isNull() );
801 assert (!scEl->superClusterRef().isNull());
881 switch (ps.
layer()) {
901 if( ! atPS.
isValid() )
return -1.;
903 double trackx = atPS.
position().X();
904 double tracky = atPS.
position().Y();
905 double trackz = atPS.
position().Z();
912 if( trackz*psz < 0.)
return -1.;
917 double dist =
std::sqrt( (psx-trackx)*(psx-trackx)
918 + (psy-tracky)*(psy-tracky));
919 if(
debug_)
cout<<
"testTrackAndPS "<< dist <<
" "<<endl;
921 cout<<
" trackx " << trackx
922 <<
" tracky " << tracky
939 double dist = fabs(ecal.
positionREP().Eta()) > 2.5 ?
948 if(
debug_)
cout<<
"testECALAndHCAL "<< dist <<
" "<<endl;
957 if ( dist < 0.2 )
return dist;
967 double dist = fabs(hcal.
positionREP().Eta()) < 1.5 ?
976 if(
debug_)
cout<<
"testHCALAndHO "<< dist <<
" "<<endl;
982 <<
" dist " << dist<<endl;
986 if ( dist < 0.20 )
return dist;
1004 if(testindex == -1.)
return dist;
1008 const std::vector<reco::PFClusterRef> & thePFClusters(
scpfcRefs_[testindex]);
1010 unsigned npf=thePFClusters.size();
1011 for(
unsigned i=0;
i<npf;++
i)
1013 if(thePFClusters[
i]==ecal2)
1016 ecal1->positionREP().Phi(),
1017 ecal2->positionREP().Eta(),
1018 ecal2->positionREP().Phi() );
1047 ecal1->position().phi(),
1048 ecal2->positionREP().Eta(),
1049 ecal2->positionREP().Phi() );
1077 double scale = z2/z1;
1078 double x1atPS2 = x1*
scale;
1079 double y1atPS2 = y1*
scale;
1082 double dx1dx1 = resPSpitch_*resPSpitch_*scale*
scale;
1083 double dy1dy1 = resPSlength_*resPSlength_*scale*
scale;
1085 double dy2dy2 = resPSpitch_*resPSpitch_;
1086 double dx2dx2 = resPSlength_*resPSlength_;
1091 double dist =
std::sqrt( (x2-x1atPS2)*(x2-x1atPS2)
1092 + (y2-y1atPS2)*(y2-y1atPS2));
1094 if(
debug_)
cout<<
"testPS1AndPS2 "<<dist<<
" "<<endl;
1096 cout<<
" x1atPS2 "<< x1atPS2 <<
" dx1 "<<resPSpitch_*scale
1097 <<
" y1atPS2 "<< y1atPS2 <<
" dy1 "<<resPSlength_*scale<< endl
1098 <<
" x2 " <<x2 <<
" dx2 "<<resPSlength_
1099 <<
" y2 " << y2 <<
" dy2 "<<resPSpitch_<< endl;
1125 if( ni1_TO_DISP == ni2_FROM_DISP ) { result = 1.0;
return result; }
1128 if( ni1_FROM_DISP == ni2_TO_DISP ) { result = 1.0;
return result; }
1131 if( ni1_FROM_DISP == ni2_FROM_DISP ) { result = 1.0;
return result; }
1137 if(
debug_ )
std::cout <<
" testLinkByVertex On Conversions " << std::endl;
1140 if(
debug_ )
std::cout <<
" PFBlockAlgo.cc testLinkByVertex Cconversion Refs are non null " << std::endl;
1143 if(
debug_ )
std::cout <<
" testLinkByVertex Cconversion Refs are equal " << std::endl;
1154 if(
debug_ )
std::cout <<
" PFBlockAlgo.cc testLinkByVertex V0 Refs are non null " << std::endl;
1157 if(
debug_ )
std::cout <<
" testLinkByVertex V0 Refs are equal " << std::endl;
1180 const Mask& trackMask,
1181 const Mask& gsftrackMask,
1182 const Mask& ecalMask,
1183 const Mask& hcalMask,
1185 const Mask& hfemMask,
1186 const Mask& hfhadMask,
1189 const Mask& scMask)
const {
1191 if( !trackMask.empty() &&
1192 trackMask.size() != tracks.size() ) {
1193 string err =
"PFBlockAlgo::setInput: ";
1194 err +=
"The size of the track mask is different ";
1195 err +=
"from the size of the track vector.";
1196 throw std::length_error( err.c_str() );
1199 if( !gsftrackMask.empty() &&
1200 gsftrackMask.size() != gsftracks.size() ) {
1201 string err =
"PFBlockAlgo::setInput: ";
1202 err +=
"The size of the gsf track mask is different ";
1203 err +=
"from the size of the gsftrack vector.";
1204 throw std::length_error( err.c_str() );
1207 if( !ecalMask.empty() &&
1208 ecalMask.size() != ecals.size() ) {
1209 string err =
"PFBlockAlgo::setInput: ";
1210 err +=
"The size of the ecal mask is different ";
1211 err +=
"from the size of the ecal clusters vector.";
1212 throw std::length_error( err.c_str() );
1215 if( !hcalMask.empty() &&
1216 hcalMask.size() != hcals.size() ) {
1217 string err =
"PFBlockAlgo::setInput: ";
1218 err +=
"The size of the hcal mask is different ";
1219 err +=
"from the size of the hcal clusters vector.";
1220 throw std::length_error( err.c_str() );
1223 if( !hoMask.empty() &&
1224 hoMask.size() != hos.size() ) {
1225 string err =
"PFBlockAlgo::setInput: ";
1226 err +=
"The size of the ho mask is different ";
1227 err +=
"from the size of the ho clusters vector.";
1228 throw std::length_error( err.c_str() );
1232 if( !hfemMask.empty() &&
1233 hfemMask.size() != hfems.size() ) {
1234 string err =
"PFBlockAlgo::setInput: ";
1235 err +=
"The size of the hfem mask is different ";
1236 err +=
"from the size of the hfem clusters vector.";
1237 throw std::length_error( err.c_str() );
1240 if( !hfhadMask.empty() &&
1241 hfhadMask.size() != hfhads.size() ) {
1242 string err =
"PFBlockAlgo::setInput: ";
1243 err +=
"The size of the hfhad mask is different ";
1244 err +=
"from the size of the hfhad clusters vector.";
1245 throw std::length_error( err.c_str() );
1248 if( !psMask.empty() &&
1249 psMask.size() != pss.size() ) {
1250 string err =
"PFBlockAlgo::setInput: ";
1251 err +=
"The size of the ps mask is different ";
1252 err +=
"from the size of the ps clusters vector.";
1253 throw std::length_error( err.c_str() );
1256 if( !phMask.empty() &&
1257 phMask.size() != egphh.size() ) {
1258 string err =
"PFBlockAlgo::setInput: ";
1259 err +=
"The size of the photon mask is different ";
1260 err +=
"from the size of the photon vector.";
1261 throw std::length_error( err.c_str() );
1264 if( !scMask.empty() &&
1265 scMask.size() != (sceb.size() + scee.size()) ) {
1266 string err =
"PFBlockAlgo::setInput: ";
1267 err +=
"The size of the SC mask is different ";
1268 err +=
"from the size of the SC vectors.";
1269 throw std::length_error( err.c_str() );
1276 if(! out)
return out;
1278 out<<
"====== Particle Flow Block Algorithm ======= ";
1280 out<<
"number of unassociated elements : "<<a.
elements_.size()<<endl;
1285 out<<
"\t"<<**ie <<endl;
1291 const std::auto_ptr< reco::PFBlockCollection >&
blocks
1294 if(!blocks.get() ) {
1295 out<<
"blocks already transfered"<<endl;
1298 out<<
"number of blocks : "<<blocks->size()<<endl;
1302 ib != blocks->end(); ++
ib) {
1313 double P = trackref->p();
1314 double Pt = trackref->pt();
1315 double DPt = trackref->ptError();
1316 unsigned int NHit = trackref->hitPattern().trackerLayersWithMeasurement();
1317 unsigned int NLostHit = trackref->hitPattern().trackerLayersWithoutMeasurement();
1318 unsigned int LostHits = trackref->numberOfLostHits();
1319 double sigmaHad =
sqrt(1.20*1.20/P+0.06*0.06) / (1.+LostHits);
1322 unsigned int Algo = 0;
1323 switch (trackref->algo()) {
1324 case TrackBase::ctf:
1325 case TrackBase::iter0:
1326 case TrackBase::iter1:
1327 case TrackBase::iter2:
1330 case TrackBase::iter3:
1333 case TrackBase::iter4:
1336 case TrackBase::iter5:
1339 case TrackBase::iter6:
1348 if ( P < 0.05 )
return false;
1351 if ( Algo > 4 )
return false;
1353 if (
debug_)
cout <<
" PFBlockAlgo: PFrecTrack->Track Pt= "
1354 << Pt <<
" DPt = " << DPt << endl;
1359 if (
debug_)
cout <<
" PFBlockAlgo: skip badly measured track"
1363 <<
", N(hits) = " << NHit <<
" (Lost : " << LostHits <<
"/" << NLostHit <<
")"
1364 <<
", Algo = " << Algo
1396 for(
unsigned j=0;
j<muonh->size(); ++
j) {
1399 if( muonref->track() == trackref )
return j;
1409 for(
unsigned j=0;
j<muonh->size(); ++
j) {
1412 if( muonref->track() == trackref )
return j;
1427 if( type1==type2 ) {
1430 if( type1!=PFBlockElement::TRACK && type1!=PFBlockElement::GSF &&
1438 if( type1 ==PFBlockElement::TRACK) {
1439 if ( !((last)->isLinkedToDisplacedVertex()) || !((next)->isLinkedToDisplacedVertex()))
1444 if ((type1 == PFBlockElement::PS1 || type1 == PFBlockElement::PS2) && (type2 !=
PFBlockElement::ECAL))
return false;
1445 if ((type2 == PFBlockElement::PS1 || type2 == PFBlockElement::PS2) && (type1 !=
PFBlockElement::ECAL))
return false;
1446 if ((type1 == PFBlockElement::HFEM && type2 != PFBlockElement::HFHAD) || (type1 == PFBlockElement::HFHAD && type2 != PFBlockElement::HFEM))
return false;
1454 if ( type1 == PFBlockElement::PS1 || type1 == PFBlockElement::PS2)
1456 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_
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
bool useSuperClusters_
Flag to turn off the import of SuperCluster collections.
std::vector< GsfPFRecTrack > GsfPFRecTrackCollection
collection of GsfPFRecTrack objects
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
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
void setParameters(std::vector< double > &DPtovPtCut, std::vector< unsigned > &NHitCut, bool useConvBremPFRecTracks, bool useIterTracking, int nuclearInteractionsPurity, bool useEGPhotons, std::vector< double > &photonSelectionCuts, bool useSuperClusters)
static const Mask dummyMask_
reco::PFBlockCollection::const_iterator IBC
IE associate(IE next, IE last, std::vector< PFBlockLink > &links)
const PhotonSelectorAlgo * photonSelector_
PhotonSelector.
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 reco::SuperClusterCollection &sceb, const reco::SuperClusterCollection &scee, 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 Mask &scMask) const
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
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