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,
39 bool superClusterMatchByRef
51 photonSelectionCuts[1], photonSelectionCuts[2],
52 photonSelectionCuts[3], photonSelectionCuts[4],
53 photonSelectionCuts[5], photonSelectionCuts[6],
54 photonSelectionCuts[7],
55 photonSelectionCuts[8],
56 photonSelectionCuts[9],
57 photonSelectionCuts[10]
77 cout<<
"~PFBlockAlgo - number of remaining elements: "
107 cout<<
" PFBlockAlgo::findBlocks() ----------------------"<<endl;
108 cout<<
" element "<<**ie<<endl;
109 cout<<
" creating new block"<<endl;
115 vector< PFBlockLink >
links;
130 vector<PFBlockLink>&
links ) {
134 if(
debug_ )
cout<<
"PFBlockAlgo::associate start ----"<<endl;
141 link( *last, *next, linktype, linktest, dist );
152 blocks_->back().addElement( *next );
164 (*next)->index() ) );
173 if(
debug_ )
cout<<
"adding to block element "<<(**next)<<endl;
175 blocks_->back().addElement( *next );
189 if( ie == last || ie == next ) {
201 if( (*ie)->locked() ) {
203 if(
debug_ )
cout<<
"element "<<(**ie)<<
"already used"<<endl;
211 if(
debug_ )
cout<<
"calling associate "<<(**next)<<
" & "<<(**ie)<<endl;
218 cout<<
"**** deleting element "<<endl;
226 cout<<
"**** removing element "<<endl;
230 IE iteratorToNextFreeElement =
elements_.erase( next );
233 if(
debug_ )
cout<<
"PFBlockAlgo::associate stop ----"<<endl;
236 return iteratorToNextFreeElement;
243 const vector<PFBlockLink>&
links )
const {
249 unsigned elsize = els.
size();
250 unsigned ilStart = 0;
252 for(
unsigned i1=0; i1<elsize; ++i1 ) {
253 for(
unsigned i2=0; i2<i1; ++i2 ) {
262 = PFBlock::LINKTEST_RECHIT;
266 unsigned linksize = links.size();
267 for(
unsigned il = ilStart; il<linksize; ++il ) {
269 if ( links[il].element2() < i1 ) ilStart = il;
270 if ( links[il].element2() > i1 )
break;
271 if( (links[il].element1() == i2 &&
272 links[il].element2() == i1) ) {
274 dist = links[il].dist();
279 linktest = links[il].test();
282 cout <<
"Reading link vector: linktest used="
284 <<
" distance = " << dist
296 if (bTestLink)
link( & els[i1], & els[i2], linktype, linktest, dist);
303 cout <<
"Setting link between elements " << i1 <<
" and " << i2
304 <<
" of dist =" << dist <<
" computed from link test "
327 double& dist)
const {
333 linktest = PFBlock::LINKTEST_RECHIT;
339 ((1<< (type1-1) ) | (1<< (type2-1) ));
341 if(
debug_ )
std::cout <<
" PFBlockAlgo links type1 " << type1 <<
" type2 " << type2 << std::endl;
359 assert( !psref.
isNull() );
360 assert( !ecalref.
isNull() );
367 double ecalPhi = ecalref->positionREP().Phi();
368 double ecalEta = ecalref->positionREP().Eta();
371 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
372 for (; mlit != multilinks.end(); ++mlit)
373 if ((mlit->first == ecalPhi) && (mlit->second == ecalEta))
377 if (mlit != multilinks.end()){
378 double xPS = psref->position().X();
379 double yPS = psref->position().Y();
380 double xECAL = ecalref->position().X();
381 double yECAL = ecalref->position().Y();
400 assert( !trackref.
isNull() );
401 assert( !clusterref.
isNull() );
403 if(
debug_ )
std::cout <<
" Track pt " << trackref->trackRef()->pt() << std::endl;
410 double ecalphi = clusterref->positionREP().Phi();
411 double ecaleta = clusterref->positionREP().Eta();
414 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
415 for (; mlit != multilinks.end(); ++mlit)
416 if ((mlit->first == ecalphi) && (mlit->second == ecaleta))
421 if (mlit != multilinks.end()){
455 std::cout <<
" Here a link has been established"
456 <<
" between a track an Ecal with dist "
457 << dist << std::endl;
459 std::cout <<
" No link found " << std::endl;
471 assert( !trackref.
isNull() );
472 assert( !clusterref.
isNull() );
498 reco::PFMultilinksType::const_iterator mlit = multilinks.begin();
499 for (; mlit != multilinks.end(); ++mlit)
500 if ((mlit->first == trackphi) && (mlit->second == tracketa))
504 if (mlit != multilinks.end()){
513 if ( dHPhi >
M_PI ) dHPhi = dHPhi - 2.*
M_PI;
514 else if ( dHPhi < -
M_PI ) dHPhi = dHPhi + 2.*
M_PI;
516 std::cout <<
"Qu'est ce que c'est que ce gag ? "
517 << atHCALExit.
position().R() <<
" is larger than "
518 << atHCAL.
position().R() <<
" !" << std::endl;
521 tracketa += 0.1 * dHEta;
522 trackphi += 0.1 * dHPhi;
524 double clusterphi = clusterref->positionREP().Phi();
525 double clustereta = clusterref->positionREP().Eta();
547 assert( !trackref.
isNull() );
548 assert( !clusterref.
isNull() );
570 assert( !ecalref.
isNull() );
571 assert( !hcalref.
isNull() );
583 assert( !hcalref.
isNull() );
584 assert( !horef.
isNull() );
607 cout<<
"TRACKandTRACK"<<endl;
610 std::cout <<
" PFBlockLink::TRACKandTRACK dist " << dist << std::endl;
620 assert( !ecal1ref.
isNull() );
621 assert( !ecal2ref.
isNull() );
623 cout <<
" PFBlockLink::ECALandECAL" << endl;
631 assert( !clusterref.
isNull() );
633 const PFRecTrack * myTrack = &(GsfEl->GsftrackPF());
642 std::cout <<
" Here a link has been established"
643 <<
" between a GSF track an Ecal with dist "
644 << dist << std::endl;
654 assert( !trackref.
isNull() );
659 assert( !gsfref.
isNull() );
661 if(refkf.isNonnull()) {
664 if (kftrackref == gsftrackref) {
679 vector<PFRecTrackRef> pfrectrack_vec = GsfEl->GsftrackRefPF()->convBremPFRecTrackRef();
680 if(pfrectrack_vec.size() > 0){
681 for(
unsigned int iconv = 0; iconv < pfrectrack_vec.size(); ++iconv) {
684 if(kftrackref == (*pfrectrack_vec[iconv]).trackRef()) {
692 if(newTrackBaseRef == elemTrackBaseRef){
711 assert( !gsfref.
isNull() );
712 assert( !bremref.
isNull() );
713 if (gsfref == bremref) {
729 assert( !lowgsfref.
isNull() );
730 assert( !highgsfref.
isNull() );
736 if(lowgsfref->trackId() == highgsfref->trackId()) {
748 assert( !clusterref.
isNull() );
751 const PFRecTrack * myTrack = &(BremEl->trackPF());
763 std::cout <<
"ECALandBREM: dist testTrackAndClusterByRecHit "
764 << dist << std::endl;
771 assert( !clusterref.
isNull() );
773 const PFRecTrack * myTrack = &(GsfEl->GsftrackPF());
785 assert( !clusterref.
isNull() );
787 const PFRecTrack * myTrack = &(BremEl->trackPF());
799 assert( !clusterref.
isNull() );
803 assert (!scEl->superClusterRef().isNull());
883 switch (ps.
layer()) {
903 if( ! atPS.
isValid() )
return -1.;
905 double trackx = atPS.
position().X();
906 double tracky = atPS.
position().Y();
907 double trackz = atPS.
position().Z();
914 if( trackz*psz < 0.)
return -1.;
919 double dist =
std::sqrt( (psx-trackx)*(psx-trackx)
920 + (psy-tracky)*(psy-tracky));
921 if(
debug_)
cout<<
"testTrackAndPS "<< dist <<
" "<<endl;
923 cout<<
" trackx " << trackx
924 <<
" tracky " << tracky
941 double dist = fabs(ecal.
positionREP().Eta()) > 2.5 ?
950 if(
debug_)
cout<<
"testECALAndHCAL "<< dist <<
" "<<endl;
959 if ( dist < 0.2 )
return dist;
969 double dist = fabs(hcal.
positionREP().Eta()) < 1.5 ?
978 if(
debug_)
cout<<
"testHCALAndHO "<< dist <<
" "<<endl;
984 <<
" dist " << dist<<endl;
988 if ( dist < 0.20 )
return dist;
1006 if(testindex == -1.)
return dist;
1010 const std::vector<reco::PFClusterRef> & thePFClusters(
scpfcRefs_[testindex]);
1012 unsigned npf=thePFClusters.size();
1013 for(
unsigned i=0;
i<npf;++
i)
1015 if(thePFClusters[
i]==ecal2)
1018 ecal1->positionREP().Phi(),
1019 ecal2->positionREP().Eta(),
1020 ecal2->positionREP().Phi() );
1049 if (overlap) dist = 0.001;
1057 ecal1->position().phi(),
1058 ecal2->positionREP().Eta(),
1059 ecal2->positionREP().Phi() );
1087 double scale = z2/z1;
1088 double x1atPS2 = x1*
scale;
1089 double y1atPS2 = y1*
scale;
1092 double dx1dx1 = resPSpitch_*resPSpitch_*scale*
scale;
1093 double dy1dy1 = resPSlength_*resPSlength_*scale*
scale;
1095 double dy2dy2 = resPSpitch_*resPSpitch_;
1096 double dx2dx2 = resPSlength_*resPSlength_;
1101 double dist =
std::sqrt( (x2-x1atPS2)*(x2-x1atPS2)
1102 + (y2-y1atPS2)*(y2-y1atPS2));
1104 if(
debug_)
cout<<
"testPS1AndPS2 "<<dist<<
" "<<endl;
1106 cout<<
" x1atPS2 "<< x1atPS2 <<
" dx1 "<<resPSpitch_*scale
1107 <<
" y1atPS2 "<< y1atPS2 <<
" dy1 "<<resPSlength_*scale<< endl
1108 <<
" x2 " <<x2 <<
" dx2 "<<resPSlength_
1109 <<
" y2 " << y2 <<
" dy2 "<<resPSpitch_<< endl;
1135 if( ni1_TO_DISP == ni2_FROM_DISP ) { result = 1.0;
return result; }
1138 if( ni1_FROM_DISP == ni2_TO_DISP ) { result = 1.0;
return result; }
1141 if( ni1_FROM_DISP == ni2_FROM_DISP ) { result = 1.0;
return result; }
1147 if(
debug_ )
std::cout <<
" testLinkByVertex On Conversions " << std::endl;
1150 if(
debug_ )
std::cout <<
" PFBlockAlgo.cc testLinkByVertex Cconversion Refs are non null " << std::endl;
1153 if(
debug_ )
std::cout <<
" testLinkByVertex Cconversion Refs are equal " << std::endl;
1164 if(
debug_ )
std::cout <<
" PFBlockAlgo.cc testLinkByVertex V0 Refs are non null " << std::endl;
1167 if(
debug_ )
std::cout <<
" testLinkByVertex V0 Refs are equal " << std::endl;
1190 const Mask& trackMask,
1191 const Mask& gsftrackMask,
1192 const Mask& ecalMask,
1193 const Mask& hcalMask,
1195 const Mask& hfemMask,
1196 const Mask& hfhadMask,
1199 const Mask& scMask)
const {
1201 if( !trackMask.empty() &&
1202 trackMask.size() != tracks.size() ) {
1203 string err =
"PFBlockAlgo::setInput: ";
1204 err +=
"The size of the track mask is different ";
1205 err +=
"from the size of the track vector.";
1206 throw std::length_error( err.c_str() );
1209 if( !gsftrackMask.empty() &&
1210 gsftrackMask.size() != gsftracks.size() ) {
1211 string err =
"PFBlockAlgo::setInput: ";
1212 err +=
"The size of the gsf track mask is different ";
1213 err +=
"from the size of the gsftrack vector.";
1214 throw std::length_error( err.c_str() );
1217 if( !ecalMask.empty() &&
1218 ecalMask.size() != ecals.size() ) {
1219 string err =
"PFBlockAlgo::setInput: ";
1220 err +=
"The size of the ecal mask is different ";
1221 err +=
"from the size of the ecal clusters vector.";
1222 throw std::length_error( err.c_str() );
1225 if( !hcalMask.empty() &&
1226 hcalMask.size() != hcals.size() ) {
1227 string err =
"PFBlockAlgo::setInput: ";
1228 err +=
"The size of the hcal mask is different ";
1229 err +=
"from the size of the hcal clusters vector.";
1230 throw std::length_error( err.c_str() );
1233 if( !hoMask.empty() &&
1234 hoMask.size() != hos.size() ) {
1235 string err =
"PFBlockAlgo::setInput: ";
1236 err +=
"The size of the ho mask is different ";
1237 err +=
"from the size of the ho clusters vector.";
1238 throw std::length_error( err.c_str() );
1242 if( !hfemMask.empty() &&
1243 hfemMask.size() != hfems.size() ) {
1244 string err =
"PFBlockAlgo::setInput: ";
1245 err +=
"The size of the hfem mask is different ";
1246 err +=
"from the size of the hfem clusters vector.";
1247 throw std::length_error( err.c_str() );
1250 if( !hfhadMask.empty() &&
1251 hfhadMask.size() != hfhads.size() ) {
1252 string err =
"PFBlockAlgo::setInput: ";
1253 err +=
"The size of the hfhad mask is different ";
1254 err +=
"from the size of the hfhad clusters vector.";
1255 throw std::length_error( err.c_str() );
1258 if( !psMask.empty() &&
1259 psMask.size() != pss.size() ) {
1260 string err =
"PFBlockAlgo::setInput: ";
1261 err +=
"The size of the ps mask is different ";
1262 err +=
"from the size of the ps clusters vector.";
1263 throw std::length_error( err.c_str() );
1266 if( !phMask.empty() &&
1267 phMask.size() != egphh.size() ) {
1268 string err =
"PFBlockAlgo::setInput: ";
1269 err +=
"The size of the photon mask is different ";
1270 err +=
"from the size of the photon vector.";
1271 throw std::length_error( err.c_str() );
1274 if( !scMask.empty() &&
1275 scMask.size() != (sceb.size() + scee.size()) ) {
1276 string err =
"PFBlockAlgo::setInput: ";
1277 err +=
"The size of the SC mask is different ";
1278 err +=
"from the size of the SC vectors.";
1279 throw std::length_error( err.c_str() );
1286 if(! out)
return out;
1288 out<<
"====== Particle Flow Block Algorithm ======= ";
1290 out<<
"number of unassociated elements : "<<a.
elements_.size()<<endl;
1295 out<<
"\t"<<**ie <<endl;
1301 const std::auto_ptr< reco::PFBlockCollection >&
blocks
1304 if(!blocks.get() ) {
1305 out<<
"blocks already transfered"<<endl;
1308 out<<
"number of blocks : "<<blocks->size()<<endl;
1312 ib != blocks->end(); ++
ib) {
1323 double P = trackref->p();
1324 double Pt = trackref->pt();
1325 double DPt = trackref->ptError();
1326 unsigned int NHit = trackref->hitPattern().trackerLayersWithMeasurement();
1327 unsigned int NLostHit = trackref->hitPattern().trackerLayersWithoutMeasurement();
1328 unsigned int LostHits = trackref->numberOfLostHits();
1329 double sigmaHad =
sqrt(1.20*1.20/P+0.06*0.06) / (1.+LostHits);
1332 unsigned int Algo = 0;
1333 switch (trackref->algo()) {
1334 case TrackBase::ctf:
1335 case TrackBase::iter0:
1336 case TrackBase::iter1:
1337 case TrackBase::iter2:
1340 case TrackBase::iter3:
1343 case TrackBase::iter4:
1346 case TrackBase::iter5:
1349 case TrackBase::iter6:
1358 if ( P < 0.05 )
return false;
1361 if ( Algo > 4 )
return false;
1363 if (
debug_)
cout <<
" PFBlockAlgo: PFrecTrack->Track Pt= "
1364 << Pt <<
" DPt = " << DPt << endl;
1369 if (
debug_)
cout <<
" PFBlockAlgo: skip badly measured track"
1373 <<
", N(hits) = " << NHit <<
" (Lost : " << LostHits <<
"/" << NLostHit <<
")"
1374 <<
", Algo = " << Algo
1406 for(
unsigned j=0;
j<muonh->size(); ++
j) {
1409 if( muonref->track() == trackref )
return j;
1419 for(
unsigned j=0;
j<muonh->size(); ++
j) {
1422 if( muonref->track() == trackref )
return j;
1437 if( type1==type2 ) {
1440 if( type1!=PFBlockElement::TRACK && type1!=PFBlockElement::GSF &&
1448 if( type1 ==PFBlockElement::TRACK) {
1449 if ( !((last)->isLinkedToDisplacedVertex()) || !((next)->isLinkedToDisplacedVertex()))
1454 if ((type1 == PFBlockElement::PS1 || type1 == PFBlockElement::PS2) && (type2 !=
PFBlockElement::ECAL))
return false;
1455 if ((type2 == PFBlockElement::PS1 || type2 == PFBlockElement::PS2) && (type1 !=
PFBlockElement::ECAL))
return false;
1456 if ((type1 == PFBlockElement::HFEM && type2 != PFBlockElement::HFHAD) || (type1 == PFBlockElement::HFHAD && type2 != PFBlockElement::HFEM))
return false;
1464 if ( type1 == PFBlockElement::PS1 || type1 == PFBlockElement::PS2)
1466 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::ValueMap< reco::CaloClusterPtr > * pfclusterassoc_
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
bool superClusterMatchByRef_
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
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.
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...
volatile std::atomic< bool > shutdown_flag false
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)
void setParameters(std::vector< double > &DPtovPtCut, std::vector< unsigned > &NHitCut, bool useConvBremPFRecTracks, bool useIterTracking, int nuclearInteractionsPurity, bool useEGPhotons, std::vector< double > &photonSelectionCuts, bool useSuperClusters, bool superClusterMatchByRef)
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