From 28199e280be52450c39431af35453819e5d6d3c3 Mon Sep 17 00:00:00 2001 From: Rene Brun <Rene.Brun@cern.ch> Date: Fri, 9 Jun 2000 16:26:11 +0000 Subject: [PATCH] Changes by Philippe to extend support for array notation git-svn-id: http://root.cern.ch/svn/root/trunk@99 27541ba8-7e3a-0410-8455-c3a389f83636 --- treeplayer/src/TTreeFormula.cxx | 68 +++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/treeplayer/src/TTreeFormula.cxx b/treeplayer/src/TTreeFormula.cxx index ece97b2bda7..d43358d9dcb 100644 --- a/treeplayer/src/TTreeFormula.cxx +++ b/treeplayer/src/TTreeFormula.cxx @@ -1,4 +1,4 @@ -// @(#)root/treeplayer:$Name: $:$Id: TTreeFormula.cxx,v 1.4 2000/05/30 06:12:50 brun Exp $ +// @(#)root/treeplayer:$Name: $:$Id: TTreeFormula.cxx,v 1.5 2000/06/05 07:27:12 brun Exp $ // Author: Rene Brun 19/01/96 /************************************************************************* @@ -71,8 +71,16 @@ TTreeFormula::TTreeFormula(const char *name,const char *expression, TTree *tree) TLeaf *leaf = GetLeaf(i); if (leaf->InheritsFrom("TLeafC")) SetBit(kIsCharacter); if (leaf->InheritsFrom("TLeafB")) SetBit(kIsCharacter); - if(leaf->GetLeafCount() && fIndex[i] < 0) fMultiplicity = 1; + + if((leaf->GetLeafCount() || leaf->GetLen()>1) && fIndex[i] < 0) fMultiplicity = 1; + // this next one does not need to be modified. It is designed to + // force the loading of the index leaf. (I think) if(leaf->GetLeafCount() && fMultiplicity == 0) fMultiplicity = -1; + + // find if multiplicity is more than 1! + if (leaf->GetLeafCount() && leaf->GetLenStatic()>1 && fIndex[i] >= 0) fMultiplicity = 2; + + if (fIndex[i] == -1 ) fIndex[i] = 0; } } @@ -103,6 +111,12 @@ Int_t TTreeFormula::DefinedVariable(TString &name) // - Leaf_Name (simple variable or data member of a ClonesArray) // - Branch_Name.Leaf_Name // - Branch_Name.Method_Name +// - Leaf_Name[index] +// - Branch_Name.Leaf_Name[index] +// I want to support, with Leaf_Name a 1D array data member. +// - Branch_Name.Leaf_Name[index1] +// - Branch_Name.Leaf_Name[][index2] +// - Branch_Name.Leaf_Name[index1][index2] // if (!fTree) return -1; @@ -110,6 +124,7 @@ Int_t TTreeFormula::DefinedVariable(TString &name) Int_t nchname = name.Length(); if (nchname > 60) return -1; char branchname[128]; + char leafname[128]; static char anumber[10]; static char lname[64]; static char lmethod[128]; @@ -145,7 +160,11 @@ Int_t TTreeFormula::DefinedVariable(TString &name) // Look for a data member for (i=0;i<nleaves;i++) { TLeaf *leaf = (TLeaf*)lleaves->UncheckedAt(i); - if (!strcmp(lname,leaf->GetBranch()->GetName() ) ) { + strcpy(branchname,leaf->GetBranch()->GetName()); + // do not look at the indexes if any + char *dim = (char*)strstr(branchname,"["); + if (dim) dim[0] = '\0'; + if (!strcmp(lname, branchname) ) { TMethodCall *method = 0; fMethods.Add(method); Int_t code = fNcodes; @@ -161,6 +180,9 @@ Int_t TTreeFormula::DefinedVariable(TString &name) for (i=0;i<nleaves;i++) { TLeaf *leaf = (TLeaf*)lleaves->UncheckedAt(i); sprintf(branchname,"%s.%s",leaf->GetBranch()->GetName(),leaf->GetName()); + // do not look at the indexes if any + char *dim = (char*)strstr(branchname,"["); + if (dim) dim[0] = '\0'; if (!strcmp(lname,branchname)) { TMethodCall *method = 0; fMethods.Add(method); @@ -177,7 +199,11 @@ Int_t TTreeFormula::DefinedVariable(TString &name) for (i=0;i<nleaves;i++) { lname[dot] = 0; TLeaf *leaf = (TLeaf*)lleaves->UncheckedAt(i); - if (!strcmp(lname,leaf->GetBranch()->GetName())) { + strcpy(branchname,leaf->GetBranch()->GetName()); + // do not look at the indexes if any + char *dim = (char*)strstr(branchname,"["); + if (dim) dim[0] = '\0'; + if (!strcmp(lname,branchname)) { if (leaf->IsA() != TLeafObject::Class()) return -1; TLeafObject *lobj = (TLeafObject*)leaf; TMethodCall *method = lobj->GetMethodCall(lmethod); @@ -195,6 +221,13 @@ Int_t TTreeFormula::DefinedVariable(TString &name) } else { for (i=0;i<nleaves;i++) { TLeaf *leaf = (TLeaf*)lleaves->UncheckedAt(i); + strcpy(branchname,leaf->GetBranch()->GetName()); + strcpy(leafname,leaf->GetName()); + // do not look at the indexes if any + char *dim = (char*)strstr(branchname,"["); + if (dim) dim[0] = '\0'; + dim = (char*)strstr(leafname,"["); + if (dim) dim[0] = '\0'; if (!strcmp(lname,leaf->GetBranch()->GetName()) || !strcmp(lname,leaf->GetName())) { TMethodCall *method = 0; @@ -247,7 +280,7 @@ Double_t TTreeFormula::EvalInstance(Int_t instance) const Int_t kMAXFOUND = 200; //must be the same as values defined in TFormula const Int_t kMAXSTRINGFOUND = 10; - Int_t i,pos,pos2,int1,int2; + Int_t i,pos,pos2,int1,int2,real_instance; Float_t aresult; Double_t tab[kMAXFOUND]; Float_t param[kMAXFOUND]; @@ -265,12 +298,15 @@ Double_t TTreeFormula::EvalInstance(Int_t instance) } TLeaf *leaf = GetLeaf(0); if (instance) { + if (fMultiplicity==2) instance += leaf->GetLenStatic() * fIndex[0]; if (instance < leaf->GetNdata()) return leaf->GetValue(instance); else return leaf->GetValue(0); } else { + instance = fIndex[0]; + if (fMultiplicity==2) instance *= leaf->GetLenStatic(); leaf->GetBranch()->GetEntry(fTree->GetReadEntry()); - if (!(leaf->IsA() == TLeafObject::Class())) return leaf->GetValue(fIndex[0]); - return GetValueLeafObject(fIndex[0],(TLeafObject *)leaf); + if (!(leaf->IsA() == TLeafObject::Class())) return leaf->GetValue(instance); + return GetValueLeafObject(instance,(TLeafObject *)leaf); } } for(i=0;i<fNval;i++) { @@ -283,13 +319,17 @@ Double_t TTreeFormula::EvalInstance(Int_t instance) param[i] = gcut->IsInside(xcut,ycut); } else { TLeaf *leaf = GetLeaf(i); - if (instance) { - if (instance < leaf->GetNdata()) param[i] = leaf->GetValue(instance); - else param[i] = leaf->GetValue(0); + real_instance = instance; + if (real_instance) { + if (fMultiplicity==2) real_instance += leaf->GetLenStatic() * fIndex[i]; + if (real_instance < leaf->GetNdata()) param[i] = leaf->GetValue(real_instance); + else param[i] = leaf->GetValue(0); } else { + real_instance = fIndex[i]; + if (fMultiplicity==2) real_instance *= leaf->GetLenStatic(); leaf->GetBranch()->GetEntry(fTree->GetReadEntry()); - if (!(leaf->IsA() == TLeafObject::Class())) param[i] = leaf->GetValue(fIndex[i]); - else param[i] = GetValueLeafObject(fIndex[i],(TLeafObject *)leaf); + if (!(leaf->IsA() == TLeafObject::Class())) param[i] = leaf->GetValue(real_instance); + else param[i] = GetValueLeafObject(real_instance,(TLeafObject *)leaf); } } } @@ -444,7 +484,11 @@ Int_t TTreeFormula::GetNdata() if (leaf->GetLeafCount()) { TBranch *branch = leaf->GetLeafCount()->GetBranch(); branch->GetEntry(fTree->GetReadEntry()); + if (fMultiplicity==2) return leaf->GetLenStatic(); return leaf->GetLen(); + } else { + Int_t len = leaf->GetLen(); + if (len>1) return len; } } return 0; -- GitLab