3 namespace PFTauDiscriminants
15 currentTauDecayMode_ =
NULL;
25 edm::LogError(
"PFTauDiscriminantManager") <<
"Error adding a discriminant, null pointer!";
28 string discriminantName = discriminant->
name();
29 myDiscriminants_.insert(make_pair(discriminantName, discriminant));
36 signalObjectsSortedByPt_.clear();
37 signalObjectsSortedByDR_.clear();
38 outlierObjectsSortedByPt_.clear();
39 outlierObjectsSortedByDR_.clear();
45 currentTauDecayMode_ = &theTau;
52 for(discriminantHolder::iterator aDiscriminant = myDiscriminants_.begin();
53 aDiscriminant != myDiscriminants_.end();
59 string theName = aDiscriminant->first;
60 edm::LogError(
"PFTauDiscriminantManager") <<
"Error filling discriminant " << theName <<
", null pointer!";
78 currentTauDecayMode_ =
NULL;
85 for(discriminantHolder::iterator aDiscriminant = myDiscriminants_.begin();
86 aDiscriminant != myDiscriminants_.end();
92 string theName = aDiscriminant->first;
93 edm::LogError(
"PFTauDiscriminantManager") <<
"Error filling discriminant " << theName <<
", null pointer!";
106 if (currentTauDecayMode_ ==
NULL)
108 edm::LogError(
"PFTauDiscriminantManager") <<
"Trying to get signal objects from null PFTauDecayMode object! Returning empty vector...";
111 candPtrVector tempChargedVector = currentTauDecayMode_->chargedPionCandidates();
112 candPtrVector tempNeutralVector = currentTauDecayMode_->neutralPionCandidates();
113 toFill.insert(toFill.end(), tempChargedVector.begin(), tempChargedVector.end());
114 toFill.insert(toFill.end(), tempNeutralVector.begin(), tempNeutralVector.end());
120 if (currentTauDecayMode_ ==
NULL)
122 edm::LogError(
"PFTauDiscriminantManager") <<
"Trying to get QCD objects from null PFTauDecayMode object! Returning empty vector...";
131 iFilteredCand != theFilteredObjects.
end();
137 toFill.push_back(castedCand);
141 const PFTau* originalTau = currentTauDecayMode_->pfTauRef().
get();
146 iIsoCand != theOutliers.
end();
152 toFill.push_back(castedCand);
160 if (mainTrack_ ==
NULL)
162 if (!this->getDecayMode())
164 edm::LogError(
"PFTauDiscriminantManager") <<
"In ::mainTrack(), trying to access a null PFTauDecayMode - returning null pointer for main track";
168 std::vector<const reco::Candidate*> myChargedCandidates = getDecayMode()->chargedPionCandidates();
169 size_t nTracks = myChargedCandidates.size();
179 sort(myChargedCandidates.begin(), myChargedCandidates.end(), ptSorter);
180 size_t maxTracks = (nTracks > 3) ? 3 : nTracks;
184 mainTrack_ = myChargedCandidates[0];
187 for(
size_t iTrack = 0; iTrack < maxTracks; ++iTrack)
188 charge += myChargedCandidates[iTrack]->
charge();
190 for(
size_t iTrack = 0; iTrack < maxTracks; ++iTrack)
192 int currentCharge = myChargedCandidates[iTrack]->charge();
193 if (currentCharge != charge)
195 mainTrack_ = myChargedCandidates[iTrack];
210 for(candPtrVector::const_iterator iCandidate = input.begin();
211 iCandidate != input.end();
214 bool chargeType = (*iCandidate)->charge();
215 if( chargeType == isCharged )
216 output.push_back(*iCandidate);
221 const std::vector<const reco::Candidate*>&
225 if(!signalObjectsSortedByPt_.empty() || iAmNull_)
227 return signalObjectsSortedByPt_;
232 fillSignalObjects(signalObjectsSortedByPt_);
233 sort(signalObjectsSortedByPt_.begin(), signalObjectsSortedByPt_.end(), mySorter);
235 return signalObjectsSortedByPt_;
238 const std::vector<const reco::Candidate*>&
242 if(!signalObjectsSortedByDR_.empty() || iAmNull_)
244 return signalObjectsSortedByDR_;
248 if (currentTauDecayMode_ ==
NULL)
250 edm::LogError(
"PFTauDiscriminantManager") <<
"Trying to get signal objects from null PFTauDecayMode object! Returning empty vector...";
251 return signalObjectsSortedByDR_;
255 fillSignalObjects(signalObjectsSortedByDR_);
256 sort(signalObjectsSortedByDR_.begin(), signalObjectsSortedByDR_.end(), mySorter);
258 return signalObjectsSortedByDR_;
261 const std::vector<const reco::Candidate*>&
264 if(!outlierObjectsSortedByPt_.empty() || iAmNull_)
266 return outlierObjectsSortedByPt_;
270 fillOutlierObjects(outlierObjectsSortedByPt_);
272 sort(outlierObjectsSortedByPt_.begin(), outlierObjectsSortedByPt_.end(), mySorter);
274 return outlierObjectsSortedByPt_;
277 const std::vector<const reco::Candidate*>&
280 if(!outlierObjectsSortedByDR_.empty() || iAmNull_)
282 return outlierObjectsSortedByDR_;
286 if (currentTauDecayMode_ ==
NULL)
288 edm::LogError(
"PFTauDiscriminantManager") <<
"Trying to get outlier objects from null PFTauDecayMode object! Returning empty vector...";
289 return outlierObjectsSortedByDR_;
292 fillOutlierObjects(outlierObjectsSortedByDR_);
294 sort(outlierObjectsSortedByDR_.begin(), outlierObjectsSortedByDR_.end(), mySorter);
296 return outlierObjectsSortedByDR_;
305 edm::LogError(
"PFTauDiscriminantManager") <<
"Error: trying to branch ttree - TTree pointer is null!";
311 treeToBranch->Branch(
"__TARGET__", &iAmSignal_,
"__TARGET__/O");
313 treeToBranch->Branch(
"__WEIGHT__", &eventWeight_,
"__WEIGHT__/D");
316 treeToBranch->Branch(
"__ISNULL__", &iAmNull_,
"__ISNULL__/O");
317 treeToBranch->Branch(
"__PREPASS__", &prePass_,
"__PREPASS__/O");
318 treeToBranch->Branch(
"__PREFAIL__", &preFail_,
"__PREFAIL__/O");
321 for(discriminantHolder::iterator iVariable = myDiscriminants_.begin();
322 iVariable != myDiscriminants_.end();
326 edm::LogInfo(
"PFTauDiscriminantManager") <<
"Branching for discriminant w/ name: " << theDiscriminant->
name();
335 for(discriminantHolder::iterator iVariable = myDiscriminants_.begin();
336 iVariable != myDiscriminants_.end();
340 theDiscriminant->
fillMVA(toFill);
344 vector<const reco::Candidate*>
347 std::vector<const reco::Candidate*>
output;
355 output.push_back(input);
358 for(
size_t iDaughter = 0; iDaughter < nDaughters; ++iDaughter)
360 std::vector<const reco::Candidate*> leafsOnThisBranch = getLeafDaughters(input->
daughter(iDaughter));
361 output.insert(output.end(), leafsOnThisBranch.begin(), leafsOnThisBranch.end());
virtual const Candidate * daughter(size_type i) const =0
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
const PFCandidateRefVector & isolationPFCands() const
PFCandidates in isolation region.
void addDiscriminant(Discriminant *const aDiscriminant)
add a discriminant
~PFTauDiscriminantManager()
bool setTau(const reco::PFTauDecayMode &theTau, bool prePass=false, bool preFail=false)
set objects for this discriminant
void fillOutlierObjects(candPtrVector &input)
static std::vector< const reco::Candidate * > getLeafDaughters(const reco::Candidate *input)
return the lowest level constituent candidates of a composite candidate
const std::vector< const reco::Candidate * > & outlierObjectsSortedByPt()
const_iterator end() const
Termination of iteration.
const_iterator begin() const
Initialize an iterator over the RefVector.
const std::vector< const reco::Candidate * > & outlierObjectsSortedByDR()
virtual size_type numberOfDaughters() const =0
number of daughters
void setEvent(const edm::Event &, double eventWeight)
set the current event. Must be called (once per event) before setTau or setNullResult ...
virtual void fillMVA(std::vector< PhysicsTools::Variable::Value > &mvaHolder) const =0
T get() const
get a component
const std::vector< const reco::Candidate * > & signalObjectsSortedByPt()
accessed by Discriminant classes (caches to prevent multiple sorts)
virtual void compute(PFTauDiscriminantManager *input)=0
const reco::Candidate * mainTrack()
get the 'main' track (track computed for relevancy to tau decay resonances) (ie pi- in pi+pi+pi-) ...
const std::vector< const reco::Candidate * > & signalObjectsSortedByDR()
std::vector< const reco::Candidate * > candPtrVector
virtual void branchTree(TTree *theTree)=0
add a branch to a ttree corresponding to this variable
bool branchTree(TTree *const treeToBranch, bool addTargetBranch=false, bool addWeightBranch=false)
add a set of branches ot the TTree
PFTauDiscriminantManager()
XYZVectorD XYZVector
spatial vector with cartesian internal representation
void fillSignalObjects(candPtrVector &input)
std::vector< const reco::Candidate * > candPtrVector
Particle reconstructed by the particle flow algorithm.
candPtrVector filterByCharge(const candPtrVector &input, bool isCharged) const
virtual void setNullResult(PFTauDiscriminantManager *input)=0
void buildMVAComputerLink(std::vector< PhysicsTools::Variable::Value > &)
connect to an MVA computer