| 1 | /* ======================================================================== *\
|
|---|
| 2 | !
|
|---|
| 3 | ! *
|
|---|
| 4 | ! * This file is part of MARS, the MAGIC Analysis and Reconstruction
|
|---|
| 5 | ! * Software. It is distributed to you in the hope that it can be a useful
|
|---|
| 6 | ! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
|
|---|
| 7 | ! * It is distributed WITHOUT ANY WARRANTY.
|
|---|
| 8 | ! *
|
|---|
| 9 | ! * Permission to use, copy, modify and distribute this software and its
|
|---|
| 10 | ! * documentation for any purpose is hereby granted without fee,
|
|---|
| 11 | ! * provided that the above copyright notice appear in all copies and
|
|---|
| 12 | ! * that both that copyright notice and this permission notice appear
|
|---|
| 13 | ! * in supporting documentation. It is provided "as is" without express
|
|---|
| 14 | ! * or implied warranty.
|
|---|
| 15 | ! *
|
|---|
| 16 | !
|
|---|
| 17 | !
|
|---|
| 18 | ! Author(s): Thomas Hengstebeck, 02/2005 <mailto:hengsteb@physik.hu-berlin.de>
|
|---|
| 19 | !
|
|---|
| 20 | ! Copyright: MAGIC Software Development, 2000-2005
|
|---|
| 21 | !
|
|---|
| 22 | !
|
|---|
| 23 | \* ======================================================================== */
|
|---|
| 24 |
|
|---|
| 25 | //////////////////////////////////////////////////////////////////////////////
|
|---|
| 26 | //
|
|---|
| 27 | // This macro shows you how to use the new class MRFEnergyEst, which is
|
|---|
| 28 | // an implementation of energy estimation with RF. It contains following
|
|---|
| 29 | // functions:
|
|---|
| 30 | //
|
|---|
| 31 | // - CreateMatrices() : Create matrix for training (and matrix for test)
|
|---|
| 32 | // - RFEnergyEstTrain(): Training of RFs
|
|---|
| 33 | // - ReadForests() : Read and print out energy bins which have been used
|
|---|
| 34 | // in training (depence on statistics)
|
|---|
| 35 | //
|
|---|
| 36 | // - RFEnergyEstTest() : Fast testing using a matrix with test data
|
|---|
| 37 | // - RFEnergyEstLoop() : Application of RF energy est in eventloop
|
|---|
| 38 | //
|
|---|
| 39 | ////////////////////////////////////////////////////////////////////////////
|
|---|
| 40 |
|
|---|
| 41 |
|
|---|
| 42 | //****************************************************************************
|
|---|
| 43 | // main user settings
|
|---|
| 44 | //****************************************************************************
|
|---|
| 45 |
|
|---|
| 46 | //----------------------------------------------------------------------------
|
|---|
| 47 | // settings for RF training
|
|---|
| 48 | const Int_t ntrees = 50; // 50-100 is usually sufficient
|
|---|
| 49 | const Int_t numtrials = 3; // should be <= sqrt(no. of used var)
|
|---|
| 50 | const Int_t nodesize = 1; // best results with 1
|
|---|
| 51 |
|
|---|
| 52 | // settings for energy grid
|
|---|
| 53 | const Int_t ebins = 30;
|
|---|
| 54 | const Float_t e_low = log10(10); // lower limit of log10(energy[GeV])
|
|---|
| 55 | const Float_t e_up = log10(30000); // upper limit
|
|---|
| 56 |
|
|---|
| 57 | //----------------------------------------------------------------------------
|
|---|
| 58 | // data settings
|
|---|
| 59 | TString path="/emc/commich/Mars/mcdata/oldout/";
|
|---|
| 60 |
|
|---|
| 61 | //TString nameTrain = "19990101_10001_I_MCGamTrainLZA_E_10_5";
|
|---|
| 62 | //TString nameTest = "19990101_10002_I_MCGamTestLZA_E_10_5";
|
|---|
| 63 | TString nameTrain = "19990101_10003_I_MCGamTrainHZA_E_10_5";
|
|---|
| 64 | TString nameTest = "19990101_10004_I_MCGamTestHZA_E_10_5" ;
|
|---|
| 65 |
|
|---|
| 66 | TString info=""; // put here additional info e.g. about cuts used in
|
|---|
| 67 | // CreateMatrices function
|
|---|
| 68 |
|
|---|
| 69 | //----------------------------------------------------------------------------
|
|---|
| 70 | // generate filenames
|
|---|
| 71 | TString fileNameTrain = path + nameTrain + ".root";
|
|---|
| 72 | TString fileNameTest = path + nameTest + ".root";
|
|---|
| 73 |
|
|---|
| 74 | TString fileMatrixTrain = nameTrain + "_Matrix" + info + ".root";
|
|---|
| 75 | TString fileMatrixTest = nameTest + "_Matrix" + info + ".root";
|
|---|
| 76 |
|
|---|
| 77 | TString fileForest = "EForests" + nameTrain + info + ".root";
|
|---|
| 78 |
|
|---|
| 79 |
|
|---|
| 80 | //****************************************************************************
|
|---|
| 81 | // Create matrices for training (and test)
|
|---|
| 82 | //****************************************************************************
|
|---|
| 83 | void CreateMatrices()
|
|---|
| 84 | {
|
|---|
| 85 | MGeomCamMagic gcam;
|
|---|
| 86 | const Double_t mm2deg=gcam.GetConvMm2Deg();//180./17000./3.14159265358979312;
|
|---|
| 87 |
|
|---|
| 88 | TString filename[2] = {fileNameTrain,fileNameTest};
|
|---|
| 89 | TString filematrix[2] = {fileMatrixTrain,fileMatrixTest};
|
|---|
| 90 |
|
|---|
| 91 | for(int i=0;i<2;i++)
|
|---|
| 92 | {
|
|---|
| 93 | if(filename[i].IsNull() || filematrix[i].IsNull())
|
|---|
| 94 | continue;
|
|---|
| 95 |
|
|---|
| 96 | MParList plist;
|
|---|
| 97 | MTaskList tlist;
|
|---|
| 98 | plist.AddToList(&tlist);
|
|---|
| 99 |
|
|---|
| 100 | MReadTree read("Events", filename[i]);
|
|---|
| 101 | read.DisableAutoScheme();
|
|---|
| 102 |
|
|---|
| 103 | MHMatrix matrix("MatrixGammas");
|
|---|
| 104 | // setting rules (MC energy must be last column!!!)
|
|---|
| 105 | matrix.AddColumn("log10(MHillas.fSize)");
|
|---|
| 106 | matrix.AddColumn("MHillasSrc.fDist");
|
|---|
| 107 | matrix.AddColumn("MHillas.fWidth");
|
|---|
| 108 | matrix.AddColumn("MHillas.fLength");
|
|---|
| 109 | matrix.AddColumn("log10(MHillas.fSize/(MHillas.fLength*MHillas.fWidth))");
|
|---|
| 110 | matrix.AddColumn("MNewImagePar.fConc");
|
|---|
| 111 | matrix.AddColumn("MNewImagePar.fLeakage1");
|
|---|
| 112 | matrix.AddColumn("MPointingPos.fZd");
|
|---|
| 113 | matrix.AddColumn("MMcEvt.fEnergy");
|
|---|
| 114 |
|
|---|
| 115 | plist.AddToList(&matrix);
|
|---|
| 116 | MFillH fillmat("MatrixGammas");
|
|---|
| 117 |
|
|---|
| 118 | // pre-cuts on data,
|
|---|
| 119 | // take care that this is inverted logic (MContinue task!!)
|
|---|
| 120 | MContinue sizecut("MHillas.fSize<60.");
|
|---|
| 121 | MContinue leakcut("MNewImagePar.fLeakage1>0.1");
|
|---|
| 122 | MContinue distcutlo(Form("MHillasSrc.fDist*%f<0.3",mm2deg));
|
|---|
| 123 | MContinue distcutup(Form("MHillasSrc.fDist*%f>1.1",mm2deg));
|
|---|
| 124 | MContinue hcut("MHadronness.fHadronness>0.3");
|
|---|
| 125 |
|
|---|
| 126 | tlist.AddToList(&read);
|
|---|
| 127 |
|
|---|
| 128 | // put cuts into tlist
|
|---|
| 129 | tlist.AddToList(&sizecut);
|
|---|
| 130 | tlist.AddToList(&leakcut);
|
|---|
| 131 | tlist.AddToList(&distcutlo);
|
|---|
| 132 | tlist.AddToList(&distcutup);
|
|---|
| 133 | //tlist.AddToList(&hcut);
|
|---|
| 134 |
|
|---|
| 135 | tlist.AddToList(&fillmat);
|
|---|
| 136 |
|
|---|
| 137 | MEvtLoop evtloop;
|
|---|
| 138 | evtloop.SetParList(&plist);
|
|---|
| 139 |
|
|---|
| 140 | if (!evtloop.Eventloop()) return;
|
|---|
| 141 | tlist.PrintStatistics();
|
|---|
| 142 |
|
|---|
| 143 | TFile file(filematrix[i],"recreate","");
|
|---|
| 144 | matrix.Write();
|
|---|
| 145 | file.Close();
|
|---|
| 146 | }
|
|---|
| 147 |
|
|---|
| 148 | return;
|
|---|
| 149 | }
|
|---|
| 150 |
|
|---|
| 151 | //****************************************************************************
|
|---|
| 152 | // Training of RFs
|
|---|
| 153 | //****************************************************************************
|
|---|
| 154 | void RFEnergyEstTrain()
|
|---|
| 155 | {
|
|---|
| 156 | // initializations
|
|---|
| 157 | TArrayD egrid(ebins+1);
|
|---|
| 158 |
|
|---|
| 159 | for(Int_t i=0;i<=ebins;i++)
|
|---|
| 160 | egrid[i]=e_low+i*(e_up-e_low)/float(ebins);
|
|---|
| 161 |
|
|---|
| 162 | MHMatrix matrix;
|
|---|
| 163 | TFile *file=new TFile(fileMatrixTrain);
|
|---|
| 164 | matrix.Read("MatrixGammas");
|
|---|
| 165 |
|
|---|
| 166 | // output info about used rules
|
|---|
| 167 | cout<<endl<<"Rules for energy estimation:"<<endl;
|
|---|
| 168 | for(Int_t i=0;i<matrix.GetM().GetNcols();i++)
|
|---|
| 169 | {
|
|---|
| 170 | MDataArray *rules = matrix.GetColumns();
|
|---|
| 171 | MData &data=(*rules)[i];
|
|---|
| 172 |
|
|---|
| 173 | cout<<" "<<i+1<<") "<<data.GetRule()<<endl;
|
|---|
| 174 | }
|
|---|
| 175 |
|
|---|
| 176 | // setup RF for energy estimation
|
|---|
| 177 | MRFEnergyEst rf;
|
|---|
| 178 | rf.SetMatrixTrain(&matrix);
|
|---|
| 179 | rf.SetFile(fileForest);
|
|---|
| 180 | rf.SetLogEnergyGrid(egrid);
|
|---|
| 181 |
|
|---|
| 182 | rf.SetNumTrees(ntrees); // number of trees
|
|---|
| 183 | rf.SetNumTry(numtrials); // number of trials in random split selection
|
|---|
| 184 | rf.SetNdSize(nodesize); // limit for nodesize
|
|---|
| 185 |
|
|---|
| 186 | rf.Train();
|
|---|
| 187 |
|
|---|
| 188 | return;
|
|---|
| 189 | }
|
|---|
| 190 |
|
|---|
| 191 | //****************************************************************************
|
|---|
| 192 | // Check which energy bins have been used
|
|---|
| 193 | //****************************************************************************
|
|---|
| 194 | void ReadForests()
|
|---|
| 195 | {
|
|---|
| 196 | TFile fileRF(fileForest,"read");
|
|---|
| 197 | TList *list=(TList*)fileRF.GetListOfKeys();
|
|---|
| 198 | const Int_t n=list->GetSize()-1;// subtract 1 since 1 key belongs to MDataArray
|
|---|
| 199 |
|
|---|
| 200 | MRanForest forest;
|
|---|
| 201 | for(Int_t i=0;i<n;i++)
|
|---|
| 202 | {
|
|---|
| 203 | forest.Read(Form("%d",i));
|
|---|
| 204 | MRanForest *curforest=(MRanForest*)forest.Clone();
|
|---|
| 205 | const char *energy=list->FindObject(Form("%d",i))->GetTitle();
|
|---|
| 206 | const char *bin =list->FindObject(Form("%d",i))->GetName();
|
|---|
| 207 |
|
|---|
| 208 | if(i<10) cout<<"Bin "<<bin<<": log10(Energy[GeV]) = "<<energy<<endl;
|
|---|
| 209 | else cout<<"Bin "<< bin<<": log10(Energy[GeV]) = "<<energy<<endl;
|
|---|
| 210 | }
|
|---|
| 211 | fileRF.Close();
|
|---|
| 212 |
|
|---|
| 213 | return;
|
|---|
| 214 | }
|
|---|
| 215 |
|
|---|
| 216 | //****************************************************************************
|
|---|
| 217 | // Fast Testing with matrix
|
|---|
| 218 | //****************************************************************************
|
|---|
| 219 | void RFEnergyEstTest()
|
|---|
| 220 | {
|
|---|
| 221 | MHMatrix matrix;
|
|---|
| 222 | TFile *file=new TFile(fileMatrixTest);
|
|---|
| 223 | matrix.Read("MatrixGammas");
|
|---|
| 224 |
|
|---|
| 225 | MRFEnergyEst rf;
|
|---|
| 226 | rf.SetMatrixTest(&matrix);
|
|---|
| 227 | rf.SetFile(fileForest);
|
|---|
| 228 |
|
|---|
| 229 | rf.SetBit(MParContainer::kEnableGraphicalOutput,1);
|
|---|
| 230 | rf.Test();
|
|---|
| 231 |
|
|---|
| 232 | return;
|
|---|
| 233 | }
|
|---|
| 234 |
|
|---|
| 235 | //****************************************************************************
|
|---|
| 236 | // Apply RF energy estimation in eventloop
|
|---|
| 237 | //****************************************************************************
|
|---|
| 238 | void RFEnergyEstLoop()
|
|---|
| 239 | {
|
|---|
| 240 | MParList plist;
|
|---|
| 241 |
|
|---|
| 242 | MTaskList tlist;
|
|---|
| 243 | plist.AddToList(&tlist);
|
|---|
| 244 | MReadTree read("Events",fileNameTest);
|
|---|
| 245 | read.DisableAutoScheme();
|
|---|
| 246 |
|
|---|
| 247 | MRFEnergyEst rf;
|
|---|
| 248 | rf.SetFile(fileForest);
|
|---|
| 249 |
|
|---|
| 250 | MWriteRootFile write("EnergyEstTest.root");
|
|---|
| 251 | write.AddContainer("MMcEvt", "Events");
|
|---|
| 252 | write.AddContainer("MEnergyEst", "Events");
|
|---|
| 253 |
|
|---|
| 254 | tlist.AddToList(&read);
|
|---|
| 255 | tlist.AddToList(&rf);
|
|---|
| 256 | tlist.AddToList(&write);
|
|---|
| 257 |
|
|---|
| 258 | MEvtLoop evtloop;
|
|---|
| 259 | evtloop.SetParList(&plist);
|
|---|
| 260 |
|
|---|
| 261 | if (!evtloop.Eventloop()) return;
|
|---|
| 262 | tlist.PrintStatistics();
|
|---|
| 263 |
|
|---|
| 264 | return;
|
|---|
| 265 | }
|
|---|