ROOT logo

/**********************************************************************************
 * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
 * Package: TMVA                                                                  *
 * Classes: PDEFoamDistr                                                          *
 * Web    : http://tmva.sourceforge.net                                           *
 *                                                                                *
 * Description:                                                                   *
 *      The TFDSITR class provides an interface between the Binary search tree    *
 *      and the PDEFoam object.  In order to build-up the foam one needs to       *
 *      calculate the density of events at a given point (sampling during         *
 *      Foam build-up).  The function PDEFoamDistr::Density() does this job.  It  *
 *      uses a binary search tree, filled with training events, in order to       *
 *      provide this density.                                                     *
 *                                                                                *
 * Authors (alphabetical):                                                        *
 *      Tancredi Carli   - CERN, Switzerland                                      *
 *      Dominik Dannheim - CERN, Switzerland                                      *
 *      S. Jadach        - Institute of Nuclear Physics, Cracow, Poland           *
 *      Alexander Voigt  - CERN, Switzerland                                      *
 *      Peter Speckmayer - CERN, Switzerland                                      *
 *                                                                                *
 * Copyright (c) 2008:                                                            *
 *      CERN, Switzerland                                                         *
 *      MPI-K Heidelberg, Germany                                                 *
 *                                                                                *
 * Redistribution and use in source and binary forms, with or without             *
 * modification, are permitted according to the terms listed in LICENSE           *
 * (http://tmva.sourceforge.net/LICENSE)                                          *
 **********************************************************************************/

#include <cmath>
#include <limits>

#ifndef ROOT_TMath
#include "TMath.h"
#endif

#ifndef ROOT_TMVA_PDEFoamDistr
#include "TMVA/PDEFoamDistr.h"
#endif

ClassImp(TMVA::PDEFoamDistr)

//_____________________________________________________________________
TMVA::PDEFoamDistr::PDEFoamDistr() 
   : TObject(),
     fPDEFoam(NULL),
     fBst(NULL),
     fDensityCalc(kEVENT_DENSITY), // default: fill event density to BinarySearchTree
     fLogger( new MsgLogger("PDEFoamDistr"))
{}

//_____________________________________________________________________
TMVA::PDEFoamDistr::~PDEFoamDistr() 
{
   if (fBst)  delete fBst;
   delete fLogger;
}

//_____________________________________________________________________
TMVA::PDEFoamDistr::PDEFoamDistr(const PDEFoamDistr &distr)
   : TObject(),
     fPDEFoam         (distr.fPDEFoam),
     fBst             (distr.fBst),
     fDensityCalc     (kEVENT_DENSITY), // default: fill event density to BinarySearchTree
     fLogger( new MsgLogger("PDEFoamDistr"))
{
   // Copy constructor
   Log() << kFATAL << "COPY CONSTRUCTOR NOT IMPLEMENTED" << Endl;
}

//_____________________________________________________________________
void TMVA::PDEFoamDistr::Initialize()
{
   // Initialisation of binary search tree.  
   // Set dimension and create new BinarySearchTree.

   if (!GetPDEFoam())
      Log() << kFATAL << "<PDEFoamDistr::Initialize()> Pointer to owner not set!" << Endl;

   if (fBst) delete fBst;
   fBst = new TMVA::BinarySearchTree();

   if (!fBst){
      Log() << kFATAL << "<PDEFoamDistr::Initialize> "
            << "ERROR: an not create binary tree !" << Endl;
   }

   // set periode (number of variables)
   fBst->SetPeriode(GetPDEFoam()->GetTotDim());
}

//_____________________________________________________________________
void TMVA::PDEFoamDistr::FillBinarySearchTree( const Event* ev, EFoamType ft, Bool_t NoNegWeights )
{
   // This method creates an TMVA::Event and inserts it into the
   // binary search tree.
   //
   // If 'NoNegWeights' is true, an event with negative weight will
   // not be filled into the foam.  (Default value: false)

   if((NoNegWeights && ev->GetWeight()<=0) || ev->GetOriginalWeight()==0)
      return;

   TMVA::Event *event = new TMVA::Event(*ev);
 
   // set event variables in case of multi-target regression
   if (ft==kMultiTarget){
      // since in multi target regression targets are handled like
      // variables, remove targets and add them to the event variabels
      std::vector<Float_t> targets = ev->GetTargets();
      for (UInt_t i = 0; i < targets.size(); i++)
         event->SetVal(i+ev->GetValues().size(), targets.at(i));
      event->GetTargets().clear();
   }
   fBst->Insert(event);

   delete event;
}

//_____________________________________________________________________
Double_t TMVA::PDEFoamDistr::Density( Double_t *Xarg, Double_t &event_density )
{
   // This function is needed during the foam buildup.
   // It return a certain density depending on the selected classification
   // or regression options:
   //
   // In case of separated foams (classification) or multi target regression:
   //  - returns event density within volume (specified by VolFrac)
   // In case of unified foams: (classification)
   //  - returns discriminator (N_sig)/(N_sig + N_bg) divided by volume
   //    (specified by VolFrac)
   // In case of mono target regression:
   //  - returns average target value within volume divided by volume
   //    (specified by VolFrac)

   if (!GetPDEFoam())
      Log() << kFATAL << "<PDEFoamDistr::Density()> Pointer to owner not set!" << Endl;

   if (!fBst)
      Log() << kFATAL << "<PDEFoamDistr::Density()> Binary tree not found!"<< Endl;

   // get PDEFoam properties
   Int_t Dim       = GetPDEFoam()->GetTotDim(); // dimension of foam
   Float_t VolFrac = GetPDEFoam()->GetVolumeFraction(); // get fVolFrac

   // make the variable Xarg transform, since Foam only knows about x=[0,1]
   // transformation [0, 1] --> [xmin, xmax]
   for (Int_t idim=0; idim<Dim; idim++)
      Xarg[idim] = GetPDEFoam()->VarTransformInvers(idim, Xarg[idim]);

   //create volume around point to be found
   std::vector<Double_t> lb(Dim);
   std::vector<Double_t> ub(Dim);

   // probevolume relative to hypercube with edge length 1:
   const Double_t probevolume_inv = std::pow((VolFrac/2), Dim);

   // set upper and lower bound for search volume
   for (Int_t idim = 0; idim < Dim; idim++) {
      Double_t volsize=(GetPDEFoam()->GetXmax(idim) 
			- GetPDEFoam()->GetXmin(idim)) / VolFrac;
      lb[idim] = Xarg[idim] - volsize;
      ub[idim] = Xarg[idim] + volsize;
   }

   TMVA::Volume volume(&lb, &ub);                        // volume to search in
   std::vector<const TMVA::BinarySearchTreeNode*> nodes; // BST nodes found

   // do range searching
   fBst->SearchVolume(&volume, &nodes);

   // normalized density: (number of counted events) / volume / (total
   // number of events) should be ~1 on average
   const UInt_t count = nodes.size(); // number of events found

   // store density based on total number of events
   event_density = count * probevolume_inv;

   Double_t weighted_count = 0.; // number of events found (sum of weights!)
   for (UInt_t j=0; j<nodes.size(); j++)
      weighted_count += (nodes.at(j))->GetWeight();

   if (FillDiscriminator()){ // calc number of signal events in nodes
      Double_t N_sig = 0;    // number of signal events found
      // now sum over all nodes->IsSignal;
      for (UInt_t j=0; j<count; j++){
         if (nodes.at(j)->IsSignal()) N_sig += nodes.at(j)->GetWeight();
      }
      return (N_sig/(weighted_count+0.1))*probevolume_inv; // return:  (N_sig/N_total) / (cell_volume)
   }
   else if (FillTarget0()){ // calc sum of weighted target values
      Double_t N_tar = 0;   // number of target events found
      // now sum over all nodes->GetTarget(0);
      for (UInt_t j=0; j<count; j++) {
         N_tar += ((nodes.at(j))->GetTargets()).at(0) * ((nodes.at(j))->GetWeight());
      }
      return (N_tar/(weighted_count+0.1))*probevolume_inv; // return:  (N_tar/N_total) / (cell_volume)
   }

   return ((weighted_count+0.1)*probevolume_inv); // return:  N_total(weighted) / cell_volume
}

//_____________________________________________________________________
void TMVA::PDEFoamDistr::FillHist(PDEFoamCell* cell, std::vector<TH1F*> &hsig, std::vector<TH1F*> &hbkg, std::vector<TH1F*> &hsig_unw, std::vector<TH1F*> &hbkg_unw)
{
   // fill the given histograms with signal and background events,
   // which are located in the given cell

   if (!GetPDEFoam())
      Log() << kFATAL << "<PDEFoamDistr::FillHist> Pointer to owner not set!" << Endl;

   // get PDEFoam properties
   Int_t Dim = GetPDEFoam()->GetTotDim(); // dimension of foam

   // sanity check
   if (!cell)
      Log() << kFATAL << "<PDEFoamDistr::FillHist> Null pointer for cell given!" << Endl;
   if (Int_t(hsig.size()) != Dim || Int_t(hbkg.size()) != Dim || 
       Int_t(hsig_unw.size()) != Dim || Int_t(hbkg_unw.size()) != Dim)
      Log() << kFATAL << "<PDEFoamDistr::FillHist> Edge histograms have wrong size!" << Endl;

   // check histograms
   for (Int_t idim=0; idim<Dim; idim++) {
      if (!hsig.at(idim) || !hbkg.at(idim) || 
	  !hsig_unw.at(idim) || !hbkg_unw.at(idim))
	 Log() << kFATAL << "<PDEFoamDistr::FillHist> Histogram not initialized!" << Endl;
   }

   // get cell position and size
   PDEFoamVect  cellSize(Dim);
   PDEFoamVect  cellPosi(Dim);
   cell->GetHcub(cellPosi, cellSize);

   // determine lower and upper cell bound
   std::vector<Double_t> lb(Dim); // lower bound
   std::vector<Double_t> ub(Dim); // upper bound
   for (Int_t idim = 0; idim < Dim; idim++) {
      lb[idim] = GetPDEFoam()->VarTransformInvers(idim, cellPosi[idim] - std::numeric_limits<float>::epsilon());
      ub[idim] = GetPDEFoam()->VarTransformInvers(idim, cellPosi[idim] + cellSize[idim] + std::numeric_limits<float>::epsilon());
   }

   // create TMVA::Volume object needed for searching within the BST
   TMVA::Volume volume(&lb, &ub); // volume to search in
   std::vector<const TMVA::BinarySearchTreeNode*> nodes; // BST nodes found

   // do range searching
   fBst->SearchVolume(&volume, &nodes);

   // calc xmin and xmax of events found in cell
   std::vector<Float_t> xmin(Dim, std::numeric_limits<float>::max());
   std::vector<Float_t> xmax(Dim, -std::numeric_limits<float>::max());
   for (UInt_t iev=0; iev<nodes.size(); iev++) {
      std::vector<Float_t> ev = nodes.at(iev)->GetEventV();
      for (Int_t idim=0; idim<Dim; idim++) {
	 if (ev.at(idim) < xmin.at(idim))  xmin.at(idim) = ev.at(idim);
	 if (ev.at(idim) > xmax.at(idim))  xmax.at(idim) = ev.at(idim);
      }
   }

   // reset histogram ranges
   for (Int_t idim=0; idim<Dim; idim++) {
      hsig.at(idim)->GetXaxis()->SetLimits(GetPDEFoam()->VarTransform(idim,xmin.at(idim)), 
					   GetPDEFoam()->VarTransform(idim,xmax.at(idim)));
      hbkg.at(idim)->GetXaxis()->SetLimits(GetPDEFoam()->VarTransform(idim,xmin.at(idim)), 
					   GetPDEFoam()->VarTransform(idim,xmax.at(idim)));
      hsig_unw.at(idim)->GetXaxis()->SetLimits(GetPDEFoam()->VarTransform(idim,xmin.at(idim)), 
					       GetPDEFoam()->VarTransform(idim,xmax.at(idim)));
      hbkg_unw.at(idim)->GetXaxis()->SetLimits(GetPDEFoam()->VarTransform(idim,xmin.at(idim)), 
					       GetPDEFoam()->VarTransform(idim,xmax.at(idim)));
      hsig.at(idim)->Reset();
      hbkg.at(idim)->Reset();
      hsig_unw.at(idim)->Reset();
      hbkg_unw.at(idim)->Reset();
   }

   // fill histograms
   for (UInt_t iev=0; iev<nodes.size(); iev++) {
      std::vector<Float_t> ev = nodes.at(iev)->GetEventV();
      Float_t              wt = nodes.at(iev)->GetWeight();
      Bool_t           signal = nodes.at(iev)->IsSignal();
      for (Int_t idim=0; idim<Dim; idim++) {
	 if (signal) {
	    hsig.at(idim)->Fill(GetPDEFoam()->VarTransform(idim,ev.at(idim)), wt);
	    hsig_unw.at(idim)->Fill(GetPDEFoam()->VarTransform(idim,ev.at(idim)), 1);
	 } else {
	    hbkg.at(idim)->Fill(GetPDEFoam()->VarTransform(idim,ev.at(idim)), wt);
	    hbkg_unw.at(idim)->Fill(GetPDEFoam()->VarTransform(idim,ev.at(idim)), 1);
	 }
      }
   }
}
 PDEFoamDistr.cxx:1
 PDEFoamDistr.cxx:2
 PDEFoamDistr.cxx:3
 PDEFoamDistr.cxx:4
 PDEFoamDistr.cxx:5
 PDEFoamDistr.cxx:6
 PDEFoamDistr.cxx:7
 PDEFoamDistr.cxx:8
 PDEFoamDistr.cxx:9
 PDEFoamDistr.cxx:10
 PDEFoamDistr.cxx:11
 PDEFoamDistr.cxx:12
 PDEFoamDistr.cxx:13
 PDEFoamDistr.cxx:14
 PDEFoamDistr.cxx:15
 PDEFoamDistr.cxx:16
 PDEFoamDistr.cxx:17
 PDEFoamDistr.cxx:18
 PDEFoamDistr.cxx:19
 PDEFoamDistr.cxx:20
 PDEFoamDistr.cxx:21
 PDEFoamDistr.cxx:22
 PDEFoamDistr.cxx:23
 PDEFoamDistr.cxx:24
 PDEFoamDistr.cxx:25
 PDEFoamDistr.cxx:26
 PDEFoamDistr.cxx:27
 PDEFoamDistr.cxx:28
 PDEFoamDistr.cxx:29
 PDEFoamDistr.cxx:30
 PDEFoamDistr.cxx:31
 PDEFoamDistr.cxx:32
 PDEFoamDistr.cxx:33
 PDEFoamDistr.cxx:34
 PDEFoamDistr.cxx:35
 PDEFoamDistr.cxx:36
 PDEFoamDistr.cxx:37
 PDEFoamDistr.cxx:38
 PDEFoamDistr.cxx:39
 PDEFoamDistr.cxx:40
 PDEFoamDistr.cxx:41
 PDEFoamDistr.cxx:42
 PDEFoamDistr.cxx:43
 PDEFoamDistr.cxx:44
 PDEFoamDistr.cxx:45
 PDEFoamDistr.cxx:46
 PDEFoamDistr.cxx:47
 PDEFoamDistr.cxx:48
 PDEFoamDistr.cxx:49
 PDEFoamDistr.cxx:50
 PDEFoamDistr.cxx:51
 PDEFoamDistr.cxx:52
 PDEFoamDistr.cxx:53
 PDEFoamDistr.cxx:54
 PDEFoamDistr.cxx:55
 PDEFoamDistr.cxx:56
 PDEFoamDistr.cxx:57
 PDEFoamDistr.cxx:58
 PDEFoamDistr.cxx:59
 PDEFoamDistr.cxx:60
 PDEFoamDistr.cxx:61
 PDEFoamDistr.cxx:62
 PDEFoamDistr.cxx:63
 PDEFoamDistr.cxx:64
 PDEFoamDistr.cxx:65
 PDEFoamDistr.cxx:66
 PDEFoamDistr.cxx:67
 PDEFoamDistr.cxx:68
 PDEFoamDistr.cxx:69
 PDEFoamDistr.cxx:70
 PDEFoamDistr.cxx:71
 PDEFoamDistr.cxx:72
 PDEFoamDistr.cxx:73
 PDEFoamDistr.cxx:74
 PDEFoamDistr.cxx:75
 PDEFoamDistr.cxx:76
 PDEFoamDistr.cxx:77
 PDEFoamDistr.cxx:78
 PDEFoamDistr.cxx:79
 PDEFoamDistr.cxx:80
 PDEFoamDistr.cxx:81
 PDEFoamDistr.cxx:82
 PDEFoamDistr.cxx:83
 PDEFoamDistr.cxx:84
 PDEFoamDistr.cxx:85
 PDEFoamDistr.cxx:86
 PDEFoamDistr.cxx:87
 PDEFoamDistr.cxx:88
 PDEFoamDistr.cxx:89
 PDEFoamDistr.cxx:90
 PDEFoamDistr.cxx:91
 PDEFoamDistr.cxx:92
 PDEFoamDistr.cxx:93
 PDEFoamDistr.cxx:94
 PDEFoamDistr.cxx:95
 PDEFoamDistr.cxx:96
 PDEFoamDistr.cxx:97
 PDEFoamDistr.cxx:98
 PDEFoamDistr.cxx:99
 PDEFoamDistr.cxx:100
 PDEFoamDistr.cxx:101
 PDEFoamDistr.cxx:102
 PDEFoamDistr.cxx:103
 PDEFoamDistr.cxx:104
 PDEFoamDistr.cxx:105
 PDEFoamDistr.cxx:106
 PDEFoamDistr.cxx:107
 PDEFoamDistr.cxx:108
 PDEFoamDistr.cxx:109
 PDEFoamDistr.cxx:110
 PDEFoamDistr.cxx:111
 PDEFoamDistr.cxx:112
 PDEFoamDistr.cxx:113
 PDEFoamDistr.cxx:114
 PDEFoamDistr.cxx:115
 PDEFoamDistr.cxx:116
 PDEFoamDistr.cxx:117
 PDEFoamDistr.cxx:118
 PDEFoamDistr.cxx:119
 PDEFoamDistr.cxx:120
 PDEFoamDistr.cxx:121
 PDEFoamDistr.cxx:122
 PDEFoamDistr.cxx:123
 PDEFoamDistr.cxx:124
 PDEFoamDistr.cxx:125
 PDEFoamDistr.cxx:126
 PDEFoamDistr.cxx:127
 PDEFoamDistr.cxx:128
 PDEFoamDistr.cxx:129
 PDEFoamDistr.cxx:130
 PDEFoamDistr.cxx:131
 PDEFoamDistr.cxx:132
 PDEFoamDistr.cxx:133
 PDEFoamDistr.cxx:134
 PDEFoamDistr.cxx:135
 PDEFoamDistr.cxx:136
 PDEFoamDistr.cxx:137
 PDEFoamDistr.cxx:138
 PDEFoamDistr.cxx:139
 PDEFoamDistr.cxx:140
 PDEFoamDistr.cxx:141
 PDEFoamDistr.cxx:142
 PDEFoamDistr.cxx:143
 PDEFoamDistr.cxx:144
 PDEFoamDistr.cxx:145
 PDEFoamDistr.cxx:146
 PDEFoamDistr.cxx:147
 PDEFoamDistr.cxx:148
 PDEFoamDistr.cxx:149
 PDEFoamDistr.cxx:150
 PDEFoamDistr.cxx:151
 PDEFoamDistr.cxx:152
 PDEFoamDistr.cxx:153
 PDEFoamDistr.cxx:154
 PDEFoamDistr.cxx:155
 PDEFoamDistr.cxx:156
 PDEFoamDistr.cxx:157
 PDEFoamDistr.cxx:158
 PDEFoamDistr.cxx:159
 PDEFoamDistr.cxx:160
 PDEFoamDistr.cxx:161
 PDEFoamDistr.cxx:162
 PDEFoamDistr.cxx:163
 PDEFoamDistr.cxx:164
 PDEFoamDistr.cxx:165
 PDEFoamDistr.cxx:166
 PDEFoamDistr.cxx:167
 PDEFoamDistr.cxx:168
 PDEFoamDistr.cxx:169
 PDEFoamDistr.cxx:170
 PDEFoamDistr.cxx:171
 PDEFoamDistr.cxx:172
 PDEFoamDistr.cxx:173
 PDEFoamDistr.cxx:174
 PDEFoamDistr.cxx:175
 PDEFoamDistr.cxx:176
 PDEFoamDistr.cxx:177
 PDEFoamDistr.cxx:178
 PDEFoamDistr.cxx:179
 PDEFoamDistr.cxx:180
 PDEFoamDistr.cxx:181
 PDEFoamDistr.cxx:182
 PDEFoamDistr.cxx:183
 PDEFoamDistr.cxx:184
 PDEFoamDistr.cxx:185
 PDEFoamDistr.cxx:186
 PDEFoamDistr.cxx:187
 PDEFoamDistr.cxx:188
 PDEFoamDistr.cxx:189
 PDEFoamDistr.cxx:190
 PDEFoamDistr.cxx:191
 PDEFoamDistr.cxx:192
 PDEFoamDistr.cxx:193
 PDEFoamDistr.cxx:194
 PDEFoamDistr.cxx:195
 PDEFoamDistr.cxx:196
 PDEFoamDistr.cxx:197
 PDEFoamDistr.cxx:198
 PDEFoamDistr.cxx:199
 PDEFoamDistr.cxx:200
 PDEFoamDistr.cxx:201
 PDEFoamDistr.cxx:202
 PDEFoamDistr.cxx:203
 PDEFoamDistr.cxx:204
 PDEFoamDistr.cxx:205
 PDEFoamDistr.cxx:206
 PDEFoamDistr.cxx:207
 PDEFoamDistr.cxx:208
 PDEFoamDistr.cxx:209
 PDEFoamDistr.cxx:210
 PDEFoamDistr.cxx:211
 PDEFoamDistr.cxx:212
 PDEFoamDistr.cxx:213
 PDEFoamDistr.cxx:214
 PDEFoamDistr.cxx:215
 PDEFoamDistr.cxx:216
 PDEFoamDistr.cxx:217
 PDEFoamDistr.cxx:218
 PDEFoamDistr.cxx:219
 PDEFoamDistr.cxx:220
 PDEFoamDistr.cxx:221
 PDEFoamDistr.cxx:222
 PDEFoamDistr.cxx:223
 PDEFoamDistr.cxx:224
 PDEFoamDistr.cxx:225
 PDEFoamDistr.cxx:226
 PDEFoamDistr.cxx:227
 PDEFoamDistr.cxx:228
 PDEFoamDistr.cxx:229
 PDEFoamDistr.cxx:230
 PDEFoamDistr.cxx:231
 PDEFoamDistr.cxx:232
 PDEFoamDistr.cxx:233
 PDEFoamDistr.cxx:234
 PDEFoamDistr.cxx:235
 PDEFoamDistr.cxx:236
 PDEFoamDistr.cxx:237
 PDEFoamDistr.cxx:238
 PDEFoamDistr.cxx:239
 PDEFoamDistr.cxx:240
 PDEFoamDistr.cxx:241
 PDEFoamDistr.cxx:242
 PDEFoamDistr.cxx:243
 PDEFoamDistr.cxx:244
 PDEFoamDistr.cxx:245
 PDEFoamDistr.cxx:246
 PDEFoamDistr.cxx:247
 PDEFoamDistr.cxx:248
 PDEFoamDistr.cxx:249
 PDEFoamDistr.cxx:250
 PDEFoamDistr.cxx:251
 PDEFoamDistr.cxx:252
 PDEFoamDistr.cxx:253
 PDEFoamDistr.cxx:254
 PDEFoamDistr.cxx:255
 PDEFoamDistr.cxx:256
 PDEFoamDistr.cxx:257
 PDEFoamDistr.cxx:258
 PDEFoamDistr.cxx:259
 PDEFoamDistr.cxx:260
 PDEFoamDistr.cxx:261
 PDEFoamDistr.cxx:262
 PDEFoamDistr.cxx:263
 PDEFoamDistr.cxx:264
 PDEFoamDistr.cxx:265
 PDEFoamDistr.cxx:266
 PDEFoamDistr.cxx:267
 PDEFoamDistr.cxx:268
 PDEFoamDistr.cxx:269
 PDEFoamDistr.cxx:270
 PDEFoamDistr.cxx:271
 PDEFoamDistr.cxx:272
 PDEFoamDistr.cxx:273
 PDEFoamDistr.cxx:274
 PDEFoamDistr.cxx:275
 PDEFoamDistr.cxx:276
 PDEFoamDistr.cxx:277
 PDEFoamDistr.cxx:278
 PDEFoamDistr.cxx:279
 PDEFoamDistr.cxx:280
 PDEFoamDistr.cxx:281
 PDEFoamDistr.cxx:282
 PDEFoamDistr.cxx:283
 PDEFoamDistr.cxx:284
 PDEFoamDistr.cxx:285
 PDEFoamDistr.cxx:286
 PDEFoamDistr.cxx:287
 PDEFoamDistr.cxx:288
 PDEFoamDistr.cxx:289
 PDEFoamDistr.cxx:290
 PDEFoamDistr.cxx:291
 PDEFoamDistr.cxx:292
 PDEFoamDistr.cxx:293