Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
Event.h
Go to the documentation of this file.
1 // @(#)root/tmva $Id$
2 // Author: Andreas Hoecker, Peter Speckmayer, Joerg Stelzer, Helge Voss, Jan Therhaag
3 
4 /**********************************************************************************
5  * Project: TMVA - a Root-integrated toolkit for multivariate data analysis *
6  * Package: TMVA *
7  * Class : Event *
8  * Web : http://tmva.sourceforge.net *
9  * *
10  * Description: *
11  * Event container *
12  * *
13  * Authors (alphabetical): *
14  * Andreas Hoecker <Andreas.Hocker@cern.ch> - CERN, Switzerland *
15  * Joerg Stelzer <Joerg.Stelzer@cern.ch> - CERN, Switzerland *
16  * Peter Speckmayer <Peter.Speckmayer@cern.ch> - CERN, Switzerland *
17  * Jan Therhaag <Jan.Therhaag@cern.ch> - U of Bonn, Germany *
18  * Helge Voss <Helge.Voss@cern.ch> - MPI-K Heidelberg, Germany *
19  * *
20  * Copyright (c) 2005-2011: *
21  * CERN, Switzerland *
22  * U. of Victoria, Canada *
23  * MPI-K Heidelberg, Germany *
24  * U. of Bonn, Germany *
25  * *
26  * Redistribution and use in source and binary forms, with or without *
27  * modification, are permitted according to the terms listed in LICENSE *
28  * (http://mva.sourceforge.net/license.txt) *
29  **********************************************************************************/
30 
31 #ifndef ROOT_TMVA_Event
32 #define ROOT_TMVA_Event
33 
34 #include <iosfwd>
35 #include <vector>
36 
37 #include "Rtypes.h"
38 #include "TMVA/Types.h"
39 
40 #include "TObject.h"
41 
42 
43 class TCut;
44 
45 namespace TMVA {
46 
47  class Event;
48 
49  std::ostream& operator<<( std::ostream& os, const Event& event );
50 
51  class Event:public TObject {
52 
53  friend std::ostream& operator<<( std::ostream& os, const Event& event );
54 
55  public:
56 
57  // constructors
58  Event();
59  Event( const Event& );
60  explicit Event( const std::vector<Float_t>& values,
61  const std::vector<Float_t>& targetValues,
62  const std::vector<Float_t>& spectatorValues,
63  UInt_t theClass = 0, Double_t weight = 1.0, Double_t boostweight = 1.0 );
64  explicit Event( const std::vector<Float_t>& values,
65  const std::vector<Float_t>& targetValues,
66  UInt_t theClass = 0, Double_t weight = 1.0, Double_t boostweight = 1.0 );
67  explicit Event( const std::vector<Float_t>&,
68  UInt_t theClass, Double_t weight = 1.0, Double_t boostweight = 1.0 );
69  explicit Event( const std::vector<Float_t*>*&, UInt_t nvar );
70 
71  ~Event();
72 
73  // operators
74  // NOTE: Because we do not want to change the behaviour of the Event class
75  // as a public interface, we use the explicit default assignment operator,
76  // which is similar to the implicit one but silences gcc9 warnings.
77  Event& operator=( const Event& ) = default;
78 
79  // accessors
80  Bool_t IsDynamic() const {return fDynamic; }
81 
82  // Double_t GetWeight() const { return fWeight*fBoostWeight; }
83  Double_t GetWeight() const;
84  Double_t GetOriginalWeight() const { return fWeight; }
85  Double_t GetBoostWeight() const { return TMath::Max(Double_t(0.0001),fBoostWeight); }
86  UInt_t GetClass() const { return fClass; }
87 
88  UInt_t GetNVariables() const;
89  UInt_t GetNTargets() const;
90  UInt_t GetNSpectators() const;
91 
92  Float_t GetValue( UInt_t ivar) const;
93  Float_t GetValueFast(UInt_t ivar) const { return fDynamic ? *(*fValuesDynamic)[ivar] : fValues[ivar]; }
94  std::vector<Float_t>& GetValues()
95  {
96  //For a detailed explanation, please see the heading "Avoid Duplication in const and Non-const Member Function," on p. 23, in Item 3 "Use const whenever possible," in Effective C++, 3d ed by Scott Meyers, ISBN-13: 9780321334879.
97  // http://stackoverflow.com/questions/123758/how-do-i-remove-code-duplication-between-similar-const-and-non-const-member-func
98  return const_cast<std::vector<Float_t>&>( static_cast<const Event&>(*this).GetValues() );
99  }
100  const std::vector<Float_t>& GetValues() const;
101 
102  Float_t GetTarget( UInt_t itgt ) const { return fTargets.at(itgt); }
103  std::vector<Float_t>& GetTargets() { return fTargets; }
104  const std::vector<Float_t>& GetTargets() const { return fTargets; }
105 
106  Float_t GetSpectator( UInt_t ivar) const;
107  std::vector<Float_t>& GetSpectators() { return fSpectators; }
108  const std::vector<Float_t>& GetSpectators() const { return fSpectators; }
109 
110  void SetWeight ( Double_t w ) { fWeight=w; }
111  void SetBoostWeight ( Double_t w ) const { fDoNotBoost ? fDoNotBoost = kFALSE : fBoostWeight=w; }
112  void ScaleBoostWeight ( Double_t s ) const { fDoNotBoost ? fDoNotBoost = kFALSE : fBoostWeight *= s; }
113  void SetClass ( UInt_t t ) { fClass=t; }
114  void SetVal ( UInt_t ivar, Float_t val );
115  void SetTarget ( UInt_t itgt, Float_t value );
116  void SetSpectator ( UInt_t ivar, Float_t value );
117  void SetVariableArrangement( std::vector<UInt_t>* const m ) const;
118 
119  void SetDoNotBoost () const { fDoNotBoost = kTRUE; }
120  static void ClearDynamicVariables() {}
121 
122  void CopyVarValues( const Event& other );
123  using TObject::Print;
124  void Print ( std::ostream & o ) const;
125 
126  static void SetIsTraining(Bool_t);
127  static void SetIgnoreNegWeightsInTraining(Bool_t);
128 
129  private:
130 
131  static Bool_t fgIsTraining; // mark if we are in an actual training or "evaluation/testing" phase --> ignoreNegWeights only in actual training !
132  static Bool_t fgIgnoreNegWeightsInTraining;
133 
134 
135  mutable std::vector<Float_t> fValues; // the event values ; mutable, to be able to copy the dynamic values in there
136 
137  mutable std::vector<Float_t> fValuesRearranged; // the event values ; mutable, to be able to copy the dynamic values in there
138  mutable std::vector<Float_t*> *fValuesDynamic; //! the event values
139  std::vector<Float_t> fTargets; // target values for regression
140  mutable std::vector<Float_t> fSpectators; // "visisting" variables not used in MVAs ; mutable, to be able to copy the dynamic values in there
141  mutable std::vector<UInt_t> fVariableArrangement; // needed for MethodCategories, where we can train on other than the main variables
142 
143  UInt_t fClass; // class number
144  Double_t fWeight; // event weight (product of global and individual weights)
145  mutable Double_t fBoostWeight; // internal weight to be set by boosting algorithm
146  Bool_t fDynamic; // is set when the dynamic values are taken
147  mutable Bool_t fDoNotBoost; // mark event as not to be boosted (used to compensate for events with negative event weights
148  public:
149 
150  ClassDef(Event,1);
151 
152  };
153 }
154 
155 #endif