CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
Tree Class Reference

#include <Tree.h>

Public Member Functions

void addXMLAttributes (TXMLEngine *xml, Node *node, XMLNodePointer_t np)
 
void buildTree (Int_t nodeLimit)
 
void calcError ()
 
void filterEvents (std::vector< Event * > &tEvents)
 
void filterEventsRecursive (Node *node)
 
Int_t getNumTerminalNodes ()
 
NodegetRootNode ()
 
std::list< Node * > & getTerminalNodes ()
 
void loadFromXML (const char *filename)
 
void loadFromXMLRecursive (TXMLEngine *xml, XMLNodePointer_t node, Node *tnode)
 
void rankVariables (std::vector< Double_t > &v)
 
void rankVariablesRecursive (Node *node, std::vector< Double_t > &v)
 
void saveToXML (const char *filename)
 
void saveToXMLRecursive (TXMLEngine *xml, Node *node, XMLNodePointer_t np)
 
void setRootNode (Node *sRootNode)
 
void setTerminalNodes (std::list< Node * > &sTNodes)
 
 Tree ()
 
 Tree (std::vector< std::vector< Event * > > &cEvents)
 
 ~Tree ()
 

Private Attributes

Int_t numTerminalNodes
 
Double_t rmsError
 
NoderootNode
 
std::list< Node * > terminalNodes
 

Detailed Description

Definition at line 16 of file Tree.h.

Constructor & Destructor Documentation

Tree::Tree ( )

Definition at line 26 of file Tree.cc.

References numTerminalNodes, rootNode, and terminalNodes.

27 {
28  rootNode = new Node("root");
29 
30  terminalNodes.push_back(rootNode);
31  numTerminalNodes = 1;
32 }
std::list< Node * > terminalNodes
Definition: Tree.h:48
Int_t numTerminalNodes
Definition: Tree.h:49
Node * rootNode
Definition: Tree.h:47
edm::TrieNode< PDet > Node
Tree::Tree ( std::vector< std::vector< Event * > > &  cEvents)

Definition at line 34 of file Tree.cc.

References numTerminalNodes, rootNode, Node::setEvents(), and terminalNodes.

35 {
36  rootNode = new Node("root");
37  rootNode->setEvents(cEvents);
38 
39  terminalNodes.push_back(rootNode);
40  numTerminalNodes = 1;
41 }
std::list< Node * > terminalNodes
Definition: Tree.h:48
void setEvents(std::vector< std::vector< Event * > > &sEvents)
Definition: Node.cc:201
Int_t numTerminalNodes
Definition: Tree.h:49
Node * rootNode
Definition: Tree.h:47
edm::TrieNode< PDet > Node
Tree::~Tree ( )

Definition at line 47 of file Tree.cc.

References rootNode.

48 {
49 // When the tree is destroyed it will delete all of the nodes in the tree.
50 // The deletion begins with the rootnode and continues recursively.yea.
51  delete rootNode;
52 }
Node * rootNode
Definition: Tree.h:47

Member Function Documentation

void Tree::addXMLAttributes ( TXMLEngine *  xml,
Node node,
XMLNodePointer_t  np 
)

Definition at line 244 of file Tree.cc.

References Node::getFitValue(), Node::getSplitValue(), Node::getSplitVariable(), and numToStr().

Referenced by saveToXML(), and saveToXMLRecursive().

245 {
246  // Convert Node members into XML attributes
247  // and add them to the XMLEngine.
248  xml->NewAttr(np, 0, "splitVar", numToStr(node->getSplitVariable()).c_str());
249  xml->NewAttr(np, 0, "splitVal", numToStr(node->getSplitValue()).c_str());
250  xml->NewAttr(np, 0, "fitVal", numToStr(node->getFitValue()).c_str());
251 }
Double_t getFitValue()
Definition: Node.cc:155
Double_t getSplitValue()
Definition: Node.cc:133
int np
Definition: AMPTWrapper.h:33
Int_t getSplitVariable()
Definition: Node.cc:143
std::string numToStr(T num)
Definition: Utilities.h:43
void Tree::buildTree ( Int_t  nodeLimit)

Definition at line 107 of file Tree.cc.

References calcError(), Node::calcOptimumSplit(), Node::filterEventsToDaughters(), Node::getLeftDaughter(), Node::getRightDaughter(), numTerminalNodes, rootNode, terminalNodes, and Node::theMiracleOfChildBirth().

Referenced by Forest::doRegression().

108 {
109  // We greedily pick the best terminal node to split.
110  Double_t bestNodeErrorReduction = -1;
111  Node* nodeToSplit;
112 
113  if(numTerminalNodes == 1)
114  {
116  calcError();
117 // std::cout << std::endl << " " << numTerminalNodes << " Nodes : " << rmsError << std::endl;
118  }
119 
120  for(std::list<Node*>::iterator it=terminalNodes.begin(); it!=terminalNodes.end(); it++)
121  {
122  if( (*it)->getErrorReduction() > bestNodeErrorReduction )
123  {
124  bestNodeErrorReduction = (*it)->getErrorReduction();
125  nodeToSplit = (*it);
126  }
127  }
128 
129  // Create daughter nodes, and link the nodes together appropriately.
130  nodeToSplit->theMiracleOfChildBirth();
131 
132  // Get left and right daughters for reference.
133  Node* left = nodeToSplit->getLeftDaughter();
134  Node* right = nodeToSplit->getRightDaughter();
135 
136  // Update the list of terminal nodes.
137  terminalNodes.remove(nodeToSplit);
138  terminalNodes.push_back(left);
139  terminalNodes.push_back(right);
141 
142  // Filter the events from the parent into the daughters.
143  nodeToSplit->filterEventsToDaughters();
144 
145  // Calculate the best splits for the new nodes.
146  left->calcOptimumSplit();
147  right->calcOptimumSplit();
148 
149  // See if the error reduces as we add more nodes.
150  calcError();
151 
152  if(numTerminalNodes % 1 == 0)
153  {
154 // std::cout << " " << numTerminalNodes << " Nodes : " << rmsError << std::endl;
155  }
156 
157  // Repeat until done.
158  if(numTerminalNodes < nodeLimit) buildTree(nodeLimit);
159 }
Definition: Node.h:10
Node * getLeftDaughter()
Definition: Node.cc:99
std::list< Node * > terminalNodes
Definition: Tree.h:48
void buildTree(Int_t nodeLimit)
Definition: Tree.cc:107
void theMiracleOfChildBirth()
Definition: Node.cc:329
Node * getRightDaughter()
Definition: Node.cc:109
void filterEventsToDaughters()
Definition: Node.cc:344
Int_t numTerminalNodes
Definition: Tree.h:49
Node * rootNode
Definition: Tree.h:47
void calcError()
Definition: Tree.cc:91
void calcOptimumSplit()
Definition: Node.cc:210
void Tree::calcError ( )

Definition at line 91 of file Tree.cc.

References Node::getNumEvents(), rmsError, rootNode, mathSSE::sqrt(), and terminalNodes.

Referenced by buildTree().

92 {
93 // Loop through the separate predictive regions (terminal nodes) and
94 // add up the errors to get the error of the entire space.
95 
96  Double_t totalSquaredError = 0;
97 
98  for(std::list<Node*>::iterator it=terminalNodes.begin(); it!=terminalNodes.end(); it++)
99  {
100  totalSquaredError += (*it)->getTotalError();
101  }
102  rmsError = sqrt( totalSquaredError/rootNode->getNumEvents() );
103 }
Int_t getNumEvents()
Definition: Node.cc:189
std::list< Node * > terminalNodes
Definition: Tree.h:48
T sqrt(T t)
Definition: SSEVec.h:18
Double_t rmsError
Definition: Tree.h:50
Node * rootNode
Definition: Tree.h:47
void Tree::filterEvents ( std::vector< Event * > &  tEvents)

Definition at line 163 of file Tree.cc.

References filterEventsRecursive(), Node::getEvents(), and rootNode.

Referenced by Forest::appendCorrection().

164 {
165 // Use trees which have already been built to fit a bunch of events
166 // given by the tEvents vector.
167 
168  // Set the events to be filtered.
169  rootNode->getEvents() = std::vector< std::vector<Event*> >(1);
170  rootNode->getEvents()[0] = tEvents;
171 
172  // The tree now knows about the events it needs to fit.
173  // Filter them into a predictive region (terminal node).
175 }
void filterEventsRecursive(Node *node)
Definition: Tree.cc:179
std::vector< std::vector< Event * > > & getEvents()
Definition: Node.cc:196
Node * rootNode
Definition: Tree.h:47
void Tree::filterEventsRecursive ( Node node)

Definition at line 179 of file Tree.cc.

References Node::filterEventsToDaughters(), Node::getLeftDaughter(), and Node::getRightDaughter().

Referenced by filterEvents().

180 {
181 // Filter the events repeatedly into the daughter nodes until they
182 // fall into a terminal node.
183 
184  Node* left = node->getLeftDaughter();
185  Node* right = node->getRightDaughter();
186 
187  if(left == 0 || right == 0) return;
188 
189  node->filterEventsToDaughters();
190 
191  filterEventsRecursive(left);
192  filterEventsRecursive(right);
193 }
void filterEventsRecursive(Node *node)
Definition: Tree.cc:179
Definition: Node.h:10
Node * getLeftDaughter()
Definition: Node.cc:99
Node * getRightDaughter()
Definition: Node.cc:109
void filterEventsToDaughters()
Definition: Node.cc:344
Int_t Tree::getNumTerminalNodes ( )

Definition at line 82 of file Tree.cc.

References numTerminalNodes.

83 {
84  return numTerminalNodes;
85 }
Int_t numTerminalNodes
Definition: Tree.h:49
Node * Tree::getRootNode ( )

Definition at line 63 of file Tree.cc.

References rootNode.

64 {
65  return rootNode;
66 }
Node * rootNode
Definition: Tree.h:47
std::list< Node * > & Tree::getTerminalNodes ( )

Definition at line 75 of file Tree.cc.

References terminalNodes.

Referenced by Forest::updateEvents(), and Forest::updateRegTargets().

76 {
77  return terminalNodes;
78 }
std::list< Node * > terminalNodes
Definition: Tree.h:48
void Tree::loadFromXML ( const char *  filename)

Definition at line 303 of file Tree.cc.

References loadFromXMLRecursive(), rootNode, and ExtractAppInfoFromXML::xmldoc.

304 {
305  // First create the engine.
306  TXMLEngine* xml = new TXMLEngine();
307 
308  // Now try to parse xml file.
309  XMLDocPointer_t xmldoc = xml->ParseFile(filename);
310  if (xmldoc==0)
311  {
312  delete xml;
313  return;
314  }
315 
316  // Get access to main node of the xml file.
317  XMLNodePointer_t mainnode = xml->DocGetRootElement(xmldoc);
318 
319  // Recursively connect nodes together.
320  loadFromXMLRecursive(xml, mainnode, rootNode);
321 
322  // Release memory before exit
323  xml->FreeDoc(xmldoc);
324  delete xml;
325 }
string xmldoc
Some module&#39;s global variables.
tuple filename
Definition: lut2db_cfg.py:20
Node * rootNode
Definition: Tree.h:47
void loadFromXMLRecursive(TXMLEngine *xml, XMLNodePointer_t node, Node *tnode)
Definition: Tree.cc:329
void Tree::loadFromXMLRecursive ( TXMLEngine *  xml,
XMLNodePointer_t  node,
Node tnode 
)

Definition at line 329 of file Tree.cc.

References Node::getLeftDaughter(), Node::getRightDaughter(), i, numTerminalNodes, Node::setFitValue(), Node::setSplitValue(), Node::setSplitVariable(), terminalNodes, and Node::theMiracleOfChildBirth().

Referenced by loadFromXML().

330 {
331 
332  // Get the split information from xml.
333  XMLAttrPointer_t attr = xml->GetFirstAttr(xnode);
334  std::vector<std::string> splitInfo(3);
335  for(unsigned int i=0; i<3; i++)
336  {
337  splitInfo[i] = xml->GetAttrValue(attr);
338  attr = xml->GetNextAttr(attr);
339  }
340 
341  // Convert strings into numbers.
342  std::stringstream converter;
343  Int_t splitVar;
344  Double_t splitVal;
345  Double_t fitVal;
346 
347  converter << splitInfo[0];
348  converter >> splitVar;
349  converter.str("");
350  converter.clear();
351 
352  converter << splitInfo[1];
353  converter >> splitVal;
354  converter.str("");
355  converter.clear();
356 
357  converter << splitInfo[2];
358  converter >> fitVal;
359  converter.str("");
360  converter.clear();
361 
362  // Store gathered splitInfo into the node object.
363  tnode->setSplitVariable(splitVar);
364  tnode->setSplitValue(splitVal);
365  tnode->setFitValue(fitVal);
366 
367  // Get the xml daughters of the current xml node.
368  XMLNodePointer_t xleft = xml->GetChild(xnode);
369  XMLNodePointer_t xright = xml->GetNext(xleft);
370 
371  // If there are no daughters we are done.
372  if(xleft == 0 || xright == 0) return;
373 
374  // If there are daughters link the node objects appropriately.
375  tnode->theMiracleOfChildBirth();
376  Node* tleft = tnode->getLeftDaughter();
377  Node* tright = tnode->getRightDaughter();
378 
379  // Update the list of terminal nodes.
380  terminalNodes.remove(tnode);
381  terminalNodes.push_back(tleft);
382  terminalNodes.push_back(tright);
384 
385  loadFromXMLRecursive(xml, xleft, tleft);
386  loadFromXMLRecursive(xml, xright, tright);
387 }
int i
Definition: DBlmapReader.cc:9
Definition: Node.h:10
Node * getLeftDaughter()
Definition: Node.cc:99
void setSplitValue(Double_t sSplitValue)
Definition: Node.cc:128
std::list< Node * > terminalNodes
Definition: Tree.h:48
void theMiracleOfChildBirth()
Definition: Node.cc:329
Node * getRightDaughter()
Definition: Node.cc:109
void setFitValue(Double_t sFitValue)
Definition: Node.cc:150
Int_t numTerminalNodes
Definition: Tree.h:49
void setSplitVariable(Int_t sSplitVar)
Definition: Node.cc:138
void loadFromXMLRecursive(TXMLEngine *xml, XMLNodePointer_t node, Node *tnode)
Definition: Tree.cc:329
void Tree::rankVariables ( std::vector< Double_t > &  v)

Definition at line 223 of file Tree.cc.

References rankVariablesRecursive(), and rootNode.

224 {
226 }
void rankVariablesRecursive(Node *node, std::vector< Double_t > &v)
Definition: Tree.cc:198
Node * rootNode
Definition: Tree.h:47
void Tree::rankVariablesRecursive ( Node node,
std::vector< Double_t > &  v 
)

Definition at line 198 of file Tree.cc.

References Node::getErrorReduction(), Node::getLeftDaughter(), Node::getRightDaughter(), and Node::getSplitVariable().

Referenced by rankVariables().

199 {
200 // We recursively go through all of the nodes in the tree and find the
201 // total error reduction for each variable. The one with the most
202 // error reduction should be the most important.
203 
204  Node* left = node->getLeftDaughter();
205  Node* right = node->getRightDaughter();
206 
207  if(left==0 || right==0) return;
208 
209  Int_t sv = node->getSplitVariable();
210  Double_t er = node->getErrorReduction();
211 
212  // Add error reduction to the current total for the appropriate
213  // variable.
214  v[sv] += er;
215 
216  rankVariablesRecursive(left, v);
217  rankVariablesRecursive(right, v);
218 
219 }
Definition: Node.h:10
Node * getLeftDaughter()
Definition: Node.cc:99
void rankVariablesRecursive(Node *node, std::vector< Double_t > &v)
Definition: Tree.cc:198
Node * getRightDaughter()
Definition: Node.cc:109
Int_t getSplitVariable()
Definition: Node.cc:143
Double_t getErrorReduction()
Definition: Node.cc:87
void Tree::saveToXML ( const char *  filename)

Definition at line 255 of file Tree.cc.

References addXMLAttributes(), Node::getName(), pyrootRender::root, rootNode, saveToXMLRecursive(), and ExtractAppInfoFromXML::xmldoc.

Referenced by Forest::doRegression().

256 {
257 
258  TXMLEngine* xml = new TXMLEngine();
259 
260  // Add the root node.
261  XMLNodePointer_t root = xml->NewChild(0, 0, rootNode->getName().c_str());
262  addXMLAttributes(xml, rootNode, root);
263 
264  // Recursively write the tree to XML.
265  saveToXMLRecursive(xml, rootNode, root);
266 
267  // Make the XML Document.
268  XMLDocPointer_t xmldoc = xml->NewDoc();
269  xml->DocSetRootElement(xmldoc, root);
270 
271  // Save to file.
272  xml->SaveDoc(xmldoc, c);
273 
274  // Clean up.
275  xml->FreeDoc(xmldoc);
276  delete xml;
277 }
string xmldoc
Some module&#39;s global variables.
void saveToXMLRecursive(TXMLEngine *xml, Node *node, XMLNodePointer_t np)
Definition: Tree.cc:281
std::string getName()
Definition: Node.cc:75
void addXMLAttributes(TXMLEngine *xml, Node *node, XMLNodePointer_t np)
Definition: Tree.cc:244
Node * rootNode
Definition: Tree.h:47
void Tree::saveToXMLRecursive ( TXMLEngine *  xml,
Node node,
XMLNodePointer_t  np 
)

Definition at line 281 of file Tree.cc.

References addXMLAttributes(), Node::getLeftDaughter(), Node::getRightDaughter(), cmsLHEtoEOSManager::l, and alignCSCRings::r.

Referenced by saveToXML().

282 {
283  Node* l = node->getLeftDaughter();
284  Node* r = node->getRightDaughter();
285 
286  if(l==0 || r==0) return;
287 
288  // Add children to the XMLEngine.
289  XMLNodePointer_t left = xml->NewChild(np, 0, "left");
290  XMLNodePointer_t right = xml->NewChild(np, 0, "right");
291 
292  // Add attributes to the children.
293  addXMLAttributes(xml, l, left);
294  addXMLAttributes(xml, r, right);
295 
296  // Recurse.
297  saveToXMLRecursive(xml, l, left);
298  saveToXMLRecursive(xml, r, right);
299 }
Definition: Node.h:10
Node * getLeftDaughter()
Definition: Node.cc:99
void saveToXMLRecursive(TXMLEngine *xml, Node *node, XMLNodePointer_t np)
Definition: Tree.cc:281
int np
Definition: AMPTWrapper.h:33
Node * getRightDaughter()
Definition: Node.cc:109
void addXMLAttributes(TXMLEngine *xml, Node *node, XMLNodePointer_t np)
Definition: Tree.cc:244
void Tree::setRootNode ( Node sRootNode)

Definition at line 58 of file Tree.cc.

References rootNode.

59 {
60  rootNode = sRootNode;
61 }
Node * rootNode
Definition: Tree.h:47
void Tree::setTerminalNodes ( std::list< Node * > &  sTNodes)

Definition at line 70 of file Tree.cc.

References terminalNodes.

71 {
72  terminalNodes = sTNodes;
73 }
std::list< Node * > terminalNodes
Definition: Tree.h:48

Member Data Documentation

Int_t Tree::numTerminalNodes
private

Definition at line 49 of file Tree.h.

Referenced by buildTree(), getNumTerminalNodes(), loadFromXMLRecursive(), and Tree().

Double_t Tree::rmsError
private

Definition at line 50 of file Tree.h.

Referenced by calcError().

Node* Tree::rootNode
private
std::list<Node*> Tree::terminalNodes
private