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 | }
|
---|