25 ClassImp(TTreeTableInterface);
49 TTreeTableInterface::TTreeTableInterface (TTree *tree,
const char *varexp,
50 const char *selection, Option_t *option, Long64_t nentries,
52 : TVirtualTableInterface(), fTree(tree), fFormulas(0), fEntry(0),
53 fNEntries(nentries), fFirstEntry(firstentry), fManager(0), fSelect(0), fSelector(0), fInput(0),
54 fForceDim(kFALSE), fEntries(0), fNRows(0), fNColumns(0)
57 Error(
"TTreeTableInterface",
"No tree supplied");
61 fFormulas=
new TList();
62 fSelector =
new TSelectorDraw();
64 fInput->Add(
new TNamed(
"varexp",
""));
65 fInput->Add(
new TNamed(
"selection",
""));
66 fSelector->SetInputList(fInput);
72 fNEntries = fTree->GetEntries();
73 Info(
"TTreeTableInterface",
"nentries was 0, setting to maximum number"
74 " available in the tree");
78 SetVariablesExpression(varexp);
79 SetSelection(selection);
82 Warning (
"TTreeTableInterface::TTreeTableInterface",
"nrows = 0");
85 Warning (
"TTreeTableInterface::TTreeTableInterface",
"ncolumns = 0");
92 TTreeTableInterface::~TTreeTableInterface()
99 if (fTree) fTree->SetEntryList(0);
106 void TTreeTableInterface::SetVariablesExpression(
const char *varexp)
110 Bool_t allvar = kFALSE;
113 if (!strcmp(varexp,
"*")) { allvar = kTRUE; }
120 TObjArray *leaves = fTree->GetListOfLeaves();
121 UInt_t nleaves = leaves->GetEntries();
123 Error(
"TTreeTableInterface",
"No leaves in Tree");
127 for (UInt_t ui = 0; ui < fNColumns; ui++) {
128 TLeaf *lf = (TLeaf*)leaves->At(ui);
129 fFormulas->Add(
new TTreeFormula(
"Var1", lf->GetName(), fTree));
133 std::vector<TString> cnames;
134 fNColumns = fSelector->SplitNames(varexp,cnames);
137 for (UInt_t ui = 0; ui < fNColumns; ui++) {
138 fFormulas->Add(
new TTreeFormula(
"Var1", cnames[ui].Data(), fTree));
146 void TTreeTableInterface::SetSelection(
const char *selection)
150 fFormulas->Remove(fSelect);
154 if (selection && strlen(selection)) {
155 fSelect =
new TTreeFormula(
"Selection", selection, fTree);
156 fFormulas->Add(fSelect);
160 for (Int_t i = 0; i <= fFormulas->LastIndex(); i++) {
161 fManager->Remove((TTreeFormula*)fFormulas->At(i));
173 void TTreeTableInterface::SyncFormulas()
178 if (fFormulas->LastIndex() >= 0) {
180 if (fSelect->GetManager()->GetMultiplicity() > 0 ) {
181 if (!fManager) fManager =
new TTreeFormulaManager;
182 for (i = 0; i <= fFormulas->LastIndex(); i++) {
183 fManager->Add((TTreeFormula*)fFormulas->At(i));
188 for (i = 0; i < fFormulas->LastIndex(); i++) {
189 TTreeFormula *form = ((TTreeFormula*)fFormulas->At(i));
190 switch (form->GetManager()->GetMultiplicity()) {
207 void TTreeTableInterface::InitEntries()
209 TEntryList *entrylist =
new TEntryList(fTree);
214 Long64_t notSkipped = 0;
216 Long64_t entry = fFirstEntry;
217 Int_t entriesToDisplay = fNEntries;
219 while (entriesToDisplay != 0){
222 Long64_t localEntry = fTree->LoadTree(entry);
223 if (localEntry < 0)
break;
224 if (tnumber != fTree->GetTreeNumber()) {
225 tnumber = fTree->GetTreeNumber();
226 if (fManager) fManager->UpdateFormulaLeaves();
228 for(i = 0; i < fFormulas->LastIndex(); i++)
229 ((TTreeFormula*)fFormulas->At(ui))->UpdateFormulaLeaves();
235 ndata = fManager->GetNdata(kTRUE);
237 for (ui = 0; ui < fNColumns; ui++){
238 if (ndata < ((TTreeFormula*)fFormulas->At(ui))->GetNdata())
240 ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
243 if (fSelect && fSelect->GetNdata() == 0)
247 Bool_t skip = kFALSE;
250 for (Int_t inst = 0; inst < ndata; inst++){
252 if (fSelect->EvalInstance(inst) == 0){
259 entrylist->Enter(entry);
265 SetEntryList(entrylist);
272 Double_t TTreeTableInterface::GetValue(UInt_t row, UInt_t column)
274 static UInt_t prow = 0;
278 if (row == prow + 1) {
279 entry = fEntries->Next();
281 entry = fEntries->GetEntry(row);
284 fTree->LoadTree(entry);
286 Error(
"TTreeTableInterface",
"Row requested does not exist");
289 if (column < fNColumns) {
290 TTreeFormula *formula = (TTreeFormula *)fFormulas->At(column);
291 if (!formula->IsString()) {
292 return (Double_t)formula->EvalInstance();
294 Warning(
"TTreeTableInterface::GetValue",
"Value requested is a "
295 "string, returning 0.");
299 Error(
"TTreeTableInterface",
"Column requested does not exist");
308 const char *TTreeTableInterface::GetValueAsString(UInt_t row, UInt_t column)
310 static UInt_t prow = 0;
314 if (row == prow + 1) {
315 entry = fEntries->Next();
317 entry = fEntries->GetEntry(row);
320 fTree->LoadTree(entry);
322 Error(
"TTreeTableInterface",
"Row requested does not exist");
325 if (column < fNColumns) {
326 TTreeFormula *formula = (TTreeFormula *)fFormulas->At(column);
327 if(formula->IsString()) {
328 return Form(
"%s", formula->EvalStringInstance());
330 return Form(
"%5.2f", (Double_t)formula->EvalInstance());
333 Error(
"TTreeTableInterface",
"Column requested does not exist");
341 const char *TTreeTableInterface::GetRowHeader(UInt_t row)
344 return Form(
"%lld", fEntries->GetEntry(row));
346 Error(
"TTreeTableInterface",
"Row requested does not exist");
354 const char *TTreeTableInterface::GetColumnHeader(UInt_t column)
356 TTreeFormula *formula = (TTreeFormula *)fFormulas->At(column);
357 if (column < fNColumns) {
358 return formula->GetTitle();
360 Error(
"TTreeTableInterface",
"Column requested does not exist");
368 UInt_t TTreeTableInterface::GetNColumns()
376 UInt_t TTreeTableInterface::GetNRows()
386 void TTreeTableInterface::AddColumn(
const char *expression, UInt_t position)
388 TString onerow = expression;
390 if (onerow.Contains(
':')) {
391 Error(
"TTreeTableInterface::AddColumn",
"Only 1 expression allowed.");
396 TTreeFormula *formula =
new TTreeFormula(
"Var1", expression, fTree);
397 fFormulas->AddAt(formula, position);
400 fManager->Add(formula);
410 void TTreeTableInterface::AddColumn(TTreeFormula *formula, UInt_t position)
412 if (position > fNColumns) {
413 Error(
"TTreeTableInterface::AddColumn",
"Please specify a "
417 fFormulas->AddAt(formula, position);
419 fManager->Add(formula);
429 void TTreeTableInterface::RemoveColumn(UInt_t position)
431 if (position >= fNColumns) {
432 Error(
"TTreeTableInterface::RemoveColumn",
"Please specify a "
435 }
else if (fNColumns == 1) {
436 Error(
"TTreeTableInterface::RemoveColumn",
"Can't remove last column");
440 TTreeFormula *formula = (TTreeFormula *)fFormulas->RemoveAt(position);
442 fManager->Remove(formula);
446 if (formula)
delete formula;
453 void TTreeTableInterface::SetFormula(TTreeFormula *formula, UInt_t position)
455 if (position >= fNColumns) {
456 Error(
"TTreeTableInterface::SetFormula",
"Please specify a "
460 TTreeFormula *form = (TTreeFormula *)fFormulas->RemoveAt(position);
462 fManager->Remove(form);
464 if (form)
delete form;
465 fFormulas->AddAt(formula, position);
467 fManager->Add(formula);
476 void TTreeTableInterface::SetEntryList(TEntryList *entrylist)
479 if (fEntries)
delete fEntries;
480 fEntries = entrylist;
481 fNRows = fEntries->GetN();
482 fTree->SetEntryList(entrylist);