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.GetValueFast(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.GetValueFast(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 " << (
Longptr_t)
this <<
", ";
231 if (this->GetParent() != NULL) os <<
" parent at addr: " << (
Longptr_t)this->GetParent();
232 if (this->GetLeft() != NULL) os <<
" left daughter at addr: " << (
Longptr_t)this->GetLeft();
233 if (this->GetRight() != NULL) os <<
" right daughter at addr: " << (
Longptr_t)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");
551 fgTmva_Version_Code = code;
559 return fgTmva_Version_Code;
char * Form(const char *fmt,...)
#define TMVA_VERSION(a, b, c)
virtual void AddContentToNode(std::stringstream &s) const
adding attributes to tree node (well, was used in BinarySearchTree, and somehow I guess someone progr...
DTNodeTrainingInfo * fTrainInfo
flag to set node as terminal (i.e., without deleting its descendants)
virtual ~DecisionTreeNode()
destructor
static void SetIsTraining(bool on)
void PrintPrune(std::ostream &os) const
printout of the node (can be read in with ReadDataRecord)
void PrintRecPrune(std::ostream &os) const
recursive printout of the node and its daughters
void SetFisherCoeff(Int_t ivar, Double_t coeff)
set fisher coefficients
static UInt_t fgTmva_Version_Code
virtual void SetLeft(Node *l)
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
void ClearNodeAndAllDaughters()
clear the nodes (their S/N, Nevents etc), just keep the structure of the tree
virtual Bool_t GoesLeft(const Event &) const
test event if it descends the tree at this node to the left
static void SetTmvaVersionCode(UInt_t code)
virtual void ReadContent(std::stringstream &s)
reading attributes from tree node (well, was used in BinarySearchTree, and somehow I guess someone pr...
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 Print(std::ostream &os) const
print the node
virtual Bool_t GoesRight(const Event &) const
test event if it descends the tree at this node to the right
DecisionTreeNode()
constructor of an essentially "empty" node floating in space
virtual void AddAttributesToNode(void *node) const
add attribute to xml
static UInt_t GetTmvaVersionCode()
virtual void ReadAttributes(void *node, UInt_t tmva_Version_Code=TMVA_VERSION_CODE)
void ResetValidationData()
temporary stored node values (number of events, etc.) that originate not from the training but from t...
virtual void PrintRec(std::ostream &os) const
recursively print the node and its daughters (--> print the 'tree')
virtual void SetRight(Node *r)
virtual Bool_t ReadDataRecord(std::istream &is, UInt_t tmva_Version_Code=TMVA_VERSION_CODE)
Read the data block.
virtual void SetParent(Node *p)
Float_t GetSampleMax(UInt_t ivar) const
return the maximum of variable ivar from the training sample that pass/end up in this node
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 SetSampleMin(UInt_t ivar, Float_t xmin)
set the minimum of variable ivar from the training sample that pass/end up in this node
ostringstream derivative to redirect and format output
Node for the BinarySearch or Decision Trees.
create variable transformations
MsgLogger & Endl(MsgLogger &ml)