File indexing completed on 2025-12-15 10:28:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #ifndef ROOT_TMVA_MethodBase
0034 #define ROOT_TMVA_MethodBase
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 #include <iosfwd>
0045 #include <vector>
0046 #include <map>
0047 #include "assert.h"
0048
0049 #include "TString.h"
0050
0051 #include "TMVA/IMethod.h"
0052 #include "TMVA/Configurable.h"
0053 #include "TMVA/Types.h"
0054 #include "TMVA/DataSet.h"
0055 #include "TMVA/Event.h"
0056 #include "TMVA/TransformationHandler.h"
0057 #include <TMVA/Results.h>
0058 #include "TMVA/TrainingHistory.h"
0059
0060 #include <TFile.h>
0061
0062 class TGraph;
0063 class TTree;
0064 class TDirectory;
0065 class TSpline;
0066 class TH1F;
0067 class TH1D;
0068 class TMultiGraph;
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 namespace TMVA {
0082
0083 class Ranking;
0084 class PDF;
0085 class TSpline1;
0086 class MethodCuts;
0087 class MethodBoost;
0088 class DataSetInfo;
0089 namespace Experimental {
0090 class Classification;
0091 }
0092 class TrainingHistory;
0093
0094 class IPythonInteractive {
0095 public:
0096 IPythonInteractive();
0097 ~IPythonInteractive();
0098 void Init(std::vector<TString>& graphTitles);
0099 void ClearGraphs();
0100 void AddPoint(Double_t x, Double_t y1, Double_t y2);
0101 void AddPoint(std::vector<Double_t>& dat);
0102 inline TMultiGraph* Get() {return fMultiGraph;}
0103 inline bool NotInitialized(){ return fNumGraphs==0;};
0104 private:
0105 TMultiGraph* fMultiGraph;
0106 std::vector<TGraph*> fGraphs;
0107 Int_t fNumGraphs;
0108 Int_t fIndex;
0109 };
0110
0111 class MethodBase : virtual public IMethod, public Configurable {
0112
0113 friend class CrossValidation;
0114 friend class Factory;
0115 friend class RootFinder;
0116 friend class MethodBoost;
0117 friend class MethodCrossValidation;
0118 friend class Experimental::Classification;
0119
0120 public:
0121
0122 enum EWeightFileType { kROOT=0, kTEXT };
0123
0124
0125 MethodBase( const TString& jobName,
0126 Types::EMVA methodType,
0127 const TString& methodTitle,
0128 DataSetInfo& dsi,
0129 const TString& theOption = "" );
0130
0131
0132
0133 MethodBase( Types::EMVA methodType,
0134 DataSetInfo& dsi,
0135 const TString& weightFile );
0136
0137
0138 virtual ~MethodBase();
0139
0140
0141 void SetupMethod();
0142 void ProcessSetup();
0143 virtual void CheckSetup();
0144
0145
0146
0147
0148 void AddOutput( Types::ETreeType type, Types::EAnalysisType analysisType );
0149
0150
0151
0152 void TrainMethod();
0153
0154
0155 virtual std::map<TString,Double_t> OptimizeTuningParameters(TString fomType="ROCIntegral", TString fitType="FitGA");
0156 virtual void SetTuneParameters(std::map<TString,Double_t> tuneParameters);
0157
0158 void Train() override = 0;
0159
0160
0161 void SetTrainTime( Double_t trainTime ) { fTrainTime = trainTime; }
0162 Double_t GetTrainTime() const { return fTrainTime; }
0163
0164
0165 void SetTestTime ( Double_t testTime ) { fTestTime = testTime; }
0166 Double_t GetTestTime () const { return fTestTime; }
0167
0168
0169 virtual void TestClassification();
0170 virtual Double_t GetKSTrainingVsTest(Char_t SorB, TString opt="X");
0171
0172
0173 virtual void TestMulticlass();
0174
0175
0176 virtual void TestRegression( Double_t& bias, Double_t& biasT,
0177 Double_t& dev, Double_t& devT,
0178 Double_t& rms, Double_t& rmsT,
0179 Double_t& mInf, Double_t& mInfT,
0180 Double_t& corr,
0181 Types::ETreeType type );
0182
0183
0184 void Init() override = 0;
0185 void DeclareOptions() override = 0;
0186 void ProcessOptions() override = 0;
0187 virtual void DeclareCompatibilityOptions();
0188
0189
0190
0191
0192
0193 virtual void Reset(){return;}
0194
0195
0196
0197
0198 Double_t GetMvaValue( Double_t* errLower = nullptr, Double_t* errUpper = nullptr) override = 0;
0199
0200
0201 Double_t GetMvaValue( const TMVA::Event* const ev, Double_t* err = nullptr, Double_t* errUpper = nullptr );
0202
0203 protected:
0204
0205 void NoErrorCalc(Double_t* const err, Double_t* const errUpper);
0206
0207
0208 virtual std::vector<Double_t> GetMvaValues(Long64_t firstEvt = 0, Long64_t lastEvt = -1, Bool_t logProgress = false);
0209
0210 virtual std::vector<Double_t> GetDataMvaValues(DataSet *data = nullptr, Long64_t firstEvt = 0, Long64_t lastEvt = -1, Bool_t logProgress = false);
0211
0212 public:
0213
0214 const std::vector<Float_t>& GetRegressionValues(const TMVA::Event* const ev){
0215 fTmpEvent = ev;
0216 const std::vector<Float_t>* ptr = &GetRegressionValues();
0217 fTmpEvent = nullptr;
0218 return (*ptr);
0219 }
0220
0221 virtual const std::vector<Float_t>& GetRegressionValues() {
0222 std::vector<Float_t>* ptr = new std::vector<Float_t>(0);
0223 return (*ptr);
0224 }
0225
0226
0227 virtual const std::vector<Float_t>& GetMulticlassValues() {
0228 std::vector<Float_t>* ptr = new std::vector<Float_t>(0);
0229 return (*ptr);
0230 }
0231
0232
0233 virtual const std::vector<Float_t>& GetTrainingHistory(const char* ) {
0234 std::vector<Float_t>* ptr = new std::vector<Float_t>(0);
0235 return (*ptr);
0236 }
0237
0238
0239 virtual Double_t GetProba( const Event *ev);
0240 virtual Double_t GetProba( Double_t mvaVal, Double_t ap_sig );
0241
0242
0243 virtual Double_t GetRarity( Double_t mvaVal, Types::ESBType reftype = Types::kBackground ) const;
0244
0245
0246 const Ranking* CreateRanking() override = 0;
0247
0248
0249 void MakeClass( const TString& classFileName = TString("") ) const override;
0250
0251
0252 void PrintHelpMessage() const override;
0253
0254
0255
0256
0257 public:
0258 void WriteStateToFile () const;
0259 void ReadStateFromFile ();
0260
0261 protected:
0262
0263 virtual void AddWeightsXMLTo ( void* parent ) const = 0;
0264 virtual void ReadWeightsFromXML ( void* wghtnode ) = 0;
0265 void ReadWeightsFromStream( std::istream& ) override = 0;
0266 virtual void ReadWeightsFromStream( TFile& ) {}
0267
0268 private:
0269 friend class MethodCategory;
0270 friend class MethodCompositeBase;
0271 void WriteStateToXML ( void* parent ) const;
0272 void ReadStateFromXML ( void* parent );
0273 void WriteStateToStream ( std::ostream& tf ) const;
0274 void WriteVarsToStream ( std::ostream& tf, const TString& prefix = "" ) const;
0275
0276
0277 public:
0278 void ReadStateFromStream ( std::istream& tf );
0279 void ReadStateFromStream ( TFile& rf );
0280 void ReadStateFromXMLString( const char* xmlstr );
0281
0282 private:
0283
0284 void AddVarsXMLTo ( void* parent ) const;
0285 void AddSpectatorsXMLTo ( void* parent ) const;
0286 void AddTargetsXMLTo ( void* parent ) const;
0287 void AddClassesXMLTo ( void* parent ) const;
0288 void ReadVariablesFromXML ( void* varnode );
0289 void ReadSpectatorsFromXML( void* specnode);
0290 void ReadTargetsFromXML ( void* tarnode );
0291 void ReadClassesFromXML ( void* clsnode );
0292 void ReadVarsFromStream ( std::istream& istr );
0293
0294 public:
0295
0296
0297
0298 virtual void WriteEvaluationHistosToFile(Types::ETreeType treetype);
0299
0300
0301 void WriteMonitoringHistosToFile() const override;
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313 virtual Double_t GetEfficiency( const TString&, Types::ETreeType, Double_t& err );
0314 virtual Double_t GetTrainingEfficiency(const TString& );
0315 virtual std::vector<Float_t> GetMulticlassEfficiency( std::vector<std::vector<Float_t> >& purity );
0316 virtual std::vector<Float_t> GetMulticlassTrainingEfficiency(std::vector<std::vector<Float_t> >& purity );
0317 virtual TMatrixD GetMulticlassConfusionMatrix(Double_t effB, Types::ETreeType type);
0318 virtual Double_t GetSignificance() const;
0319 virtual Double_t GetROCIntegral(TH1D *histS, TH1D *histB) const;
0320 virtual Double_t GetROCIntegral(PDF *pdfS=nullptr, PDF *pdfB=nullptr) const;
0321 virtual Double_t GetMaximumSignificance( Double_t SignalEvents, Double_t BackgroundEvents,
0322 Double_t& optimal_significance_value ) const;
0323 virtual Double_t GetSeparation( TH1*, TH1* ) const;
0324 virtual Double_t GetSeparation( PDF* pdfS = nullptr, PDF* pdfB = nullptr ) const;
0325
0326 virtual void GetRegressionDeviation(UInt_t tgtNum, Types::ETreeType type, Double_t& stddev,Double_t& stddev90Percent ) const;
0327
0328
0329
0330 const TString& GetJobName () const { return fJobName; }
0331 const TString& GetMethodName () const { return fMethodName; }
0332 TString GetMethodTypeName() const { return Types::Instance().GetMethodName(fMethodType); }
0333 Types::EMVA GetMethodType () const { return fMethodType; }
0334 const char* GetName () const override { return fMethodName.Data(); }
0335 const TString& GetTestvarName () const { return fTestvar; }
0336 const TString GetProbaName () const { return fTestvar + "_Proba"; }
0337 TString GetWeightFileName() const;
0338
0339
0340
0341 void SetTestvarName ( const TString & v="" ) { fTestvar = (v=="") ? ("MVA_" + GetMethodName()) : v; }
0342
0343
0344 UInt_t GetNvar() const { return DataInfo().GetNVariables(); }
0345 UInt_t GetNVariables() const { return DataInfo().GetNVariables(); }
0346 UInt_t GetNTargets() const { return DataInfo().GetNTargets(); };
0347
0348
0349 const TString& GetInputVar ( Int_t i ) const { return DataInfo().GetVariableInfo(i).GetInternalName(); }
0350 const TString& GetInputLabel( Int_t i ) const { return DataInfo().GetVariableInfo(i).GetLabel(); }
0351 const char * GetInputTitle( Int_t i ) const { return DataInfo().GetVariableInfo(i).GetTitle(); }
0352
0353
0354 Double_t GetMean( Int_t ivar ) const { return GetTransformationHandler().GetMean(ivar); }
0355 Double_t GetRMS ( Int_t ivar ) const { return GetTransformationHandler().GetRMS(ivar); }
0356 Double_t GetXmin( Int_t ivar ) const { return GetTransformationHandler().GetMin(ivar); }
0357 Double_t GetXmax( Int_t ivar ) const { return GetTransformationHandler().GetMax(ivar); }
0358
0359
0360 Double_t GetSignalReferenceCut() const { return fSignalReferenceCut; }
0361 Double_t GetSignalReferenceCutOrientation() const { return fSignalReferenceCutOrientation; }
0362
0363
0364 void SetSignalReferenceCut( Double_t cut ) { fSignalReferenceCut = cut; }
0365 void SetSignalReferenceCutOrientation( Double_t cutOrientation ) { fSignalReferenceCutOrientation = cutOrientation; }
0366
0367
0368 TDirectory* BaseDir() const;
0369 TDirectory* MethodBaseDir() const;
0370 TFile* GetFile() const {return fFile;}
0371
0372 void SetMethodDir ( TDirectory* methodDir ) { fBaseDir = fMethodBaseDir = methodDir; }
0373 void SetBaseDir( TDirectory* methodDir ){ fBaseDir = methodDir; }
0374 void SetMethodBaseDir( TDirectory* methodDir ){ fMethodBaseDir = methodDir; }
0375 void SetFile(TFile* file){fFile=file;}
0376
0377
0378 void SetSilentFile(Bool_t status) {fSilentFile=status;}
0379 Bool_t IsSilentFile() const {return fSilentFile;}
0380
0381
0382 void SetModelPersistence(Bool_t status){fModelPersistence=status;}
0383 Bool_t IsModelPersistence() const {return fModelPersistence;}
0384
0385
0386
0387
0388
0389 UInt_t GetTrainingTMVAVersionCode() const { return fTMVATrainingVersion; }
0390 UInt_t GetTrainingROOTVersionCode() const { return fROOTTrainingVersion; }
0391 TString GetTrainingTMVAVersionString() const;
0392 TString GetTrainingROOTVersionString() const;
0393
0394 TransformationHandler& GetTransformationHandler(Bool_t takeReroutedIfAvailable=true)
0395 {
0396 if(fTransformationPointer && takeReroutedIfAvailable) return *fTransformationPointer; else return fTransformation;
0397 }
0398 const TransformationHandler& GetTransformationHandler(Bool_t takeReroutedIfAvailable=true) const
0399 {
0400 if(fTransformationPointer && takeReroutedIfAvailable) return *fTransformationPointer; else return fTransformation;
0401 }
0402
0403 void RerouteTransformationHandler (TransformationHandler* fTargetTransformation) { fTransformationPointer=fTargetTransformation; }
0404
0405
0406
0407
0408
0409 DataSet* Data() const { return (fTmpData) ? fTmpData : DataInfo().GetDataSet(); }
0410 DataSetInfo& DataInfo() const { return fDataSetInfo; }
0411
0412
0413
0414
0415
0416 UInt_t GetNEvents () const { return Data()->GetNEvents(); }
0417 const Event* GetEvent () const;
0418 const Event* GetEvent ( const TMVA::Event* ev ) const;
0419 const Event* GetEvent ( Long64_t ievt ) const;
0420 const Event* GetEvent ( Long64_t ievt , Types::ETreeType type ) const;
0421 const Event* GetTrainingEvent( Long64_t ievt ) const;
0422 const Event* GetTestingEvent ( Long64_t ievt ) const;
0423 const std::vector<TMVA::Event*>& GetEventCollection( Types::ETreeType type );
0424
0425 TrainingHistory fTrainHistory;
0426
0427
0428
0429
0430
0431 virtual Bool_t IsSignalLike();
0432 virtual Bool_t IsSignalLike(Double_t mvaVal);
0433
0434
0435 Bool_t HasMVAPdfs() const { return fHasMVAPdfs; }
0436 virtual void SetAnalysisType( Types::EAnalysisType type ) { fAnalysisType = type; }
0437 Types::EAnalysisType GetAnalysisType() const { return fAnalysisType; }
0438 Bool_t DoRegression() const { return fAnalysisType == Types::kRegression; }
0439 Bool_t DoMulticlass() const { return fAnalysisType == Types::kMulticlass; }
0440
0441
0442 void DisableWriting(Bool_t setter){ fModelPersistence = setter?kFALSE:kTRUE; }
0443
0444 protected:
0445 mutable const Event *fTmpEvent;
0446 DataSet *fTmpData = nullptr;
0447
0448 IPythonInteractive *fInteractive = nullptr;
0449 bool fExitFromTraining = false;
0450 UInt_t fIPyMaxIter = 0, fIPyCurrentIter = 0;
0451
0452 public:
0453
0454
0455 inline void InitIPythonInteractive(){
0456 if (fInteractive) delete fInteractive;
0457 fInteractive = new IPythonInteractive();
0458 }
0459
0460
0461 inline TMultiGraph* GetInteractiveTrainingError(){return fInteractive->Get();}
0462
0463
0464 inline void ExitFromTraining(){
0465 fExitFromTraining = true;
0466 }
0467
0468
0469 inline bool TrainingEnded(){
0470 if (fExitFromTraining && fInteractive){
0471 delete fInteractive;
0472 fInteractive = nullptr;
0473 }
0474 return fExitFromTraining;
0475 }
0476
0477
0478 inline UInt_t GetMaxIter(){ return fIPyMaxIter; }
0479
0480
0481 inline UInt_t GetCurrentIter(){ return fIPyCurrentIter; }
0482
0483 protected:
0484
0485
0486
0487
0488
0489
0490 void SetWeightFileName( TString );
0491
0492 const TString& GetWeightFileDir() const { return fFileDir; }
0493 void SetWeightFileDir( TString fileDir );
0494
0495
0496 Bool_t IsNormalised() const { return fNormalise; }
0497 void SetNormalised( Bool_t norm ) { fNormalise = norm; }
0498
0499
0500
0501
0502
0503 Bool_t Verbose() const { return fVerbose; }
0504 Bool_t Help () const { return fHelp; }
0505
0506
0507
0508
0509
0510 const TString& GetInternalVarName( Int_t ivar ) const { return (*fInputVars)[ivar]; }
0511 const TString& GetOriginalVarName( Int_t ivar ) const { return DataInfo().GetVariableInfo(ivar).GetExpression(); }
0512
0513 Bool_t HasTrainingTree() const { return Data()->GetNTrainingEvents() != 0; }
0514
0515
0516
0517 protected:
0518
0519
0520 void MakeClassSpecific( std::ostream&, const TString& = "" ) const override {}
0521
0522
0523 virtual void MakeClassSpecificHeader( std::ostream&, const TString& = "" ) const {}
0524
0525
0526
0527
0528
0529 void Statistics( Types::ETreeType treeType, const TString& theVarName,
0530 Double_t&, Double_t&, Double_t&,
0531 Double_t&, Double_t&, Double_t& );
0532
0533
0534 Bool_t TxtWeightsOnly() const { return kTRUE; }
0535
0536 protected:
0537
0538
0539
0540 Bool_t IsConstructedFromWeightFile() const { return fConstructedFromWeightFile; }
0541
0542 private:
0543
0544
0545
0546 void InitBase();
0547 void DeclareBaseOptions();
0548 void ProcessBaseOptions();
0549
0550
0551 enum ECutOrientation { kNegative = -1, kPositive = +1 };
0552 ECutOrientation GetCutOrientation() const { return fCutOrientation; }
0553
0554
0555
0556
0557 void ResetThisBase();
0558
0559
0560
0561
0562 void CreateMVAPdfs();
0563
0564
0565
0566 virtual Double_t GetValueForRoot ( Double_t );
0567
0568
0569 Bool_t GetLine( std::istream& fin, char * buf );
0570
0571
0572 virtual void AddClassifierOutput ( Types::ETreeType type );
0573 virtual void AddClassifierOutputProb( Types::ETreeType type );
0574 virtual void AddRegressionOutput ( Types::ETreeType type );
0575 virtual void AddMulticlassOutput ( Types::ETreeType type );
0576
0577 private:
0578
0579 void AddInfoItem( void* gi, const TString& name,
0580 const TString& value) const;
0581
0582
0583
0584 protected:
0585
0586
0587 Ranking* fRanking;
0588 std::vector<TString>* fInputVars;
0589
0590
0591 Int_t fNbins;
0592 Int_t fNbinsMVAoutput;
0593 Int_t fNbinsH;
0594
0595 Types::EAnalysisType fAnalysisType;
0596
0597 std::vector<Float_t>* fRegressionReturnVal;
0598 std::vector<Float_t>* fMulticlassReturnVal;
0599
0600 private:
0601
0602
0603 friend class MethodCuts;
0604
0605
0606
0607 DataSetInfo& fDataSetInfo;
0608
0609 Double_t fSignalReferenceCut;
0610 Double_t fSignalReferenceCutOrientation;
0611 Types::ESBType fVariableTransformType;
0612
0613
0614 TString fJobName;
0615 TString fMethodName;
0616 Types::EMVA fMethodType;
0617 TString fTestvar;
0618 UInt_t fTMVATrainingVersion;
0619 UInt_t fROOTTrainingVersion;
0620 Bool_t fConstructedFromWeightFile;
0621
0622
0623
0624
0625 TDirectory* fBaseDir;
0626 mutable TDirectory* fMethodBaseDir;
0627
0628 TFile *fFile;
0629
0630
0631 Bool_t fSilentFile;
0632
0633 Bool_t fModelPersistence;
0634
0635 TString fParentDir;
0636
0637 TString fFileDir;
0638 TString fWeightFile;
0639
0640 private:
0641
0642 TH1* fEffS;
0643
0644 PDF* fDefaultPDF;
0645 PDF* fMVAPdfS;
0646 PDF* fMVAPdfB;
0647
0648
0649
0650 PDF* fSplS;
0651 PDF* fSplB;
0652 TSpline* fSpleffBvsS;
0653
0654 PDF* fSplTrainS;
0655 PDF* fSplTrainB;
0656 TSpline* fSplTrainEffBvsS;
0657
0658 private:
0659
0660
0661 Double_t fMeanS;
0662 Double_t fMeanB;
0663 Double_t fRmsS;
0664 Double_t fRmsB;
0665 Double_t fXmin;
0666 Double_t fXmax;
0667
0668
0669 TString fVarTransformString;
0670
0671 TransformationHandler* fTransformationPointer;
0672 TransformationHandler fTransformation;
0673
0674
0675
0676 Bool_t fVerbose;
0677 TString fVerbosityLevelString;
0678 EMsgType fVerbosityLevel;
0679 Bool_t fHelp;
0680 Bool_t fHasMVAPdfs;
0681
0682 Bool_t fIgnoreNegWeightsInTraining;
0683
0684 protected:
0685
0686 Bool_t IgnoreEventsWithNegWeightsInTraining() const { return fIgnoreNegWeightsInTraining; }
0687
0688
0689 UInt_t fSignalClass;
0690 UInt_t fBackgroundClass;
0691
0692 private:
0693
0694
0695 Double_t fTrainTime;
0696 Double_t fTestTime;
0697
0698
0699 ECutOrientation fCutOrientation;
0700
0701
0702 TSpline1* fSplRefS;
0703 TSpline1* fSplRefB;
0704
0705 TSpline1* fSplTrainRefS;
0706 TSpline1* fSplTrainRefB;
0707
0708 mutable std::vector<const std::vector<TMVA::Event*>*> fEventCollections;
0709
0710 public:
0711 Bool_t fSetupCompleted;
0712
0713 private:
0714
0715
0716
0717
0718
0719
0720 private:
0721
0722 Bool_t fNormalise;
0723 Bool_t fUseDecorr;
0724 TString fVariableTransformTypeString;
0725 Bool_t fTxtWeightsOnly;
0726 Int_t fNbinsMVAPdf;
0727 Int_t fNsmoothMVAPdf;
0728
0729 protected:
0730 Results *fResults;
0731 ClassDefOverride(MethodBase,0);
0732
0733 };
0734 }
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746 inline const TMVA::Event* TMVA::MethodBase::GetEvent( const TMVA::Event* ev ) const
0747 {
0748 return GetTransformationHandler().Transform(ev);
0749 }
0750
0751 inline const TMVA::Event* TMVA::MethodBase::GetEvent() const
0752 {
0753 if(fTmpEvent)
0754 return GetTransformationHandler().Transform(fTmpEvent);
0755 else
0756 return GetTransformationHandler().Transform(Data()->GetEvent());
0757 }
0758
0759 inline const TMVA::Event* TMVA::MethodBase::GetEvent( Long64_t ievt ) const
0760 {
0761 assert(fTmpEvent==nullptr);
0762 return GetTransformationHandler().Transform(Data()->GetEvent(ievt));
0763 }
0764
0765 inline const TMVA::Event* TMVA::MethodBase::GetEvent( Long64_t ievt, Types::ETreeType type ) const
0766 {
0767 assert(fTmpEvent==nullptr);
0768 return GetTransformationHandler().Transform(Data()->GetEvent(ievt, type));
0769 }
0770
0771 inline const TMVA::Event* TMVA::MethodBase::GetTrainingEvent( Long64_t ievt ) const
0772 {
0773 assert(fTmpEvent==nullptr);
0774 return GetEvent(ievt, Types::kTraining);
0775 }
0776
0777 inline const TMVA::Event* TMVA::MethodBase::GetTestingEvent( Long64_t ievt ) const
0778 {
0779 assert(fTmpEvent==nullptr);
0780 return GetEvent(ievt, Types::kTesting);
0781 }
0782
0783 #endif