119 fCutValue(
n.fCutValue ),
120 fCutType (
n.fCutType ),
121 fSelector(
n.fSelector ),
122 fResponse(
n.fResponse ),
124 fNodeType(
n.fNodeType ),
125 fPurity (
n.fPurity),
126 fIsTerminalNode(
n.fIsTerminalNode )
129 if (
n.GetLeft() == 0 ) this->
SetLeft(NULL);
132 if (
n.GetRight() == 0 ) this->
SetRight(NULL);
159 if (GetNFisherCoeff() == 0){
161 result = (
e.GetValue(this->GetSelector()) >= this->GetCutValue() );
165 Double_t fisher = this->GetFisherCoeff(fFisherCoeff.size()-1);
166 for (
UInt_t ivar=0; ivar<fFisherCoeff.size()-1; ivar++)
167 fisher += this->GetFisherCoeff(ivar)*(
e.GetValue(ivar));
169 result = fisher > this->GetCutValue();
172 if (fCutType ==
kTRUE)
return result;
181 if (!this->GoesRight(
e))
return kTRUE;
193 if ( ( this->GetNSigEvents() + this->GetNBkgEvents() ) > 0 ) {
194 fPurity = this->GetNSigEvents() / ( this->GetNSigEvents() + this->GetNBkgEvents());
197 Log() << kINFO <<
"Zero events in purity calculation , return purity=0.5" <<
Endl;
198 std::ostringstream oss;
211 os <<
"< *** " << std::endl;
212 os <<
" d: " << this->GetDepth()
213 << std::setprecision(6)
214 <<
"NCoef: " << this->GetNFisherCoeff();
215 for (
Int_t i=0; i< (
Int_t) this->GetNFisherCoeff(); i++) { os <<
"fC"<<i<<
": " << this->GetFisherCoeff(i);}
216 os <<
" ivar: " << this->GetSelector()
217 <<
" cut: " << this->GetCutValue()
218 <<
" cType: " << this->GetCutType()
219 <<
" s: " << this->GetNSigEvents()
220 <<
" b: " << this->GetNBkgEvents()
221 <<
" nEv: " << this->GetNEvents()
222 <<
" suw: " << this->GetNSigEvents_unweighted()
223 <<
" buw: " << this->GetNBkgEvents_unweighted()
224 <<
" nEvuw: " << this->GetNEvents_unweighted()
225 <<
" sepI: " << this->GetSeparationIndex()
226 <<
" sepG: " << this->GetSeparationGain()
227 <<
" nType: " << this->GetNodeType()
230 os <<
"My address is " << long(
this) <<
", ";
231 if (this->GetParent() != NULL) os <<
" parent at addr: " << long(this->GetParent()) ;
232 if (this->GetLeft() != NULL) os <<
" left daughter at addr: " << long(this->GetLeft());
233 if (this->GetRight() != NULL) os <<
" right daughter at addr: " << long(this->GetRight()) ;
235 os <<
" **** > " << std::endl;
243 os << this->GetDepth()
244 << std::setprecision(6)
245 <<
" " << this->GetPos()
246 <<
"NCoef: " << this->GetNFisherCoeff();
247 for (
Int_t i=0; i< (
Int_t) this->GetNFisherCoeff(); i++) {os <<
"fC"<<i<<
": " << this->GetFisherCoeff(i);}
248 os <<
" ivar: " << this->GetSelector()
249 <<
" cut: " << this->GetCutValue()
250 <<
" cType: " << this->GetCutType()
251 <<
" s: " << this->GetNSigEvents()
252 <<
" b: " << this->GetNBkgEvents()
253 <<
" nEv: " << this->GetNEvents()
254 <<
" suw: " << this->GetNSigEvents_unweighted()
255 <<
" buw: " << this->GetNBkgEvents_unweighted()
256 <<
" nEvuw: " << this->GetNEvents_unweighted()
257 <<
" sepI: " << this->GetSeparationIndex()
258 <<
" sepG: " << this->GetSeparationGain()
259 <<
" res: " << this->GetResponse()
260 <<
" rms: " << this->GetRMS()
261 <<
" nType: " << this->GetNodeType();
262 if (this->GetCC() > 10000000000000.) os <<
" CC: " << 100000. << std::endl;
263 else os <<
" CC: " << this->GetCC() << std::endl;
265 if (this->GetLeft() != NULL) this->GetLeft() ->PrintRec(os);
266 if (this->GetRight() != NULL) this->GetRight()->PrintRec(os);
274 fgTmva_Version_Code=tmva_Version_Code;
277 Float_t cutVal, cutType, nsig, nbkg, nEv, nsig_unweighted, nbkg_unweighted, nEv_unweighted;
278 Float_t separationIndex, separationGain, response(-99), cc(0);
279 Int_t depth, ivar, nodeType;
284 if ( depth==-1 ) {
return kFALSE; }
287 this->SetDepth(depth);
298 >> tmp >> nsig_unweighted
299 >> tmp >> nbkg_unweighted
300 >> tmp >> nEv_unweighted
301 >> tmp >> separationIndex
302 >> tmp >> separationGain
312 >> tmp >> nsig_unweighted
313 >> tmp >> nbkg_unweighted
314 >> tmp >> nEv_unweighted
315 >> tmp >> separationIndex
316 >> tmp >> separationGain
322 this->SetSelector((
UInt_t)ivar);
323 this->SetCutValue(cutVal);
324 this->SetCutType(cutType);
325 this->SetNodeType(nodeType);
327 this->SetNSigEvents(nsig);
328 this->SetNBkgEvents(nbkg);
329 this->SetNEvents(nEv);
330 this->SetNSigEvents_unweighted(nsig_unweighted);
331 this->SetNBkgEvents_unweighted(nbkg_unweighted);
332 this->SetNEvents_unweighted(nEv_unweighted);
333 this->SetSeparationIndex(separationIndex);
334 this->SetSeparationGain(separationGain);
351 SetNSigEvents_unweighted(0);
352 SetNBkgEvents_unweighted(0);
353 SetNEvents_unweighted(0);
354 SetSeparationIndex(-1);
355 SetSeparationGain(-1);
358 if (this->GetLeft() != NULL) ((
DecisionTreeNode*)(this->GetLeft()))->ClearNodeAndAllDaughters();
359 if (this->GetRight() != NULL) ((
DecisionTreeNode*)(this->GetRight()))->ClearNodeAndAllDaughters();
367 SetNBValidation( 0.0 );
368 SetNSValidation( 0.0 );
372 if(GetLeft() != NULL && GetRight() != NULL) {
373 GetLeft()->ResetValidationData();
374 GetRight()->ResetValidationData();
382 os <<
"----------------------" << std::endl
383 <<
"|~T_t| " << GetNTerminal() << std::endl
384 <<
"R(t): " << GetNodeR() << std::endl
385 <<
"R(T_t): " << GetSubTreeR() << std::endl
386 <<
"g(t): " << GetAlpha() << std::endl
387 <<
"G(t): " << GetAlphaMinSubtree() << std::endl;
394 this->PrintPrune(os);
395 if(this->GetLeft() != NULL && this->GetRight() != NULL) {
405 if (fTrainInfo) fTrainInfo->fCC = cc;
406 else Log() << kFATAL <<
"call to SetCC without trainingInfo" <<
Endl;
414 if (fTrainInfo && ivar < fTrainInfo->fSampleMin.size())
return fTrainInfo->fSampleMin[ivar];
415 else Log() << kFATAL <<
"You asked for Min of the event sample in node for variable " 416 << ivar <<
" that is out of range" <<
Endl;
425 if (fTrainInfo && ivar < fTrainInfo->fSampleMin.size())
return fTrainInfo->fSampleMax[ivar];
426 else Log() << kFATAL <<
"You asked for Max of the event sample in node for variable " 427 << ivar <<
" that is out of range" <<
Endl;
437 if ( ivar >= fTrainInfo->fSampleMin.size()) fTrainInfo->fSampleMin.resize(ivar+1);
438 fTrainInfo->fSampleMin[ivar]=
xmin;
447 if( ! fTrainInfo )
return;
448 if ( ivar >= fTrainInfo->fSampleMax.size() )
449 fTrainInfo->fSampleMax.resize(ivar+1);
450 fTrainInfo->fSampleMax[ivar]=
xmax;
457 Float_t tempNSigEvents,tempNBkgEvents;
460 if (
gTools().HasAttr(node,
"NCoef")){
462 this->SetNFisherCoeff(nCoef);
464 for (
Int_t i=0; i< (
Int_t) this->GetNFisherCoeff(); i++) {
466 this->SetFisherCoeff(i,tmp);
469 this->SetNFisherCoeff(0);
477 if(
gTools().HasAttr(node,
"purity") ) {
482 fPurity = tempNSigEvents / (tempNSigEvents + tempNBkgEvents);
495 for (
Int_t i=0; i< (
Int_t) this->GetNFisherCoeff(); i++)
517 if ((
Int_t) fFisherCoeff.size()<ivar+1) fFisherCoeff.resize(ivar+1) ;
518 fFisherCoeff[ivar]=coeff;
541 TTHREAD_TLS_DECL_ARG(
MsgLogger,logger,
"DecisionTreeNode");
virtual void ReadAttributes(void *node, UInt_t tmva_Version_Code=TMVA_VERSION_CODE)
DTNodeTrainingInfo * fTrainInfo
flag to set node as terminal (i.e., without deleting its descendants)
virtual void AddAttributesToNode(void *node) const
add attribute to xml
MsgLogger & Endl(MsgLogger &ml)
void SetFisherCoeff(Int_t ivar, Double_t coeff)
set fisher coefficients
virtual Bool_t GoesLeft(const Event &) const
test event if it descends the tree at this node to the left
virtual void Print(std::ostream &os) const
print the node
virtual void PrintRec(std::ostream &os) const
recursively print the node and its daughters (–> print the 'tree')
virtual void ReadContent(std::stringstream &s)
reading attributes from tree node (well, was used in BinarySearchTree, and somehow I guess someone pr...
void PrintPrune(std::ostream &os) const
printout of the node (can be read in with ReadDataRecord)
Float_t GetSampleMax(UInt_t ivar) const
return the maximum of variable ivar from the training sample that pass/end up in this node ...
DecisionTreeNode()
constructor of an essentially "empty" node floating in space
virtual void SetRight(Node *r)
Float_t GetSampleMin(UInt_t ivar) const
return the minimum of variable ivar from the training sample that pass/end up in this node ...
void ResetValidationData()
temporary stored node values (number of events, etc.) that originate not from the training but from t...
virtual void AddContentToNode(std::stringstream &s) const
adding attributes to tree node (well, was used in BinarySearchTree, and somehow I guess someone progr...
virtual void SetLeft(Node *l)
void SetSampleMin(UInt_t ivar, Float_t xmin)
set the minimum of variable ivar from the training sample that pass/end up in this node ...
char * Form(const char *fmt,...)
void SetPurity(void)
return the S/(S+B) (purity) for the node REM: even if nodes with purity 0.01 are very PURE background...
virtual void SetParent(Node *p)
void SetSampleMax(UInt_t ivar, Float_t xmax)
set the maximum of variable ivar from the training sample that pass/end up in this node ...
#define TMVA_VERSION(a, b, c)
static UInt_t fgTmva_Version_Code
virtual Bool_t GoesRight(const Event &) const
test event if it descends the tree at this node to the right
void Print(std::ostream &os, const OptionType &opt)
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
void PrintRecPrune(std::ostream &os) const
recursive printout of the node and its daughters
ostringstream derivative to redirect and format output
Abstract ClassifierFactory template that handles arbitrary types.
Node for the BinarySearch or Decision Trees.
virtual Bool_t ReadDataRecord(std::istream &is, UInt_t tmva_Version_Code=TMVA_VERSION_CODE)
Read the data block.
void ClearNodeAndAllDaughters()
clear the nodes (their S/N, Nevents etc), just keep the structure of the tree
virtual ~DecisionTreeNode()
destructor