/* ======================================================================== *\ ! ! * ! * This file is part of MARS, the MAGIC Analysis and Reconstruction ! * Software. It is distributed to you in the hope that it can be a useful ! * and timesaving tool in analysing Data of imaging Cerenkov telescopes. ! * It is distributed WITHOUT ANY WARRANTY. ! * ! * Permission to use, copy, modify and distribute this software and its ! * documentation for any purpose is hereby granted without fee, ! * provided that the above copyright notice appear in all copies and ! * that both that copyright notice and this permission notice appear ! * in supporting documentation. It is provided "as is" without express ! * or implied warranty. ! * ! ! ! Author(s): Thomas Bretz 11/2005 ! ! Copyright: MAGIC Software Development, 2005 ! ! \* ======================================================================== */ ///////////////////////////////////////////////////////////////////////////// // // MJTrainEnergy // // // Example: // -------- // // // SequencesOn are used for training, SequencesOff for Testing // MDataSet set("mctesttrain.txt"); // set.SetNumAnalysis(1); // Must have a number // MJTrainEnergy opt; // //opt.SetDebug(); // opt.AddParameter("MHillas.fSize"); // opt.AddParameter("MHillasSrc.fDist"); // MStatusDisplay *d = new MStatusDisplay; // opt.SetDisplay(d); // opt.AddPreCut("MHillasSrc.fDCA*MGeomCam.fConvMm2Deg<0.3"); // opt.Train("rf-energy.root", set, 30000); // Number of train events // // Random Numbers: // --------------- // Use: // if(gRandom) // delete gRandom; // gRandom = new TRandom3(); // in advance to change the random number generator. // //////////////////////////////////////////////////////////////////////////// #include "MJTrainEnergy.h" #include "MHMatrix.h" #include "MLog.h" #include "MLogManip.h" // tools #include "MDataSet.h" #include "MTFillMatrix.h" // eventloop #include "MParList.h" #include "MTaskList.h" #include "MEvtLoop.h" // tasks #include "MReadMarsFile.h" #include "MContinue.h" #include "MFillH.h" #include "MRanForestCalc.h" // histograms #include "MHEnergyEst.h" // filter #include "MFilterList.h" ClassImp(MJTrainEnergy); using namespace std; Bool_t MJTrainEnergy::Train(const char *out, const MDataSet &set, Int_t num) { if (!set.IsValid()) { *fLog << err << "ERROR - DataSet invalid!" << endl; return kFALSE; } *fLog << inf; fLog->Separator(GetDescriptor()); // --------------------- Setup files -------------------- MReadMarsFile readtrn("Events"); MReadMarsFile readtst("Events"); readtrn.DisableAutoScheme(); readtst.DisableAutoScheme(); set.AddFilesOn(readtrn); set.AddFilesOff(readtst); // ----------------------- Setup Matrix ------------------ MHMatrix train("Train"); train.AddColumns(fRules); if (fEnableWeights) train.AddColumn("MWeight.fVal"); train.AddColumn("MMcEvt.fImpact/100"); train.AddColumn("MMcEvt.fTelescopeTheta*kRad2Deg"); train.AddColumn("MMcEvt.fEnergy"); // ----------------------- Fill Matrix RF ---------------------- MTFillMatrix fill; fill.SetDisplay(fDisplay); fill.SetLogStream(fLog); fill.SetDestMatrix1(&train, num); fill.SetReader(&readtrn); fill.AddPreCuts(fPreCuts); fill.AddPreCuts(fTrainCuts); fill.AddPreTasks(fPreTasks); fill.AddPostTasks(fPostTasks); if (!fill.Process()) return kFALSE; // ------------------------ Train RF -------------------------- MRanForestCalc rf; rf.SetNumTrees(fNumTrees); rf.SetNdSize(fNdSize); rf.SetNumTry(fNumTry); rf.SetNumObsoleteVariables(3); rf.SetLastDataColumnHasWeights(fEnableWeights); rf.SetDisplay(fDisplay); rf.SetLogStream(fLog); rf.SetFileName(out); rf.SetDebug(fDebug); rf.SetNameOutput("MEnergyEst"); /* MBinning b(32, 10, 100000, "BinningEnergyEst", "log"); if (!rf.TrainMultiRF(train, b.GetEdgesD())) // classification with one tree per bin return; if (!rf.TrainSingleRF(train, b.GetEdgesD())) // classification into different bins return; */ if (!rf.TrainRegression(train)) // regression (best choice) return kFALSE; // --------------------- Display result ---------------------- gLog.Separator("Test"); MParList plist; MTaskList tlist; plist.AddToList(this); plist.AddToList(&tlist); //plist.AddToList(&b); MFilterList list; if (!list.AddToList(fPreCuts)) *fLog << err << "ERROR - Calling MFilterList::AddToList for fPreCuts failed!" << endl; if (!list.AddToList(fTestCuts)) *fLog << err << "ERROR - Calling MFilterList::AddToList for fTestCuts failed!" << endl; MContinue cont(&list); cont.SetInverted(); MHEnergyEst hist; MFillH fillh(&hist); if (fEnableWeights) fillh.SetWeight(); tlist.AddToList(&readtst); tlist.AddToList(fPreTasks); tlist.AddToList(&cont); tlist.AddToList(&rf); tlist.AddToList(fPostTasks); tlist.AddToList(&fillh); MEvtLoop loop; loop.SetLogStream(fLog); loop.SetDisplay(fDisplay); loop.SetParList(&plist); if (!loop.Eventloop()) return kFALSE; if (!WriteDisplay(out)) return kFALSE; return kTRUE; }