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.size()>0){
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.size()>0){
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.size()>0){
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.size()>0){
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);
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();
343 double currentDelToCenter = ptrToMetricFunction(leadTrackVector, axisVectorSoFar);
345 ++signalObjectCandidate;
346 bool doneBuilding =
false;
347 while (!doneBuilding && signalObjectCandidate != sortedCands.end())
352 testAxis += (**signalObjectCandidate).momentum();
353 currentDelToCenter = ptrToMetricFunction((**signalObjectCandidate).momentum(), testAxis);
354 double testEnergy = totalEnergySoFar + (**signalObjectCandidate).energy();
355 double testEt = totalEtSoFar + (**signalObjectCandidate).et();
356 bool isCharged = (**signalObjectCandidate).charge();
357 bool addThisObject =
true;
358 if (currentDelToCenter > ((isCharged)?maxChargedSize:maxNeutralSize) ) {
360 addThisObject =
false;
362 else if (currentDelToCenter > ((isCharged)?minChargedSize:minNeutralSize) )
365 double cutOffQuantity = coneSizeFormula.Eval(testEnergy, testEt);
366 if (currentDelToCenter > cutOffQuantity)
367 addThisObject =
false;
368 else if (useScanningAxis)
372 if (ptrToMetricFunction(testAxis, leadTrackVector) > cutOffQuantity)
373 addThisObject =
false;
378 axisVectorSoFar = testAxis;
379 totalEnergySoFar = testEnergy;
380 totalEtSoFar = testEt;
381 ++signalObjectCandidate;
389 double largest3DOpeningAngleSignal = 0.;
390 for (std::vector<reco::PFCandidatePtr>::const_iterator iterCand = sortedCands.begin();
391 iterCand != signalObjectCandidate;
395 if (angleToAxis > largest3DOpeningAngleSignal)
396 largest3DOpeningAngleSignal = angleToAxis;
398 if ((*iterCand)->charge())
399 signalChargedObjects.push_back(*iterCand);
401 signalGammaObjects.push_back(*iterCand);
406 double outlierCollectionComputedMaxSize = 0;
408 if (!outlierCollectorConeMetric.compare(
"angle"))
411 outlierCollectionComputedMaxSize = outlierCollectionMaxSize;
412 }
else if (!outlierCollectorConeMetric.compare(
"area"))
420 int errorFlagForConeSizeCalc = 0;
421 outlierCollectionComputedMaxSize = theFixedAreaCone(axisVectorSoFar.theta(), axisVectorSoFar.phi(), largest3DOpeningAngleSignal, outlierCollectionMaxSize, errorFlagForConeSizeCalc);
422 if (errorFlagForConeSizeCalc != 0)
424 edm::LogError(
"PFRecoTauAlgorithm") <<
"Error: " << errorFlagForConeSizeCalc <<
" when calculated const area annulus. Taking all non-signal PFJet consituents!";
425 outlierCollectionComputedMaxSize = 1000.;
427 }
else if (!outlierCollectorConeMetric.compare(
"DR"))
430 outlierCollectionComputedMaxSize = outlierCollectionMaxSize;
434 edm::LogWarning(
"PFRecoTauAlgorithm") <<
"Error in computeInsideOutContents(...): Outlier (isolation) collector cone metric (" << outlierCollectorConeMetric
435 <<
") is not recognized! All non-signal associated PFJet constituents will be included in the outliers!";
438 for (std::vector<reco::PFCandidatePtr>::const_iterator iterCand = signalObjectCandidate;
439 iterCand != sortedCands.end();
443 double outlierOpeningQuantity = outlierCollectionCalculator(axisVectorSoFar, (*iterCand)->momentum());
444 if (outlierOpeningQuantity > outlierCollectionComputedMaxSize)
break;
446 if ((*iterCand)->charge())
447 outlierChargedObjects.push_back(*iterCand);
449 outlierGammaObjects.push_back(*iterCand);
457 double myDiscriminator=0.;
458 if ((
int)
IsolPFCands_.size()<=IsolPFCands_maxN) myDiscriminator=1;
459 return myDiscriminator;
461 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){
462 double myDiscriminator=0.;
464 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
465 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
466 if(!myleadPFCand)
return myDiscriminator;
469 const std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
470 if ((
int)isolPFCands.size()<=IsolPFCands_maxN) myDiscriminator=1;
471 return myDiscriminator;
473 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){
474 double myDiscriminator=0;
476 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
477 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
478 if(!myleadPFCand)
return myDiscriminator;
481 const std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
482 if ((
int)isolPFCands.size()<=IsolPFCands_maxN) myDiscriminator=1;
483 return myDiscriminator;
486 double myDiscriminator=0.;
488 return myDiscriminator;
490 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){
491 double myDiscriminator=0.;
493 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
494 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
495 if(!myleadPFCand)
return myDiscriminator;
498 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
499 if ((
int)isolPFChargedHadrCands.size()<=IsolPFChargedHadrCands_maxN) myDiscriminator=1;
500 return myDiscriminator;
502 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){
503 double myDiscriminator=0;
505 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
506 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
507 if(!myleadPFCand)
return myDiscriminator;
510 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
511 if ((
int)isolPFChargedHadrCands.size()<=IsolPFChargedHadrCands_maxN) myDiscriminator=1;
512 return myDiscriminator;
515 double myDiscriminator=0.;
517 return myDiscriminator;
519 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){
520 double myDiscriminator=0.;
522 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
523 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
524 if(!myleadPFCand)
return myDiscriminator;
527 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
528 if ((
int)isolPFNeutrHadrCands.size()<=IsolPFNeutrHadrCands_maxN) myDiscriminator=1;
529 return myDiscriminator;
531 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){
532 double myDiscriminator=0;
534 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
535 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
536 if(!myleadPFCand)
return myDiscriminator;
539 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
540 if ((
int)isolPFNeutrHadrCands.size()<=IsolPFNeutrHadrCands_maxN) myDiscriminator=1;
541 return myDiscriminator;
544 double myDiscriminator=0.;
546 return myDiscriminator;
548 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){
549 double myDiscriminator=0.;
551 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
552 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
553 if(!myleadPFCand)
return myDiscriminator;
556 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
557 if ((
int)isolPFGammaCands.size()<=IsolPFGammaCands_maxN) myDiscriminator=1;
558 return myDiscriminator;
560 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){
561 double myDiscriminator=0;
563 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
564 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
565 if(!myleadPFCand)
return myDiscriminator;
568 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
569 if ((
int)isolPFGammaCands.size()<=IsolPFGammaCands_maxN) myDiscriminator=1;
570 return myDiscriminator;
573 double myIsolPFCandsEtSum=0.;
574 double myDiscriminator=0.;
575 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=
IsolPFCands_.begin();iPFCand!=
IsolPFCands_.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
576 if (myIsolPFCandsEtSum<=IsolPFCands_maxEtSum) myDiscriminator=1;
577 return myDiscriminator;
579 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){
580 double myIsolPFCandsEtSum=0.;
581 double myDiscriminator=0.;
583 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
584 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
585 if(!myleadPFCand)
return myDiscriminator;
588 std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
589 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFCands.begin();iPFCand!=isolPFCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
590 if (myIsolPFCandsEtSum<=IsolPFCands_maxEtSum) myDiscriminator=1;
591 return myDiscriminator;
593 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){
594 double myIsolPFCandsEtSum=0.;
595 double myDiscriminator=0;
597 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
598 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
599 if(!myleadPFCand)
return myDiscriminator;
602 std::vector<reco::PFCandidatePtr> isolPFCands=
PFCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
603 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFCands.begin();iPFCand!=isolPFCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
604 if (myIsolPFCandsEtSum<=IsolPFCands_maxEtSum) myDiscriminator=1;
605 return myDiscriminator;
608 double myIsolPFCandsEtSum=0.;
609 double myDiscriminator=0.;
611 if (myIsolPFCandsEtSum<=IsolPFChargedHadrCands_maxEtSum) myDiscriminator=1;
612 return myDiscriminator;
614 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){
615 double myIsolPFCandsEtSum=0.;
616 double myDiscriminator=0.;
618 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
619 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
620 if(!myleadPFCand)
return myDiscriminator;
623 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
624 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFChargedHadrCands.begin();iPFCand!=isolPFChargedHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
625 if (myIsolPFCandsEtSum<=IsolPFChargedHadrCands_maxEtSum) myDiscriminator=1;
626 return myDiscriminator;
628 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){
629 double myIsolPFCandsEtSum=0.;
630 double myDiscriminator=0;
632 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
633 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
634 if(!myleadPFCand)
return myDiscriminator;
637 std::vector<reco::PFCandidatePtr> isolPFChargedHadrCands=
PFChargedHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
638 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFChargedHadrCands.begin();iPFCand!=isolPFChargedHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
639 if (myIsolPFCandsEtSum<=IsolPFChargedHadrCands_maxEtSum) myDiscriminator=1;
640 return myDiscriminator;
643 double myIsolPFCandsEtSum=0.;
644 double myDiscriminator=0.;
646 if (myIsolPFCandsEtSum<=IsolPFNeutrHadrCands_maxEtSum) myDiscriminator=1;
647 return myDiscriminator;
649 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){
650 double myIsolPFCandsEtSum=0.;
651 double myDiscriminator=0.;
653 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
654 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
655 if(!myleadPFCand)
return myDiscriminator;
658 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
659 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFNeutrHadrCands.begin();iPFCand!=isolPFNeutrHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
660 if (myIsolPFCandsEtSum<=IsolPFNeutrHadrCands_maxEtSum) myDiscriminator=1;
661 return myDiscriminator;
663 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){
664 double myIsolPFCandsEtSum=0.;
665 double myDiscriminator=0;
667 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
668 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
669 if(!myleadPFCand)
return myDiscriminator;
672 std::vector<reco::PFCandidatePtr> isolPFNeutrHadrCands=
PFNeutrHadrCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
673 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFNeutrHadrCands.begin();iPFCand!=isolPFNeutrHadrCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
674 if (myIsolPFCandsEtSum<=IsolPFNeutrHadrCands_maxEtSum) myDiscriminator=1;
675 return myDiscriminator;
678 double myIsolPFCandsEtSum=0.;
679 double myDiscriminator=0.;
680 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=
IsolPFGammaCands_.begin();iPFCand!=
IsolPFGammaCands_.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
681 if (myIsolPFCandsEtSum<=IsolPFGammaCands_maxEtSum) myDiscriminator=1;
682 return myDiscriminator;
684 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){
685 double myIsolPFCandsEtSum=0.;
686 double myDiscriminator=0.;
688 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
689 else myleadPFCand=
leadPFCand(matchingcone_metric,matchingcone_size,minPt_leadPFCand);
690 if(!myleadPFCand)
return myDiscriminator;
691 if(signalcone_size>=isolcone_size)
return 1.;
693 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
694 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFGammaCands.begin();iPFCand!=isolPFGammaCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
695 if (myIsolPFCandsEtSum<=IsolPFGammaCands_maxEtSum) myDiscriminator=1;
696 return myDiscriminator;
698 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){
699 double myIsolPFCandsEtSum=0.;
700 double myDiscriminator=0;
702 if (useOnlyChargedHadrforleadPFCand) myleadPFCand=
leadPFChargedHadrCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
703 else myleadPFCand=
leadPFCand(myVector,matchingcone_metric,matchingcone_size,minPt_leadPFCand);
704 if(!myleadPFCand)
return myDiscriminator;
707 std::vector<reco::PFCandidatePtr> isolPFGammaCands=
PFGammaCandsInAnnulus(leadPFCand_XYZVector,signalcone_metric,signalcone_size,isolcone_metric,isolcone_size,minPt_PFCand);
708 for(std::vector<reco::PFCandidatePtr>::const_iterator iPFCand=isolPFGammaCands.begin();iPFCand!=isolPFGammaCands.end();iPFCand++) myIsolPFCandsEtSum+=(**iPFCand).et();
709 if (myIsolPFCandsEtSum<=IsolPFGammaCands_maxEtSum) myDiscriminator=1;
710 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_