ROOT  6.06/09
Reference Guide
PDEFoamDiscriminantDensity.cxx
Go to the documentation of this file.
1 // @(#)root/tmva $Id$
2 // Author: Tancredi Carli, Dominik Dannheim, Alexander Voigt
3 
4 /**********************************************************************************
5  * Project: TMVA - a Root-integrated toolkit for multivariate data analysis *
6  * Package: TMVA *
7  * Classes: PDEFoamDiscriminantDensity *
8  * Web : http://tmva.sourceforge.net *
9  * *
10  * Description: *
11  * The TFDSITR class provides an interface between the Binary search tree *
12  * and the PDEFoam object. In order to build-up the foam one needs to *
13  * calculate the density of events at a given point (sampling during *
14  * Foam build-up). The function PDEFoamDiscriminantDensity::Density() does this job. It *
15  * uses a binary search tree, filled with training events, in order to *
16  * provide this density. *
17  * *
18  * Authors (alphabetical): *
19  * Tancredi Carli - CERN, Switzerland *
20  * Dominik Dannheim - CERN, Switzerland *
21  * S. Jadach - Institute of Nuclear Physics, Cracow, Poland *
22  * Alexander Voigt - TU Dresden, Germany *
23  * Peter Speckmayer - CERN, Switzerland *
24  * *
25  * Copyright (c) 2008, 2010: *
26  * CERN, Switzerland *
27  * MPI-K Heidelberg, Germany *
28  * *
29  * Redistribution and use in source and binary forms, with or without *
30  * modification, are permitted according to the terms listed in LICENSE *
31  * (http://tmva.sourceforge.net/LICENSE) *
32  **********************************************************************************/
33 
34 //_____________________________________________________________________
35 //
36 // PDEFoamDiscriminantDensity
37 //
38 // This is a concrete implementation of PDEFoam. Density(...)
39 // estimates the discriminant density at a given phase-space point
40 // using range-searching. The discriminant D is defined as
41 //
42 // D = #events with given class / total number of events
43 // _____________________________________________________________________
44 
45 #include <cmath>
46 
47 #ifndef ROOT_TMVA_PDEFoamDiscriminantDensity
49 #endif
50 
52 
53 ////////////////////////////////////////////////////////////////////////////////
54 
55 TMVA::PDEFoamDiscriminantDensity::PDEFoamDiscriminantDensity()
56  : PDEFoamDensityBase()
57  , fClass(0)
58 {}
59 
60 ////////////////////////////////////////////////////////////////////////////////
61 /// User construcor:
62 ///
63 /// Parameters:
64 ///
65 /// - box - size of the range-searching box (n-dimensional
66 /// std::vector)
67 ///
68 /// - cls - event class used for the range-searching
69 
71  : PDEFoamDensityBase(box)
72  , fClass(cls)
73 {
74 }
75 
76 ////////////////////////////////////////////////////////////////////////////////
77 /// Copy constructor
78 
80  : PDEFoamDensityBase(distr)
81  , fClass(distr.fClass)
82 {
83 }
84 
85 ////////////////////////////////////////////////////////////////////////////////
86 /// This function is needed during the foam buildup. It returns the
87 /// average number density of events of type fClass within the
88 /// range-searching volume (specified by fBox).
89 ///
90 /// Parameters:
91 ///
92 /// - xev - event vector (in [fXmin,fXmax]) to place the box at
93 ///
94 /// - event_density - here the event density is stored
95 ///
96 /// Returns:
97 ///
98 /// Number of events (event weights) of type fClass, which were
99 /// found in the range-searching volume at point 'xev', divided by
100 /// the box volume.
101 
102 Double_t TMVA::PDEFoamDiscriminantDensity::Density(std::vector<Double_t> &xev, Double_t &event_density)
103 {
104  if (!fBst)
105  Log() << kFATAL << "<PDEFoamDiscriminantDensity::Density()> Binary tree not set!" << Endl;
106 
107  //create volume around point to be found
108  std::vector<Double_t> lb(GetBox().size());
109  std::vector<Double_t> ub(GetBox().size());
110 
111  // probevolume relative to hypercube with edge length 1:
112  const Double_t probevolume_inv = 1.0 / GetBoxVolume();
113 
114  // set upper and lower bound for search volume
115  for (UInt_t idim = 0; idim < GetBox().size(); ++idim) {
116  lb[idim] = xev[idim] - GetBox().at(idim) / 2.0;
117  ub[idim] = xev[idim] + GetBox().at(idim) / 2.0;
118  }
119 
120  TMVA::Volume volume(&lb, &ub); // volume to search in
121  std::vector<const TMVA::BinarySearchTreeNode*> nodes; // BST nodes found
122 
123  // do range searching
124  const Double_t sumOfWeights = fBst->SearchVolume(&volume, &nodes);
125 
126  // store density based on total number of events
127  event_density = nodes.size() * probevolume_inv;
128 
129  Double_t n_sig = 0; // number of signal events found
130  // calc number of signal events in nodes
131  for (std::vector<const TMVA::BinarySearchTreeNode*>::const_iterator it = nodes.begin();
132  it != nodes.end(); ++it) {
133  if ((*it)->GetClass() == fClass) // signal node
134  n_sig += (*it)->GetWeight();
135  }
136 
137  // return: (n_sig/n_total) / (cell_volume)
138  return (n_sig / (sumOfWeights + 0.1)) * probevolume_inv;
139 }
MsgLogger & Endl(MsgLogger &ml)
Definition: MsgLogger.h:162
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Definition: fillpatterns.C:1
TClass * fClass
pointer to the foreign object
unsigned int UInt_t
Definition: RtypesCore.h:42
double Double_t
Definition: RtypesCore.h:55
Abstract ClassifierFactory template that handles arbitrary types.
virtual Double_t Density(std::vector< Double_t > &Xarg, Double_t &event_density)
This function is needed during the foam buildup.
ClassImp(TMVA::PDEFoamDiscriminantDensity) TMVA
Definition: math.cpp:60