| 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 3/2003 <mailto:hengsteb@alwa02.physik.uni-siegen.de>!
|
|---|
| 19 | !
|
|---|
| 20 | ! Copyright: MAGIC Software Development, 2000-2003
|
|---|
| 21 | !
|
|---|
| 22 | !
|
|---|
| 23 | \* ======================================================================== */
|
|---|
| 24 |
|
|---|
| 25 | #include "MMcEvt.hxx"
|
|---|
| 26 |
|
|---|
| 27 | void RanForestPD(Int_t minsize=0)
|
|---|
| 28 | {
|
|---|
| 29 | //
|
|---|
| 30 | // Create a empty Parameter List and an empty Task List
|
|---|
| 31 | // The tasklist is identified in the eventloop by its name
|
|---|
| 32 | //
|
|---|
| 33 | MParList plist;
|
|---|
| 34 |
|
|---|
| 35 | MTaskList tlist;
|
|---|
| 36 | plist.AddToList(&tlist);
|
|---|
| 37 |
|
|---|
| 38 | MReadMarsFile read("Events", "star_gamma_train.root");
|
|---|
| 39 | Float_t numgammas = read.GetEntries();
|
|---|
| 40 |
|
|---|
| 41 | read.AddFile("star_proton_train.root");
|
|---|
| 42 | read.AddFile("star_helium_train.root");
|
|---|
| 43 |
|
|---|
| 44 | Float_t numhadrons = read.GetEntries() - numgammas;
|
|---|
| 45 |
|
|---|
| 46 | // Fraction of gammas to be used in training:
|
|---|
| 47 | // (less than total sample, to speed up execution)
|
|---|
| 48 | //
|
|---|
| 49 | Float_t gamma_frac = 2.*(numhadrons / numgammas);
|
|---|
| 50 |
|
|---|
| 51 |
|
|---|
| 52 | read.DisableAutoScheme();
|
|---|
| 53 |
|
|---|
| 54 | tlist.AddToList(&read);
|
|---|
| 55 |
|
|---|
| 56 | MFParticleId fhadrons("MMcEvt", '!', MMcEvt::kGAMMA);
|
|---|
| 57 | tlist.AddToList(&fhadrons);
|
|---|
| 58 |
|
|---|
| 59 | MHMatrix matrixg("MatrixGammas");
|
|---|
| 60 |
|
|---|
| 61 | // matrixg.AddColumn("floor(0.5+(cos(MMcEvt.fTelescopeTheta)/0.01))");
|
|---|
| 62 | // matrixg.AddColumn("MMcEvt.fTelescopePhi");
|
|---|
| 63 | // matrixg.AddColumn("MSigmabar.fSigmabar");
|
|---|
| 64 |
|
|---|
| 65 | matrixg.AddColumn("MHillas.fSize");
|
|---|
| 66 | matrixg.AddColumn("MHillasSrc.fDist");
|
|---|
| 67 |
|
|---|
| 68 | // matrixg.AddColumn("MHillas.fWidth");
|
|---|
| 69 | // matrixg.AddColumn("MHillas.fLength");
|
|---|
| 70 |
|
|---|
| 71 | // Scaled Width and Length:
|
|---|
| 72 | //
|
|---|
| 73 | matrixg.AddColumn("MHillas.fWidth/(-13.1618+(10.0492*log10(MHillas.fSize)))");
|
|---|
| 74 | matrixg.AddColumn("MHillas.fLength/(-57.3784+(32.6131*log10(MHillas.fSize)))");
|
|---|
| 75 |
|
|---|
| 76 | // matrixg.AddColumn("(MHillas.fSize/(MHillas.fWidth*MHillas.fLength))");
|
|---|
| 77 | matrixg.AddColumn("MNewImagePar.fConc");
|
|---|
| 78 |
|
|---|
| 79 | // matrixg.AddColumn("MNewImagePar.fConc1");
|
|---|
| 80 | // matrixg.AddColumn("MNewImagePar.fAsym");
|
|---|
| 81 | // matrixg.AddColumn("MHillasExt.fM3Trans");
|
|---|
| 82 | // matrixg.AddColumn("abs(MHillasSrc.fHeadTail)");
|
|---|
| 83 | // matrixg.AddColumn("MNewImagePar.fLeakage1");
|
|---|
| 84 |
|
|---|
| 85 | //
|
|---|
| 86 | // Third moment, with sign referred to source position:
|
|---|
| 87 | //
|
|---|
| 88 | matrixg.AddColumn("MHillasExt.fM3Long*MHillasSrc.fCosDeltaAlpha/abs(MHillasSrc.fCosDeltaAlpha)");
|
|---|
| 89 |
|
|---|
| 90 | //# matrixg.AddColumn("MHillasSrc.fAlpha");
|
|---|
| 91 |
|
|---|
| 92 | //
|
|---|
| 93 | // SIZE cut:
|
|---|
| 94 | //
|
|---|
| 95 | TString dummy("(MHillas.fSize<");
|
|---|
| 96 | dummy += minsize;
|
|---|
| 97 | dummy += ")";
|
|---|
| 98 |
|
|---|
| 99 | // AM, useful FOR High Energy only:
|
|---|
| 100 | // dummy += " || (MImagePar.fNumSatPixelsLG>0)";
|
|---|
| 101 |
|
|---|
| 102 | MContinue SizeCut(dummy);
|
|---|
| 103 | tlist.AddToList(&SizeCut);
|
|---|
| 104 |
|
|---|
| 105 | // AM TEST!!!, no muons in train
|
|---|
| 106 | // dummy = "(MMcEvt.fMuonCphFraction>0.1)";
|
|---|
| 107 | // MContinue MuonsCut(dummy);
|
|---|
| 108 | // tlist.AddToList(&MuonsCut);
|
|---|
| 109 |
|
|---|
| 110 | plist.AddToList(&matrixg);
|
|---|
| 111 |
|
|---|
| 112 | MHMatrix matrixh("MatrixHadrons");
|
|---|
| 113 | matrixh.AddColumns(matrixg.GetColumns());
|
|---|
| 114 | plist.AddToList(&matrixh);
|
|---|
| 115 |
|
|---|
| 116 | MFillH fillmath("MatrixHadrons");
|
|---|
| 117 | fillmath.SetFilter(&fhadrons);
|
|---|
| 118 | tlist.AddToList(&fillmath);
|
|---|
| 119 |
|
|---|
| 120 | MContinue skiphad(&fhadrons);
|
|---|
| 121 | tlist.AddToList(&skiphad);
|
|---|
| 122 |
|
|---|
| 123 | MFEventSelector reduce_training_gammas;
|
|---|
| 124 | reduce_training_gammas.SetSelectionRatio(gamma_frac);
|
|---|
| 125 | tlist.AddToList(&reduce_training_gammas);
|
|---|
| 126 |
|
|---|
| 127 | MFillH fillmatg("MatrixGammas");
|
|---|
| 128 | fillmatg.SetFilter(&reduce_training_gammas);
|
|---|
| 129 | tlist.AddToList(&fillmatg);
|
|---|
| 130 |
|
|---|
| 131 | //
|
|---|
| 132 | // Create and setup the eventloop
|
|---|
| 133 | //
|
|---|
| 134 | MEvtLoop evtloop;
|
|---|
| 135 | evtloop.SetParList(&plist);
|
|---|
| 136 |
|
|---|
| 137 | MProgressBar bar;
|
|---|
| 138 | evtloop.SetProgressBar(&bar);
|
|---|
| 139 | //
|
|---|
| 140 | // Execute your analysis
|
|---|
| 141 | //
|
|---|
| 142 | if (!evtloop.Eventloop())
|
|---|
| 143 | return;
|
|---|
| 144 |
|
|---|
| 145 | tlist.PrintStatistics();
|
|---|
| 146 |
|
|---|
| 147 | // ---------------------------------------------------------------
|
|---|
| 148 | // ---------------------------------------------------------------
|
|---|
| 149 | // second event loop: the trees of the random forest are grown,
|
|---|
| 150 | // the event loop is now actually a tree loop (loop of training
|
|---|
| 151 | // process)
|
|---|
| 152 | // ---------------------------------------------------------------
|
|---|
| 153 | // ---------------------------------------------------------------
|
|---|
| 154 |
|
|---|
| 155 | MTaskList tlist2;
|
|---|
| 156 | plist.Replace(&tlist2);
|
|---|
| 157 |
|
|---|
| 158 | MRanForestGrow rfgrow2;
|
|---|
| 159 | rfgrow2.SetNumTrees(100);
|
|---|
| 160 | rfgrow2.SetNumTry(3);
|
|---|
| 161 | rfgrow2.SetNdSize(10);
|
|---|
| 162 |
|
|---|
| 163 | MWriteRootFile rfwrite2("RF.root");
|
|---|
| 164 | rfwrite2.AddContainer("MRanTree","Tree"); //save all trees
|
|---|
| 165 | MFillH fillh2("MHRanForestGini");
|
|---|
| 166 |
|
|---|
| 167 | tlist2.AddToList(&rfgrow2);
|
|---|
| 168 | tlist2.AddToList(&rfwrite2);
|
|---|
| 169 | tlist2.AddToList(&fillh2);
|
|---|
| 170 |
|
|---|
| 171 | // gRandom is accessed from MRanForest (-> bootstrap aggregating)
|
|---|
| 172 | // and MRanTree (-> random split selection) and should be initialized
|
|---|
| 173 | // here if you want to set a certain random number generator
|
|---|
| 174 | if(gRandom)
|
|---|
| 175 | delete gRandom;
|
|---|
| 176 | // gRandom = new TRandom3(0); // Takes seed from the computer clock
|
|---|
| 177 | gRandom = new TRandom3(); // Uses always same seed
|
|---|
| 178 | //
|
|---|
| 179 | // Execute tree growing (now the eventloop is actually a treeloop)
|
|---|
| 180 | //
|
|---|
| 181 |
|
|---|
| 182 | evtloop.SetProgressBar(&bar);
|
|---|
| 183 |
|
|---|
| 184 | if (!evtloop.Eventloop())
|
|---|
| 185 | return;
|
|---|
| 186 |
|
|---|
| 187 | tlist2.PrintStatistics();
|
|---|
| 188 |
|
|---|
| 189 | plist.FindObject("MHRanForestGini")->DrawClone();
|
|---|
| 190 |
|
|---|
| 191 | // ---------------------------------------------------------------
|
|---|
| 192 | // ---------------------------------------------------------------
|
|---|
| 193 | // third event loop: the control sample (star2.root) is processed
|
|---|
| 194 | // through the previously grown random forest,
|
|---|
| 195 | //
|
|---|
| 196 | // the histograms MHHadronness (quality of g/h-separation) and
|
|---|
| 197 | // MHRanForest are created and displayed.
|
|---|
| 198 | // MHRanForest shows the convergence of the classification error
|
|---|
| 199 | // as function of the number of grown (and combined) trees
|
|---|
| 200 | // and tells the user how many trees are actually needed in later
|
|---|
| 201 | // classification tasks.
|
|---|
| 202 | // ---------------------------------------------------------------
|
|---|
| 203 | // ---------------------------------------------------------------
|
|---|
| 204 |
|
|---|
| 205 | MTaskList tlist3;
|
|---|
| 206 |
|
|---|
| 207 | plist.Replace(&tlist3);
|
|---|
| 208 |
|
|---|
| 209 | MReadMarsFile read3("Events", "star_gamma_test.root");
|
|---|
| 210 |
|
|---|
| 211 | read3.AddFile("star_proton_test.root");
|
|---|
| 212 | read3.AddFile("star_helium_test.root");
|
|---|
| 213 |
|
|---|
| 214 | read3.DisableAutoScheme();
|
|---|
| 215 | tlist3.AddToList(&read3);
|
|---|
| 216 |
|
|---|
| 217 | tlist3.AddToList(&SizeCut);
|
|---|
| 218 |
|
|---|
| 219 | MRanForestCalc calc;
|
|---|
| 220 | tlist3.AddToList(&calc);
|
|---|
| 221 |
|
|---|
| 222 | // parameter containers you want to save
|
|---|
| 223 | //
|
|---|
| 224 |
|
|---|
| 225 | TString outfname = "star_S";
|
|---|
| 226 | outfname += minsize;
|
|---|
| 227 | outfname += "_all.root";
|
|---|
| 228 | MWriteRootFile write(outfname, "recreate");
|
|---|
| 229 |
|
|---|
| 230 | write.AddContainer("MMcEvt", "Events");
|
|---|
| 231 | write.AddContainer("MHillas", "Events");
|
|---|
| 232 | write.AddContainer("MHillasExt", "Events");
|
|---|
| 233 | write.AddContainer("MImagePar", "Events");
|
|---|
| 234 | write.AddContainer("MNewImagePar", "Events");
|
|---|
| 235 | write.AddContainer("MHillasSrc", "Events");
|
|---|
| 236 | write.AddContainer("MHadronness", "Events");
|
|---|
| 237 |
|
|---|
| 238 | write.AddContainer("MRawRunHeader", "RunHeaders");
|
|---|
| 239 | write.AddContainer("MSrcPosCam", "RunHeaders");
|
|---|
| 240 | write.AddContainer("MMcRunHeader", "RunHeaders");
|
|---|
| 241 |
|
|---|
| 242 | /*
|
|---|
| 243 | write.AddContainer("MMcTrig", "Events");
|
|---|
| 244 | write.AddContainer("MRawEvtData", "Events");
|
|---|
| 245 | write.AddContainer("MRawEvtHeader", "Events");
|
|---|
| 246 | */
|
|---|
| 247 |
|
|---|
| 248 |
|
|---|
| 249 | MFillH fillh3a("MHHadronness");
|
|---|
| 250 | MFillH fillh3b("MHRanForest");
|
|---|
| 251 |
|
|---|
| 252 | tlist3.AddToList(&fillh3a);
|
|---|
| 253 | tlist3.AddToList(&fillh3b);
|
|---|
| 254 |
|
|---|
| 255 |
|
|---|
| 256 | tlist3.AddToList(&write);
|
|---|
| 257 |
|
|---|
| 258 | evtloop.SetProgressBar(&bar);
|
|---|
| 259 |
|
|---|
| 260 | //
|
|---|
| 261 | // Execute your analysis
|
|---|
| 262 | //
|
|---|
| 263 | if (!evtloop.Eventloop())
|
|---|
| 264 | return;
|
|---|
| 265 |
|
|---|
| 266 | tlist3.PrintStatistics();
|
|---|
| 267 |
|
|---|
| 268 | plist.FindObject("MHRanForest")->DrawClone();
|
|---|
| 269 |
|
|---|
| 270 | TCanvas *had = new TCanvas;
|
|---|
| 271 | had->cd();
|
|---|
| 272 | plist.FindObject("MHHadronness")->Draw();
|
|---|
| 273 |
|
|---|
| 274 | TString gifname = "had_S";
|
|---|
| 275 | gifname += minsize;
|
|---|
| 276 | gifname += ".gif";
|
|---|
| 277 |
|
|---|
| 278 | had->SaveAs(gifname);
|
|---|
| 279 | had->Close();
|
|---|
| 280 |
|
|---|
| 281 | plist.FindObject("MHHadronness")->DrawClone();
|
|---|
| 282 | plist.FindObject("MHHadronness")->Print();//*/
|
|---|
| 283 |
|
|---|
| 284 | return;
|
|---|
| 285 | }
|
|---|