KaliVeda
Toolkit for HIC analysis
Loading...
Searching...
No Matches
KVSpIdGUI.cpp
1//Created by KVClassFactory on Wed Nov 28 13:11:32 2012
2//Author: dgruyer
3
4#include "KVSpIdGUI.h"
5#include "Riostream.h"
6#include "KVIDGridManager.h"
7#include "TGFileDialog.h"
8#include "TPad.h"
9#include <TGMsgBox.h>
10#include <TTimer.h>
11#include <TClass.h>
12#include <TROOT.h>
13#include <TGLayout.h>
14#include <TCanvas.h>
15#include "KVConfig.h"
16#include "KVNucleus.h"
17#include "TStyle.h"
18#include "TBox.h"
19#include "TLine.h"
20#include "KVNuclearChart.h"
21#include "KVHistoManipulator.h"
22
34
36
37
38
39
40
41KVSpIdGUI::KVSpIdGUI(KVIDGraph* g, TH2* data_histo, Double_t xm, Double_t ym, Double_t pdx, Double_t pdy, const char* opt)
42{
43 fOption = opt;
44 fHisto = data_histo;
45 fGrid = g;
46 fScaledHisto = 0;
47 fIdentificator = 0;
48
49 fXm = xm;
50 fYm = ym;
51 fPdx = pdx;
52 fPdy = pdy;
53
54 fUserParameter = (fZp > 0);
55 fSfx = 1.;
56 fSfy = 1.;
57
58 if (fHisto) {
59 fSfx = fHisto->GetNbinsX() * 1. / (fHisto->GetXaxis()->GetXmax());
60 fSfy = fHisto->GetNbinsY() * 1 / (fHisto->GetYaxis()->GetXmax());
61 }
62
63 //Dialog box for testing identification grid
64 fMain = new TGTransientFrame(gClient->GetDefaultRoot(), gClient->GetDefaultRoot(), 10, 10);
65 fMain->Connect("CloseWindow()", "KVSpIdGUI", this, "DoClose()");
66 fMain->DontCallClose(); // to avoid double deletions.
67
68 fGrid = g;
69 // use hierarchical cleaning
70 fMain->SetCleanup(kDeepCleanup);
71
72 /******* frame for initialization **************/
73 fInitFrame = new TGGroupFrame(fMain, "Initialization");
74
75 fZpFrame = new TGHorizontalFrame(fInitFrame);
76 fZpLabel = new TGLabel(fZpFrame, "Z ");
77 fZpEntry = new TGNumberEntry(fZpFrame, fZp, 6, 0,
79 fZpEntry->SetState(kTRUE);
80
81 fZpFrame->AddFrame(fZpLabel, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
82 fZpFrame->AddFrame(fZpEntry, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
83
84 fSpiderFactorLabel = new TGLabel(fZpFrame, "Parameter ");
85 fSpiderFactorEntry = new TGNumberEntry(fZpFrame, fSpFactor, 6, 0,
87 fSpiderFactorRadio = new TGCheckButton(fZpFrame);
88 fSpiderFactorRadio->Connect("Toggled(Bool_t)", "KVSpIdGUI", this, "SetUserParameter(Bool_t)");
89
90 SetUserParameter(fUserParameter);
91
92 fZpFrame->AddFrame(fSpiderFactorRadio, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
93 fZpFrame->AddFrame(fSpiderFactorEntry, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
94 fZpFrame->AddFrame(fSpiderFactorLabel, new TGLayoutHints(kLHintsRight, 5, 2, 2, 2));
95 fInitFrame->AddFrame(fZpFrame, new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
96
97
98 /******* frame for options **************/
99 fOptFrame = new TGGroupFrame(fMain, "Options");
100
101 fTypeFrame = new TGHorizontalFrame(fOptFrame);
102 fTypeLabel = new TGLabel(fTypeFrame, "Grid ");
103
104 fTypeChoice = new TGComboBox(fTypeFrame);
105 fTypeChoice->AddEntry("Si-CsI", 0);
106 fTypeChoice->AddEntry("Si-Si", 1);
107 fTypeChoice->AddEntry("ChIo-Si", 2);
108 fTypeChoice->AddEntry("Other", 3);
109 fTypeChoice->Resize(80, 22);
110 fTypeChoice->Select(fMatrixType);
111
112 fTypeFrame->AddFrame(fTypeLabel, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
113 fTypeFrame->AddFrame(fTypeChoice, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
114
115
116 fNPointsLabel = new TGLabel(fTypeFrame, "Np : ");
117 fNPointsEntry = new TGNumberEntry(fTypeFrame, fNPoints, 4, 0,
119
120 fTypeFrame->AddFrame(fNPointsEntry, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
121 fTypeFrame->AddFrame(fNPointsLabel, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
122
123 fPiedLabel = new TGLabel(fTypeFrame, " Piedestal ");
124
125 fPiedChoice = new TGComboBox(fTypeFrame);
126 fPiedChoice->AddEntry("User", 0);
127 fPiedChoice->AddEntry("Auto", 1);
128 fPiedChoice->AddEntry("None", 2);
129 fPiedChoice ->Resize(80, 22);
130 fPiedChoice->Select(fPiedType);
131
132 fTypeFrame->AddFrame(fPiedChoice, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
133 fTypeFrame->AddFrame(fPiedLabel, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
134
135 fOptFrame->AddFrame(fTypeFrame, new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
136
137 fDebugFrame = new TGHorizontalFrame(fOptFrame);
138 fDebugBut = new TGCheckButton(fDebugFrame, "Debug");
139 fDebugBut->SetState((!fDebug ? kButtonUp : kButtonDown), kFALSE);
140 fDebugBut->Connect("Toggled(Bool_t)", "KVSpIdGUI", this, "SetDebug(Bool_t)");
141
142 fCutBut = new TGCheckButton(fDebugFrame, "Keep cuts");
143 fCutBut->SetState((!fUseCut ? kButtonUp : kButtonDown), kFALSE);
144 fCutBut->Connect("Toggled(Bool_t)", "KVSpIdGUI", this, "SetUseCut(Bool_t)");
145
146 fDebugFrame->AddFrame(fCutBut, new TGLayoutHints(kLHintsCenterX, 2, 2, 2, 2));
147 fDebugFrame->AddFrame(fDebugBut, new TGLayoutHints(kLHintsCenterX, 2, 2, 2, 2));
148 fOptFrame->AddFrame(fDebugFrame, new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
149
150
151 /******* frame for advanced options **************/
152 fAdOptFrame = new TGGroupFrame(fMain, "Advanced options");
153
154 fAngleUpFrame = new TGHorizontalFrame(fAdOptFrame);
155 fAngleUpLabel = new TGLabel(fAngleUpFrame, "Angles : above");
156 fAngleUpEntry = new TGNumberEntry(fAngleUpFrame, fAnglesUp, 4, 0,
158
159 fAngleUpFrame->AddFrame(fAngleUpLabel, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
160 fAngleUpFrame->AddFrame(fAngleUpEntry, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
161
162 fAngleDownLabel = new TGLabel(fAngleUpFrame, " below");
163 fAngleDownEntry = new TGNumberEntry(fAngleUpFrame, fAnglesDown, 4, 0,
165
166 fAngleUpFrame->AddFrame(fAngleDownLabel, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
167 fAngleUpFrame->AddFrame(fAngleDownEntry, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
168
169 fApertureLabel = new TGLabel(fAngleUpFrame, " alpha");
170 fApertureUpEntry = new TGNumberEntry(fAngleUpFrame, fAlpha, 4, 0,
172
173 fAngleUpFrame->AddFrame(fApertureLabel, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
174 fAngleUpFrame->AddFrame(fApertureUpEntry, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
175 fAdOptFrame->AddFrame(fAngleUpFrame, new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
176
177 /********** progress bar **********/
178 fProgressBar = new TGHProgressBar(fMain, TGProgressBar::kFancy, 300);
179 fProgressBar->SetFillType(TGProgressBar::kBlockFill);
180 fProgressBar->ShowPosition();
181 fProgressBar->SetBarColor("red");
182
183 /************buttons***************/
184 fButtonsFrame = new TGHorizontalFrame(fMain, 100, 50);
185 fTestButton = new TGTextButton(fButtonsFrame, "&Spider");
186 fTestButton->Connect("Clicked()", "KVSpIdGUI", this,
187 "SpiderIdentification()");
188 fCloseButton = new TGTextButton(fButtonsFrame, "&Close");
189 fCloseButton->Connect("Clicked()", "KVSpIdGUI", this,
190 "DoClose()");
191
192 fButtonsFrame->AddFrame(fTestButton,
195 kLHintsCenterY, 2, 2, 5, 5));
196 fButtonsFrame->AddFrame(fCloseButton,
199 kLHintsCenterY, 2, 2, 5, 5));
200
201
202 fMain->AddFrame(fInitFrame, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2, 2, 10, 2));
203 fMain->AddFrame(fOptFrame, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2, 2, 2, 2));
204 fMain->AddFrame(fAdOptFrame, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2, 2, 2, 2));
205 fMain->AddFrame(fProgressBar, new TGLayoutHints(kLHintsCenterX | kLHintsTop, 5, 5, 5, 5));
206 fMain->AddFrame(fButtonsFrame, new TGLayoutHints(kLHintsCenterX | kLHintsTop, 2, 2, 2, 2));
207
208 //layout and display window
209 fMain->MapSubwindows();
210 fMain->Resize(fMain->GetDefaultSize());
211
212 // position relative to the parent's window
213 fMain->CenterOnParent();
214
215 fMain->SetWindowName("Spider Identification");
216 fMain->MapWindow();
217
218}
219
220
221
223
225{
226 TTimer::SingleShot(150, "KVSpIdGUI", this, "CloseWindow()");
227}
228
229
230
232
234{
235 delete this;
236}
237
238
239
242
244{
245 //Delete all widgets
246 if ((fIdentificator) && (!fDebug)) delete fIdentificator;
247 if ((fScaledHisto) && (!fDebug)) delete fScaledHisto;
248 delete fMain;
249}
250
251
252
253
260
262{
263 // Copy constructor
264 // This ctor is used to make a copy of an existing object (for example
265 // when a method returns an object), and it is always a good idea to
266 // implement it.
267 // If your class allocates memory in its constructor(s) then it is ESSENTIAL :-)
268
269}
270
271
272
274
282
283
284
286
288{
289 Double_t fact = TMath::Sqrt((fXm - fPdx) * (fXm - fPdx) * (fSfx * fSfx) + (fYm - fPdy) * (fYm - fPdy) * (fSfy * fSfy)) / (20.*fZp * 12.);
290 return fact;
291}
292
293
294
296
298{
299 if ((!fHisto) || (!fGrid)) return;
300
301 TVirtualPad* pad = fGrid->GetPad();
302 fGrid->UnDraw();
303
307
315
316 TH2* tmpHisto = fHisto;
317 TList* tmpCut = 0;
318 if (fUseCut) {
319 tmpHisto = (TH2*)fHisto->Clone(Form("%s_cut", fHisto->GetName()));
320 tmpHisto->Reset();
321 for (int i = 1; i <= fHisto->GetNbinsX(); i++) {
322 for (int j = 1; j <= fHisto->GetNbinsY(); j++) {
323 Stat_t ww = fHisto->GetBinContent(i, j);
326 if (fGrid->IsIdentifiable(x0, y0)) tmpHisto->Fill(x0, y0, ww);
327 }
328 }
329 tmpCut = (TList*)fGrid->GetCuts()->Clone("tmpCuts");
330 }
331
332 fGrid->Clear();
333
334 if (fScaledHisto) delete fScaledHisto;
336
337 TF1 RtLt("RtLt", Form("x*%lf", fSfx), 0, tmpHisto->GetXaxis()->GetXmax());
338 TF1 RtLty("RtLty", Form("x*%lf", fSfy), 0, tmpHisto->GetXaxis()->GetXmax());
339 fScaledHisto = (TH2F*)hm.ScaleHisto(tmpHisto, &RtLt, &RtLty);
340
341 if (fIdentificator) delete fIdentificator;
343
344 switch (fPiedType) {
345 case kUser:
348 break;
349 case kAuto:
350 break;
351 case kNone:
354 }
355
359
362 fIdentificator->Connect("Increment(Float_t)", "TGHProgressBar", fProgressBar, "SetPosition(Float_t)");
363
369
370 fIdentificator->Disconnect("Increment(Float_t)", fProgressBar, "SetPosition(Float_t)");
372
374
376
377 KVIDZALine* TheLine = 0;
378 int zmax = 0;
379
380 KVSpiderLine* spline = 0;
381 TIter next_line(ll);
382 while ((spline = (KVSpiderLine*)next_line())) {
383 if ((spline->GetN() > 10)) { //&&(spline->GetX(0)<=fIdentificator->GetX0()+200.))
384 TF1* ff1 = 0;
385
386// printf("#%s# z=%d\n",spline->GetName(),spline->GetZ());
387
388 if (type == KVSpiderIdentificator::kSiCsI) ff1 = spline->GetFunction(fPdx * fSfx, TMath::Max(fScaledHisto->GetXaxis()->GetXmax() * 0.9, spline->GetX(spline->GetN() - 1)));
389 else if (type == KVSpiderIdentificator::kSiSi) ff1 = spline->GetFunction(fPdx * fSfx, TMath::Min(fScaledHisto->GetXaxis()->GetXmax() * 0.9, spline->GetX(spline->GetN() - 1) * 1.5));
390 else if (type == KVSpiderIdentificator::kChIoSi) ff1 = spline->GetFunction(fPdx * fSfx, TMath::Min(fScaledHisto->GetXaxis()->GetXmax() * 0.9, spline->GetX(spline->GetN() - 1) * 1.5));
391 else ff1 = spline->GetFunction();
392
393 /*
394 if ((type == kSiCsI) && (ff1->GetParameter(1) >= 3000. || (ff1->GetParameter(2) <= 0.35) || (ff1->GetParameter(2) >= 1.))) {
395 Info("SpiderIdentification", "Z = %d has been rejected (fit parameters)", spline->GetZ());
396 continue;
397 }
398 */
399 TheLine = (KVIDZALine*)((KVIDZAGrid*)fGrid)->NewLine("ID");
400 TheLine->SetZ(spline->GetZ());
401 double min, max;
402 ff1->GetRange(min, max);
403 max = TMath::Min(max, fHisto->GetXaxis()->GetXmax() * 0.95);
404// double step = TMath::Min((max - min) /fNPoints, 20.); //20.;
405 double step = (max - min) / fNPoints; //20.;
406 double stepmax = 5.*step; //800.;
407
408 double x = 0.;
409 for (x = min + 1; x < max; x += step) {
410 if (step < stepmax) step *= 1.2;
411 TheLine->SetPoint(TheLine->GetN(), x, ff1->Eval(x));
412 }
413 if (max > x) TheLine->SetPoint(TheLine->GetN(), max, ff1->Eval(max));
414
415 fGrid->Add("ID", TheLine);
416 if (spline->GetZ() >= zmax) zmax = spline->GetZ();
417 }
418 else {
419 Info("SpiderIdentification", "Z = %d has been rejected (too few points)", spline->GetZ());
420 }
421 }
422
423 TF1 fx("fx12", Form("x/%lf", fSfx), 0., fScaledHisto->GetNbinsX() * 1.);
424 TF1 fy("fy12", Form("x/%lf", fSfy), 0., fScaledHisto->GetNbinsY() * 1.);
425 fGrid->Scale(&fx, &fy);
426
427 if (fUseCut) delete tmpHisto;
428
429 if (tmpCut) fGrid->GetCuts()->AddAll(tmpCut);
430 pad->cd();
431 fGrid->Draw();
432 pad->Modified();
433 pad->Update();
434
435 DoClose();
436}
437
438
439
440
int Int_t
bool Bool_t
double Axis_t
constexpr Bool_t kFALSE
double Double_t
double Stat_t
constexpr Bool_t kTRUE
kButtonDown
kButtonUp
#define gClient
kDeepCleanup
kLHintsRight
kLHintsLeft
kLHintsCenterY
kLHintsCenterX
kLHintsTop
kLHintsExpandX
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 g
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 type
char * Form(const char *fmt,...)
Toolkit for various operations on histograms & graphs not provided by ROOT.
TH1 * ScaleHisto(TH1 *hh, TF1 *fx, TF1 *fy=NULL, Int_t nx=-1, Int_t ny=-1, Double_t xmin=-1., Double_t xmax=-1., Double_t ymin=-1., Double_t ymax=-1., Option_t *norm="")
Base class for particle identification in a 2D map.
Definition KVIDGraph.h:32
void Add(TString, KVIDentifier *)
void Scale(Double_t sx=-1, Double_t sy=-1)
Called by SetX/YScaleFactor methods to rescale every point of every object in the grid.
void Draw(Option_t *opt="")
void UnDraw()
virtual Bool_t IsIdentifiable(Double_t, Double_t, TString *rejected_by=nullptr) const
TVirtualPad * GetPad() const
Definition KVIDGraph.h:133
const KVList * GetCuts() const
Definition KVIDGraph.h:308
virtual void Clear(Option_t *opt="")
Identification grid with lines corresponding to different nuclear isotopes (KVIDZALine)
Definition KVIDZAGrid.h:66
Base class for identification ridge lines corresponding to different nuclear species.
Definition KVIDZALine.h:33
virtual void SetZ(Int_t ztnum)
static Double_t fSpFactor
Definition KVSpIdGUI.h:106
virtual ~KVSpIdGUI()
Delete all widgets.
static Double_t fAlpha
Definition KVSpIdGUI.h:107
TString fOption
Definition KVSpIdGUI.h:127
static Bool_t fUseCut
Definition KVSpIdGUI.h:111
TGComboBox * fPiedChoice
Definition KVSpIdGUI.h:69
static Int_t fZp
Definition KVSpIdGUI.h:105
TGNumberEntry * fSpiderFactorEntry
Definition KVSpIdGUI.h:57
static Int_t fAnglesUp
Definition KVSpIdGUI.h:112
static Bool_t fDebug
Definition KVSpIdGUI.h:108
Double_t fXm
Definition KVSpIdGUI.h:118
Double_t fYm
Definition KVSpIdGUI.h:119
void SpiderIdentification()
TH2F * fScaledHisto
Definition KVSpIdGUI.h:101
Double_t fSfy
Definition KVSpIdGUI.h:124
TGNumberEntry * fNPointsEntry
Definition KVSpIdGUI.h:73
TGTextButton * fCloseButton
Definition KVSpIdGUI.h:97
Double_t fSfx
Definition KVSpIdGUI.h:123
Double_t fPdx
Definition KVSpIdGUI.h:120
Bool_t fUserParameter
Definition KVSpIdGUI.h:126
TH2 * fHisto
Definition KVSpIdGUI.h:100
static Int_t fPiedType
Definition KVSpIdGUI.h:115
Double_t GetFactor()
TGNumberEntry * fAngleDownEntry
Definition KVSpIdGUI.h:87
static Int_t fMatrixType
Definition KVSpIdGUI.h:114
TGNumberEntry * fZpEntry
Definition KVSpIdGUI.h:52
static Int_t fAnglesDown
Definition KVSpIdGUI.h:113
static Bool_t fPiedestal
Definition KVSpIdGUI.h:109
TGComboBox * fTypeChoice
Definition KVSpIdGUI.h:65
TGNumberEntry * fApertureUpEntry
Definition KVSpIdGUI.h:90
TGHProgressBar * fProgressBar
Progress Bar and buttons.
Definition KVSpIdGUI.h:93
void DoClose()
void SetUserParameter(Bool_t par)
void CloseWindow()
TGTransientFrame * fMain
Definition KVSpIdGUI.h:41
KVIDGraph * fGrid
Definition KVSpIdGUI.h:99
TGTextButton * fTestButton
Definition KVSpIdGUI.h:96
TGNumberEntry * fAngleUpEntry
Definition KVSpIdGUI.h:84
Double_t fPdy
Definition KVSpIdGUI.h:121
TGCheckButton * fSpiderFactorRadio
Definition KVSpIdGUI.h:58
KVSpIdGUI(KVIDGraph *g=0, TH2 *data_histo=0, Double_t xm=-1., Double_t ym=-1., Double_t pdx=-1., Double_t pdy=-1., const char *opt="DRLF")
Definition KVSpIdGUI.cpp:41
static Int_t fNPoints
Definition KVSpIdGUI.h:116
KVSpiderIdentificator * fIdentificator
Definition KVSpIdGUI.h:103
Semi-automatic identification grid generator.
void SetNangles(Int_t up, Int_t down)
void SetParameters(double bining_=1.)
void Draw(Option_t *opt_="")
Part of Spider Identification.
double GetX(int n_) const
int GetN() const
virtual TF1 * GetFunction(double min_=-1., double max_=-1.)
virtual Double_t GetBinCenter(Int_t bin) const
Double_t GetXmax() const
virtual void AddAll(const TCollection *col)
TObject * Clone(const char *newname="") const override
virtual void GetRange(Double_t &xmin, Double_t &xmax) const
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
virtual void SetEnabled(Bool_t e=kTRUE)
void SetState(EButtonState state, Bool_t emit=kFALSE) override
virtual Int_t GetSelected() const
virtual void SetState(Bool_t enable=kTRUE)
virtual Long_t GetIntNumber() const
virtual Double_t GetNumber() const
void SetRange(Float_t min, Float_t max)
virtual void Reset()
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Int_t GetN() const
virtual Int_t GetNbinsY() const
TAxis * GetXaxis()
virtual Int_t GetNbinsX() const
TAxis * GetYaxis()
TObject * Clone(const char *newname="") const override
virtual Int_t Fill(const char *namex, const char *namey, Double_t w)
void Reset(Option_t *option="") override
virtual Double_t GetBinContent(Int_t bin) const
const char * GetName() const override
const char * Data() const
static void SingleShot(Int_t milliSec, const char *receiver_class, void *receiver, const char *method)
virtual void Modified(Bool_t flag=1)=0
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
virtual void Update()=0
Double_t x[n]
void Info(const char *location, const char *fmt,...)
double min(double x, double y)
double max(double x, double y)
Double_t Min(Double_t a, Double_t b)
Double_t Sqrt(Double_t x)
Double_t Max(Double_t a, Double_t b)
ClassImp(TPyArg)