Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TMLPAnalyzer.cxx
Go to the documentation of this file.
1// @(#)root/mlp:$Id$
2// Author: Christophe.Delaere@cern.ch 25/04/04
3
4/*************************************************************************
5 * Copyright (C) 1995-2003, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TMLPAnalyzer
13
14This utility class contains a set of tests useful when developing
15a neural network.
16It allows you to check for unneeded variables, and to control
17the network structure.
18
19*/
20
21#include "TROOT.h"
22#include "TSynapse.h"
23#include "TNeuron.h"
25#include "TMLPAnalyzer.h"
26#include "TTree.h"
27#include "TTreeFormula.h"
28#include "TEventList.h"
29#include "TH1D.h"
30#include "TProfile.h"
31#include "THStack.h"
32#include "TLegend.h"
33#include "TVirtualPad.h"
34#include "TRegexp.h"
35#include "TMath.h"
36#include "snprintf.h"
37#include <iostream>
38#include <cstdlib>
39
40
41////////////////////////////////////////////////////////////////////////////////
42/// Destructor
43
45{
46 delete fAnalysisTree;
47 delete fIOTree;
48}
49
50////////////////////////////////////////////////////////////////////////////////
51/// Returns the number of layers.
52
54{
55 TString fStructure = fNetwork->GetStructure();
56 return fStructure.CountChar(':')+1;
57}
58
59////////////////////////////////////////////////////////////////////////////////
60/// Returns the number of neurons in given layer.
61
63{
64 if(layer==1) {
65 TString fStructure = fNetwork->GetStructure();
66 TString input = TString(fStructure(0, fStructure.First(':')));
67 return input.CountChar(',')+1;
68 }
69 else if(layer==GetLayers()) {
70 TString fStructure = fNetwork->GetStructure();
71 TString output = TString(fStructure(fStructure.Last(':') + 1,
72 fStructure.Length() - fStructure.Last(':')));
73 return output.CountChar(',')+1;
74 }
75 else {
76 Int_t cnt=1;
77 TString fStructure = fNetwork->GetStructure();
78 TString hidden = TString(fStructure(fStructure.First(':') + 1,
79 fStructure.Last(':') - fStructure.First(':') - 1));
80 Int_t beg = 0;
81 Int_t end = hidden.Index(":", beg + 1);
82 Int_t num = 0;
83 while (end != -1) {
84 num = atoi(TString(hidden(beg, end - beg)).Data());
85 cnt++;
86 beg = end + 1;
87 end = hidden.Index(":", beg + 1);
88 if(layer==cnt) return num;
89 }
90 num = atoi(TString(hidden(beg, hidden.Length() - beg)).Data());
91 cnt++;
92 if(layer==cnt) return num;
93 }
94 return -1;
95}
96
97////////////////////////////////////////////////////////////////////////////////
98/// Returns the formula used as input for neuron (idx) in
99/// the first layer.
100
102{
103 TString fStructure = fNetwork->GetStructure();
104 TString input = TString(fStructure(0, fStructure.First(':')));
105 Int_t beg = 0;
106 Int_t end = input.Index(",", beg + 1);
108 Int_t cnt = 0;
109 while (end != -1) {
110 brName = TString(input(beg, end - beg));
111 if (brName[0]=='@')
112 brName = brName(1,brName.Length()-1);
113 beg = end + 1;
114 end = input.Index(",", beg + 1);
115 if(cnt==idx) return brName;
116 cnt++;
117 }
118 brName = TString(input(beg, input.Length() - beg));
119 if (brName[0]=='@')
120 brName = brName(1,brName.Length()-1);
121 return brName;
122}
123
124////////////////////////////////////////////////////////////////////////////////
125/// Returns the name of any neuron from the input layer
126
128{
129 TNeuron* neuron=(TNeuron*)fNetwork->fFirstLayer[in];
130 return neuron ? neuron->GetName() : "NO SUCH NEURON";
131}
132
133////////////////////////////////////////////////////////////////////////////////
134/// Returns the name of any neuron from the output layer
135
137{
138 TNeuron* neuron=(TNeuron*)fNetwork->fLastLayer[out];
139 return neuron ? neuron->GetName() : "NO SUCH NEURON";
140}
141
142////////////////////////////////////////////////////////////////////////////////
143/// Gives some information about the network in the terminal.
144
146{
147 TString fStructure = fNetwork->GetStructure();
148 std::cout << "Network with structure: " << fStructure.Data() << std::endl;
149 std::cout << "inputs with low values in the differences plot may not be needed" << std::endl;
150 // Checks if some input variable is not needed
151 char var[64], sel[64];
152 for (Int_t i = 0; i < GetNeurons(1); i++) {
153 snprintf(var,64,"diff>>tmp%d",i);
154 snprintf(sel,64,"inNeuron==%d",i);
155 fAnalysisTree->Draw(var, sel, "goff");
156 TH1F* tmp = (TH1F*)gDirectory->Get(Form("tmp%d",i));
157 if (!tmp) continue;
158 std::cout << GetInputNeuronTitle(i)
159 << " -> " << tmp->GetMean()
160 << " +/- " << tmp->GetRMS() << std::endl;
161 }
162}
163
164////////////////////////////////////////////////////////////////////////////////
165/// Collect information about what is useful in the network.
166/// This method has to be called first when analyzing a network.
167/// Fills the two analysis trees.
168
170{
171 Double_t shift = 0.1;
174 Int_t nEvents = test->GetN();
175 Int_t nn = GetNeurons(1);
176 Double_t* params = new Double_t[nn];
177 Double_t* rms = new Double_t[nn];
179 Int_t* index = new Int_t[nn];
180 TString formula;
181 TRegexp re("{[0-9]+}$");
182 Ssiz_t len = formula.Length();
183 Ssiz_t pos = -1;
184 Int_t i(0), j(0), k(0), l(0);
185 for(i=0; i<nn; i++){
186 formula = GetNeuronFormula(i);
187 pos = re.Index(formula,&len);
188 if(pos==-1 || len<3) {
189 formulas[i] = new TTreeFormula(Form("NF%zu",(size_t)this),formula,data);
190 index[i] = 0;
191 }
192 else {
193 TString newformula(formula,pos);
194 TString val = formula(pos+1,len-2);
195 formulas[i] = new TTreeFormula(Form("NF%zu",(size_t)this),newformula,data);
196 formula = newformula;
197 index[i] = val.Atoi();
198 }
199 TH1D tmp("tmpb", "tmpb", 1, -FLT_MAX, FLT_MAX);
200 tmp.SetDirectory(gDirectory);
201 data->Draw(Form("%s>>tmpb",formula.Data()),"","goff");
202 rms[i] = tmp.GetRMS();
203 }
204 Int_t inNeuron = 0;
205 Double_t diff = 0.;
206 if(fAnalysisTree) delete fAnalysisTree;
207 fAnalysisTree = new TTree("result","analysis");
208 fAnalysisTree->SetDirectory(nullptr);
209 fAnalysisTree->Branch("inNeuron",&inNeuron,"inNeuron/I");
210 fAnalysisTree->Branch("diff",&diff,"diff/D");
214
215 delete fIOTree;
216 fIOTree=new TTree("MLP_iotree","MLP_iotree");
217 fIOTree->SetDirectory(nullptr);
219 for (i=0; i<nn; i++)
220 leaflist+=Form("In%d/D:",i);
221 leaflist.Remove(leaflist.Length()-1);
222 fIOTree->Branch("In", params, leaflist);
223
224 leaflist="";
225 for (i=0; i<numOutNodes; i++)
226 leaflist+=Form("Out%d/D:",i);
227 leaflist.Remove(leaflist.Length()-1);
228 fIOTree->Branch("Out", outVal, leaflist);
229
230 leaflist="";
231 for (i=0; i<numOutNodes; i++)
232 leaflist+=Form("True%d/D:",i);
233 leaflist.Remove(leaflist.Length()-1);
234 fIOTree->Branch("True", trueVal, leaflist);
235 Double_t v1 = 0.;
236 Double_t v2 = 0.;
237 // Loop on the events in the test sample
238 for(j=0; j< nEvents; j++) {
239 fNetwork->GetEntry(test->GetEntry(j));
240 // Loop on the neurons to evaluate
241 for(k=0; k<GetNeurons(1); k++) {
242 params[k] = formulas[k]->EvalInstance(index[k]);
243 }
244 for(k=0; k<GetNeurons(GetLayers()); k++) {
245 outVal[k] = fNetwork->Evaluate(k,params);
246 trueVal[k] = ((TNeuron*)fNetwork->fLastLayer[k])->GetBranch();
247 }
248 fIOTree->Fill();
249
250 // Loop on the input neurons
251 for (i = 0; i < GetNeurons(1); i++) {
252 inNeuron = i;
253 diff = 0;
254 // Loop on the neurons in the output layer
255 for(l=0; l<GetNeurons(GetLayers()); l++){
256 params[i] += shift*rms[i];
257 v1 = fNetwork->Evaluate(l,params);
258 params[i] -= 2*shift*rms[i];
259 v2 = fNetwork->Evaluate(l,params);
260 diff += (v1-v2)*(v1-v2);
261 // reset to original value
262 params[i] += shift*rms[i];
263 }
266 }
267 }
268 delete[] params;
269 delete[] rms;
270 delete[] outVal;
271 delete[] trueVal;
272 delete[] index;
273 for(i=0; i<GetNeurons(1); i++) delete formulas[i];
274 delete [] formulas;
277}
278
279////////////////////////////////////////////////////////////////////////////////
280/// Draws the distribution (on the test sample) of the
281/// impact on the network output of a small variation of
282/// the ith input.
283
285{
286 char sel[64];
287 snprintf(sel,64, "inNeuron==%d", i);
288 fAnalysisTree->Draw("diff", sel);
289}
290
291////////////////////////////////////////////////////////////////////////////////
292/// Draws the distribution (on the test sample) of the
293/// impact on the network output of a small variation of
294/// each input.
295/// DrawDInputs() draws something that approximates the distribution of the
296/// derivative of the NN w.r.t. each input. That quantity is recognized as
297/// one of the measures to determine key quantities in the network.
298///
299/// What is done is to vary one input around its nominal value and to see
300/// how the NN changes. This is done for each entry in the sample and produces
301/// a distribution.
302///
303/// What you can learn from that is:
304/// - is variable a really useful, or is my network insensitive to it ?
305/// - is there any risk of big systematic ? Is the network extremely sensitive
306/// to small variations of any of my inputs ?
307///
308/// As you might understand, this is to be considered with care and can serve
309/// as input for an "educated guess" when optimizing the network.
310
312{
313 THStack* stack = new THStack("differences","differences (impact of variables on ANN)");
314 TLegend* legend = new TLegend(0.75,0.75,0.95,0.95);
315 TH1F* tmp = nullptr;
316 char var[64], sel[64];
317 for(Int_t i = 0; i < GetNeurons(1); i++) {
318 snprintf(var,64, "diff>>tmp%d", i);
319 snprintf(sel,64, "inNeuron==%d", i);
320 fAnalysisTree->Draw(var, sel, "goff");
321 tmp = (TH1F*)gDirectory->Get(Form("tmp%d",i));
322 tmp->SetDirectory(nullptr);
323 tmp->SetLineColor(i+1);
324 stack->Add(tmp);
325 legend->AddEntry(tmp,GetInputNeuronTitle(i),"l");
326 }
327 stack->Draw("nostack");
328 legend->Draw();
329 gPad->SetLogy();
330}
331
332////////////////////////////////////////////////////////////////////////////////
333/// Draws the distribution of the neural network (using ith neuron).
334/// Two distributions are drawn, for events passing respectively the "signal"
335/// and "background" cuts. Only the test sample is used.
336
337void TMLPAnalyzer::DrawNetwork(Int_t neuron, const char* signal, const char* bg)
338{
341 TEventList* current = data->GetEventList();
342 data->SetEventList(test);
343 THStack* stack = new THStack("__NNout_TMLPA",Form("Neural net output (neuron %d)",neuron));
344 TH1F *bgh = new TH1F("__bgh_TMLPA", "NN output", 50, -0.5, 1.5);
345 TH1F *sigh = new TH1F("__sigh_TMLPA", "NN output", 50, -0.5, 1.5);
346 bgh->SetDirectory(nullptr);
347 sigh->SetDirectory(nullptr);
348 Int_t nEvents = 0;
349 Int_t j=0;
350 // build event lists for signal and background
351 TEventList* signal_list = new TEventList("__tmpSig_MLPA");
352 TEventList* bg_list = new TEventList("__tmpBkg_MLPA");
353 signal_list->SetDirectory(gDirectory);
354 bg_list->SetDirectory(gDirectory);
355 data->Draw(">>__tmpSig_MLPA",signal,"goff");
356 data->Draw(">>__tmpBkg_MLPA",bg,"goff");
357
358 // fill the background
359 nEvents = bg_list->GetN();
360 for(j=0; j< nEvents; j++) {
361 bgh->Fill(fNetwork->Result(bg_list->GetEntry(j),neuron));
362 }
363 // fill the signal
364 nEvents = signal_list->GetN();
365 for(j=0; j< nEvents; j++) {
366 sigh->Fill(fNetwork->Result(signal_list->GetEntry(j),neuron));
367 }
368 // draws the result
369 bgh->SetLineColor(kBlue);
370 bgh->SetFillStyle(3008);
371 bgh->SetFillColor(kBlue);
372 sigh->SetLineColor(kRed);
373 sigh->SetFillStyle(3003);
374 sigh->SetFillColor(kRed);
375 bgh->SetStats(false);
376 sigh->SetStats(false);
377 stack->Add(bgh);
378 stack->Add(sigh);
379 TLegend *legend = new TLegend(.75, .80, .95, .95);
380 legend->AddEntry(bgh, "Background");
381 legend->AddEntry(sigh,"Signal");
382 stack->Draw("nostack");
383 legend->Draw();
384 // restore the default event list
385 data->SetEventList(current);
386 delete signal_list;
387 delete bg_list;
388}
389
390////////////////////////////////////////////////////////////////////////////////
391/// Create a profile of the difference of the MLP output minus the
392/// true value for a given output node outnode, vs the true value for
393/// outnode, for all test data events. This method is mainly useful
394/// when doing regression analysis with the MLP (i.e. not classification,
395/// but continuous truth values).
396/// The resulting TProfile histogram is returned.
397/// It is not drawn if option "goff" is specified.
398/// Options are passed to TProfile::Draw
399
401 Option_t *option /*=""*/)
402{
404 TString pipehist=Form("MLP_truthdev_%d",outnode);
406 drawline.Form("Out.Out%d-True.True%d:True.True%d>>",
408 fIOTree->Draw(drawline+pipehist+"(20)", "", "goff prof");
410 h->SetDirectory(nullptr);
411 const char* title=GetOutputNeuronTitle(outnode);
412 if (title) {
413 h->SetTitle(Form("#Delta(output - truth) vs. truth for %s",
414 title));
415 h->GetXaxis()->SetTitle(title);
416 h->GetYaxis()->SetTitle(Form("#Delta(output - truth) for %s", title));
417 }
418 if (!strstr(option,"goff"))
419 h->Draw();
420 return h;
421}
422
423////////////////////////////////////////////////////////////////////////////////
424/// Creates TProfiles of the difference of the MLP output minus the
425/// true value vs the true value, one for each output, filled with the
426/// test data events. This method is mainly useful when doing regression
427/// analysis with the MLP (i.e. not classification, but continuous truth
428/// values).
429/// The returned THStack contains all the TProfiles. It is drawn unless
430/// the option "goff" is specified.
431/// Options are passed to TProfile::Draw.
432
434{
435 THStack *hs=new THStack("MLP_TruthDeviation",
436 "Deviation of MLP output from truth");
437
438 // leg!=0 means we're drawing
439 TLegend *leg=nullptr;
440 if (!option || !strstr(option,"goff"))
441 leg=new TLegend(.4,.85,.95,.95,"#Delta(output - truth) vs. truth for:");
442
443 const char* xAxisTitle=nullptr;
444
445 // create profile for each input neuron,
446 // adding them into the THStack and the TLegend
449 h->SetLineColor(1+outnode);
450 hs->Add(h, option);
451 if (leg) leg->AddEntry(h,GetOutputNeuronTitle(outnode));
452 if (!outnode)
453 // Xaxis title is the same for all, extract it from the first one.
454 xAxisTitle=h->GetXaxis()->GetTitle();
455 }
456
457 if (leg) {
458 hs->Draw("nostack");
459 leg->Draw();
460 // gotta draw before accessing the axes
461 hs->GetXaxis()->SetTitle(xAxisTitle);
462 hs->GetYaxis()->SetTitle("#Delta(output - truth)");
463 }
464
465 return hs;
466}
467
468////////////////////////////////////////////////////////////////////////////////
469/// Creates a profile of the difference of the MLP output outnode minus
470/// the true value of outnode vs the input value innode, for all test
471/// data events.
472/// The resulting TProfile histogram is returned.
473/// It is not drawn if option "goff" is specified.
474/// Options are passed to TProfile::Draw
475
477 Int_t outnode /*=0*/,
478 Option_t *option /*=""*/)
479{
481 TString pipehist=Form("MLP_truthdev_i%d_o%d", innode, outnode);
483 drawline.Form("Out.Out%d-True.True%d:In.In%d>>",
485 fIOTree->Draw(drawline+pipehist+"(50)", "", "goff prof");
487 h->SetDirectory(nullptr);
490 h->SetTitle(Form("#Delta(output - truth) of %s vs. input %s",
492 h->GetXaxis()->SetTitle(Form("%s", titleInNeuron));
493 h->GetYaxis()->SetTitle(Form("#Delta(output - truth) for %s",
495 if (!strstr(option,"goff"))
496 h->Draw(option);
497 return h;
498}
499
500////////////////////////////////////////////////////////////////////////////////
501/// Creates a profile of the difference of the MLP output outnode minus the
502/// true value of outnode vs the input value, stacked for all inputs, for
503/// all test data events.
504/// The returned THStack contains all the TProfiles. It is drawn unless
505/// the option "goff" is specified.
506/// Options are passed to TProfile::Draw.
507
509 Option_t *option /*=""*/)
510{
512 sName.Form("MLP_TruthDeviationIO_%d", outnode);
514 THStack *hs=new THStack(sName,
515 Form("Deviation of MLP output %s from truth",
517
518 // leg!=0 means we're drawing.
519 TLegend *leg=nullptr;
520 if (!option || !strstr(option,"goff"))
521 leg=new TLegend(.4,.75,.95,.95,
522 Form("#Delta(output - truth) of %s vs. input for:",
524
525 // create profile for each input neuron,
526 // adding them into the THStack and the TLegend
528 Int_t innode=0;
529 for (innode=0; innode<numInNodes; innode++) {
531 h->SetLineColor(1+innode);
532 hs->Add(h, option);
533 if (leg) leg->AddEntry(h,h->GetXaxis()->GetTitle());
534 }
535
536 if (leg) {
537 hs->Draw("nostack");
538 leg->Draw();
539 // gotta draw before accessing the axes
540 hs->GetXaxis()->SetTitle("Input value");
541 hs->GetYaxis()->SetTitle(Form("#Delta(output - truth) for %s",
543 }
544
545 return hs;
546}
#define h(i)
Definition RSha256.hxx:106
const char Option_t
Option string (const char)
Definition RtypesCore.h:81
@ kRed
Definition Rtypes.h:67
@ kBlue
Definition Rtypes.h:67
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define gDirectory
Definition TDirectory.h:385
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t sel
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
#define gROOT
Definition TROOT.h:417
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2570
#define gPad
#define snprintf
Definition civetweb.c:1579
<div class="legacybox"><h2>Legacy Code</h2> TEventList is a legacy interface: there will be no bug fi...
Definition TEventList.h:31
1-D histogram with a double per channel (see TH1 documentation)
Definition TH1.h:926
1-D histogram with a float per channel (see TH1 documentation)
Definition TH1.h:878
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
Definition TH1.cxx:9170
TObject * FindObject(const char *name) const override
Search object named name in the list of functions.
Definition TH1.cxx:4008
The Histogram stack class.
Definition THStack.h:40
virtual void Add(TH1 *h, Option_t *option="")
Add a new histogram to the list.
Definition THStack.cxx:364
void Draw(Option_t *chopt="") override
Draw this stack with its current attributes.
Definition THStack.cxx:451
This class displays a legend box (TPaveText) containing several legend entries.
Definition TLegend.h:23
TTree * fAnalysisTree
Int_t GetNeurons(Int_t layer)
Returns the number of neurons in given layer.
Int_t GetLayers()
Returns the number of layers.
TProfile * DrawTruthDeviation(Int_t outnode=0, Option_t *option="")
Create a profile of the difference of the MLP output minus the true value for a given output node out...
void DrawDInput(Int_t i)
Draws the distribution (on the test sample) of the impact on the network output of a small variation ...
const char * GetOutputNeuronTitle(Int_t out)
Returns the name of any neuron from the output layer.
~TMLPAnalyzer() override
Destructor.
void DrawDInputs()
Draws the distribution (on the test sample) of the impact on the network output of a small variation ...
TTree * fIOTree
THStack * DrawTruthDeviationInsOut(Int_t outnode=0, Option_t *option="")
Creates a profile of the difference of the MLP output outnode minus the true value of outnode vs the ...
void CheckNetwork()
Gives some information about the network in the terminal.
void GatherInformations()
Collect information about what is useful in the network.
THStack * DrawTruthDeviations(Option_t *option="")
Creates TProfiles of the difference of the MLP output minus the true value vs the true value,...
TProfile * DrawTruthDeviationInOut(Int_t innode, Int_t outnode=0, Option_t *option="")
Creates a profile of the difference of the MLP output outnode minus the true value of outnode vs the ...
const char * GetInputNeuronTitle(Int_t in)
Returns the name of any neuron from the input layer.
TMultiLayerPerceptron * fNetwork
TString GetNeuronFormula(Int_t idx)
Returns the formula used as input for neuron (idx) in the first layer.
void DrawNetwork(Int_t neuron, const char *signal, const char *bg)
Draws the distribution of the neural network (using ith neuron).
Double_t Evaluate(Int_t index, Double_t *params) const
Returns the Neural Net for a given set of input parameters #parameters must equal #input neurons.
TEventList * fTest
! EventList defining the events in the test dataset
TTree * fData
! pointer to the tree used as datasource
Double_t Result(Int_t event, Int_t index=0) const
Computes the output for a given event.
TObjArray fLastLayer
Collection of the output neurons; subset of fNetwork.
TObjArray fFirstLayer
Collection of the input neurons; subset of fNetwork.
void GetEntry(Int_t) const
Load an entry into the network.
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
This class describes an elementary neuron, which is the basic element for a Neural Network.
Definition TNeuron.h:25
Profile Histogram.
Definition TProfile.h:32
Regular expression class.
Definition TRegexp.h:31
Basic string class.
Definition TString.h:138
Ssiz_t Length() const
Definition TString.h:427
Int_t Atoi() const
Return integer value of string.
Definition TString.cxx:2068
Ssiz_t First(char c) const
Find first occurrence of a character c.
Definition TString.cxx:545
const char * Data() const
Definition TString.h:386
Ssiz_t Last(char c) const
Find last occurrence of a character c.
Definition TString.cxx:938
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
Definition TString.cxx:522
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition TString.h:662
Used to pass a selection expression to the Tree drawing routine.
A TTree represents a columnar dataset.
Definition TTree.h:89
virtual Int_t Fill()
Fill all branches.
Definition TTree.cxx:4653
void Draw(Option_t *opt) override
Default Draw method for all objects.
Definition TTree.h:478
virtual void SetDirectory(TDirectory *dir)
Change the tree's directory.
Definition TTree.cxx:9220
TBranch * Branch(const char *name, T *obj, Int_t bufsize=32000, Int_t splitlevel=99)
Add a new branch, and infer the data type from the type of obj being passed.
Definition TTree.h:397
virtual void ResetBranchAddresses()
Tell all of our branches to drop their current objects and allocate new ones.
Definition TTree.cxx:8268
leg
Definition legend1.C:34
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:675
TLine l
Definition textangle.C:4