21 std::vector<reco::PFCandidatePtr> theFilteredPFCands;
22 for (std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=thePFCands.begin();iPFCand!=thePFCands.end();++iPFCand) {
23 if ((**iPFCand).pt()>
minPt)theFilteredPFCands.push_back(*iPFCand);
25 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone;
26 if (conemetric==
"DR"){
28 }
else if(conemetric==
"angle"){
30 }
else if(conemetric==
"area"){
34 double coneangle=theFixedAreaCone(myVector.theta(),myVector.phi(),0,conesize,errorFlag);
35 if (errorFlag!=0)
return theFilteredPFCandsInCone;
37 }
else return std::vector<reco::PFCandidatePtr>();
38 return theFilteredPFCandsInCone;
41 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFCandsInCone(
PFCands_,myVector,conemetric,conesize,minPt);
42 return theFilteredPFCandsInCone;
46 return theFilteredPFCandsInCone;
51 TrackRef PFChargedHadrCand_track=(**iPFCand).trackRef();
52 if (!PFChargedHadrCand_track)
continue;
53 if (fabs((*PFChargedHadrCand_track).dz(myPV.
position())-refpoint_Z)<=PFChargedHadrCand_tracktorefpoint_maxDZ) filteredPFChargedHadrCands.push_back(*iPFCand);
55 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFCandsInCone(filteredPFChargedHadrCands,myVector,conemetric,conesize,
minPt);
56 return theFilteredPFCandsInCone;
60 return theFilteredPFCandsInCone;
64 return theFilteredPFCandsInCone;
69 std::pair<std::vector<reco::PFCandidatePtr>,std::vector<reco::PFCandidatePtr>> myPFGammaCandsInEllipse =
PFCandidatesInEllipse_(leadCand_, rPhi, rEta, PFGammaCands_);
70 std::vector<reco::PFCandidatePtr> thePFGammaCandsInEllipse = myPFGammaCandsInEllipse.first;
71 std::vector<reco::PFCandidatePtr> thePFGammaCandsOutEllipse = myPFGammaCandsInEllipse.second;
72 std::vector<reco::PFCandidatePtr> theFilteredPFGammaCandsInEllipse;
73 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFGammaCand = thePFGammaCandsInEllipse.begin(); iPFGammaCand != thePFGammaCandsInEllipse.end(); ++iPFGammaCand){
74 if((**iPFGammaCand).pt() <=
maxPt) theFilteredPFGammaCandsInEllipse.push_back(*iPFGammaCand);
75 else thePFGammaCandsOutEllipse.push_back(*iPFGammaCand);
77 std::pair<std::vector<reco::PFCandidatePtr>, std::vector<reco::PFCandidatePtr>> theFilteredPFGammaCandsInOutEllipse(theFilteredPFGammaCandsInEllipse, thePFGammaCandsOutEllipse);
79 return theFilteredPFGammaCandsInOutEllipse;
84 std::vector<reco::PFCandidatePtr>
PFTauElementsOperators::PFCandsInAnnulus(
const std::vector<reco::PFCandidatePtr>& thePFCands,
const math::XYZVector& myVector,
const string innercone_metric,
const double innercone_size,
const string outercone_metric,
const double outercone_size,
const double minPt)
const{
85 std::vector<reco::PFCandidatePtr> theFilteredPFCands;
86 for (std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=thePFCands.begin();iPFCand!=thePFCands.end();++iPFCand) {
87 if ((**iPFCand).pt()>
minPt)theFilteredPFCands.push_back(*iPFCand);
89 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInAnnulus;
90 if (outercone_metric==
"DR"){
91 if (innercone_metric==
"DR"){
93 }
else if(innercone_metric==
"angle"){
95 }
else if(innercone_metric==
"area"){
99 double innercone_angle=theFixedAreaSignalCone(myVector.theta(),myVector.phi(),0,innercone_size,errorFlag);
100 if (errorFlag!=0)
return theFilteredPFCandsInAnnulus;
102 }
else return std::vector<reco::PFCandidatePtr>();
103 }
else if(outercone_metric==
"angle"){
104 if (innercone_metric==
"DR"){
106 }
else if(innercone_metric==
"angle"){
108 }
else if(innercone_metric==
"area"){
112 double innercone_angle=theFixedAreaSignalCone(myVector.theta(),myVector.phi(),0,innercone_size,errorFlag);
113 if (errorFlag!=0)
return theFilteredPFCandsInAnnulus;
115 }
else return std::vector<reco::PFCandidatePtr>();
116 }
else if(outercone_metric==
"area"){
120 if (innercone_metric==
"DR"){
122 }
else if(innercone_metric==
"angle"){
123 double outercone_angle=theFixedAreaSignalCone(myVector.theta(),myVector.phi(),innercone_size,outercone_size,errorFlag);
124 if (errorFlag!=0)
return theFilteredPFCandsInAnnulus;
126 }
else if(innercone_metric==
"area"){
127 double innercone_angle=theFixedAreaSignalCone(myVector.theta(),myVector.phi(),0,innercone_size,errorFlag);
128 if (errorFlag!=0)
return theFilteredPFCandsInAnnulus;
129 double outercone_angle=theFixedAreaSignalCone(myVector.theta(),myVector.phi(),innercone_angle,outercone_size,errorFlag);
130 if (errorFlag!=0)
return theFilteredPFCandsInAnnulus;
132 }
else return std::vector<reco::PFCandidatePtr>();
134 return theFilteredPFCandsInAnnulus;
137 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInAnnulus=
PFCandsInAnnulus(
PFCands_,myVector,innercone_metric,innercone_size,outercone_metric,outercone_size,minPt);
138 return theFilteredPFCandsInAnnulus;
141 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInAnnulus=
PFCandsInAnnulus(
PFChargedHadrCands_,myVector,innercone_metric,innercone_size,outercone_metric,outercone_size,minPt);
142 return theFilteredPFCandsInAnnulus;
147 TrackRef PFChargedHadrCand_track=(**iPFCand).trackRef();
148 if (!PFChargedHadrCand_track)
continue;
149 if (fabs((*PFChargedHadrCand_track).dz(myPV.
position())-refpoint_Z)<=PFChargedHadrCand_tracktorefpoint_maxDZ) filteredPFChargedHadrCands.push_back(*iPFCand);
151 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInAnnulus=
PFCandsInAnnulus(filteredPFChargedHadrCands,myVector,innercone_metric,innercone_size,outercone_metric,outercone_size,
minPt);
152 return theFilteredPFCandsInAnnulus;
155 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInAnnulus=
PFCandsInAnnulus(
PFNeutrHadrCands_,myVector,innercone_metric,innercone_size,outercone_metric,outercone_size,minPt);
156 return theFilteredPFCandsInAnnulus;
159 std::vector<reco::PFCandidatePtr> theFilteredPFCandsInAnnulus=
PFCandsInAnnulus(
PFGammaCands_,myVector,innercone_metric,innercone_size,outercone_metric,outercone_size,minPt);
160 return theFilteredPFCandsInAnnulus;
166 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFCandsInCone(PFJet_XYZVector,matchingcone_metric,matchingcone_size,minPt);
168 if (theFilteredPFCandsInCone.size()>0.){
169 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand =theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
170 if((*iPFCand)->pt()>pt_cut) {
171 myleadPFCand=*iPFCand;
172 pt_cut=(**iPFCand).pt();
180 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFCandsInCone(myVector,matchingcone_metric,matchingcone_size,minPt);
182 if (!theFilteredPFCandsInCone.empty()){
183 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
184 if((*iPFCand)->pt()>pt_cut) {
185 myleadPFCand=*iPFCand;
186 pt_cut=(**iPFCand).pt();
196 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFChargedHadrCandsInCone(PFJet_XYZVector,matchingcone_metric,matchingcone_size,minPt);
198 if (theFilteredPFCandsInCone.size()>0.){
199 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand =theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
200 if((*iPFCand)->pt()>pt_cut) {
201 myleadPFCand=*iPFCand;
202 pt_cut=(**iPFCand).pt();
210 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFChargedHadrCandsInCone(myVector,matchingcone_metric,matchingcone_size,minPt);
212 if (!theFilteredPFCandsInCone.empty()){
213 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
214 if((*iPFCand)->pt()>pt_cut) {
215 myleadPFCand=*iPFCand;
216 pt_cut=(**iPFCand).pt();
226 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFNeutrHadrCandsInCone(PFJet_XYZVector,matchingcone_metric,matchingcone_size,minPt);
228 if (theFilteredPFCandsInCone.size()>0.){
229 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand =theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
230 if((*iPFCand)->pt()>pt_cut) {
231 myleadPFCand=*iPFCand;
232 pt_cut=(**iPFCand).pt();
240 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFNeutrHadrCandsInCone(myVector,matchingcone_metric,matchingcone_size,minPt);
242 if (!theFilteredPFCandsInCone.empty()){
243 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
244 if((*iPFCand)->pt()>pt_cut) {
245 myleadPFCand=*iPFCand;
246 pt_cut=(**iPFCand).pt();
256 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFGammaCandsInCone(PFJet_XYZVector,matchingcone_metric,matchingcone_size,minPt);
258 if (theFilteredPFCandsInCone.size()>0.){
259 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand =theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
260 if((*iPFCand)->pt()>pt_cut) {
261 myleadPFCand=*iPFCand;
262 pt_cut=(**iPFCand).pt();
270 const std::vector<reco::PFCandidatePtr> theFilteredPFCandsInCone=
PFGammaCandsInCone(myVector,matchingcone_metric,matchingcone_size,minPt);
272 if (!theFilteredPFCandsInCone.empty()){
273 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=theFilteredPFCandsInCone.begin();iPFCand!=theFilteredPFCandsInCone.end();iPFCand++){
274 if((*iPFCand)->pt()>pt_cut) {
275 myleadPFCand=*iPFCand;
276 pt_cut=(**iPFCand).pt();
286 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand = theInputCands.begin();
287 iPFCand != theInputCands.end();
290 if ( (*iPFCand)->pt() >
minPt )
291 theOutputCands.push_back(*iPFCand);
300 const double minChargedSize,
const double maxChargedSize,
const double minNeutralSize,
const double maxNeutralSize,
301 const double minChargedPt,
const double minNeutralPt,
302 const string& outlierCollectorConeMetric,
const double outlierCollectionMaxSize,
303 std::vector<reco::PFCandidatePtr>& signalChargedObjects, std::vector<reco::PFCandidatePtr>& outlierChargedObjects,
304 std::vector<reco::PFCandidatePtr>& signalGammaObjects, std::vector<reco::PFCandidatePtr>& outlierGammaObjects,
bool useScanningAxis)
306 if (theChargedCands.empty() && theGammaCands.empty())
309 std::vector<reco::PFCandidatePtr> filteredCands;
310 filteredCands.reserve(theChargedCands.size() + theGammaCands.size());
315 if (filteredCands.empty())
321 std::vector<uint32_t> filteredCandIndexes(numberOfCandidates);
323 filteredCandIndexes[theIndex] = theIndex;
328 sort(filteredCandIndexes.begin(), filteredCandIndexes.end(), myAngularSorter);
330 std::vector<reco::PFCandidatePtr> sortedCands;
331 for(std::vector<uint32_t>::const_iterator theSortedIndex = filteredCandIndexes.begin();
332 theSortedIndex != filteredCandIndexes.end();
335 sortedCands.push_back(filteredCands.at(*theSortedIndex));
339 std::vector<reco::PFCandidatePtr>::const_iterator signalObjectCandidate = sortedCands.begin();
340 double totalEnergySoFar = (**signalObjectCandidate).energy();
341 double totalEtSoFar = (**signalObjectCandidate).et();
344 ++signalObjectCandidate;
345 bool doneBuilding =
false;
346 while (!doneBuilding && signalObjectCandidate != sortedCands.end())
351 testAxis += (**signalObjectCandidate).momentum();
352 double currentDelToCenter = ptrToMetricFunction((**signalObjectCandidate).momentum(), testAxis);
353 double testEnergy = totalEnergySoFar + (**signalObjectCandidate).energy();
354 double testEt = totalEtSoFar + (**signalObjectCandidate).et();
355 bool isCharged = (**signalObjectCandidate).charge();
356 bool addThisObject =
true;
357 if (currentDelToCenter > ((isCharged)?maxChargedSize:maxNeutralSize) ) {
359 addThisObject =
false;
361 else if (currentDelToCenter > ((isCharged)?minChargedSize:minNeutralSize) )
364 double cutOffQuantity = coneSizeFormula.Eval(testEnergy, testEt);
365 if (currentDelToCenter > cutOffQuantity)
366 addThisObject =
false;
367 else if (useScanningAxis)
371 if (ptrToMetricFunction(testAxis, leadTrackVector) > cutOffQuantity)
372 addThisObject =
false;
377 axisVectorSoFar = testAxis;
378 totalEnergySoFar = testEnergy;
379 totalEtSoFar = testEt;
380 ++signalObjectCandidate;
388 double largest3DOpeningAngleSignal = 0.;
389 for (std::vector<reco::PFCandidatePtr>::const_iterator iterCand = sortedCands.begin();
390 iterCand != signalObjectCandidate;
394 if (angleToAxis > largest3DOpeningAngleSignal)
395 largest3DOpeningAngleSignal = angleToAxis;
397 if ((*iterCand)->charge())
398 signalChargedObjects.push_back(*iterCand);
400 signalGammaObjects.push_back(*iterCand);
405 double outlierCollectionComputedMaxSize = 0;
407 if (!outlierCollectorConeMetric.compare(
"angle"))
410 outlierCollectionComputedMaxSize = outlierCollectionMaxSize;
411 }
else if (!outlierCollectorConeMetric.compare(
"area"))
419 int errorFlagForConeSizeCalc = 0;
420 outlierCollectionComputedMaxSize = theFixedAreaCone(axisVectorSoFar.theta(), axisVectorSoFar.phi(), largest3DOpeningAngleSignal, outlierCollectionMaxSize, errorFlagForConeSizeCalc);
421 if (errorFlagForConeSizeCalc != 0)
423 edm::LogError(
"PFRecoTauAlgorithm") <<
"Error: " << errorFlagForConeSizeCalc <<
" when calculated const area annulus. Taking all non-signal PFJet consituents!";
424 outlierCollectionComputedMaxSize = 1000.;
426 }
else if (!outlierCollectorConeMetric.compare(
"DR"))
429 outlierCollectionComputedMaxSize = outlierCollectionMaxSize;
433 edm::LogWarning(
"PFRecoTauAlgorithm") <<
"Error in computeInsideOutContents(...): Outlier (isolation) collector cone metric (" << outlierCollectorConeMetric
434 <<
") is not recognized! All non-signal associated PFJet constituents will be included in the outliers!";
437 for (std::vector<reco::PFCandidatePtr>::const_iterator iterCand = signalObjectCandidate;
438 iterCand != sortedCands.end();
442 double outlierOpeningQuantity = outlierCollectionCalculator(axisVectorSoFar, (*iterCand)->momentum());
443 if (outlierOpeningQuantity > outlierCollectionComputedMaxSize)
break;
445 if ((*iterCand)->charge())
446 outlierChargedObjects.push_back(*iterCand);
448 outlierGammaObjects.push_back(*iterCand);
456 double myDiscriminator=0.;
457 if ((
int)
IsolPFCands_.size()<=IsolPFCands_maxN) myDiscriminator=1;
458 return myDiscriminator;
460 double PFTauElementsOperators::discriminatorByIsolPFCandsN(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFCands_maxN){
461 double myDiscriminator=0.;
463 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
464 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
465 if(!myleadPFCand)
return myDiscriminator;
468 const std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
469 if ((
int)isolPFCands.size()<=IsolPFCands_maxN) myDiscriminator=1;
470 return myDiscriminator;
472 double PFTauElementsOperators::discriminatorByIsolPFCandsN(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFCands_maxN){
473 double myDiscriminator=0;
475 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
476 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
477 if(!myleadPFCand)
return myDiscriminator;
480 const std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
481 if ((
int)isolPFCands.size()<=IsolPFCands_maxN) myDiscriminator=1;
482 return myDiscriminator;
485 double myDiscriminator=0.;
487 return myDiscriminator;
489 double PFTauElementsOperators::discriminatorByIsolPFChargedHadrCandsN(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFChargedHadrCands_maxN){
490 double myDiscriminator=0.;
492 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
493 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
494 if(!myleadPFCand)
return myDiscriminator;
497 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
498 if ((
int)isolPFChargedHadrCands.size()<=IsolPFChargedHadrCands_maxN) myDiscriminator=1;
499 return myDiscriminator;
501 double PFTauElementsOperators::discriminatorByIsolPFChargedHadrCandsN(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFChargedHadrCands_maxN){
502 double myDiscriminator=0;
504 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
505 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
506 if(!myleadPFCand)
return myDiscriminator;
509 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
510 if ((
int)isolPFChargedHadrCands.size()<=IsolPFChargedHadrCands_maxN) myDiscriminator=1;
511 return myDiscriminator;
514 double myDiscriminator=0.;
516 return myDiscriminator;
518 double PFTauElementsOperators::discriminatorByIsolPFNeutrHadrCandsN(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFNeutrHadrCands_maxN){
519 double myDiscriminator=0.;
521 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
522 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
523 if(!myleadPFCand)
return myDiscriminator;
526 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
527 if ((
int)isolPFNeutrHadrCands.size()<=IsolPFNeutrHadrCands_maxN) myDiscriminator=1;
528 return myDiscriminator;
530 double PFTauElementsOperators::discriminatorByIsolPFNeutrHadrCandsN(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFNeutrHadrCands_maxN){
531 double myDiscriminator=0;
533 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
534 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
535 if(!myleadPFCand)
return myDiscriminator;
538 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
539 if ((
int)isolPFNeutrHadrCands.size()<=IsolPFNeutrHadrCands_maxN) myDiscriminator=1;
540 return myDiscriminator;
543 double myDiscriminator=0.;
545 return myDiscriminator;
547 double PFTauElementsOperators::discriminatorByIsolPFGammaCandsN(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFGammaCands_maxN){
548 double myDiscriminator=0.;
550 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
551 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
552 if(!myleadPFCand)
return myDiscriminator;
555 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
556 if ((
int)isolPFGammaCands.size()<=IsolPFGammaCands_maxN) myDiscriminator=1;
557 return myDiscriminator;
559 double PFTauElementsOperators::discriminatorByIsolPFGammaCandsN(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
int IsolPFGammaCands_maxN){
560 double myDiscriminator=0;
562 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
563 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
564 if(!myleadPFCand)
return myDiscriminator;
567 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
568 if ((
int)isolPFGammaCands.size()<=IsolPFGammaCands_maxN) myDiscriminator=1;
569 return myDiscriminator;
572 double myIsolPFCandsEtSum=0.;
573 double myDiscriminator=0.;
574 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=
IsolPFCands_.begin();iPFCand!=
IsolPFCands_.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
575 if (myIsolPFCandsEtSum<=IsolPFCands_maxEtSum) myDiscriminator=1;
576 return myDiscriminator;
578 double PFTauElementsOperators::discriminatorByIsolPFCandsEtSum(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFCands_maxEtSum){
579 double myIsolPFCandsEtSum=0.;
580 double myDiscriminator=0.;
582 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
583 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
584 if(!myleadPFCand)
return myDiscriminator;
587 std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
588 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFCands.begin();iPFCand!=isolPFCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
589 if (myIsolPFCandsEtSum<=IsolPFCands_maxEtSum) myDiscriminator=1;
590 return myDiscriminator;
592 double PFTauElementsOperators::discriminatorByIsolPFCandsEtSum(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFCands_maxEtSum){
593 double myIsolPFCandsEtSum=0.;
594 double myDiscriminator=0;
596 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
597 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
598 if(!myleadPFCand)
return myDiscriminator;
601 std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
602 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFCands.begin();iPFCand!=isolPFCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
603 if (myIsolPFCandsEtSum<=IsolPFCands_maxEtSum) myDiscriminator=1;
604 return myDiscriminator;
607 double myIsolPFCandsEtSum=0.;
608 double myDiscriminator=0.;
610 if (myIsolPFCandsEtSum<=IsolPFChargedHadrCands_maxEtSum) myDiscriminator=1;
611 return myDiscriminator;
613 double PFTauElementsOperators::discriminatorByIsolPFChargedHadrCandsEtSum(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFChargedHadrCands_maxEtSum){
614 double myIsolPFCandsEtSum=0.;
615 double myDiscriminator=0.;
617 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
618 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
619 if(!myleadPFCand)
return myDiscriminator;
622 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
623 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFChargedHadrCands.begin();iPFCand!=isolPFChargedHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
624 if (myIsolPFCandsEtSum<=IsolPFChargedHadrCands_maxEtSum) myDiscriminator=1;
625 return myDiscriminator;
627 double PFTauElementsOperators::discriminatorByIsolPFChargedHadrCandsEtSum(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFChargedHadrCands_maxEtSum){
628 double myIsolPFCandsEtSum=0.;
629 double myDiscriminator=0;
631 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
632 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
633 if(!myleadPFCand)
return myDiscriminator;
636 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
637 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFChargedHadrCands.begin();iPFCand!=isolPFChargedHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
638 if (myIsolPFCandsEtSum<=IsolPFChargedHadrCands_maxEtSum) myDiscriminator=1;
639 return myDiscriminator;
642 double myIsolPFCandsEtSum=0.;
643 double myDiscriminator=0.;
645 if (myIsolPFCandsEtSum<=IsolPFNeutrHadrCands_maxEtSum) myDiscriminator=1;
646 return myDiscriminator;
648 double PFTauElementsOperators::discriminatorByIsolPFNeutrHadrCandsEtSum(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFNeutrHadrCands_maxEtSum){
649 double myIsolPFCandsEtSum=0.;
650 double myDiscriminator=0.;
652 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
653 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
654 if(!myleadPFCand)
return myDiscriminator;
657 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
658 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFNeutrHadrCands.begin();iPFCand!=isolPFNeutrHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
659 if (myIsolPFCandsEtSum<=IsolPFNeutrHadrCands_maxEtSum) myDiscriminator=1;
660 return myDiscriminator;
662 double PFTauElementsOperators::discriminatorByIsolPFNeutrHadrCandsEtSum(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFNeutrHadrCands_maxEtSum){
663 double myIsolPFCandsEtSum=0.;
664 double myDiscriminator=0;
666 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
667 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
668 if(!myleadPFCand)
return myDiscriminator;
671 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
672 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFNeutrHadrCands.begin();iPFCand!=isolPFNeutrHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
673 if (myIsolPFCandsEtSum<=IsolPFNeutrHadrCands_maxEtSum) myDiscriminator=1;
674 return myDiscriminator;
677 double myIsolPFCandsEtSum=0.;
678 double myDiscriminator=0.;
679 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=
IsolPFGammaCands_.begin();iPFCand!=
IsolPFGammaCands_.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
680 if (myIsolPFCandsEtSum<=IsolPFGammaCands_maxEtSum) myDiscriminator=1;
681 return myDiscriminator;
683 double PFTauElementsOperators::discriminatorByIsolPFGammaCandsEtSum(
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFGammaCands_maxEtSum){
684 double myIsolPFCandsEtSum=0.;
685 double myDiscriminator=0.;
687 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
688 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
689 if(!myleadPFCand)
return myDiscriminator;
690 if(signalcone_size>=isolcone_size)
return 1.;
692 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
693 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFGammaCands.begin();iPFCand!=isolPFGammaCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
694 if (myIsolPFCandsEtSum<=IsolPFGammaCands_maxEtSum) myDiscriminator=1;
695 return myDiscriminator;
697 double PFTauElementsOperators::discriminatorByIsolPFGammaCandsEtSum(
const math::XYZVector& myVector,
string matchingcone_metric,
double matchingcone_size,
string signalcone_metric,
double signalcone_size,
string isolcone_metric,
double isolcone_size,
bool useOnlyChargedHadrforleadPFCand,
double minPt_leadPFCand,
double minPt_PFCand,
double IsolPFGammaCands_maxEtSum){
698 double myIsolPFCandsEtSum=0.;
699 double myDiscriminator=0;
701 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
702 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
703 if(!myleadPFCand)
return myDiscriminator;
706 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
707 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFGammaCands.begin();iPFCand!=isolPFGammaCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
708 if (myIsolPFCandsEtSum<=IsolPFGammaCands_maxEtSum) myDiscriminator=1;
709 return myDiscriminator;
std::vector< reco::PFCandidatePtr > PFCandsInCone(const std::vector< reco::PFCandidatePtr > &PFCands, const math::XYZVector &myVector, const std::string conemetric, const double conesize, const double minPt) const
std::vector< reco::PFCandidatePtr > IsolPFChargedHadrCands_
std::vector< reco::PFCandidatePtr > IsolPFGammaCands_
const std::vector< reco::PFCandidatePtr > & isolationPFCands() const
PFCandidates in isolation region.
std::pair< std::vector< reco::PFCandidatePtr >, std::vector< reco::PFCandidatePtr > > PFGammaCandsInOutEllipse(const std::vector< reco::PFCandidatePtr > &, const reco::PFCandidate &, double rPhi, double rEta, double maxPt) const
double discriminatorByIsolPFGammaCandsN(int IsolPFCands_maxN=0)
std::vector< reco::PFCandidatePtr > PFGammaCands_
std::vector< reco::PFCandidatePtr > PFGammaCandsInCone(const math::XYZVector &myVector, const std::string conemetric, const double conesize, const double minPt) const
ElementsInAnnulus< math::XYZVector, Angle< math::XYZVector >, Angle< math::XYZVector >, reco::PFCandidate > PFCandsinAnnulus_innerAngleouterAnglemetrics_
Angle< math::XYZVector > metricAngle_
std::vector< reco::PFCandidatePtr > IsolPFNeutrHadrCands_
double discriminatorByIsolPFChargedHadrCandsN(int IsolPFCands_maxN=0)
ElementsInAnnulus< math::XYZVector, Angle< math::XYZVector >, DeltaR< math::XYZVector >, reco::PFCandidate > PFCandsinAnnulus_innerAngleouterDRmetrics_
std::vector< reco::PFCandidatePtr > PFNeutrHadrCands_
void computeInsideOutContents(const std::vector< reco::PFCandidatePtr > &theChargedCands, const std::vector< reco::PFCandidatePtr > &theGammaCands, const math::XYZVector &leadTrackVector, const TFormula &coneSizeFormula, double(*ptrToMetricFunction)(const math::XYZVector &, const math::XYZVector &), const double minChargedSize, const double maxChargedSize, const double minNeutralSize, const double maxNeutralSize, const double minChargedPt, const double minNeutralPt, const std::string &outlierCollectorConeMetric, const double outlierCollectorConeSize, std::vector< reco::PFCandidatePtr > &signalChargedObjects, std::vector< reco::PFCandidatePtr > &outlierChargedObjects, std::vector< reco::PFCandidatePtr > &signalGammaObjects, std::vector< reco::PFCandidatePtr > &outlierGammaObjects, bool useScanningAxis)
compute size of cone using the Inside-Out cone (Author Evan Friis, UC Davis)
const Point & position() const
position
ElementsInAnnulus< math::XYZVector, DeltaR< math::XYZVector >, Angle< math::XYZVector >, reco::PFCandidate > PFCandsinAnnulus_innerDRouterAnglemetrics_
const std::vector< reco::PFCandidatePtr > & isolationPFGammaCands() const
Gamma candidates in isolation region.
std::vector< reco::PFCandidatePtr > PFCands_
void copyCandRefsFilteredByPt(const std::vector< reco::PFCandidatePtr > &theInputCands, std::vector< reco::PFCandidatePtr > &theOutputCands, const double minPt)
append elements of theInputCands that pass Pt requirement to the end of theOutputCands ...
double AreaMetric_recoElements_maxabsEta_
reco::PFCandidatePtr leadPFCand(const std::string matchingcone_metric, const double matchingcone_size, const double minPt) const
double discriminatorByIsolPFCandsEtSum(double IsolPFCands_maxEtSum=0)
ElementsInEllipse< reco::PFCandidate, reco::PFCandidate > PFCandidatesInEllipse_
double discriminatorByIsolPFGammaCandsEtSum(double IsolPFCands_maxEtSum=0)
double discriminatorByIsolPFCandsN(int IsolPFCands_maxN=0)
reco::PFCandidatePtr leadPFNeutrHadrCand(const std::string matchingcone_metric, const double matchingcone_size, const double minPt) const
std::vector< reco::PFCandidatePtr > PFNeutrHadrCandsInCone(const math::XYZVector &myVector, const std::string conemetric, const double conesize, const double minPt) const
PFTauElementsOperators(reco::PFTau &thePFTau)
void setAcceptanceLimit(double etaMaxTrackingAcceptance)
std::vector< reco::PFCandidatePtr > IsolPFCands_
const std::vector< reco::PFCandidatePtr > & isolationPFNeutrHadrCands() const
double discriminatorByIsolPFNeutrHadrCandsN(int IsolPFCands_maxN=0)
ElementsInAnnulus< math::XYZVector, DeltaR< math::XYZVector >, DeltaR< math::XYZVector >, reco::PFCandidate > PFCandsinAnnulus_innerDRouterDRmetrics_
const std::vector< reco::PFCandidatePtr > & isolationPFChargedHadrCands() const
Charged candidates in isolation region.
reco::TrackRefVector Tracks_
ElementsInCone< math::XYZVector, Angle< math::XYZVector >, reco::PFCandidate > PFCandsinCone_Anglemetric_
const PFTauTagInfoRef & pfTauTagInfoRef() const
reco::PFCandidatePtr leadPFGammaCand(const std::string matchingcone_metric, const double matchingcone_size, const double minPt) const
reco::PFCandidatePtr leadPFChargedHadrCand(const std::string matchingcone_metric, const double matchingcone_size, const double minPt) const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
ElementsInCone< math::XYZVector, DeltaR< math::XYZVector >, reco::PFCandidate > PFCandsinCone_DRmetric_
std::vector< reco::PFCandidatePtr > PFGammaCandsInAnnulus(const math::XYZVector &myVector, const std::string innercone_metric, const double innercone_size, const std::string outercone_metric, const double outercone_size, const double minPt) const
DeltaR< math::XYZVector > metricDR_
std::vector< reco::PFCandidatePtr > PFChargedHadrCandsInAnnulus(const math::XYZVector &myVector, const std::string innercone_metric, const double innercone_size, const std::string outercone_metric, const double outercone_size, const double minPt) const
void setAreaMetricrecoElementsmaxabsEta(double x)
Particle reconstructed by the particle flow algorithm.
std::vector< reco::PFCandidatePtr > PFCandsInAnnulus(const std::vector< reco::PFCandidatePtr > &PFCands, const math::XYZVector &myVector, const std::string innercone_metric, const double innercone_size, const std::string outercone_metric, const double outercone_size, const double minPt) const
double discriminatorByIsolPFChargedHadrCandsEtSum(std::string matchingcone_metric, double matchingcone_size, std::string signalcone_metric, double signalcone_size, std::string isolcone_metric, double isolcone_size, bool useOnlyChargedHadrforleadPFCand, double minPt_leadPFCand, double minPt_PFCand, double IsolPFCands_maxEtSum=0)
double discriminatorByIsolPFNeutrHadrCandsEtSum(double IsolPFCands_maxEtSum=0)
std::vector< reco::PFCandidatePtr > PFChargedHadrCandsInCone(const math::XYZVector &myVector, const std::string conemetric, const double conesize, const double minPt) const
std::vector< reco::PFCandidatePtr > PFNeutrHadrCandsInAnnulus(const math::XYZVector &myVector, const std::string innercone_metric, const double innercone_size, const std::string outercone_metric, const double outercone_size, const double minPt) const
std::vector< reco::PFCandidatePtr > PFChargedHadrCands_