Hall A ROOT/C++ Analyzer (podd)
Loading...
Searching...
No Matches
THaVhist.cxx
Go to the documentation of this file.
1//*-- AUTHOR : Robert Michaels 05/08/2002
2
4//
5// THaVhist
6//
7// Vector of histograms; of course can be just 1 histogram.
8// This object uses TH1 class of ROOT to form a histogram
9// used by THaOutput.
10// The X and Y axis, as well as cut conditions, can be
11// formulas of global variables.
12// They can also be arrays of variables, or vector formula,
13// though certain rules apply about the dimensions; see
14// THaOutput documentation for those rules.
15//
16//
17// author: R. Michaels May 2003
18//
20
21#include "THaVhist.h"
22#include "THaVform.h"
23#include "THaString.h"
24#include "TObject.h"
25#include "THaVarList.h"
26#include "THaVar.h"
27#include "THaCut.h"
28#include "TH1.h"
29#include "TH2.h"
30#include "TFile.h"
31#include "TRegexp.h"
32#include "TError.h"
33#include "TROOT.h"
34#include <cstdlib>
35#include <algorithm>
36#include <iostream>
37#include <utility>
38
39using namespace std;
40using namespace THaString;
41
42//_____________________________________________________________________________
43THaVhist::THaVhist( string type, string name, string title ) :
44 fType(std::move(type)), fName(std::move(name)), fTitle(std::move(title)),
45 fNbinX(0), fNbinY(0), fSize(0), fInitStat(0), fScalar(0), fEye(0),
46 fEyeOffset(0), fXlo(0.), fXhi(0.), fYlo(0.), fYhi(0.),
47 fFirst(true), fProc(true), fFormX(nullptr), fFormY(nullptr), fCut(nullptr),
48 fMyFormX(false), fMyFormY(false), fMyCut(false), fDebug(0)
49{
50 fH1.clear();
51}
52
53//_____________________________________________________________________________
55{
56 if (fMyFormX) delete fFormX;
57 if (fMyFormY) delete fFormY;
58 if (fMyCut) delete fCut;
59 if( TROOT::Initialized() ) {
60 for( auto& ith : fH1 ) delete ith;
61 }
62}
63
64//_____________________________________________________________________________
66{
67 fProc = true;
68 if (fEye == 0 && fScalar == 0 && fSize != static_cast<Int_t>(fH1.size())) {
69 fProc = false;
70 ErrPrint();
71 cerr << "THaVhist:ERROR:: Inconsistent sizes."<<endl;
72 }
73 if (fFormX == nullptr) {
74 fProc = false;
75 ErrPrint();
76 cerr << "THaVhist:ERROR:: No X axis defined."<<endl;
77 }
78 if (fInitStat != 0) {
79 fProc = false;
80 ErrPrint();
81 cerr << "THaVhist:ERROR:: Improperly initialized."<<endl;
82 }
83}
84
85//_____________________________________________________________________________
87{
88 // Must be called once at beginning of execution.
89 // Initializes this vector of histograms.
90 // Sets up the X, Y, and cuts as THaVforms.
91 // Checks the dimensionality of this object and
92 // calls BookHisto() to instantiate the histograms.
93 // fInitStat is returned.
94 // fInitStat == 0 --> all ok
95 // fInitStat !=0 --> various errors, interpreted
96 // with ErrPrint();
97
98 if( TROOT::Initialized() ) {
99 for( auto& ith : fH1 ) delete ith;
100 }
101 fH1.clear();
102 fInitStat = 0;
103
104 if (fDebug) cout << "THaVhist :: init " << fName << endl;
105
106 if (fNbinX == 0) {
107 cerr << "THaVhist:ERROR:: Histogram "<<fName<<" has no bins."<<endl;
109 return fInitStat;
110 }
111 if (fFormX == nullptr) {
112 if( fVarX.empty() ) {
113 cerr << "THaVhist:WARNING:: Empty X formula." << endl;
114 }
115 string sname = fName+"X";
116 if (fDebug) cout << "THaVhist :: X var " << sname << endl;
117
118 if (FindEye(fVarX)) {
119 fFormX = new THaVform("eye",sname.c_str(),"[0]");
121 } else {
122 fFormX = new THaVform("formula",sname.c_str(),fVarX.c_str());
123 }
124 fMyFormX = true;
125
126 Int_t status = fFormX->Init();
127 if (status != 0) {
128 fFormX->ErrPrint(status);
130 return fInitStat;
131 }
132 }
133
134 if (fDebug) cout << "THaVhist :: Y bins " << fNbinY << endl;
135
136 if (fNbinY != 0 && fFormY == nullptr) {
137 if( fVarY.empty()) {
138 cerr << "THaVhist:WARNING:: Empty Y formula."<<endl;
139 }
140 string sname = fName+"Y";
141 if (FindEye(fVarY)) {
142 fFormY = new THaVform("eye",sname.c_str(),"[0]");
144 } else {
145 fFormY = new THaVform("formula",sname.c_str(),fVarY.c_str());
146 }
147 fMyFormY = true;
148
149 Int_t status = fFormY->Init();
150 if (status != 0) {
151 fFormY->ErrPrint(status);
153 return fInitStat;
154 }
155 }
156 if (fCut == nullptr && HasCut()) {
157 string sname = fName+"Cut";
158 fCut = new THaVform("cut",sname.c_str(),fScut.c_str());
159 fMyCut = true;
160
161 Int_t status = fCut->Init();
162 if (status != 0) {
163 fCut->ErrPrint(status);
165 return fInitStat;
166 }
167 }
168
169
170 fSize = FindVarSize();
171
172 if (fDebug) cout << "THaVhist :: fSize = " << fSize << endl;
173
174 if (fSize < 0) {
175 switch (fSize) {
176 case -1:
177 fInitStat = kNoX;
178 return fInitStat;
179
180 case -2:
182 return fInitStat;
183
184 case -3:
186 return fInitStat;
187
188 case -4:
190 return fInitStat;
191
192 default:
193 fInitStat = kUnk;
194 return fInitStat;
195 }
196 }
197
198 BookHisto(0, fSize);
199
200 return fInitStat;
201}
202
203//_____________________________________________________________________________
205{
206 if (fFormX && fMyFormX) fFormX->ReAttach();
207 if (fFormY && fMyFormY) fFormY->ReAttach();
208 if (fCut && fMyCut) fCut->ReAttach();
209}
210
211
212//_____________________________________________________________________________
213Bool_t THaVhist::FindEye(const string& var) {
214// If the variable is "[I]" it is an "Eye" variable.
215// This means we will simply use I = 0,1,2, to fill that axis.
216 const string eye = "[I]";
217 if( fDebug ) cout << "FindEye for var = " << var << endl;
218 auto pos1 = var.find(ToUpper(eye), 0);
219 auto pos2 = var.find(ToLower(eye), 0);
220 auto pos = string::npos;
221 if( pos1 != string::npos ) pos = pos1;
222 if( pos2 != string::npos ) pos = pos2;
223 if( pos != string::npos ) {
224 if( var.length() == eye.length() ) {
225 if( fDebug ) cout << "Is an Eye var [I]" << endl;
226 return true;
227 }
228 }
229// If you did not find [I] there could be an offset like [I+1].
230 if( fDebug ) cout << "Checking for Eye offset " << endl;
231 return FindEyeOffset(var);
232}
233
234//_____________________________________________________________________________
235Bool_t THaVhist::FindEyeOffset(const string& var) {
236// If the variable is "[I+offset]" it is an "Eye" variable
237// with offset fEyeOffset.
238// This means we will use I = 0+offset, 1+offset, 2+offset ...
239// to fill that axis.
240 fEyeOffset = 0;
241 const string eyestart = "[I+";
242 const string eyeend = "]";
243 auto pos1 = var.find(ToUpper(eyestart), 0);
244 auto pos2 = var.find(ToLower(eyestart), 0);
245 auto pos = string::npos;
246 if( pos1 != string::npos ) pos = pos1;
247 if( pos2 != string::npos ) pos = pos2;
248 if( pos != string::npos ) {
249 auto pos3 = var.find(eyeend, pos);
250 if( pos3 != string::npos ) {
251 pos3 = var.find(eyeend, pos);
252 if( pos3 != string::npos ) {
253 string cnum = var.substr(pos + 3, var.length() - 4);
254 fEyeOffset = atoi(cnum.c_str());
255 if( fDebug )
256 cout << "FindEyeOffset: substring with number " << pos << " "
257 << pos3 << " " << cnum << " " << fEyeOffset << endl;
258 return true;
259 }
260 }
261 }
262 if( fDebug ) cout << "Not an Eye variable! " << endl;
263 return false;
264}
265
266//_____________________________________________________________________________
268{
269 // Find the size of this object, according to these rules:
270 //
271 // 1) Scalar: One histogram
272 // If this histogram was declared as "sTH1F", "sTH2F" etc in the
273 // output definition file (type starts with "s", case insensitive),
274 // it is a scalar, i.e. one histogram.
275 // If X (Y) is a vector and Y (X) is a scalar, then all the vectors
276 // get filled for the given scalar.
277 // If the X and Y are both vectors they must have the same
278 // dimensions or there is an error, and the indices track.
279 // The cut can be a scalar or a vector; if the cut is a
280 // vector it must have the same dimensions as the X or the Y since
281 // the indices track with the variable which is a vector.
282 //
283 // 2) potentially a vector -- the old (ca 2003) behavior.
284 // If the histogram was declared as vTH1F, vTH2F, etc it is
285 // potentially a vector, depending on rules 2a, 2b, 2c below.
286 // Actually this is the case if the first character is not "s"
287 // or is absent, e.g. just TH1F, TH2F, etc. (old behavior).
288 // Rules to determine size:
289 // 2a) If one of the variables is an "eye" ("[I]") then
290 // the other variable to determines the eye's size.
291 // (Also note, "[I+4]" is an "eye" but would add an offset of 4 to
292 // the index I. I suppose the most common use would be [I+1]. )
293 // 2b) If the cut is a scalar, and if one of X or Y is
294 // a scalar, this histo will be a scalar (i.e. one element).
295 // 2c) If neither a) nor b), then the size is the size of the
296 // X component.
297 // The sizes of X,Y,cuts must obey the rules encoded below.
298 // Return code:
299 // 1 = size is 1, i.e. a scalar.
300 // > 1 = size of this vector.
301 // < 0 = Rules were violated, as follows:
302 // -1 = No X defined. Must have at least an X.
303 // -2 = Inconsistent size of X and Y.
304 // -3 = Cut size inconsistent with X.
305 // -4 = Cut size inconsistent with Y.
306
307 if (!fFormX) return -2; // Error, must have at least an X.
308 Int_t sizex = 0, sizey = 0, sizec = 0;
309 if (fCut) sizec = fCut->GetSize();
310// From output definition file, it's already known to be a scalar
311// because of the "s" prefix, e.g. "sth2f"
312 if (fScalar) {
313 sizex = fFormX->GetSize();
314 if (fDebug) cout << "THaVhist:: is scalar , sizex = " << sizex
315 << " sizec " << sizec << " fFormY " << fFormY << endl;
316 if (fFormY) {
317 sizey = fFormY->GetSize();
318 if (fDebug) cout << "THaVhist:: sizey = " << sizey << endl;
319 if (sizey != sizex) {
320 cerr << "Scalar histogram, but inconsistent sizes of X and Y"<<endl;
321 return -2;
322 }
323 }
324 if (sizec > 1) { // if sizec=1 or 0 it's ok.
325 if (sizec != sizex) {
326 cerr << "Scalar histogram, but cut size inconsistent"<<endl;
327 return -3;
328 }
329 }
330 return 1; // It's a scalar
331 }
332
333// Find the size by rules 2a, 2b, 2c (explained above) :
334// This is the old (circa 2003) behavior
335 if ( fFormX->IsEye() ) {
336 fEye = 1;
337 } else {
338 sizex = fFormX->GetSize();
339 }
340 if (fFormY) {
341 sizey = fFormY->GetSize();
342 if ( fFormY->IsEye() ) {
343 fEye = 1;
344 sizey = sizex;
345 } else {
346 if (fFormX->IsEye()) sizex = sizey;
347 }
348 }
349 if ( (sizex != 0 && sizey != 0) && (sizex != sizey) ) {
350 cerr<< "THaVhist::ERROR: inconsistent axis sizes"<<endl;
351 return -2;
352 }
353 if ( (sizex != 0 && sizec > 1) && (sizex != sizec) ) {
354 cerr<< "THaVhist::ERROR: inconsistent cut size"<<endl;
355 return -3;
356 }
357 if ( (sizey != 0 && sizec > 1) && (sizey != sizec) ) {
358 cerr<< "THaVhist::ERROR: inconsistent cut size"<<endl;
359 return -4;
360 }
361 if ( (sizec <= 1) && (sizex <=1 || sizey <= 1) ) {
362 fScalar = 1; // This object is a scalar.
363 return 1;
364 }
365 fScalar = 0; // This object is a vector.
366 return sizex;
367}
368
369
370//_____________________________________________________________________________
372{
373 // Using ROOT Histogram classes, set up the vector
374 // of histograms of type fType (th1f, th1d, th2f, th2d)
375 // for vector indices that run from hfirst to hlast.
376 fSize = hlast;
377 if(fDebug) cout << "BookHisto:: " << hfirst << " " << hlast << endl;
378 if (hfirst > hlast) return -1;
379 if (fSize > fgVHIST_HUGE) {
380 // fSize cannot be infinite.
381 // The following probably indicates a usage error.
382 cerr << "THaVhist::WARNING: Asking for a too-huge";
383 cerr << " number of histograms !!" << endl;
384 cerr << "Truncating at " << fgVHIST_HUGE << endl;
386 }
387 // Booking a histogram with zero bins is suspicious.
388 if (fNbinX == 0) cerr << "THaVhist:WARNING: fNbinX = 0."<<endl;
389
390 string sname = fName;
391 string stitle = fTitle;
392 bool doing_array = (fSize>1);
393 for (Int_t i = hfirst; i < fSize; ++i) {
394 if (fDebug) cout << "BookHisto " << i << " " << fType << endl;
395 if (fEye == 0 && doing_array) {
396 sname = fName + Form("%d",i);
397 stitle = fTitle + Form(" %d",i);
398 }
399 if (fEye == 1 && i > hfirst) continue;
400 if (CmpNoCase(fType,"th1f") == 0) {
401 fH1.push_back(new TH1F(sname.c_str(),
402 stitle.c_str(), fNbinX, fXlo, fXhi));
403 }
404 if (CmpNoCase(fType,"th1d") == 0) {
405 fH1.push_back(new TH1D(sname.c_str(),
406 stitle.c_str(), fNbinX, fXlo, fXhi));
407 }
408 if (CmpNoCase(fType,"th2f") == 0) {
409 fH1.push_back(new TH2F(sname.c_str(), stitle.c_str(),
411 if (fNbinY == 0) {
412 // Booking a 2D histo with zero Y bins is suspicious.
413 cerr << "THaVhist:WARNING:: ";
414 cerr << "2D histo with fNbiny = 0 ?"<<endl;
415 }
416 }
417 if (CmpNoCase(fType,"th2d") == 0) {
418 fH1.push_back(new TH2D(sname.c_str(), stitle.c_str(),
420 if (fNbinY == 0) {
421 cerr << "THaVhist:WARNING:: ";
422 cerr << "2D histo with fNbiny = 0 ?"<<endl;
423 }
424 }
425 }
426 return 0;
427}
428
429//_____________________________________________________________________________
431{
432 // Every event must Process() to fill histograms.
433 // Two cases: This object is either a scalar or a vector.
434 // If it's a scalar, then we fill one histogram, and if one
435 // of the variables is an array then all its elements are put
436 // into that histogram.
437 // If it's a vector, then (as previously verified) 2 or more
438 // from among [x, y, cuts] are vectors of same size. Hence
439 // fill a vector of histograms with indices running in parallel.
440 // Also, a vector of histograms can grow in size (up to a
441 // sensible limit) if the inputs grow in size.
442
443 // Check validity just once for efficiency.
444 if (fDebug) cout << "---------------- THaVhist :: Process " << fName << " // " << fTitle << endl << flush;
445 if (fFirst) {
446 fFirst = false;
448 }
449 if ( !IsValid() ) return -1;
450
451 if (fMyFormX) fFormX->Process();
452 if (fFormY && fMyFormY) fFormY->Process();
453 Int_t sizec = 0;
454 if (fCut && fMyCut) {
455 fCut->Process();
456 sizec = fCut->GetSize();
457 }
458
459 if ( IsScalar() ) {
460 // The following is my interpretation of the original code with a bugfix
461 // for the case where both X and Y are variable-size arrays (23-Jan-17 joh)
462 Int_t sizex = fFormX->GetSize();
463 if(fDebug) cout << "THaVhist :: Process sizex " << sizex << endl << flush;
464
465 if( fFormY ) { // 2D histo
466 Int_t sizey = fFormY->GetSize();
467 if(fDebug) cout << "THaVhist :: Process sizey " << sizey << endl << flush;
468 // Vararrys that report zero size are empty; nothing to do
469 if( (sizex == 0 && fFormX->IsVarray()) ||
470 (sizey == 0 && fFormY->IsVarray()) )
471 return 0;
472 // Slightly tricky coding here to avoid redundant testing inside the loop
473 Int_t zero = 0, i = 0;
474 // If GetSize()==0 for either variable, retrieve index = 0
475 Int_t *ix = (sizex == 0) ? &zero : &i;
476 Int_t *iy = (sizey == 0) ? &zero : &i;
477 // if cut size > 1, let the index track the other variable's index
478 Int_t *ic = (sizec <= 1) ? &zero : &i;
479
480 if(fDebug) cout << "THaVhist :: Process ix, iy, ic "
481 << *ix << " " << *iy << " " << *ic << endl;
482
483 // Number of valid elements:
484 // If GetSize()==0 for X or Y, it's the size of the other variable
485 // (one or more entries in Y (X) vs one fixed X (Y))
486 // If both have size > 0, it's the smaller of the two
487 // (diagonal elements of the XY index matrix)
488 Int_t n = (sizex == 0 || sizey == 0) ? max(sizex,sizey) : min(sizex,sizey);
489 if(fDebug) cout << "THaVhist :: Process n " << n << endl;
490 for ( ; i < n; ++i) {
491 // cout << "THaVhist :: proc loop: data "<<i<<" "<<fFormX->GetData(*ix)<<" "<<fFormY->GetData(*iy)<<" *ic "<<*ic<<endl<<flush;
492 if ( CheckCut(*ic)==0 ) continue;
493 // cout << "THaVhist :: proc loop: FILLING HISTO "<<i<<endl;
494 fH1[0]->Fill(fFormX->GetData(*ix), fFormY->GetData(*iy));
495 }
496
497 } else { // 1D histo
498
499 for (Int_t i = 0; i < sizex; ++i) {
500 if(fDebug) cout << "THaVhist :: 1D histo " << i << " " << sizec << endl;
501 if (sizec == sizex) {
502 if ( CheckCut(i)==0 ) continue;
503 } else {
504 if ( CheckCut()==0 ) continue;
505 }
506 fH1[0]->Fill(fFormX->GetData(i));
507 }
508 }
509
510 } else { // Vector histogram.
511
512// Expand if the size has changed.
514 if (size < 0) return -1;
515 if (size > fSize) {
517 fSize = size;
518 }
519
520 // Slightly tricky coding here to avoid redundant testing inside the loop
521 Int_t zero = 0, i = 0;
522 Int_t* idx = (fEye == 1) ? &zero : &i;
523 if( fFormY ) {
524 for( ; i < fSize; ++i ) {
525 if ( CheckCut(i)==0 ) continue;
526 fH1[*idx]->Fill(fFormX->GetData(i), fFormY->GetData(i));
527 }
528 } else {
529 for( ; i < fSize; ++i ) {
530 if ( CheckCut(i)==0 ) continue;
531 fH1[*idx]->Fill(fFormX->GetData(i));
532 }
533 }
534 }
535
536 return 0;
537}
538
539//_____________________________________________________________________________
541{
542 for( auto& ith : fH1 ) ith->Write();
543 return 0;
544}
545
546
547//_____________________________________________________________________________
549{
550 cerr << "THaVhist::ERROR:: Invalid histogram."<<endl;
551 cerr << "Offending line:"<<endl;
552 cerr << fType << " " << fName << " '" << fTitle<< "' ";
553 cerr << GetVarX() << " " << fNbinX;
554 cerr << " " << fXlo << " " << fXhi;
555 if (fNbinY != 0) {
556 cerr << GetVarY() << " " << fNbinY;
557 cerr << " " << fYlo << " " << fYhi;
558 }
559 if (HasCut()) cerr << " "<<fScut;
560 cerr << endl;
561 switch (fInitStat) {
562 case kNoBinX:
563 cerr << "Number of bins in X is zero."<<endl;
564 cerr << "This must be a typo error."<<endl;
565 break;
566 case kIllFox:
567 cerr << "Illegal formula on X axis."<<endl;
568 if (fFormX) fFormX->ErrPrint(fFormX->Init());
569 break;
570 case kIllFoy:
571 cerr << "Illegal formula on Y axis."<<endl;
572 if (fFormY) fFormY->ErrPrint(fFormY->Init());
573 break;
574 case kIllCut:
575 cerr << "Illegal formula for Cut."<<endl;
576 if (fCut) fCut->ErrPrint(fCut->Init());
577 break;
578 case kNoX:
579 cerr << "No X axis defined. Must at least have an X."<<endl;
580 break;
581 case kAxiSiz:
582 cerr << "Inconsistent size of X and Y axes."<<endl;
583 break;
584 case kCutSix:
585 cerr << "Size of Cut inconsistent with size of X."<<endl;
586 break;
587 case kCutSiy:
588 cerr << "Size of Cut inconsistent with size of Y."<<endl;
589 break;
590 case kOK:
591 case kUnk:
592 default:
593 cerr << "Unknown error."<<endl;
594 break;
595 }
596}
597
598//_____________________________________________________________________________
599void THaVhist::Print() const
600{
601 cout << " Histo "<<fType<<" : "<<fName;
602 cout << " Size : "<<fSize;
603 cout << " Title : '"<<fTitle<<"' "<<endl;
604 cout << " X : "<<GetVarX()<<" nbins "<<fNbinX;
605 cout << " xlo "<<fXlo<<" xhi "<<fXhi<<endl;
606 if (fNbinY != 0) {
607 cout << " Y : "<<GetVarY()<<" nbins "<<fNbinY;
608 cout << " ylo "<<fYlo<<" yhi "<<fYhi<<endl;
609 }
610 if (HasCut()) cout << " Cut : "<<fScut<<endl;
611 if (fInitStat != kOK) ErrPrint();
612}
613
614//_____________________________________________________________________________
int Int_t
size_t fSize
size_t size(const MatrixT &matrix)
bool Bool_t
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 name[80]
TString ToUpper(const TString &s)
TString ToLower(const TString &s)
char * Form(const char *fmt,...)
T1 fFirst
void SetEyeOffset(Int_t offset)
Definition THaVform.h:59
Bool_t IsVarray() const
Definition THaVform.h:64
Int_t GetSize() const
Definition THaVform.h:68
void ErrPrint(Int_t status) const
Definition THaVform.cxx:184
void ReAttach()
Definition THaVform.cxx:363
Int_t Process()
Definition THaVform.cxx:564
Double_t GetData(Int_t index=0) const
Definition THaVform.h:112
Bool_t IsEye() const
Definition THaVform.h:66
Int_t Init()
Definition THaVform.cxx:263
Double_t fXhi
Definition THaVhist.h:79
void ErrPrint() const
Definition THaVhist.cxx:548
virtual ~THaVhist()
Definition THaVhist.cxx:54
Bool_t fMyCut
Definition THaVhist.h:84
Bool_t IsScalar() const
Definition THaVhist.h:58
std::vector< TH1 * > fH1
Definition THaVhist.h:82
Int_t End()
Definition THaVhist.cxx:540
Bool_t IsValid() const
Definition THaVhist.h:42
Int_t CheckCut(Int_t index=0)
Definition THaVhist.h:146
static const int fgVHIST_HUGE
Definition THaVhist.h:75
Double_t fYhi
Definition THaVhist.h:79
Bool_t FindEye(const string &var)
Definition THaVhist.cxx:213
@ kNoBinX
Definition THaVhist.h:70
@ kIllFoy
Definition THaVhist.h:70
@ kIllFox
Definition THaVhist.h:70
@ kAxiSiz
Definition THaVhist.h:71
@ kIllCut
Definition THaVhist.h:70
@ kCutSix
Definition THaVhist.h:71
@ kCutSiy
Definition THaVhist.h:71
Int_t Init()
Definition THaVhist.cxx:86
void Print() const
Definition THaVhist.cxx:599
Bool_t fMyFormX
Definition THaVhist.h:84
Bool_t FindEyeOffset(const string &var)
Definition THaVhist.cxx:235
const string & GetVarX() const
Definition THaVhist.h:37
Int_t fNbinX
Definition THaVhist.h:78
Double_t fYlo
Definition THaVhist.h:79
string fType
Definition THaVhist.h:77
void ReAttach()
Definition THaVhist.cxx:204
THaVform * fFormX
Definition THaVhist.h:83
const string & GetVarY() const
Definition THaVhist.h:38
Int_t Process()
Definition THaVhist.cxx:430
string fName
Definition THaVhist.h:77
Bool_t HasCut() const
Definition THaVhist.h:41
Double_t fXlo
Definition THaVhist.h:79
Int_t BookHisto(Int_t hfirst, Int_t hlast)
Definition THaVhist.cxx:371
THaVform * fFormY
Definition THaVhist.h:83
string fVarY
Definition THaVhist.h:77
Int_t fInitStat
Definition THaVhist.h:78
THaVform * fCut
Definition THaVhist.h:83
string fVarX
Definition THaVhist.h:77
Int_t FindVarSize()
Definition THaVhist.cxx:267
Int_t fSize
Definition THaVhist.h:78
Int_t fEyeOffset
Definition THaVhist.h:78
string fTitle
Definition THaVhist.h:77
Int_t fNbinY
Definition THaVhist.h:78
Int_t fEye
Definition THaVhist.h:78
THaVhist(string type, string name, string title)
Definition THaVhist.cxx:43
string fScut
Definition THaVhist.h:77
Int_t fScalar
Definition THaVhist.h:78
Bool_t fProc
Definition THaVhist.h:80
Bool_t fMyFormY
Definition THaVhist.h:84
Int_t fDebug
Definition THaVhist.h:85
void CheckValidity()
Definition THaVhist.cxx:65
Bool_t fFirst
Definition THaVhist.h:80
static Bool_t Initialized()
const Int_t n
double min(double x, double y)
double max(double x, double y)
int CmpNoCase(const string &r, const string &s)
Definition THaString.cxx:19
STL namespace.
ClassImp(TPyArg)