ROOT  6.06/09
Reference Guide
TSelectorDraw.cxx
Go to the documentation of this file.
1 // @(#)root/treeplayer:$Id$
2 // Author: Rene Brun 08/01/2003
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, 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 TSelectorDraw
13 A specialized TSelector for TTree::Draw.
14 */
15 
16 #include "TSelectorDraw.h"
17 #include "TROOT.h"
18 #include "TH2.h"
19 #include "TH3.h"
20 #include "TView.h"
21 #include "TGraph.h"
22 #include "TPolyMarker3D.h"
23 #include "TDirectory.h"
24 #include "TVirtualPad.h"
25 #include "TProfile.h"
26 #include "TProfile2D.h"
27 #include "TTreeFormulaManager.h"
28 #include "TEnv.h"
29 #include "TTree.h"
30 #include "TCut.h"
31 #include "TEntryList.h"
32 #include "TEventList.h"
33 #include "TEntryListArray.h"
34 #include "THLimitsFinder.h"
35 #include "TStyle.h"
36 #include "TClass.h"
37 #include "TColor.h"
38 
40 
41 const Int_t kCustomHistogram = BIT(17);
42 
43 ////////////////////////////////////////////////////////////////////////////////
44 /// Default selector constructor.
45 
47 {
48  fTree = 0;
49  fW = 0;
50  fValSize = 4;
51  fVal = new Double_t*[fValSize];
52  fVmin = new Double_t[fValSize];
53  fVmax = new Double_t[fValSize];
54  fNbins = new Int_t[fValSize];
55  fVarMultiple = new Bool_t[fValSize];
56  fVar = new TTreeFormula*[fValSize];
57  for (Int_t i = 0; i < fValSize; ++i) {
58  fVal[i] = 0;
59  fVar[i] = 0;
60  }
61  fManager = 0;
62  fMultiplicity = 0;
63  fSelect = 0;
64  fSelectedRows = 0;
65  fDraw = 0;
66  fObject = 0;
67  fOldHistogram = 0;
68  fObjEval = kFALSE;
69  fSelectMultiple = kFALSE;
70  fCleanElist = kFALSE;
71  fTreeElist = 0;
72  fAction = 0;
73  fNfill = 0;
74  fDimension = 0;
75  fOldEstimate = 0;
76  fForceRead = 0;
77  fWeight = 1;
78  fCurrentSubEntry = -1;
79  fTreeElistArray = 0;
80 }
81 
82 ////////////////////////////////////////////////////////////////////////////////
83 /// Selector destructor.
84 
86 {
87  ClearFormula();
88  delete [] fVar;
89  if (fVal) {
90  for (Int_t i = 0; i < fValSize; ++i)
91  delete [] fVal[i];
92  delete [] fVal;
93  }
94  if (fVmin) delete [] fVmin;
95  if (fVmax) delete [] fVmax;
96  if (fNbins) delete [] fNbins;
97  if (fVarMultiple) delete [] fVarMultiple;
98  if (fW) delete [] fW;
99 }
100 
101 ////////////////////////////////////////////////////////////////////////////////
102 /// Called everytime a loop on the tree(s) starts.
103 
105 {
106  SetStatus(0);
107  ResetAbort();
108  ResetBit(kCustomHistogram);
109  fSelectedRows = 0;
110  fTree = tree;
111  fDimension = 0;
112  fAction = 0;
113 
114  TObject *obj = fInput->FindObject("varexp");
115  const char *varexp0 = obj ? obj->GetTitle() : "";
116  obj = fInput->FindObject("selection");
117  const char *selection = obj ? obj->GetTitle() : "";
118  const char *option = GetOption();
119 
120  TString opt, abrt;
121  char *hdefault = (char *)"htemp";
122  char *varexp = nullptr;
123  Int_t i, j, hkeep;
124  opt = option;
125  opt.ToLower();
126  fOldHistogram = 0;
127  TEntryList *enlist = 0;
128  TEventList *evlist = 0;
129  TString htitle;
130  Bool_t profile = kFALSE;
131  Bool_t optSame = kFALSE;
132  Bool_t optEnlist = kFALSE;
133  Bool_t optEnlistArray = kFALSE;
134  Bool_t optpara = kFALSE;
135  Bool_t optcandle = kFALSE;
136  Bool_t opt5d = kFALSE;
137  if (opt.Contains("same")) {
138  optSame = kTRUE;
139  opt.ReplaceAll("same", "");
140  }
141  if (opt.Contains("entrylist")) {
142  optEnlist = kTRUE;
143  if (opt.Contains("entrylistarray")) {
144  optEnlistArray = kTRUE;
145  opt.ReplaceAll("entrylistarray", "");
146  } else {
147  opt.ReplaceAll("entrylist", "");
148  }
149  }
150  if (opt.Contains("para")) {
151  optpara = kTRUE;
152  opt.ReplaceAll("para", "");
153  }
154  if (opt.Contains("candle")) {
155  optcandle = kTRUE;
156  opt.ReplaceAll("candle", "");
157  }
158  if (opt.Contains("gl5d")) {
159  opt5d = kTRUE;
160  opt.ReplaceAll("gl5d", "");
161  }
162  TCut realSelection(selection);
163  //input list - only TEntryList
164  TEntryList *inElist = fTree->GetEntryList();
165  evlist = fTree->GetEventList();
166  if (evlist && inElist) {
167  //this is needed because the input entry list was created
168  //by the fTree from the input TEventList and is owned by the fTree.
169  //Calling GetEntryList function changes ownership and here
170  //we want fTree to still delete this entry list
171 
172  inElist->SetBit(kCanDelete, kTRUE);
173  }
175  fTreeElist = inElist;
176 
177  fTreeElistArray = inElist ? dynamic_cast<TEntryListArray*>(fTreeElist) : 0;
178 
179 
180  if (inElist && inElist->GetReapplyCut()) {
181  realSelection *= inElist->GetTitle();
182  }
183 
184  // what each variable should contain:
185  // varexp0 - original expression eg "a:b>>htest"
186  // hname - name of new or old histogram
187  // hkeep - flag if to keep new histogram
188  // hnameplus - flag if to add to current histo
189  // i - length of variable expression stipped of everything after ">>"
190  // varexp - variable expression stipped of everything after ">>"
191  // fOldHistogram - pointer to hist hname
192  // elist - pointer to selection list of hname
193 
194  Bool_t canExtend = kTRUE;
195  if (optSame) canExtend = kFALSE;
196 
197  Int_t nbinsx = 0, nbinsy = 0, nbinsz = 0;
198  Double_t xmin = 0, xmax = 0, ymin = 0, ymax = 0, zmin = 0, zmax = 0;
199 
200  fObject = 0;
201  char *hname = 0;
202  char *hnamealloc = 0;
203  i = 0;
204  if (varexp0 && strlen(varexp0)) {
205  for (UInt_t k = strlen(varexp0) - 1; k > 0; k--) {
206  if (varexp0[k] == '>' && varexp0[k-1] == '>') {
207  i = (int)(&(varexp0[k-1]) - varexp0); // length of varexp0 before ">>"
208  hnamealloc = new char[strlen(&(varexp0[k+1])) + 1];
209  hname = hnamealloc;
210  strcpy(hname, &(varexp0[k+1]));
211  break;
212  }
213  }
214  }
215  // char *hname = (char*)strstr(varexp0,">>");
216  if (hname) {
217  hkeep = 1;
218  varexp = new char[i+1];
219  varexp[0] = 0; //necessary if i=0
220  Bool_t hnameplus = kFALSE;
221  while (*hname == ' ') hname++;
222  if (*hname == '+') {
223  hnameplus = kTRUE;
224  hname++;
225  while (*hname == ' ') hname++; //skip ' '
226  }
227  j = strlen(hname) - 1; // skip ' ' at the end
228  while (j) {
229  if (hname[j] != ' ') break;
230  hname[j] = 0;
231  j--;
232  }
233 
234  if (i) {
235  strlcpy(varexp,varexp0,i+1);
236 
237  Int_t mustdelete = 0;
238  SetBit(kCustomHistogram);
239 
240  // parse things that follow the name of the histo between '(' and ')'.
241  // At this point hname contains the name of the specified histogram.
242  // Now the syntax is exended to handle an hname of the following format
243  // hname(nBIN [[,[xlow]][,xhigh]],...)
244  // so enclosed in brackets is the binning information, xlow, xhigh, and
245  // the same for the other dimensions
246 
247  char *pstart; // pointer to '('
248  char *pend; // pointer to ')'
249  char *cdummy; // dummy pointer
250  int ncomma; // number of commas between '(' and ')', later number of arguments
251  int ncols; // number of columns in varexpr
252  Double_t value; // parsed value (by sscanf)
253 
254  const Int_t maxvalues = 9;
255 
256  pstart = strchr(hname, '(');
257  pend = strchr(hname, ')');
258  if (pstart != 0) { // found the bracket
259 
260  mustdelete = 1;
261 
262  // check that there is only one open and close bracket
263  if (pstart == strrchr(hname, '(') && pend == strrchr(hname, ')')) {
264 
265  // count number of ',' between '(' and ')'
266  ncomma = 0;
267  cdummy = pstart;
268  cdummy = strchr(&cdummy[1], ',');
269  while (cdummy != 0) {
270  cdummy = strchr(&cdummy[1], ',');
271  ncomma++;
272  }
273 
274  if (ncomma + 1 > maxvalues) {
275  Error("DrawSelect", "ncomma+1>maxvalues, ncomma=%d, maxvalues=%d", ncomma, maxvalues);
276  ncomma = maxvalues - 1;
277  }
278 
279  ncomma++; // number of arguments
280  cdummy = pstart;
281 
282  // number of columns
283  ncols = 1;
284  for (j = 0; j < i; j++) {
285  if (varexp[j] == ':'
286  && !((j > 0 && varexp[j-1] == ':') || varexp[j+1] == ':')
287  ) {
288  ncols++;
289  }
290  }
291  if (ncols > 3) { // max 3 columns
292  Error("DrawSelect", "ncols > 3, ncols=%d", ncols);
293  ncols = 0;
294  }
295 
296  // check dimensions before and after ">>"
297  if (ncols * 3 < ncomma) {
298  Error("DrawSelect", "ncols*3 < ncomma ncols=%d, ncomma=%d", ncols, ncomma);
299  ncomma = ncols * 3;
300  }
301 
302  // scan the values one after the other
303  for (j = 0; j < ncomma; j++) {
304  cdummy++; // skip '(' or ','
305  if (sscanf(cdummy, " %lf ", &value) == 1) {
306  cdummy = strchr(&cdummy[1], ',');
307 
308  switch (j) { // do certain settings depending on position of argument
309  case 0: // binning x-axis
310  nbinsx = (Int_t)value;
311  if (ncols < 2) {
312  gEnv->SetValue("Hist.Binning.1D.x", nbinsx);
313  } else if (ncols < 3) {
314  gEnv->SetValue("Hist.Binning.2D.x", nbinsx);
315  gEnv->SetValue("Hist.Binning.2D.Prof", nbinsx);
316  } else {
317  gEnv->SetValue("Hist.Binning.3D.x", nbinsx);
318  gEnv->SetValue("Hist.Binning.3D.Profx", nbinsx);
319  }
320 
321  break;
322  case 1: // lower limit x-axis
323  xmin = value;
324  break;
325  case 2: // upper limit x-axis
326  xmax = value;
327  break;
328  case 3: // binning y-axis
329  nbinsy = (Int_t)value;
330  if (ncols < 3) gEnv->SetValue("Hist.Binning.2D.y", nbinsy);
331  else {
332  gEnv->SetValue("Hist.Binning.3D.y", nbinsy);
333  gEnv->SetValue("Hist.Binning.3D.Profy", nbinsy);
334  }
335  break;
336  case 4: // lower limit y-axis
337  ymin = value;
338  break;
339  case 5: // upper limit y-axis
340  ymax = value;
341  break;
342  case 6: // binning z-axis
343  nbinsz = (Int_t)value;
344  gEnv->SetValue("Hist.Binning.3D.z", nbinsz);
345  break;
346  case 7: // lower limit z-axis
347  zmin = value;
348  break;
349  case 8: // upper limit z-axis
350  zmax = value;
351  break;
352  default:
353  Error("DrawSelect", "j>8");
354  break;
355  }
356  } // if sscanf == 1
357  } // for j=0;j<ncomma;j++
358  } else {
359  Error("Begin", "Two open or close brackets found, hname=%s", hname);
360  }
361 
362  // fix up hname
363  pstart[0] = '\0'; // removes things after (and including) '('
364  } // if '(' is found
365 
366  j = strlen(hname) - 1; // skip ' ' at the end
367  while (j > 0) {
368  if (hname[j] != ' ') break; // skip ' ' at the end
369  hname[j] = 0;
370  j--;
371  }
372 
373  TObject *oldObject = gDirectory->Get(hname); // if hname contains '(...)' the return values is NULL, which is what we want
374  fOldHistogram = oldObject ? dynamic_cast<TH1*>(oldObject) : 0;
375 
376  if (!fOldHistogram && oldObject && !oldObject->InheritsFrom(TH1::Class())) {
377  abrt.Form("An object of type '%s' has the same name as the requested histo (%s)", oldObject->IsA()->GetName(), hname);
378  Abort(abrt);
379  return;
380  }
381  if (fOldHistogram && !hnameplus) fOldHistogram->Reset(); // reset unless adding is wanted
382 
383  if (mustdelete) {
384  if (gDebug) {
385  Warning("Begin", "Deleting old histogram, since (possibly new) limits and binnings have been given");
386  }
387  delete fOldHistogram; fOldHistogram=0;
388  }
389 
390  } else {
391  // make selection list (i.e. varexp0 starts with ">>")
392  TObject *oldObject = gDirectory->Get(hname);
393  if (optEnlist) {
394  //write into a TEntryList
395  enlist = oldObject ? dynamic_cast<TEntryList*>(oldObject) : 0;
396 
397  if (!enlist && oldObject) {
398  abrt.Form("An object of type '%s' has the same name as the requested event list (%s)",
399  oldObject->IsA()->GetName(), hname);
400  Abort(abrt);
401  return;
402  }
403  if (!enlist) {
404  if (optEnlistArray) {
405  enlist = new TEntryListArray(hname, realSelection.GetTitle());
406  } else {
407  enlist = new TEntryList(hname, realSelection.GetTitle());
408  }
409  }
410  if (enlist) {
411  if (!hnameplus) {
412  if (enlist == inElist) {
413  // We have been asked to reset the input list!!
414  // Let's set it aside for now ...
415  if (optEnlistArray) {
416  inElist = new TEntryListArray(*enlist);
417  } else {
418  inElist = new TEntryList(*enlist);
419  }
420  fCleanElist = kTRUE;
421  fTree->SetEntryList(inElist);
422  }
423  enlist->Reset();
424  enlist->SetTitle(realSelection.GetTitle());
425  } else {
426  TCut old = enlist->GetTitle();
427  TCut upd = old || realSelection.GetTitle();
428  enlist->SetTitle(upd.GetTitle());
429  }
430  }
431  } else {
432  //write into a TEventList
433  evlist = oldObject ? dynamic_cast<TEventList*>(oldObject) : 0;
434 
435  if (!evlist && oldObject) {
436  abrt.Form("An object of type '%s' has the same name as the requested event list (%s)",
437  oldObject->IsA()->GetName(), hname);
438  Abort(abrt);
439  return;
440  }
441  if (!evlist) {
442  evlist = new TEventList(hname, realSelection.GetTitle(), 1000, 0);
443  }
444  if (evlist) {
445  if (!hnameplus) {
446  if (evlist == fTree->GetEventList()) {
447  // We have been asked to reset the input list!!
448  // Let's set it aside for now ...
449  Abort("Input and output lists are the same!");
450  delete [] varexp;
451  return;
452  }
453  evlist->Reset();
454  evlist->SetTitle(realSelection.GetTitle());
455  } else {
456  TCut old = evlist->GetTitle();
457  TCut upd = old || realSelection.GetTitle();
458  evlist->SetTitle(upd.GetTitle());
459  }
460  }
461  }
462 
463  } // if (i)
464  } else { // if (hname)
465  hname = hdefault;
466  hkeep = 0;
467  const size_t varexpLen = strlen(varexp0) + 1;
468  varexp = new char[varexpLen];
469  strlcpy(varexp, varexp0, varexpLen);
470  if (gDirectory) {
471  fOldHistogram = (TH1*)gDirectory->Get(hname);
473  }
474  }
475 
476  // Decode varexp and selection
477  if (!CompileVariables(varexp, realSelection.GetTitle())) {
478  abrt.Form("Variable compilation failed: {%s,%s}", varexp, realSelection.GetTitle());
479  Abort(abrt);
480  delete [] varexp;
481  return;
482  }
483  if (fDimension > 4 && !(optpara || optcandle || opt5d)) {
484  Abort("Too many variables. Use the option \"para\", \"gl5d\" or \"candle\" to display more than 4 variables.");
485  delete [] varexp;
486  return;
487  }
488 
489  // In case fOldHistogram exists, check dimensionality
490  Int_t nsel = strlen(selection);
491  if (nsel > 1) {
492  htitle.Form("%s {%s}", varexp, selection);
493  } else {
494  htitle = varexp;
495  }
496  if (fOldHistogram) {
497  Int_t olddim = fOldHistogram->GetDimension();
498  Int_t mustdelete = 0;
500  profile = kTRUE;
501  olddim = 2;
502  }
504  profile = kTRUE;
505  olddim = 3;
506  }
507  if (opt.Contains("prof") && fDimension > 1) {
508  // ignore "prof" for 1D.
509  if (!profile || olddim != fDimension) mustdelete = 1;
510  } else if (opt.Contains("col") && fDimension>2) {
511  if (olddim+1 != fDimension) mustdelete = 1;
512  } else {
513  if (olddim != fDimension) mustdelete = 1;
514  }
515  if (mustdelete) {
516  Warning("Begin", "Deleting old histogram with different dimensions");
517  delete fOldHistogram;
518  fOldHistogram = 0;
519  }
520  }
521 
522  // Create a default canvas if none exists
523  fDraw = 0;
524  if (!gPad && !opt.Contains("goff") && fDimension > 0) {
525  gROOT->MakeDefCanvas();
526  if (!gPad) {
527  Abort("Creation of default canvas failed");
528  return;
529  }
530  }
531 
532  // 1-D distribution
533  TH1 *hist;
534  if (fDimension == 1) {
535  fAction = 1;
536  if (!fOldHistogram) {
537  fNbins[0] = gEnv->GetValue("Hist.Binning.1D.x", 100);
538  if (gPad && optSame) {
539  TListIter np(gPad->GetListOfPrimitives());
540  TObject *op;
541  TH1 *oldhtemp = 0;
542  while ((op = np()) && !oldhtemp) {
543  if (op->InheritsFrom(TH1::Class())) oldhtemp = (TH1 *)op;
544  }
545  if (oldhtemp) {
546  fNbins[0] = oldhtemp->GetXaxis()->GetNbins();
547  fVmin[0] = oldhtemp->GetXaxis()->GetXmin();
548  fVmax[0] = oldhtemp->GetXaxis()->GetXmax();
549  } else {
550  fVmin[0] = gPad->GetUxmin();
551  fVmax[0] = gPad->GetUxmax();
552  }
553  } else {
554  fAction = -1;
555  fVmin[0] = xmin;
556  fVmax[0] = xmax;
557  if (xmin < xmax) canExtend = kFALSE;
558  }
559  }
560  if (fOldHistogram) {
561  hist = fOldHistogram;
562  fNbins[0] = hist->GetXaxis()->GetNbins();
563  } else {
564  hist = new TH1F(hname, htitle.Data(), fNbins[0], fVmin[0], fVmax[0]);
565  hist->SetLineColor(fTree->GetLineColor());
566  hist->SetLineWidth(fTree->GetLineWidth());
567  hist->SetLineStyle(fTree->GetLineStyle());
568  hist->SetFillColor(fTree->GetFillColor());
569  hist->SetFillStyle(fTree->GetFillStyle());
573  if (canExtend) hist->SetCanExtend(TH1::kAllAxes);
574  if (!hkeep) {
575  hist->GetXaxis()->SetTitle(fVar[0]->GetTitle());
576  hist->SetBit(kCanDelete);
577  if (!opt.Contains("goff")) hist->SetDirectory(0);
578  }
579  if (opt.Length() && opt.Contains("e")) hist->Sumw2();
580  }
581  fVar[0]->SetAxis(hist->GetXaxis());
582  fObject = hist;
583 
584  // 2-D distribution
585  } else if (fDimension == 2 && !(optpara || optcandle)) {
586  fAction = 2;
587  if (!fOldHistogram || !optSame) {
588  fNbins[0] = gEnv->GetValue("Hist.Binning.2D.y", 40);
589  fNbins[1] = gEnv->GetValue("Hist.Binning.2D.x", 40);
590  if (opt.Contains("prof")) fNbins[1] = gEnv->GetValue("Hist.Binning.2D.Prof", 100);
591  if (optSame) {
592  TH1 *oldhtemp = (TH1*)gPad->FindObject(hdefault);
593  if (oldhtemp) {
594  fNbins[1] = oldhtemp->GetXaxis()->GetNbins();
595  fVmin[1] = oldhtemp->GetXaxis()->GetXmin();
596  fVmax[1] = oldhtemp->GetXaxis()->GetXmax();
597  fNbins[0] = oldhtemp->GetYaxis()->GetNbins();
598  fVmin[0] = oldhtemp->GetYaxis()->GetXmin();
599  fVmax[0] = oldhtemp->GetYaxis()->GetXmax();
600  } else {
601  fNbins[1] = gEnv->GetValue("Hist.Binning.2D.x", 40);
602  fVmin[1] = gPad->GetUxmin();
603  fVmax[1] = gPad->GetUxmax();
604  fNbins[0] = gEnv->GetValue("Hist.Binning.2D.y", 40);
605  fVmin[0] = gPad->GetUymin();
606  fVmax[0] = gPad->GetUymax();
607  }
608  } else {
609  if (!fOldHistogram) fAction = -2;
610  fVmin[1] = xmin;
611  fVmax[1] = xmax;
612  fVmin[0] = ymin;
613  fVmax[0] = ymax;
614  if (xmin < xmax && ymin < ymax) canExtend = kFALSE;
615  }
616  }
617  if (profile || opt.Contains("prof")) {
618  TProfile *hp;
619  if (fOldHistogram) {
620  fAction = 4;
621  hp = (TProfile*)fOldHistogram;
622  } else {
623  if (fAction < 0) {
624  fAction = -4;
625  fVmin[1] = xmin;
626  fVmax[1] = xmax;
627  if (xmin < xmax) canExtend = kFALSE;
628  }
629  if (fAction == 2) {
630  //we come here when option = "same prof"
631  fAction = -4;
632  TH1 *oldhtemp = (TH1*)gPad->FindObject(hdefault);
633  if (oldhtemp) {
634  fNbins[1] = oldhtemp->GetXaxis()->GetNbins();
635  fVmin[1] = oldhtemp->GetXaxis()->GetXmin();
636  fVmax[1] = oldhtemp->GetXaxis()->GetXmax();
637  }
638  }
639  if (opt.Contains("profs")) {
640  hp = new TProfile(hname, htitle.Data(), fNbins[1], fVmin[1], fVmax[1], "s");
641  } else if (opt.Contains("profi")) {
642  hp = new TProfile(hname, htitle.Data(), fNbins[1], fVmin[1], fVmax[1], "i");
643  } else if (opt.Contains("profg")) {
644  hp = new TProfile(hname, htitle.Data(), fNbins[1], fVmin[1], fVmax[1], "g");
645  } else {
646  hp = new TProfile(hname, htitle.Data(), fNbins[1], fVmin[1], fVmax[1], "");
647  }
648  if (!hkeep) {
649  hp->SetBit(kCanDelete);
650  if (!opt.Contains("goff")) hp->SetDirectory(0);
651  }
660  if (canExtend) hp->SetCanExtend(TH1::kAllAxes);
661  }
662  fVar[1]->SetAxis(hp->GetXaxis());
663  fObject = hp;
664 
665  } else {
666  TH2F *h2;
667  if (fOldHistogram) {
668  h2 = (TH2F*)fOldHistogram;
669  } else {
670  h2 = new TH2F(hname, htitle.Data(), fNbins[1], fVmin[1], fVmax[1], fNbins[0], fVmin[0], fVmax[0]);
679  if (canExtend) h2->SetCanExtend(TH1::kAllAxes);
680  if (!hkeep) {
681  h2->GetXaxis()->SetTitle(fVar[1]->GetTitle());
682  h2->GetYaxis()->SetTitle(fVar[0]->GetTitle());
683  h2->SetBit(TH1::kNoStats);
684  h2->SetBit(kCanDelete);
685  if (!opt.Contains("goff")) h2->SetDirectory(0);
686  }
687  }
688  fVar[0]->SetAxis(h2->GetYaxis());
689  fVar[1]->SetAxis(h2->GetXaxis());
690  Bool_t graph = kFALSE;
691  Int_t l = opt.Length();
692  if (l == 0 || optSame) graph = kTRUE;
693  if (opt.Contains("p") || opt.Contains("*") || opt.Contains("l")) graph = kTRUE;
694  if (opt.Contains("surf") || opt.Contains("lego") || opt.Contains("cont")) graph = kFALSE;
695  if (opt.Contains("col") || opt.Contains("hist") || opt.Contains("scat")) graph = kFALSE;
696  if (opt.Contains("box")) graph = kFALSE;
697  fObject = h2;
698  if (graph) {
699  fAction = 12;
700  if (!fOldHistogram && !optSame) fAction = -12;
701  }
702  }
703 
704  // 3-D distribution
705  } else if ((fDimension == 3 || fDimension == 4) && !(optpara || optcandle)) {
706  fAction = 3;
707  if (fDimension == 4) fAction = 40;
708  if (!fOldHistogram || !optSame) {
709  fNbins[0] = gEnv->GetValue("Hist.Binning.3D.z", 20);
710  fNbins[1] = gEnv->GetValue("Hist.Binning.3D.y", 20);
711  fNbins[2] = gEnv->GetValue("Hist.Binning.3D.x", 20);
712  if (fDimension == 3 && opt.Contains("prof")) {
713  fNbins[1] = gEnv->GetValue("Hist.Binning.3D.Profy", 20);
714  fNbins[2] = gEnv->GetValue("Hist.Binning.3D.Profx", 20);
715  }
716  if (fDimension == 3 && opt.Contains("col")) {
717  fNbins[0] = gEnv->GetValue("Hist.Binning.2D.y", 40);
718  fNbins[1] = gEnv->GetValue("Hist.Binning.2D.x", 40);
719  }
720  if (optSame) {
721  TH1 *oldhtemp = (TH1*)gPad->FindObject(hdefault);
722  if (oldhtemp) {
723  fNbins[2] = oldhtemp->GetXaxis()->GetNbins();
724  fVmin[2] = oldhtemp->GetXaxis()->GetXmin();
725  fVmax[2] = oldhtemp->GetXaxis()->GetXmax();
726  fNbins[1] = oldhtemp->GetYaxis()->GetNbins();
727  fVmin[1] = oldhtemp->GetYaxis()->GetXmin();
728  fVmax[1] = oldhtemp->GetYaxis()->GetXmax();
729  fNbins[0] = oldhtemp->GetZaxis()->GetNbins();
730  fVmin[0] = oldhtemp->GetZaxis()->GetXmin();
731  fVmax[0] = oldhtemp->GetZaxis()->GetXmax();
732  } else {
733  TView *view = gPad->GetView();
734  if (!view) {
735  Error("Begin", "You cannot use option same when no 3D view exists");
736  fVmin[0] = fVmin[1] = fVmin[2] = -1;
737  fVmax[0] = fVmax[1] = fVmax[2] = 1;
738  view = TView::CreateView(1, fVmin, fVmax);
739  }
740  Double_t *rmin = view->GetRmin();
741  Double_t *rmax = view->GetRmax();
742  fNbins[2] = gEnv->GetValue("Hist.Binning.3D.z", 20);
743  fVmin[2] = rmin[0];
744  fVmax[2] = rmax[0];
745  fNbins[1] = gEnv->GetValue("Hist.Binning.3D.y", 20);
746  fVmin[1] = rmin[1];
747  fVmax[1] = rmax[1];
748  fNbins[0] = gEnv->GetValue("Hist.Binning.3D.x", 20);
749  fVmin[0] = rmin[2];
750  fVmax[0] = rmax[2];
751  }
752  } else {
753  if (!fOldHistogram && fDimension == 3) fAction = -3;
754  fVmin[2] = xmin;
755  fVmax[2] = xmax;
756  fVmin[1] = ymin;
757  fVmax[1] = ymax;
758  fVmin[0] = zmin;
759  fVmax[0] = zmax;
760  if (xmin < xmax && ymin < ymax && zmin < zmax) canExtend = kFALSE;
761  }
762  }
763  if ((fDimension == 3) && (profile || opt.Contains("prof"))) {
764  TProfile2D *hp;
765  if (fOldHistogram) {
766  fAction = 23;
767  hp = (TProfile2D*)fOldHistogram;
768  } else {
769  if (fAction < 0) {
770  fAction = -23;
771  fVmin[2] = xmin;
772  fVmax[2] = xmax;
773  fVmin[1] = ymin;
774  fVmax[1] = ymax;
775  if (xmin < xmax && ymin < ymax) canExtend = kFALSE;
776  }
777  if (opt.Contains("profs")) {
778  hp = new TProfile2D(hname, htitle.Data(), fNbins[2], fVmin[2], fVmax[2], fNbins[1], fVmin[1], fVmax[1], "s");
779  } else if (opt.Contains("profi")) {
780  hp = new TProfile2D(hname, htitle.Data(), fNbins[2], fVmin[2], fVmax[2], fNbins[1], fVmin[1], fVmax[1], "i");
781  } else if (opt.Contains("profg")) {
782  hp = new TProfile2D(hname, htitle.Data(), fNbins[2], fVmin[2], fVmax[2], fNbins[1], fVmin[1], fVmax[1], "g");
783  } else {
784  hp = new TProfile2D(hname, htitle.Data(), fNbins[2], fVmin[2], fVmax[2], fNbins[1], fVmin[1], fVmax[1], "");
785  }
786  if (!hkeep) {
787  hp->SetBit(kCanDelete);
788  if (!opt.Contains("goff")) hp->SetDirectory(0);
789  }
798  if (canExtend) hp->SetCanExtend(TH1::kAllAxes);
799  }
800  fVar[1]->SetAxis(hp->GetYaxis());
801  fVar[2]->SetAxis(hp->GetXaxis());
802  fObject = hp;
803  } else if (fDimension == 3 && opt.Contains("col")) {
804  TH2F *h2;
805  if (fOldHistogram) {
806  h2 = (TH2F*)fOldHistogram;
807  } else {
808  h2 = new TH2F(hname, htitle.Data(), fNbins[1], fVmin[1], fVmax[1], fNbins[0], fVmin[0], fVmax[0]);
817  if (canExtend) h2->SetCanExtend(TH1::kAllAxes);
818  if (!hkeep) {
819  h2->GetXaxis()->SetTitle(fVar[1]->GetTitle());
820  h2->GetYaxis()->SetTitle(fVar[0]->GetTitle());
821  h2->GetZaxis()->SetTitle(fVar[2]->GetTitle());
822  h2->SetBit(TH1::kNoStats);
823  h2->SetBit(kCanDelete);
824  if (!opt.Contains("goff")) h2->SetDirectory(0);
825  }
826  }
827  fVar[0]->SetAxis(h2->GetYaxis());
828  fVar[1]->SetAxis(h2->GetXaxis());
829  fObject = h2;
830  fAction = 33;
831  } else {
832  TH3F *h3;
833  if (fOldHistogram) {
834  h3 = (TH3F*)fOldHistogram;
835  } else {
836  h3 = new TH3F(hname, htitle.Data(), fNbins[2], fVmin[2], fVmax[2], fNbins[1], fVmin[1], fVmax[1], fNbins[0], fVmin[0], fVmax[0]);
845  if (canExtend) h3->SetCanExtend(TH1::kAllAxes);
846  if (!hkeep) {
847  //small correction for the title offsets in x,y to take into account the angles
848  Double_t xoffset = h3->GetXaxis()->GetTitleOffset();
849  Double_t yoffset = h3->GetYaxis()->GetTitleOffset();
850  h3->GetXaxis()->SetTitleOffset(1.2 * xoffset);
851  h3->GetYaxis()->SetTitleOffset(1.2 * yoffset);
852  h3->GetXaxis()->SetTitle(fVar[2]->GetTitle());
853  h3->GetYaxis()->SetTitle(fVar[1]->GetTitle());
854  h3->GetZaxis()->SetTitle(fVar[0]->GetTitle());
855  h3->SetBit(kCanDelete);
856  h3->SetBit(TH1::kNoStats);
857  if (!opt.Contains("goff")) h3->SetDirectory(0);
858  }
859  }
860  fVar[0]->SetAxis(h3->GetZaxis());
861  fVar[1]->SetAxis(h3->GetYaxis());
862  fVar[2]->SetAxis(h3->GetXaxis());
863  fObject = h3;
864  Int_t noscat = strlen(option);
865  if (optSame) noscat -= 4;
866  if (!noscat && fDimension == 3) {
867  fAction = 13;
868  if (!fOldHistogram && !optSame) fAction = -13;
869  }
870  }
871  // An Event List
872  } else if (enlist) {
873  fAction = 5;
875  fTree->SetEstimate(1);
876  fObject = enlist;
877  } else if (evlist) {
878  fAction = 5;
880  fTree->SetEstimate(1);
881  fObject = evlist;
882  } else if (optcandle || optpara || opt5d) {
883  if (optcandle) fAction = 7;
884  else if (opt5d) fAction = 8;
885  else fAction = 6;
886  }
887  if (varexp) delete [] varexp;
888  if (hnamealloc) delete [] hnamealloc;
889  for (i = 0; i < fValSize; ++i)
890  fVarMultiple[i] = kFALSE;
892  for (i = 0; i < fDimension; ++i) {
893  if (fVar[i] && fVar[i]->GetMultiplicity()) fVarMultiple[i] = kTRUE;
894  }
895 
897 
899  fWeight = fTree->GetWeight();
900  fNfill = 0;
901 
902  for (i = 0; i < fDimension; ++i) {
903  if (!fVal[i] && fVar[i]) {
904  fVal[i] = new Double_t[(Int_t)fTree->GetEstimate()];
905  }
906  }
907 
908  if (!fW) fW = new Double_t[(Int_t)fTree->GetEstimate()];
909 
910  for (i = 0; i < fValSize; ++i) {
911  fVmin[i] = DBL_MAX;
912  fVmax[i] = -DBL_MAX;
913  }
914 }
915 
916 ////////////////////////////////////////////////////////////////////////////////
917 /// Delete internal buffers.
918 
920 {
921  ResetBit(kWarn);
922  for (Int_t i = 0; i < fValSize; ++i) {
923  delete fVar[i];
924  fVar[i] = 0;
925  }
926  delete fSelect; fSelect = 0;
927  fManager = 0;
928  fMultiplicity = 0;
929 }
930 
931 ////////////////////////////////////////////////////////////////////////////////
932 /// Compile input variables and selection expression.
933 ///
934 /// varexp is an expression of the general form e1:e2:e3
935 /// where e1,etc is a formula referencing a combination of the columns
936 ///
937 /// Example:
938 ///
939 /// varexp = x simplest case: draw a 1-Dim distribution of column named x
940 /// = sqrt(x) : draw distribution of sqrt(x)
941 /// = x*y/z
942 /// = y:sqrt(x) 2-Dim dsitribution of y versus sqrt(x)
943 ///
944 /// selection is an expression with a combination of the columns
945 ///
946 /// Example:
947 ///
948 /// selection = "x<y && sqrt(z)>3.2"
949 ///
950 /// in a selection all the C++ operators are authorized
951 ///
952 /// Return kFALSE if any of the variable is not compilable.
953 
954 Bool_t TSelectorDraw::CompileVariables(const char *varexp, const char *selection)
955 {
956  Int_t i, nch, ncols;
957 
958  // Compile selection expression if there is one
959  fDimension = 0;
960  ClearFormula();
961  fMultiplicity = 0;
962  fObjEval = kFALSE;
963 
964  if (strlen(selection)) {
965  fSelect = new TTreeFormula("Selection", selection, fTree);
967  if (!fSelect->GetNdim()) {
968  delete fSelect;
969  fSelect = 0;
970  return kFALSE;
971  }
972  }
973 
974  // if varexp is empty, take first column by default
975  nch = strlen(varexp);
976  if (nch == 0) {
977  fDimension = 0;
978  if (fSelect) {
980  }
982 
983  if (fManager) {
984  fManager->Sync();
985 
988  }
989 
990  return kTRUE;
991  }
992 
993  // otherwise select only the specified columns
994  std::vector<TString> varnames;
995  ncols = SplitNames(varexp, varnames);
996 
997  InitArrays(ncols);
998 
1000  if (fSelect) fManager->Add(fSelect);
1002  for (i = 0; i < ncols; ++i) {
1003  fVar[i] = new TTreeFormula(TString::Format("Var%i", i + 1), varnames[i].Data(), fTree);
1004  fVar[i]->SetQuickLoad(kTRUE);
1005  if(!fVar[i]->GetNdim()) { ClearFormula(); return kFALSE; }
1006  fManager->Add(fVar[i]);
1007  }
1008  fManager->Sync();
1009 
1012 
1013  fDimension = ncols;
1014 
1015  if (ncols == 1) {
1016  TClass *cl = fVar[0]->EvalClass();
1017  if (cl) {
1018  fObjEval = kTRUE;
1019  }
1020  }
1021  return kTRUE;
1022 }
1023 
1024 ////////////////////////////////////////////////////////////////////////////////
1025 /// Return the last values corresponding to the i-th component
1026 /// of the formula being processed (where the component are ':' separated).
1027 /// The actual number of entries is:
1028 ///
1029 /// GetSelectedRows() % tree->GetEstimate()
1030 ///
1031 /// Note GetSelectedRows currently returns the actual number of values plotted
1032 /// and thus if the formula contains arrays, this number might be greater than
1033 /// the number of entries in the trees.
1034 ///
1035 /// By default TTree::Draw creates the arrays obtained
1036 /// with all GetVal and GetW with a length corresponding to the
1037 /// parameter fEstimate. By default fEstimate=10000 and can be modified
1038 /// via TTree::SetEstimate. A possible recipee is to do
1039 ///
1040 /// tree->SetEstimate(tree->GetEntries());
1041 ///
1042 /// You must call SetEstimate if the expected number of selected rows
1043 /// is greater than 10000.
1044 ///
1045 /// See TTree::Draw for additional details.
1046 
1048 {
1049  if (i < 0 || i >= fDimension)
1050  return 0;
1051  else
1052  return fVal[i];
1053 }
1054 
1055 ////////////////////////////////////////////////////////////////////////////////
1056 /// Return the TTreeFormula corresponding to the i-th component
1057 /// of the request formula (where the component are ':' separated).
1058 
1060 {
1061  if (i < 0 || i >= fDimension)
1062  return 0;
1063  else
1064  return fVar[i];
1065 }
1066 
1067 ////////////////////////////////////////////////////////////////////////////////
1068 /// Initialization of the primitive type arrays if the new size is bigger than the available space.
1069 
1071 {
1072  if (newsize > fValSize) {
1073  Int_t oldsize = fValSize;
1074  while (fValSize < newsize)
1075  fValSize *= 2; // Double the available space until it matches the new size.
1076  if (fNbins) delete [] fNbins;
1077  if (fVmin) delete [] fVmin;
1078  if (fVmax) delete [] fVmax;
1079  if (fVarMultiple) delete [] fVarMultiple;
1080 
1081  fNbins = new Int_t[fValSize];
1082  fVmin = new Double_t[fValSize];
1083  fVmax = new Double_t[fValSize];
1084  fVarMultiple = new Bool_t[fValSize];
1085 
1086  for (Int_t i = 0; i < oldsize; ++i)
1087  delete [] fVal[i];
1088  delete [] fVal;
1089  delete [] fVar;
1090  fVal = new Double_t*[fValSize];
1091  fVar = new TTreeFormula*[fValSize];
1092  for (Int_t i = 0; i < fValSize; ++i) {
1093  fVal[i] = 0;
1094  fVar[i] = 0;
1095  }
1096  }
1097 }
1098 
1099 ////////////////////////////////////////////////////////////////////////////////
1100 /// Build Index array for names in varexp.
1101 /// This will allocated a C style array of TString and Ints
1102 
1103 UInt_t TSelectorDraw::SplitNames(const TString &varexp, std::vector<TString> &names)
1104 {
1105  names.clear();
1106 
1107  Bool_t ternary = kFALSE;
1108  Int_t prev = 0;
1109  for (Int_t i = 0; i < varexp.Length(); i++) {
1110  if (varexp[i] == ':'
1111  && !((i > 0 && varexp[i-1] == ':') || varexp[i+1] == ':')
1112  ) {
1113  if (ternary) {
1114  ternary = kFALSE;
1115  } else {
1116  names.push_back(varexp(prev, i - prev));
1117  prev = i + 1;
1118  }
1119  }
1120  if (varexp[i] == '?') {
1121  ternary = kTRUE;
1122  }
1123  }
1124  names.push_back(varexp(prev, varexp.Length() - prev));
1125  return names.size();
1126 }
1127 
1128 
1129 ////////////////////////////////////////////////////////////////////////////////
1130 /// This function is called at the first entry of a new tree in a chain.
1131 
1133 {
1134  if (fTree) fWeight = fTree->GetWeight();
1135  if (fVar) {
1136  for (Int_t i = 0; i < fDimension; ++i) {
1137  if (fVar[i]) fVar[i]->UpdateFormulaLeaves();
1138  }
1139  }
1141  return kTRUE;
1142 }
1143 
1144 ////////////////////////////////////////////////////////////////////////////////
1145 /// Called in the entry loop for all entries accepted by Select.
1146 
1148 {
1149  if (fObjEval) {
1150  ProcessFillObject(entry);
1151  return;
1152  }
1153 
1154  if (fMultiplicity) {
1155  ProcessFillMultiple(entry);
1156  return;
1157  }
1158 
1159  // simple case with no multiplicity
1160  if (fForceRead && fManager->GetNdata() <= 0) return;
1161 
1162  if (fSelect) {
1164  if (!fW[fNfill]) return;
1165  } else fW[fNfill] = fWeight;
1166  if (fVal) {
1167  for (Int_t i = 0; i < fDimension; ++i) {
1168  if (fVar[i]) fVal[i][fNfill] = fVar[i]->EvalInstance(0);
1169  }
1170  }
1171  fNfill++;
1172  if (fNfill >= fTree->GetEstimate()) {
1173  TakeAction();
1174  fNfill = 0;
1175  }
1176 }
1177 
1178 ////////////////////////////////////////////////////////////////////////////////
1179 /// Called in the entry loop for all entries accepted by Select.
1180 /// Complex case with multiplicity.
1181 
1183 {
1184  // Grab the array size of the formulas for this entry
1186 
1187  // No data at all, let's move on to the next entry.
1188  if (!ndata) return;
1189 
1190  // If the entry list is a TEntryListArray, get the selected subentries for this entry
1191  TEntryList *subList = 0;
1192  if (fTreeElistArray) {
1193  subList = fTreeElistArray->GetSubListForEntry(entry, fTree->GetTree());
1194  }
1195 
1196  Int_t nfill0 = fNfill;
1197 
1198  // Calculate the first values
1199  if (fSelect) {
1200  // coverity[var_deref_model] fSelectMultiple==kTRUE => fSelect != 0
1202  if (!fW[fNfill] && !fSelectMultiple) return;
1203  } else fW[fNfill] = fWeight;
1204 
1205  // Always call EvalInstance(0) to insure the loading
1206  // of the branches.
1207  if (fW[fNfill] && (!subList || subList->Contains(0))) {
1208  if (fDimension == 0 && fSelectMultiple) fCurrentSubEntry = (Long64_t) 0; // to fill TEntryListArray
1209  for (Int_t i = 0; i < fDimension; ++i) {
1210  if (fVar[i]) fVal[i][fNfill] = fVar[i]->EvalInstance(0);
1211  }
1212  fNfill++;
1213  if (fNfill >= fTree->GetEstimate()) {
1214  TakeAction();
1215  fNfill = 0;
1216  }
1217  } else {
1218  for (Int_t i = 0; i < fDimension; ++i) {
1219  if (fVar[i]) fVar[i]->ResetLoading();
1220  }
1221  }
1222  Double_t ww = fW[nfill0];
1223 
1224  for (Int_t i = 1; i < ndata; i++) {
1225  if (subList && !subList->Contains(i)) continue;
1226  if (fSelectMultiple) {
1227  // coverity[var_deref_model] fSelectMultiple==kTRUE => fSelect != 0
1228  ww = fWeight * fSelect->EvalInstance(i);
1229  if (ww == 0) continue;
1230  if (fNfill == nfill0) {
1231  for (Int_t k = 0; k < fDimension; ++k) {
1232  if (!fVarMultiple[k]) fVal[k][fNfill] = fVar[k]->EvalInstance(0);
1233  }
1234  }
1235  if (fDimension == 0) fCurrentSubEntry = (Long64_t) i; // to fill TEntryListArray
1236  }
1237  for (Int_t k = 0; k < fDimension; ++k) {
1238  if (fVarMultiple[k]) fVal[k][fNfill] = fVar[k]->EvalInstance(i);
1239  else fVal[k][fNfill] = fVal[k][nfill0];
1240  }
1241  fW[fNfill] = ww;
1242 
1243  fNfill++;
1244  if (fNfill >= fTree->GetEstimate()) {
1245  TakeAction();
1246  fNfill = 0;
1247  }
1248  }
1249 }
1250 
1251 ////////////////////////////////////////////////////////////////////////////////
1252 /// Called in the entry loop for all entries accepted by Select.
1253 /// Case where the only variable returns an object (or pointer to).
1254 
1256 {
1257  // Complex case with multiplicity.
1258 
1259  // Grab the array size of the formulas for this entry
1261 
1262  // No data at all, let's move on to the next entry.
1263  if (!ndata) return;
1264 
1265  Int_t nfill0 = fNfill;
1266  Double_t ww = 0;
1267 
1268  for (Int_t i = 0; i < ndata; i++) {
1269  if (i == 0) {
1270  if (fSelect) {
1272  if (!fW[fNfill] && !fSelectMultiple) return;
1273  } else fW[fNfill] = fWeight;
1274  ww = fW[nfill0];
1275  } else if (fSelectMultiple) {
1276  ww = fWeight * fSelect->EvalInstance(i);
1277  if (ww == 0) continue;
1278  }
1279  if (fDimension >= 1 && fVar[0]) {
1280  TClass *cl = fVar[0]->EvalClass();
1281  if (cl == TBits::Class()) {
1282 
1283  void *obj = fVar[0]->EvalObject(i);
1284 
1285  if (obj) {
1286  TBits *bits = (TBits*)obj;
1287  Int_t nbits = bits->GetNbits();
1288 
1289  Int_t nextbit = -1;
1290  while (1) {
1291  nextbit = bits->FirstSetBit(nextbit + 1);
1292  if (nextbit >= nbits) break;
1293  fVal[0][fNfill] = nextbit;
1294  fW[fNfill] = ww;
1295  fNfill++;
1296  }
1297  }
1298 
1299  } else {
1300 
1301  if (!TestBit(kWarn)) {
1302  Warning("ProcessFillObject",
1303  "Not implemented for %s",
1304  cl ? cl->GetName() : "unknown class");
1305  SetBit(kWarn);
1306  }
1307 
1308  }
1309  }
1310  if (fNfill >= fTree->GetEstimate()) {
1311  TakeAction();
1312  fNfill = 0;
1313  }
1314  }
1315 
1316 }
1317 
1318 ////////////////////////////////////////////////////////////////////////////////
1319 /// Set number of entries to estimate variable limits.
1320 
1322 {
1323  if (fVal) {
1324  for (Int_t i = 0; i < fValSize; ++i) {
1325  delete [] fVal[i];
1326  fVal[i] = 0;
1327  }
1328  }
1329  delete [] fW; fW = 0;
1330 }
1331 
1332 ////////////////////////////////////////////////////////////////////////////////
1333 /// Execute action for object obj fNfill times.
1334 
1336 {
1337  Int_t i;
1338  //__________________________1-D histogram_______________________
1339  if (fAction == 1)((TH1*)fObject)->FillN(fNfill, fVal[0], fW);
1340  //__________________________2-D histogram_______________________
1341  else if (fAction == 2) {
1342  TH2 *h2 = (TH2*)fObject;
1343  for (i = 0; i < fNfill; i++) h2->Fill(fVal[1][i], fVal[0][i], fW[i]);
1344  }
1345  //__________________________Profile histogram_______________________
1346  else if (fAction == 4)((TProfile*)fObject)->FillN(fNfill, fVal[1], fVal[0], fW);
1347  //__________________________Event List______________________________
1348  else if (fAction == 5) {
1350  TEntryListArray *enlistarray = (TEntryListArray*)fObject;
1351  Long64_t enumb = fTree->GetTree()->GetReadEntry();
1352  enlistarray->Enter(enumb, 0, fCurrentSubEntry);
1353  } else if (fObject->InheritsFrom(TEntryList::Class())) {
1354  TEntryList *enlist = (TEntryList*)fObject;
1355  Long64_t enumb = fTree->GetTree()->GetReadEntry();
1356  enlist->Enter(enumb);
1357  } else {
1358  TEventList *evlist = (TEventList*)fObject;
1360  if (evlist->GetIndex(enumb) < 0) evlist->Enter(enumb);
1361  }
1362  }
1363  //__________________________2D scatter plot_______________________
1364  else if (fAction == 12) {
1365  TH2 *h2 = (TH2*)fObject;
1366  if (h2->CanExtendAllAxes() && h2->TestBit(kCanDelete)) {
1367  for (i = 0; i < fNfill; i++) {
1368  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1369  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1370  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1371  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1372  }
1374  }
1375  TGraph *pm = new TGraph(fNfill, fVal[1], fVal[0]);
1376  pm->SetEditable(kFALSE);
1377  pm->SetBit(kCanDelete);
1386 
1387  if (!fDraw && !strstr(fOption.Data(), "goff")) {
1388  if (fOption.Length() == 0 || strcasecmp(fOption.Data(), "same") == 0) pm->Draw("p");
1389  else pm->Draw(fOption.Data());
1390  }
1391  if (!h2->TestBit(kCanDelete)) {
1392  for (i = 0; i < fNfill; i++) h2->Fill(fVal[1][i], fVal[0][i], fW[i]);
1393  }
1394  }
1395  //__________________________3D scatter plot_______________________
1396  else if (fAction == 3) {
1397  TH3 *h3 = (TH3*)fObject;
1398  if (!h3->TestBit(kCanDelete)) {
1399  for (i = 0; i < fNfill; i++) h3->Fill(fVal[2][i], fVal[1][i], fVal[0][i], fW[i]);
1400  }
1401  } else if (fAction == 13) {
1402  TPolyMarker3D *pm3d = new TPolyMarker3D(fNfill);
1405  pm3d->SetMarkerSize(fTree->GetMarkerSize());
1406  for (i = 0; i < fNfill; i++) {
1407  pm3d->SetPoint(i, fVal[2][i], fVal[1][i], fVal[0][i]);
1408  }
1409  pm3d->Draw();
1410  TH3 *h3 = (TH3*)fObject;
1411  if (!h3->TestBit(kCanDelete)) {
1412  for (i = 0; i < fNfill; i++) h3->Fill(fVal[2][i], fVal[1][i], fVal[0][i], fW[i]);
1413  }
1414  }
1415  //__________________________3D scatter plot (3rd variable = col)__
1416  else if (fAction == 33) {
1417  TH2 *h2 = (TH2*)fObject;
1418  TakeEstimate();
1419  Int_t ncolors = gStyle->GetNumberOfColors();
1420  TObjArray *grs = (TObjArray*)h2->GetListOfFunctions()->FindObject("graphs");
1421  Int_t col;
1422  TGraph *gr;
1423  if (!grs) {
1424  grs = new TObjArray(ncolors);
1425  grs->SetOwner();
1426  grs->SetName("graphs");
1427  h2->GetListOfFunctions()->Add(grs, "P");
1428  for (col = 0; col < ncolors; col++) {
1429  gr = new TGraph();
1433  grs->AddAt(gr, col);
1434  }
1435  }
1436  h2->SetEntries(fNfill);
1437  h2->SetMinimum(fVmin[2]);
1438  h2->SetMaximum(fVmax[2]);
1439  // Fill the graphs acording to the color
1440  for (i = 0; i < fNfill; i++) {
1441  col = Int_t(ncolors * ((fVal[2][i] - fVmin[2]) / (fVmax[2] - fVmin[2])));
1442  if (col < 0) col = 0;
1443  if (col > ncolors - 1) col = ncolors - 1;
1444  gr = (TGraph*)grs->UncheckedAt(col);
1445  if (gr) gr->SetPoint(gr->GetN(), fVal[1][i], fVal[0][i]);
1446  }
1447  // Remove potential empty graphs
1448  for (col = 0; col < ncolors; col++) {
1449  gr = (TGraph*)grs->At(col);
1450  if (gr && gr->GetN() <= 0) grs->Remove(gr);
1451  }
1452  }
1453  //__________________________2D Profile Histogram__________________
1454  else if (fAction == 23) {
1455  TProfile2D *hp2 = (TProfile2D*)fObject;
1456  for (i = 0; i < fNfill; i++) hp2->Fill(fVal[2][i], fVal[1][i], fVal[0][i], fW[i]);
1457  }
1458  //__________________________4D scatter plot_______________________
1459  else if (fAction == 40) {
1460  TakeEstimate();
1461  TH3 *h3 = (TH3*)fObject;
1462  Int_t ncolors = gStyle->GetNumberOfColors();
1463  if (ncolors == 0) {
1465  ncolors = gStyle->GetNumberOfColors();
1466  }
1467  TObjArray *pms = (TObjArray*)h3->GetListOfFunctions()->FindObject("polymarkers");
1468  Int_t col;
1469  TPolyMarker3D *pm3d;
1470  if (!pms) {
1471  pms = new TObjArray(ncolors);
1472  pms->SetOwner();
1473  pms->SetName("polymarkers");
1474  h3->GetListOfFunctions()->Add(pms);
1475  for (col = 0; col < ncolors; col++) {
1476  pm3d = new TPolyMarker3D();
1477  pm3d->SetMarkerColor(gStyle->GetColorPalette(col));
1479  pm3d->SetMarkerSize(fTree->GetMarkerSize());
1480  pms->AddAt(pm3d, col);
1481  }
1482  }
1483  h3->SetEntries(fNfill);
1484  h3->SetMinimum(fVmin[3]);
1485  h3->SetMaximum(fVmax[3]);
1486  for (i = 0; i < fNfill; i++) {
1487  col = Int_t(ncolors * ((fVal[3][i] - fVmin[3]) / (fVmax[3] - fVmin[3])));
1488  if (col > ncolors-1) col = ncolors-1;
1489  if (col < 0) col = 0;
1490  pm3d = (TPolyMarker3D*)pms->UncheckedAt(col);
1491  pm3d->SetPoint(pm3d->GetLastPoint() + 1, fVal[2][i], fVal[1][i], fVal[0][i]);
1492  }
1493  }
1494  //__________________________Parallel coordinates / candle chart_______________________
1495  else if (fAction == 6 || fAction == 7) {
1496  TakeEstimate();
1497  Bool_t candle = (fAction == 7);
1498  // Using CINT to avoid a dependency in TParallelCoord
1499  if (!fOption.Contains("goff"))
1500  gROOT->ProcessLine(TString::Format("TParallelCoord::BuildParallelCoord((TSelectorDraw*)0x%lx,0x%lx)",
1501  (ULong_t)this, (ULong_t)candle));
1502  } else if (fAction == 8) {
1503  //gROOT->ProcessLineFast(TString::Format("(new TGL5DDataSet((TTree *)0x%1x))->Draw(\"%s\");", fTree, fOption.Data()));
1504  }
1505  //__________________________something else_______________________
1506  else if (fAction < 0) {
1507  fAction = -fAction;
1508  TakeEstimate();
1509  }
1510 
1511  // Do we need to update screen?
1512  fSelectedRows += fNfill;
1513  if (!fTree->GetUpdate()) return;
1514  if (fSelectedRows > fDraw + fTree->GetUpdate()) {
1515  if (fDraw) gPad->Modified();
1516  else fObject->Draw(fOption.Data());
1517  gPad->Update();
1518  fDraw = fSelectedRows;
1519  }
1520 }
1521 
1522 ////////////////////////////////////////////////////////////////////////////////
1523 /// Estimate limits for 1-D, 2-D or 3-D objects.
1524 
1526 {
1527  Int_t i;
1528  Double_t rmin[3], rmax[3];
1529  Double_t vminOld[4], vmaxOld[4];
1530  for (i = 0; i < fValSize && i < 4; i++) {
1531  vminOld[i] = fVmin[i];
1532  vmaxOld[i] = fVmax[i];
1533  }
1534  for (i = 0; i < fValSize; ++i) {
1535  fVmin[i] = DBL_MAX;
1536  fVmax[i] = - DBL_MAX;
1537  }
1538  //__________________________1-D histogram_______________________
1539  if (fAction == 1) {
1540  TH1 *h1 = (TH1*)fObject;
1541  if (h1->CanExtendAllAxes()) {
1542  for (i = 0; i < fNfill; i++) {
1543  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1544  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1545  }
1547  }
1548  h1->FillN(fNfill, fVal[0], fW);
1549  //__________________________2-D histogram_______________________
1550  } else if (fAction == 2) {
1551  TH2 *h2 = (TH2*)fObject;
1552  if (h2->CanExtendAllAxes()) {
1553  for (i = 0; i < fNfill; i++) {
1554  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1555  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1556  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1557  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1558  }
1560  }
1561  for (i = 0; i < fNfill; i++) h2->Fill(fVal[1][i], fVal[0][i], fW[i]);
1562  //__________________________Profile histogram_______________________
1563  } else if (fAction == 4) {
1564  TProfile *hp = (TProfile*)fObject;
1565  if (hp->CanExtendAllAxes()) {
1566  for (i = 0; i < fNfill; i++) {
1567  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1568  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1569  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1570  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1571  }
1573  }
1574  hp->FillN(fNfill, fVal[1], fVal[0], fW);
1575  //__________________________2D scatter plot_______________________
1576  } else if (fAction == 12) {
1577  TH2 *h2 = (TH2*)fObject;
1578  if (h2->CanExtendAllAxes()) {
1579  for (i = 0; i < fNfill; i++) {
1580  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1581  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1582  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1583  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1584  }
1586  // In case the new lower limits of h2 axis are 0, it is better to set them to the minimum of
1587  // the data set (which should be >0) to avoid data cut when plotting in log scale.
1588  TAxis *aX = h2->GetXaxis();
1589  TAxis *aY = h2->GetYaxis();
1590  Double_t xmin = aX->GetXmin();
1591  Double_t ymin = aY->GetXmin();
1592  if (xmin == 0 || ymin == 0) {
1593  if (aX->GetBinUpEdge(aX->FindFixBin(0.01*aX->GetBinWidth(aX->GetFirst()))) > fVmin[1]) xmin = fVmin[1];
1594  if (aY->GetBinUpEdge(aY->FindFixBin(0.01*aY->GetBinWidth(aY->GetFirst()))) > fVmin[0]) ymin = fVmin[0];
1595  h2->SetBins(aX->GetNbins(), xmin, aX->GetXmax(), aY->GetNbins(), ymin, aY->GetXmax());
1596  }
1597  }
1598 
1599  if (!strstr(fOption.Data(), "same") && !strstr(fOption.Data(), "goff")) {
1600  if (!h2->TestBit(kCanDelete)) {
1601  // case like: T.Draw("y:x>>myhist")
1602  // we must draw a copy before filling the histogram h2=myhist
1603  // because h2 will be filled below and we do not want to show
1604  // the binned scatter-plot, the TGraph being better.
1605  TH1 *h2c = h2->DrawCopy(fOption.Data(),"");
1606  if (h2c) h2c->SetStats(kFALSE);
1607  } else {
1608  // case like: T.Draw("y:x")
1609  // h2 is a temporary histogram (htemp). This histogram
1610  // will be automatically deleted by TPad::Clear
1611  h2->Draw();
1612  }
1613  gPad->Update();
1614  }
1615  TGraph *pm = new TGraph(fNfill, fVal[1], fVal[0]);
1616  pm->SetEditable(kFALSE);
1617  pm->SetBit(kCanDelete);
1626  if (!fDraw && !strstr(fOption.Data(),"goff")) {
1627  if (fOption.Length() == 0 || strcasecmp(fOption.Data(),"same")==0) {
1628  pm->Draw("p");
1629  }
1630  else {
1631  TString opt = fOption;
1632  opt.ToLower();
1633  if (opt.Contains("a")) {
1634  TString temp(opt);
1635  temp.ReplaceAll("same","");
1636  if (temp.Contains("a")) {
1637  if (h2->TestBit(kCanDelete)) {
1638  // h2 will be deleted, the axis setting is delegated to only
1639  // the TGraph.
1640  h2 = 0;
1641  }
1642  }
1643  }
1644  pm->Draw(fOption.Data());
1645  }
1646  }
1647  if (h2 && !h2->TestBit(kCanDelete)) {
1648  for (i = 0; i < fNfill; i++) h2->Fill(fVal[1][i], fVal[0][i], fW[i]);
1649  }
1650  //__________________________3D scatter plot with option col_______________________
1651  } else if (fAction == 33) {
1652  TH2 *h2 = (TH2*)fObject;
1653  Bool_t process2 = kFALSE;
1654  if (h2->CanExtendAllAxes()) {
1655  if (vminOld[2] == DBL_MAX)
1656  process2 = kTRUE;
1657  for (i = 0; i < fValSize && i < 4; i++) {
1658  fVmin[i] = vminOld[i];
1659  fVmax[i] = vmaxOld[i];
1660  }
1661  for (i = 0; i < fNfill; i++) {
1662  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1663  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1664  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1665  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1666  if (process2) {
1667  if (fVmin[2] > fVal[2][i]) fVmin[2] = fVal[2][i];
1668  if (fVmax[2] < fVal[2][i]) fVmax[2] = fVal[2][i];
1669  }
1670  }
1672  // In case the new lower limits of h2 axis are 0, it is better to set them to the minimum of
1673  // the data set (which should be >0) to avoid data cut when plotting in log scale.
1674  TAxis *aX = h2->GetXaxis();
1675  TAxis *aY = h2->GetYaxis();
1676  Double_t xmin = aX->GetXmin();
1677  Double_t ymin = aY->GetXmin();
1678  if (xmin == 0 || ymin == 0) {
1679  if (aX->GetBinUpEdge(aX->FindFixBin(0.01*aX->GetBinWidth(aX->GetFirst()))) > fVmin[1]) xmin = fVmin[1];
1680  if (aY->GetBinUpEdge(aY->FindFixBin(0.01*aY->GetBinWidth(aY->GetFirst()))) > fVmin[0]) ymin = fVmin[0];
1681  h2->SetBins(aX->GetNbins(), xmin, aX->GetXmax(), aY->GetNbins(), ymin, aY->GetXmax());
1682  }
1683  } else {
1684  for (i = 0; i < fNfill; i++) {
1685  if (fVmin[2] > fVal[2][i]) fVmin[2] = fVal[2][i];
1686  if (fVmax[2] < fVal[2][i]) fVmax[2] = fVal[2][i];
1687  }
1688  }
1689  //__________________________3D scatter plot_______________________
1690  } else if (fAction == 3 || fAction == 13) {
1691  TH3 *h3 = (TH3*)fObject;
1692  if (h3->CanExtendAllAxes()) {
1693  for (i = 0; i < fNfill; i++) {
1694  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1695  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1696  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1697  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1698  if (fVmin[2] > fVal[2][i]) fVmin[2] = fVal[2][i];
1699  if (fVmax[2] < fVal[2][i]) fVmax[2] = fVal[2][i];
1700  }
1702  }
1703  if (fAction == 3) {
1704  for (i = 0; i < fNfill; i++) h3->Fill(fVal[2][i], fVal[1][i], fVal[0][i], fW[i]);
1705  return;
1706  }
1707  if (!strstr(fOption.Data(), "same") && !strstr(fOption.Data(), "goff")) {
1708  if (!h3->TestBit(kCanDelete)) {
1709  // case like: T.Draw("y:x>>myhist")
1710  // we must draw a copy before filling the histogram h3=myhist
1711  // because h3 will be filled below and we do not want to show
1712  // the binned scatter-plot, the TGraph being better.
1713  TH1 *h3c = h3->DrawCopy(fOption.Data(),"");
1714  if (h3c) h3c->SetStats(kFALSE);
1715  } else {
1716  // case like: T.Draw("y:x")
1717  // h3 is a temporary histogram (htemp). This histogram
1718  // will be automatically deleted by TPad::Clear
1719  h3->Draw(fOption.Data());
1720  }
1721  gPad->Update();
1722  } else {
1723  rmin[0] = fVmin[2]; rmin[1] = fVmin[1]; rmin[2] = fVmin[0];
1724  rmax[0] = fVmax[2]; rmax[1] = fVmax[1]; rmax[2] = fVmax[0];
1725  gPad->Clear();
1726  gPad->Range(-1, -1, 1, 1);
1727  TView::CreateView(1, rmin, rmax);
1728  }
1729  TPolyMarker3D *pm3d = new TPolyMarker3D(fNfill);
1732  pm3d->SetMarkerSize(fTree->GetMarkerSize());
1733  for (i = 0; i < fNfill; i++) {
1734  pm3d->SetPoint(i, fVal[2][i], fVal[1][i], fVal[0][i]);
1735  }
1736  if (!fDraw && !strstr(fOption.Data(), "goff")) pm3d->Draw();
1737  if (!h3->TestBit(kCanDelete)) {
1738  for (i = 0; i < fNfill; i++) h3->Fill(fVal[2][i], fVal[1][i], fVal[0][i], fW[i]);
1739  }
1740 
1741  //__________________________2D Profile Histogram__________________
1742  } else if (fAction == 23) {
1743  TProfile2D *hp = (TProfile2D*)fObject;
1744  if (hp->CanExtendAllAxes()) {
1745  for (i = 0; i < fNfill; i++) {
1746  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1747  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1748  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1749  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1750  if (fVmin[2] > fVal[2][i]) fVmin[2] = fVal[2][i];
1751  if (fVmax[2] < fVal[2][i]) fVmax[2] = fVal[2][i];
1752  }
1754  }
1755  for (i = 0; i < fNfill; i++) hp->Fill(fVal[2][i], fVal[1][i], fVal[0][i], fW[i]);
1756  //__________________________4D scatter plot_______________________
1757  } else if (fAction == 40) {
1758  TH3 *h3 = (TH3*)fObject;
1759  if (h3->CanExtendAllAxes()) {
1760  for (i = 0; i < fValSize && i < 4; i++) {
1761  fVmin[i] = vminOld[i];
1762  fVmax[i] = vmaxOld[i];
1763  }
1764  for (i = 0; i < fNfill; i++) {
1765  if (fVmin[0] > fVal[0][i]) fVmin[0] = fVal[0][i];
1766  if (fVmax[0] < fVal[0][i]) fVmax[0] = fVal[0][i];
1767  if (fVmin[1] > fVal[1][i]) fVmin[1] = fVal[1][i];
1768  if (fVmax[1] < fVal[1][i]) fVmax[1] = fVal[1][i];
1769  if (fVmin[2] > fVal[2][i]) fVmin[2] = fVal[2][i];
1770  if (fVmax[2] < fVal[2][i]) fVmax[2] = fVal[2][i];
1771  if (fVmin[3] > fVal[3][i]) fVmin[3] = fVal[3][i];
1772  if (fVmax[3] < fVal[3][i]) fVmax[3] = fVal[3][i];
1773  }
1775  } else {
1776  for (i = 0; i < fNfill; i++) {
1777  if (fVmin[3] > fVal[3][i]) fVmin[3] = fVal[3][i];
1778  if (fVmax[3] < fVal[3][i]) fVmax[3] = fVal[3][i];
1779  }
1780  }
1781  }
1782  //__________________________Parallel coordinates plot / candle chart_______________________
1783  else if (fAction == 6 || fAction == 7) {
1784  for (i = 0; i < fDimension; ++i) {
1785  for (Long64_t entry = 0; entry < fNfill; entry++) {
1786  if (fVmin[i] > fVal[i][entry]) fVmin[i] = fVal[i][entry];
1787  if (fVmax[i] < fVal[i][entry]) fVmax[i] = fVal[i][entry];
1788  }
1789  }
1790  }
1791 }
1792 
1793 ////////////////////////////////////////////////////////////////////////////////
1794 /// Called at the end of a loop on a TTree.
1795 
1797 {
1798  if (fNfill) TakeAction();
1799 
1800  if ((fSelectedRows == 0) && (TestBit(kCustomHistogram) == 0)) fDraw = 1; // do not draw
1801 
1803 }
const int ndata
virtual const char * GetOption() const
Definition: TSelector.h:65
Int_t GetFirst() const
Return first bin on the axis i.e.
Definition: TAxis.cxx:429
virtual void InitArrays(Int_t newsize)
Initialization of the primitive type arrays if the new size is bigger than the available space...
virtual void Enter(Long64_t entry)
Enter element entry into the list.
Definition: TEventList.cxx:189
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title Offset is a correction factor with respect to the "s...
Definition: TAttAxis.cxx:244
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:52
virtual Style_t GetLineStyle() const
Definition: TAttLine.h:48
virtual Style_t GetFillStyle() const
Definition: TAttFill.h:44
virtual void SetLineWidth(Width_t lwidth)
Definition: TAttLine.h:57
TList * GetListOfFunctions() const
Definition: TH1.h:244
An array of TObjects.
Definition: TObjArray.h:39
virtual void Terminate()
Called at the end of a loop on a TTree.
float xmin
Definition: THbookFile.cxx:93
virtual Double_t * GetVal(Int_t i) const
Return the last values corresponding to the i-th component of the formula being processed (where the ...
long long Long64_t
Definition: RtypesCore.h:69
virtual void SetMaximum(Double_t maximum=-1111)
Definition: TH1.h:394
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition: TObject.cxx:487
UInt_t GetNbits() const
Definition: TBits.h:141
Ssiz_t Length() const
Definition: TString.h:390
A list of entries and subentries in a TTree or TChain.
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
Definition: TH1.cxx:8266
3-D histogram with a float per channel (see TH1 documentation)}
Definition: TH3.h:272
THist< 2, float > TH2F
Definition: THist.h:321
virtual Double_t * GetRmax()=0
virtual Bool_t Sync()
Synchronize all the formulae.
TEventList * GetEventList() const
Definition: TTree.h:392
virtual void SetEstimate(Long64_t n)
Set number of entries to estimate variable limits.
Double_t ** fVal
Definition: TSelectorDraw.h:57
virtual Long64_t GetReadEntry() const
Definition: TTree.h:424
float ymin
Definition: THbookFile.cxx:93
TTreeFormulaManager * GetManager() const
Definition: TTreeFormula.h:185
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition: TString.h:635
TTreeFormula ** fVar
Definition: TSelectorDraw.h:39
TEntryListArray * fTreeElistArray
Definition: TSelectorDraw.h:43
TTreeFormula * GetVar(Int_t i) const
Return the TTreeFormula corresponding to the i-th component of the request formula (where the compone...
R__EXTERN TStyle * gStyle
Definition: TStyle.h:423
virtual Int_t GetDimension() const
Definition: TH1.h:283
virtual void ProcessFill(Long64_t entry)
Called in the entry loop for all entries accepted by Select.
#define gDirectory
Definition: TDirectory.h:218
virtual void SetBins(Int_t nx, Double_t xmin, Double_t xmax)
Redefine x axis parameters.
Definition: TH1.cxx:8090
virtual TEntryList * GetEntryList()
Returns the entry list, set to this tree.
Definition: TTree.cxx:5213
Int_t fAction
Pointer to previously used histogram.
Definition: TSelectorDraw.h:45
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
#define BIT(n)
Definition: Rtypes.h:120
virtual Bool_t Enter(Long64_t entry, TTree *tree, Long64_t subentry)
Add entry entry (, #subentry) to the list.
UInt_t FirstSetBit(UInt_t startBit=0) const
Return position of first non null bit (starting from position 0 and up)
Definition: TBits.cxx:344
Bool_t * fVarMultiple
[fSelectedRows]Local buffer for weights
Definition: TSelectorDraw.h:60
See TView3D.
Definition: TView.h:36
THist< 1, float > TH1F
Definition: THist.h:315
virtual void SetMinimum(Double_t minimum=-1111)
Definition: TH1.h:395
TTreeFormulaManager * fManager
Definition: TSelectorDraw.h:41
static THLimitsFinder * GetLimitsFinder()
Return pointer to the current finder.
#define gROOT
Definition: TROOT.h:340
virtual TObject * Remove(TObject *obj)
Remove object from array.
Definition: TObjArray.cxx:652
virtual void TakeAction()
Execute action for object obj fNfill times.
Basic string class.
Definition: TString.h:137
virtual TClass * EvalClass(Int_t oper) const
Evaluate the class of the operation oper.
virtual Int_t GetNdim() const
Definition: TFormula.h:243
void ToLower()
Change string to lower-case.
Definition: TString.cxx:1088
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
Definition: TAxis.cxx:511
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
Definition: TObject.cxx:254
virtual void SetFillStyle(Style_t fstyle)
Definition: TAttFill.h:52
virtual TObject * FindObject(const char *name) const
Find an object in this list using its name.
Definition: TList.cxx:496
Int_t * fNbins
Definition: TSelectorDraw.h:53
virtual void * EvalObject(Int_t i=0)
Evaluate this treeformula.
Profile Historam.
Definition: TProfile.h:34
virtual Long64_t GetEstimate() const
Definition: TTree.h:386
Long64_t fCurrentSubEntry
Definition: TSelectorDraw.h:64
virtual Int_t FindGoodLimits(TH1 *h, Double_t xmin, Double_t xmax)
compute the best axis limits for the X axis.
Int_t GetN() const
Definition: TGraph.h:132
TH1 * fOldHistogram
pointer to Tree Event list array
Definition: TSelectorDraw.h:44
virtual void Add(TTreeFormula *)
Add a new formula to the list of formulas managed The manager of the formula will be changed and the ...
virtual void Draw(Option_t *chopt="")
Draw this graph with its current attributes.
Definition: TGraph.cxx:740
Iterator of linked list.
Definition: TList.h:187
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:732
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
Definition: TH1.cxx:6669
virtual Long64_t GetChainOffset() const
Definition: TTree.h:376
Int_t fValSize
[fSelectedRows][fDimension] Local buffer for the variables
Definition: TSelectorDraw.h:58
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=0)
Set the value of a resource or create a new resource.
Definition: TEnv.cxx:749
virtual Int_t GetMultiplicity() const
virtual TEntryListArray * GetSubListForEntry(Long64_t entry, TTree *tree=0)
Return the list holding the subentries for the given entry or 0.
const char * Data() const
Definition: TString.h:349
THist< 3, float > TH3F
Definition: THist.h:327
Int_t Fill(const Double_t *v)
Definition: TProfile2D.h:54
Used to coordinate one or more TTreeFormula objects.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
Definition: TString.cxx:2334
void Class()
Definition: Class.C:29
virtual void SetMarkerColor(Color_t mcolor=1)
Definition: TAttMarker.h:51
Int_t GetNumberOfColors() const
Return number of colors in the color palette.
Definition: TStyle.cxx:796
std::vector< std::vector< double > > Data
TString fOption
Definition: TSelector.h:47
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:918
Double_t fWeight
[fDimension] Maxima of varexp columns
Definition: TSelectorDraw.h:56
virtual TH1 * DrawCopy(Option_t *option="", const char *name_postfix="_copy") const
Copy this histogram and Draw in the current pad.
Definition: TH1.cxx:2925
TH1F * h1
Definition: legend1.C:5
Double_t GetXmin() const
Definition: TAxis.h:137
TTreeFormula * fSelect
[fDimension] Array of pointers to variables formula
Definition: TSelectorDraw.h:40
The 3-D histogram classes derived from the 1-D histogram classes.
Definition: TH3.h:35
virtual Float_t GetTitleOffset() const
Definition: TAttAxis.h:56
Used to pass a selection expression to the Tree drawing routine.
Definition: TTreeFormula.h:64
A specialized string object used for TTree selections.
Definition: TCut.h:27
TObject * UncheckedAt(Int_t i) const
Definition: TObjArray.h:91
Int_t fMultiplicity
Total number of histogram fills.
Definition: TSelectorDraw.h:48
TObject * fObject
Definition: TSelector.h:48
virtual void SetLineColor(Color_t lcolor)
Definition: TAttLine.h:54
virtual void Delete(Option_t *option="")
Delete this object.
Definition: TObject.cxx:228
virtual void Begin(TTree *tree)
Called everytime a loop on the tree(s) starts.
virtual Size_t GetMarkerSize() const
Definition: TAttMarker.h:46
float ymax
Definition: THbookFile.cxx:93
virtual Bool_t Notify()
This function is called at the first entry of a new tree in a chain.
TObject * fTreeElist
Definition: TSelectorDraw.h:42
virtual void SetEstimate(Long64_t nentries=1000000)
Set number of entries to estimate variable limits.
Definition: TTree.cxx:8236
Service class for 2-Dim histogram classes.
Definition: TH2.h:36
Class to manage histogram axis.
Definition: TAxis.h:36
virtual void Draw(Option_t *option="")
Draw this histogram with options.
Definition: TH1.cxx:2878
virtual void SetFillColor(Color_t fcolor)
Definition: TAttFill.h:50
Int_t GetNbins() const
Definition: TAxis.h:125
virtual void SetStatus(Long64_t status)
Definition: TSelector.h:74
virtual void Abort(const char *why, EAbort what=kAbortProcess)
Abort processing.
Definition: TSelector.cxx:114
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Definition: TAxis.cxx:499
virtual ~TSelectorDraw()
Selector destructor.
2-D histogram with a float per channel (see TH1 documentation)}
Definition: TH2.h:256
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
Definition: TEnv.cxx:494
virtual Color_t GetFillColor() const
Definition: TAttFill.h:43
virtual Bool_t CompileVariables(const char *varexp="", const char *selection="")
Compile input variables and selection expression.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition: TString.cxx:2321
unsigned int UInt_t
Definition: RtypesCore.h:42
Bool_t TestBit(UInt_t f) const
Definition: TObject.h:173
Double_t * fVmin
[fDimension] Number of bins per dimension
Definition: TSelectorDraw.h:54
virtual void UpdateFormulaLeaves()
This function is called TTreePlayer::UpdateFormulaLeaves, itself called by TChain::LoadTree when a ne...
A TEventList object is a list of selected events (entries) in a TTree.
Definition: TEventList.h:33
TLine * l
Definition: textangle.C:4
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:51
The ROOT global object gROOT contains a list of all defined classes.
Definition: TClass.h:81
virtual void SetMarkerStyle(Style_t mstyle=1)
Definition: TAttMarker.h:53
TAxis * GetYaxis()
Definition: TH1.h:320
Int_t Fill(Double_t)
Invalid Fill method.
Definition: TH3.cxx:275
float xmax
Definition: THbookFile.cxx:93
void SetName(const char *name)
Definition: TCollection.h:116
virtual Color_t GetLineColor() const
Definition: TAttLine.h:47
ClassImp(TSelectorDraw) const Int_t kCustomHistogram
Long64_t entry
virtual Int_t Contains(Long64_t entry, TTree *tree=0)
Definition: TEntryList.cxx:517
virtual void Draw(Option_t *option="")
Draws 3-D polymarker with its current attributes.
virtual void AddAt(TObject *obj, Int_t idx)
Add object at position ids.
Definition: TObjArray.cxx:238
virtual void SetMarkerSize(Size_t msize=1)
Definition: TAttMarker.h:54
virtual Double_t * GetRmin()=0
TGraphErrors * gr
Definition: legend1.C:25
Long64_t fDraw
Action type.
Definition: TSelectorDraw.h:46
Int_t GetColorPalette(Int_t i) const
Return color number i in current palette.
Definition: TStyle.cxx:730
A specialized TSelector for TTree::Draw.
Definition: TSelectorDraw.h:33
Long64_t fSelectedRows
Definition: TSelectorDraw.h:50
void SetPoint(Int_t n, Double_t x, Double_t y, Double_t z)
Set point n to x, y, z.
Bool_t fCleanElist
Definition: TSelectorDraw.h:62
virtual void ResetAbort()
Definition: TSelector.h:81
virtual void SetEntryList(TEntryList *list, Option_t *opt="")
Set an EntryList.
Definition: TTree.cxx:8172
virtual const char * GetName() const
Returns name of object.
Definition: TObject.cxx:415
double Double_t
Definition: RtypesCore.h:55
Bool_t fSelectMultiple
[fDimension] true if fVar[i] has a variable index
Definition: TSelectorDraw.h:61
virtual Int_t GetUpdate() const
Definition: TTree.h:435
Double_t * fVmax
[fDimension] Minima of varexp columns
Definition: TSelectorDraw.h:55
R__EXTERN TEnv * gEnv
Definition: TEnv.h:174
virtual void ProcessFillMultiple(Long64_t entry)
Called in the entry loop for all entries accepted by Select.
unsigned long ULong_t
Definition: RtypesCore.h:51
Double_t GetXmax() const
Definition: TAxis.h:138
virtual void ProcessFillObject(Long64_t entry)
Called in the entry loop for all entries accepted by Select.
The TH1 histogram class.
Definition: TH1.h:80
virtual TTree * GetTree() const
Definition: TTree.h:432
Double_t * fW
Definition: TSelectorDraw.h:59
T EvalInstance(Int_t i=0, const char *stringStack[]=0)
Evaluate this treeformula.
virtual Bool_t Enter(Long64_t entry, TTree *tree=0)
Add entry entry to the list.
Definition: TEntryList.cxx:558
Profile2D histograms are used to display the mean value of Z and its RMS for each cell in X...
Definition: TProfile2D.h:31
virtual void SetLineStyle(Style_t lstyle)
Definition: TAttLine.h:56
static TView * CreateView(Int_t system=1, const Double_t *rmin=0, const Double_t *rmax=0)
Create a concrete default 3-d view via the plug-in manager.
Definition: TView.cxx:36
TAxis * GetZaxis()
Definition: TH1.h:321
virtual UInt_t SetCanExtend(UInt_t extendBitMask)
make the histogram axes extendable / not extendable according to the bit mask returns the previous bi...
Definition: TH1.cxx:6211
virtual Int_t GetIndex(Long64_t entry) const
Return index in the list of element with value entry array is supposed to be sorted prior to this cal...
Definition: TEventList.cxx:233
Mother of all ROOT objects.
Definition: TObject.h:58
Container of bits.
Definition: TBits.h:33
Long64_t fOldEstimate
Definition: TSelectorDraw.h:51
virtual void TakeEstimate()
Estimate limits for 1-D, 2-D or 3-D objects.
virtual Color_t GetMarkerColor() const
Definition: TAttMarker.h:44
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
Definition: TGraph.cxx:2127
A 3D polymarker.
Definition: TPolyMarker3D.h:40
TList * fInput
Current object if processing object (vs. TTree)
Definition: TSelector.h:49
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x.
Definition: TAxis.cxx:390
void FillN(Int_t, const Double_t *, const Double_t *, Int_t)
Fill this histogram with an array x and weights w.
Definition: TProfile.h:64
virtual void Add(TObject *obj)
Definition: TList.h:81
virtual void Reset()
Reset this list.
virtual void FillN(Int_t ntimes, const Double_t *x, const Double_t *w, Int_t stride=1)
Fill this histogram with an array x and weights w.
Definition: TH1.cxx:3265
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition: TString.h:567
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
Definition: TH1.cxx:8350
A Graph is a graphics object made of two arrays X and Y with npoints each.
Definition: TGraph.h:53
virtual Bool_t GetReapplyCut() const
Definition: TEntryList.h:81
Int_t fNfill
Last entry loop number when object was drawn.
Definition: TSelectorDraw.h:47
virtual Bool_t CanExtendAllAxes() const
returns true if all axes are extendable
Definition: TH1.cxx:6197
#define gPad
Definition: TVirtualPad.h:288
virtual void ClearFormula()
Delete internal buffers.
R__EXTERN Int_t gDebug
Definition: Rtypes.h:128
virtual UInt_t SplitNames(const TString &varexp, std::vector< TString > &names)
Build Index array for names in varexp.
virtual void SetEntries(Double_t n)
Definition: TH1.h:382
A TTree object has a header with a name and a title.
Definition: TTree.h:94
static void InitializeColors()
Initialize colors used by the TCanvas based graphics (via TColor objects).
Definition: TColor.cxx:1008
void SetQuickLoad(Bool_t quick)
Definition: TTreeFormula.h:203
void ResetBit(UInt_t f)
Definition: TObject.h:172
virtual Double_t GetWeight() const
Definition: TTree.h:458
virtual Int_t GetNdata(Bool_t forceLoadDim=kFALSE)
Return number of available instances in the formulas.
TObject * At(Int_t idx) const
Definition: TObjArray.h:167
virtual Style_t GetMarkerStyle() const
Definition: TAttMarker.h:45
const Bool_t kTRUE
Definition: Rtypes.h:91
Int_t Fill(Double_t)
Invalid Fill method.
Definition: TH2.cxx:285
virtual Width_t GetLineWidth() const
Definition: TAttLine.h:49
virtual Int_t GetMultiplicity() const
Definition: TTreeFormula.h:187
virtual const char * GetTitle() const
Returns title of object.
Definition: TObject.cxx:459
virtual void SetTitle(const char *title="")
Change (i.e. set) the title of the TNamed.
Definition: TNamed.cxx:152
TObject * obj
virtual void SetEditable(Bool_t editable=kTRUE)
if editable=kFALSE, the graph cannot be modified with the mouse by default a TGraph is editable ...
Definition: TGraph.cxx:2100
float value
Definition: math.cpp:443
A List of entry numbers in a TTree or TChain.
Definition: TEntryList.h:27
Int_t GetMultiplicity() const
Definition: TSelectorDraw.h:85
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
Definition: TH1.cxx:8320
virtual void ResetLoading()
Tell the formula that we are going to request a new entry.
TAxis * GetXaxis()
Definition: TH1.h:319
virtual Int_t GetLastPoint() const
Definition: TPolyMarker3D.h:64
virtual void Reset(Option_t *option="")
Reset number of entries in event list.
Definition: TEventList.cxx:326
virtual void SetAxis(TAxis *axis=0)
Set the axis (in particular get the type).
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition: TObject.cxx:904