112class TDimensionInfo :
public TObject {
119 : fCode(code), fOper(oper), fSize(size), fMultiDim(multiDim) {};
120 ~TDimensionInfo() {};
126 fDidBooleanOptimization(
kFALSE), fDimensionSetup(0)
160 fDidBooleanOptimization(
kFALSE), fDimensionSetup(0)
169 const std::vector<std::string>& aliases)
171 fDidBooleanOptimization(
kFALSE), fDimensionSetup(0), fAliasesUsed(aliases)
211 if(savedir) savedir->
cd();
216 Warning(
"TTreeFormula",
"Too many items in expression:%s",expression);
226 if (!leafc)
continue;
269 for(k0 = 0; k0 <
fNcodes; k0++) {
274 Error(
"TTreeFormula",
275 "Index %d for dimension #%d in %s is too high (max is %d)",
278 if(savedir) savedir->
cd();
307 if (readentry >= 0) {
312 if (readentry >= 0) {
319 if(savedir) savedir->
cd();
341 for (
int j=0; j<
fNcodes; j++) {
374 switch (index_multiplicity) {
402 const char * current;
403 Int_t size, scanindex, vardim;
411 if (current[0] !=
'[') current--;
414 scanindex = sscanf(current,
"%d",&size);
418 if (scanindex==0) size = -1;
427 current = (
char*)strstr( current,
"[" );
437 TDimensionInfo * info =
new TDimensionInfo(code,
fNoper,size,multidim);
441 return (size==-1) ? 1 : 0;
449 Bool_t useCollectionObject) {
450 Int_t ndim, size, current, vardim;
482 if (maininfo==0 || maininfo==leafinfo || 1) {
488 delete currentinfo->
fNext;
513 }
else if (
c &&
c->GetReferenceProxy() &&
c->GetReferenceProxy()->HasCounter() ) {
544 }
while (current<ndim);
581 Int_t numberOfVarDim = 0;
586 const char *tname = leaf->
GetTitle();
587 char *leaf_dim = (
char*)strstr( tname,
"[" );
590 char *branch_dim = (
char*)strstr(bname,
"[");
591 if (branch_dim) branch_dim++;
603 if (!branch_dim || strncmp(branch_dim,leaf_dim,strlen(branch_dim))) {
606 }
else if (branch_dim && strncmp(branch_dim,leaf_dim,strlen(branch_dim))==0
607 && strlen(leaf_dim)>strlen(branch_dim)
608 && (leaf_dim+strlen(branch_dim))[0]==
'[') {
627 "Noticed an incorrect in-memory TBranchElement object (%s).\nIt has a BranchCount2 but no BranchCount!\nThe result might be incorrect!",
629 return numberOfVarDim;
635 "Already in kDataMember mode when handling multiple variable dimensions");
643 return numberOfVarDim;
656 static const char *altfunc =
"Alt$(";
657 static const char *minfunc =
"MinIf$(";
658 static const char *maxfunc =
"MaxIf$(";
662 if ( strncmp(expression,altfunc,strlen(altfunc))==0
663 && expression[strlen(expression)-1]==
')' ) {
665 start = strlen(altfunc);
667 if ( strncmp(expression,maxfunc,strlen(maxfunc))==0
668 && expression[strlen(expression)-1]==
')' ) {
670 start = strlen(maxfunc);
672 if ( strncmp(expression,minfunc,strlen(minfunc))==0
673 && expression[strlen(expression)-1]==
')' ) {
675 start = strlen(minfunc);
685 for(
unsigned int i=start;i<strlen(expression);++i) {
686 switch (expression[i]) {
687 case '(': paran++;
break;
688 case ')': paran--;
break;
689 case '"': instr = instr ? 0 : 1;
break;
690 case '[': brack++;
break;
691 case ']': brack--;
break;
693 if (expression[i]==
',' && paran==0 && instr==0 && brack==0) {
694 part1 = full( start, i-start );
695 part2 = full( i+1, full.
Length() -1 - (i+1) );
707 Error(
"DefinedVariable",
"The 2nd arguments in %s can not be an array (%s,%d)!",
716 Error(
"DefinedVariable",
717 "The 2nd arguments in %s has to return the same type as the 1st argument (string)!",
723 Error(
"DefinedVariable",
724 "The 2nd arguments in %s has to return the same type as the 1st argument (numerical type)!",
733 Error(
"DefinedVariable",
734 "The arguments of %s can not be strings!",
765 Int_t numberOfVarDim = 0;
768 char scratch[
kMaxLen]; scratch[0] =
'\0';
769 char work[
kMaxLen]; work[0] =
'\0';
771 const char *right = subExpression;
776 if (readentry < 0) readentry=0;
778 Bool_t useLeafReferenceObject =
false;
789 Error(
"DefinedVariable",
"Missing StreamerInfo for %s. We will be unable to read!",
801 Error(
"DefinedVariable",
"Missing StreamerInfo for %s."
802 " We will be unable to read!",
807 Error(
"DefinedVariable",
"Address not set when the type of the branch is negative for for %s. We will be unable to read!", mom->
GetName());
820 const char* alias = 0;
823 if (!alias && realtree!=
fTree) {
831 TTree *tleaf = realtree;
838 if (mother_name[strlen(mother_name)-1]!=
'.') {
839 br_extended_name = mother_name;
840 br_extended_name.
Append(
'.');
845 if (dim >= 0) br_extended_name.
Remove(dim);
933 "Missing TStreamerElement in object in TClonesArray section");
944 maininfo = clonesinfo;
963 maininfo->
fNext = previnfo;
964 unwindCollection =
kTRUE;
966 }
else if (branchEl->
GetType()==41) {
971 Warning(
"DefinedVariable",
"Missing TStreamerElement in object in Collection section");
977 if ( count->
GetID() >= 0 ) {
996 maininfo = collectioninfo;
1015 maininfo->
fNext = previnfo;
1016 unwindCollection =
kTRUE;
1018 }
else if ( branchEl->
GetType()==3) {
1020 if (useLeafCollectionObject) {
1025 numberOfVarDim +=
RegisterDimensions(code,clonesinfo,maininfo,useLeafCollectionObject);
1028 maininfo = clonesinfo;
1029 previnfo = maininfo;
1031 }
else if (!useLeafCollectionObject && branchEl->
GetType()==4) {
1034 if (useLeafCollectionObject) {
1039 numberOfVarDim +=
RegisterDimensions(code,collectioninfo,maininfo,useLeafCollectionObject);
1042 maininfo = collectioninfo;
1043 previnfo = maininfo;
1047 if (useLeafCollectionObject) {
1050 maininfo = collectioninfo;
1051 previnfo = collectioninfo;
1058 maininfo = collectioninfo;
1059 previnfo = collectioninfo;
1069 previnfo->
fNext = multi;
1072 previnfo = multi->
fNext;
1080 previnfo = previnfo->
fNext;
1086 }
else if (strlen(right)==0 && cl && element &&
final) {
1089 if (!useLeafCollectionObject
1100 maininfo = collectioninfo;
1101 previnfo = collectioninfo;
1110 previnfo->
fNext = multi;
1113 previnfo = multi->
fNext;
1120 previnfo = previnfo->
fNext;
1123 }
else if (!useLeafCollectionObject
1139 collectioninfo->
fNext =
1142 maininfo = collectioninfo;
1143 previnfo = maininfo->
fNext;
1145 }
else if (!useLeafCollectionObject
1156 previnfo = maininfo;
1161 if ( useLeafCollectionObject || fullExpression[0] ==
'@' || fullExpression[strlen(scratch)] ==
'@' ) {
1162 useLeafReferenceObject =
true;
1179 Error(
"DefinedVariable",
"Failed to access class type of reference target (%s)",element->
GetName());
1190 if (unwindCollection) {
1193 R__ASSERT(numberOfVarDim==1 && maininfo);
1200 previnfo->
fNext = multi;
1203 previnfo = multi->
fNext;
1210 previnfo = previnfo->
fNext;
1218 previnfo->
fNext = multi;
1221 previnfo = multi->
fNext;
1230 Int_t nchname = strlen(right);
1245 Error(
"DefinedVariable",
"%s does not inherit from %s. Casting not possible!",
1252 maininfo = leafinfo;
1255 previnfo = leafinfo;
1257 previnfo->
fNext = leafinfo;
1258 previnfo = leafinfo;
1263 castqueue.
AddAt(0,paran_level);
1267 Bool_t prevUseCollectionObject = useLeafCollectionObject;
1268 Bool_t useCollectionObject = useLeafCollectionObject;
1269 Bool_t useReferenceObject = useLeafReferenceObject;
1270 Bool_t prevUseReferenceObject = useLeafReferenceObject;
1271 for (i=0, current = &(work[0]); i<=nchname;i++ ) {
1273 if (right[i] ==
'(') {
1276 *current++ = right[i++];
1277 }
while(right[i]!=
')' && right[i]);
1278 *current++ = right[i];
1280 char *params = strchr(work,
'(');
1282 *params = 0; params++;
1283 }
else params = (
char *)
")";
1285 Error(
"DefinedVariable",
"Can not call '%s' with a class",work);
1289 Error(
"DefinedVariable",
"Class probably unavailable:%s",cl->
GetName());
1316 previnfo = clonesinfo;
1317 maininfo = clonesinfo;
1349 previnfo = collectioninfo;
1350 maininfo = collectioninfo;
1355 if (inside_cl) cl = inside_cl;
1357 Warning(
"DefinedVariable",
"Can not call method on content of %s in %s\n",
1364 Error(
"DefinedVariable",
1365 "Could not discover the TClass corresponding to (%s)!",
1369 method =
new TMethodCall(cl,
"GetEntriesFast",
"");
1373 if (useLeafCollectionObject) {
1379 maininfo=previnfo=collectioninfo;
1385 Error(
"DefinedVariable",
1386 "Can not call method %s on class without dictionary (%s)!",
1394 Error(
"DefinedVariable",
"Unknown method:%s in %s",right,cl->
GetName());
1419 Error(
"DefineVariable",
"Method %s from %s has an impossible return type %d",
1425 maininfo = leafinfo;
1428 previnfo = leafinfo;
1430 previnfo->
fNext = leafinfo;
1431 previnfo = leafinfo;
1434 current = &(work[0]);
1436 prevUseCollectionObject =
kFALSE;
1437 prevUseReferenceObject =
kFALSE;
1438 useCollectionObject =
kFALSE;
1441 if (numberOfVarDim>1) {
1442 Warning(
"DefinedVariable",
"TTreeFormula support only 2 level of variables size collections. Assuming '@' notation for the collection %s.",
1445 useCollectionObject =
kTRUE;
1446 }
else if (numberOfVarDim==0) {
1450 }
else if (numberOfVarDim==1) {
1455 previnfo->
fNext = leafinfo;
1456 previnfo = leafinfo;
1462 previnfo->
fNext = leafinfo;
1463 previnfo = leafinfo;
1467 }
else if (right[i] ==
')') {
1470 TClass * casted = (
TClass*) ((
int(--paran_level)>=0) ? castqueue.
At(paran_level) : 0);
1476 maininfo = leafinfo;
1479 previnfo = leafinfo;
1481 previnfo->
fNext = leafinfo;
1482 previnfo = leafinfo;
1485 current = &(work[0]);
1492 }
else if (i > 0 && (right[i] ==
'.' || right[i] ==
'[' || right[i] ==
'\0') ) {
1499 if (strlen(work)==0)
continue;
1501 prevUseCollectionObject = useCollectionObject;
1502 prevUseReferenceObject = useReferenceObject;
1504 useReferenceObject =
kTRUE;
1505 useCollectionObject =
kTRUE;
1507 for(
l=0;work[
l+1]!=0;++
l) work[
l] = work[
l+1];
1509 }
else if (work[strlen(work)-1]==
'@') {
1510 useReferenceObject =
kTRUE;
1511 useCollectionObject =
kTRUE;
1512 work[strlen(work)-1] =
'\0';
1514 useReferenceObject =
kFALSE;
1515 useCollectionObject =
kFALSE;
1526 prevUseReferenceObject =
kFALSE;
1529 previnfo = previnfo->
fNext;
1533 for(
Long64_t entry=0; entry<leaf->
GetBranch()->GetEntries()-readentry; ++entry) {
1571 previnfo = clonesinfo;
1572 maininfo = clonesinfo;
1576 Error(
"DefinedVariable",
"Unimplemented usage of ClonesArray");
1587 "TClonesArray object was not retrievable for %s!",
1596 if (1 || inside_cl) cl = inside_cl;
1598 if (0 && strlen(work)==0) {
1632 previnfo = collectioninfo;
1633 maininfo = collectioninfo;
1642 Error(
"DefinedVariable",
"Could you not find the inner class for %s with coll type = %d",
1646 Warning(
"DefinedVariable",
"No data member in content of %s in %s\n",
1655 Warning(
"DefinedVariable",
"Missing class for %s!",
name.Data());
1660 if (!element && !prevUseCollectionObject) {
1667 Int_t clones_offset = 0;
1675 previnfo->
fNext = clonesinfo;
1677 previnfo->
fNext = 0;
1689 if (maininfo==0) maininfo = leafinfo;
1690 if (previnfo==0) previnfo = leafinfo;
1692 previnfo->
fNext = leafinfo;
1693 previnfo = leafinfo;
1701 Int_t coll_offset = 0;
1710 if (numberOfVarDim>1) {
1711 Warning(
"DefinedVariable",
"TTreeFormula support only 2 level of variables size collections. Assuming '@' notation for the collection %s.",
1714 useCollectionObject =
kTRUE;
1715 }
else if (numberOfVarDim==1) {
1727 if (maininfo==0) maininfo = leafinfo;
1728 if (previnfo==0) previnfo = leafinfo;
1730 previnfo->
fNext = leafinfo;
1731 previnfo = leafinfo;
1733 if (leafinfo->
fNext) {
1734 previnfo = leafinfo->
fNext;
1749 if (numberOfVarDim>=1 &&
type>40) {
1754 if (leafinfo &&
type<=40 ) {
1794 Error(
"DefinedVariable",
1795 "%s is a datamember of %s BUT is not yet of a supported type (%d)",
1800 Error(
"DefinedVariable",
1801 "%s is a datamember of %s BUT is not of a unknown type (%d)",
1806 if (
object && !useCollectionObject &&
1812 if (
object && leafinfo) {
1814 }
else if (objarr) {
1829 if (numberOfVarDim>1) {
1830 Warning(
"DefinedVariable",
"TTreeFormula support only 2 level of variables size collections. Assuming '@' notation for the collection %s.",
1833 useCollectionObject =
kTRUE;
1834 }
else if (numberOfVarDim==1) {
1854 else leafinfo->
fNext = info;
1861 if (!maininfo) maininfo = leafinfo;
1866 if (previnfo==0) previnfo = leafinfo;
1868 previnfo->
fNext = leafinfo;
1869 previnfo = leafinfo;
1884 else leafinfo->
fNext = info;
1900 prevUseReferenceObject =
kFALSE;
1903 }
else if (pointer) {
1915 if (cl)
Error(
"DefinedVariable",
"%s is not a datamember of %s",work,cl->
GetName());
1922 maininfo = leafinfo;
1925 previnfo = leafinfo;
1926 }
else if (previnfo!=leafinfo) {
1927 previnfo->
fNext = leafinfo;
1928 previnfo = leafinfo;
1930 while (previnfo->
fNext) previnfo = previnfo->
fNext;
1932 if ( right[i] !=
'\0' ) {
1933 if ( !needClass && mustderef ) {
1939 if ( inf->IsReference() ) {
1950 Error(
"DefinedVariable",
"Failed to access class type of reference target (%s)",element->
GetName());
1956 Error(
"DefinedVariable",
"Failed to access class type of reference target (%s)",element->
GetName());
1960 else if ( needClass ) {
1964 if (mustderef) leafinfo = 0;
1965 current = &(work[0]);
1974 nchname = strlen(right);
1978 *current++ = right[i];
1987 if (strlen(work)!=0) {
1999 if (!last)
return action;
2003 if (last && last->
GetClass() != objClass) {
2015 last->
fNext = collectioninfo;
2027 if (!last)
return action;
2031 const char *funcname = 0;
2035 }
else if (objClass == stdStringClass) {
2078 method =
new TMethodCall(objClass,
"AsString",
"");
2131 const char *funcname = 0;
2134 }
else if (objClass == stdStringClass) {
2174 if (readentry < 0) readentry=0;
2175 const char *cname = expression;
2178 char right[
kMaxLen*2]; right[0] =
'\0';
2179 char work[
kMaxLen]; work[0] =
'\0';
2180 char left[
kMaxLen]; left[0] =
'\0';
2183 std::string currentname;
2184 Int_t previousdot = 0;
2187 TBranch *branch=0, *tmp_branch=0;
2188 Int_t nchname = strlen(cname);
2193 for (i=0, current = &(work[0]); i<=nchname && !
final;i++ ) {
2195 *current++ = cname[i];
2197 if (cname[i] ==
'(') {
2200 if (current==work+1) {
2203 startWithParan =
kTRUE;
2215 if (cname[i] ==
')') {
2216 if (paran_level==0) {
2217 Error(
"DefinedVariable",
"Unmatched paranthesis in %s",fullExpression);
2222 if (startWithParan) {
2232 current = &(work[0]);
2236 }
else if (
gROOT->GetType(cast_name)) {
2238 current = &(work[0]);
2241 "Casting to primary types like \"%s\" is not supported yet",cast_name.
Data());
2248 char *params = strchr(work,
'(');
2250 *params = 0; params++;
2252 if (branch && !leaf) {
2264 while (!leaf && (leafcur = (
TLeaf*) next())) {
2274 if (strlen(left) && left[strlen(left)-1]==
'.') left[strlen(left)-1]=0;
2276 if (aliasValue && strcspn(aliasValue,
"+*/-%&!=<>|")==strlen(aliasValue)) {
2279 if (find(aliasUsed.begin(),
2281 left) != aliasUsed.end()) {
2282 Error(
"DefinedVariable",
2283 "The substitution of the branch alias \"%s\" by \"%s\" in \"%s\" failed\n"\
2284 "\tbecause \"%s\" is used [recursively] in its own definition!",
2285 left,aliasValue,fullExpression,left);
2288 aliasUsed.push_back(left);
2289 TString newExpression = aliasValue;
2290 newExpression += (cname+strlen(left));
2292 castqueue, aliasUsed, useLeafCollectionObject, fullExpression);
2294 Error(
"DefinedVariable",
2295 "The substitution of the alias \"%s\" by \"%s\" failed.",left,aliasValue);
2312 strlcpy(right,work,2*
kMaxLen);
2313 strncat(right,
"(",2*
kMaxLen-1-strlen(right));
2314 strncat(right,params,2*
kMaxLen-1-strlen(right));
2318 i += strlen(params);
2321 current = &(work[0]);
2326 if (cname[i] ==
'.' || cname[i] ==
'\0' || cname[i] ==
')') {
2331 Int_t len = strlen(work);
2333 foundAtSign =
kTRUE;
2335 for(
l=0;work[
l+1]!=0;++
l) work[
l] = work[
l+1];
2338 }
else if (len>=2 && work[len-2]==
'@') {
2339 foundAtSign =
kTRUE;
2340 work[len-2] = cname[i];
2347 if (left[0]==0) strlcpy(left,work,
kMaxLen);
2348 if (!leaf && !branch) {
2352 std::string treename(
first);
2353 if (treename.size() && treename[treename.size()-1]==
'.') {
2354 treename.erase(treename.size()-1);
2356 if (treename==
"This" ) {
2361 if (cname[i]) leftover = &(cname[i+1]);
2407 useLeafCollectionObject = foundAtSign;
2409 current = &(work[0]);
2412 else if (branch && (foundAtSign || cname[i] != 0) ) {
2426 useLeafCollectionObject = foundAtSign;
2428 current = &(work[0]);
2438 useLeafCollectionObject = foundAtSign;
2440 current = &(work[0]);
2442 }
else if (leaf || branch) {
2443 if (leaf && branch) {
2457 current = &(work[0]);
2470 if (foundAtSign) strncat(right,
"@",2*
kMaxLen-1-strlen(right));
2471 if (cname[i]==
'.') strncat(right,
".",2*
kMaxLen-1-strlen(right));
2474 current = &(work[0]);
2477 }
else if (cname[i] ==
'.') {
2484 while(!branch && (branchcur=(
TBranch*)next()) ) {
2489 current = &(work[0]);
2496 Error(
"DefinedVariable",
"Unexpected control flow!");
2502 if (cname[i]) work[strlen(work)-1] =
'\0';
2507 currentname = &(work[previousdot+1]);
2514 if (!tmp_leaf) tmp_leaf = branch->
FindLeaf(scratch);
2515 if (!tmp_leaf) tmp_leaf = branch->
FindLeaf(scratch2);
2516 if (!tmp_leaf) tmp_leaf = branch->
FindLeaf(currentname.c_str());
2526 if (!tmp_branch) tmp_branch = branch->
FindBranch(scratch);
2527 if (!tmp_branch) tmp_branch = branch->
FindBranch(scratch2);
2528 if (!tmp_branch) tmp_branch = branch->
FindBranch(currentname.c_str());
2536 if (!tmp_leaf) tmp_leaf = branch->
FindLeaf(scratch);
2537 if (!tmp_leaf) tmp_leaf = branch->
FindLeaf(scratch2);
2538 if (!tmp_leaf) tmp_leaf = branch->
FindLeaf(currentname.c_str());
2552 useLeafCollectionObject = foundAtSign;
2556 current = &(work[0]);
2562 Int_t where = strlen(work);
2564 work[where+1] = cname[i];
2566 previousdot = where+1;
2568 previousdot = strlen(work);
2569 work[strlen(work)] = cname[i];
2579 strncat(right,work,2*
kMaxLen-1-strlen(right));
2583 if (strlen(right) && right[strlen(right)-1]!=
'.' && cname[i]!=
'.') {
2587 strncat(right,
".",2*
kMaxLen-1-strlen(right));
2589 strncat(right,&cname[i],2*
kMaxLen-1-strlen(right));
2592 if (!
final && branch) {
2595 if (!leaf)
return -1;
2601 if (strlen(right)==0) strlcpy(right,work,2*
kMaxLen);
2604 if (leaf==0 && left[0]!=0) {
2605 if (left[strlen(left)-1]==
'.') left[strlen(left)-1]=0;
2609 if (aliasValue && strcspn(aliasValue,
"()[]+*/-%&!=<>|")==strlen(aliasValue)) {
2612 if (find(aliasUsed.begin(),
2614 left) != aliasUsed.end()) {
2615 Error(
"DefinedVariable",
2616 "The substitution of the branch alias \"%s\" by \"%s\" in \"%s\" failed\n"\
2617 "\tbecause \"%s\" is used [recursively] in its own definition!",
2618 left,aliasValue,fullExpression,left);
2621 aliasUsed.push_back(left);
2622 TString newExpression = aliasValue;
2623 newExpression += (cname+strlen(left));
2625 castqueue, aliasUsed, useLeafCollectionObject, fullExpression);
2627 Error(
"DefinedVariable",
2628 "The substitution of the alias \"%s\" by \"%s\" failed.",left,aliasValue);
2679 if (!
fTree)
return -1;
2685 if (
name ==
"Entry$") {
2691 if (
name ==
"LocalEntry$") {
2697 if (
name ==
"Entries$") {
2705 if (
name ==
"LocalEntries$") {
2713 if (
name ==
"Iteration$") {
2719 if (
name ==
"Length$") {
2725 static const char *
lenfunc =
"Length$(";
2726 if (strncmp(
name.Data(),
"Length$(",strlen(
lenfunc))==0
2738 static const char *minfunc =
"Min$(";
2739 if (strncmp(
name.Data(),
"Min$(",strlen(minfunc))==0
2751 static const char *maxfunc =
"Max$(";
2752 if (strncmp(
name.Data(),
"Max$(",strlen(maxfunc))==0
2764 static const char *sumfunc =
"Sum$(";
2765 if (strncmp(
name.Data(),
"Sum$(",strlen(sumfunc))==0
2784 if (res<0)
return res;
2792 char dims[
kMaxLen]; dims[0] =
'\0';
2800 Int_t cnamelen = strlen(cname);
2801 for(i=0,k=0; i<cnamelen; ++i, ++k) {
2802 if (cname[i] ==
'[') {
2804 int bracket_level = 1;
2806 for (j=++i; j<cnamelen && (bracket_level>0 || cname[j]==
'['); j++, i++) {
2807 if (cname[j]==
'[') bracket_level++;
2808 else if (cname[j]==
']') bracket_level--;
2810 if (bracket_level != 0) {
2814 strncat(dims,&cname[bracket],j-bracket);
2817 if (i!=k) cname[k] = cname[i];
2826 res =
FindLeafForExpression(cname, leaf, leftover,
final, paran_level, castqueue, aliasSofar, useLeafCollectionObject,
name);
2828 if (res<0)
return res;
2830 if (!leaf && res!=2) {
2839 Error(
"DefinedVariable",
2840 "The substitution of the alias \"%s\" by \"%s\" failed\n"\
2841 "\tbecause \"%s\" is recursively used in its own definition!",
2842 cname,aliasValue,cname);
2847 if (strcspn(aliasValue,
"()+*/-%&!=<>|")!=strlen(aliasValue)) {
2853 aliasSofar.push_back( cname );
2855 TString subValue( aliasValue );
2864 Error(
"DefinedVariable",
2865 "The substitution of the alias \"%s\" by \"%s\" failed.",cname,aliasValue);
2880 TString thisAlias( aliasValue );
2888 Error(
"Compile",
" Bad numerical expression : \"%s\"",thisAlias.
Data());
2889 }
else if (aliasRes==-2) {
2890 Error(
"Compile",
" Part of the Variable \"%s\" exists but some of it is not accessible or useable",thisAlias.
Data());
2893 Error(
"DefinedVariable",
2894 "The substitution of the alias \"%s\" by \"%s\" failed.",cname,aliasValue);
2903 if (leaf || res==2) {
2906 Error(
"DefinedVariable",
"the branch \"%s\" has to be enabled to be used",leaf->
GetBranch()->
GetName());
2915 char *current = &( dims[0] );
2922 if (current[0] ==
']') {
2925 scanindex = sscanf(current,
"%d",&index);
2931 char *end = (
char*)(varindex.
Data());
2932 for(
char bracket_level = 0;*end!=0;end++) {
2933 if (*end==
'[') bracket_level++;
2934 if (bracket_level==0 && *end==
']')
break;
2935 if (*end==
']') bracket_level--;
2945 current += strlen(varindex)+1;
2953 current = (
char*)strstr( current,
"[" );
2960 res =
ParseWithLeaf(leaf,leftover,
final,paran_level,castqueue,useLeafCollectionObject,
name);
2961 if (res<0)
return res;
2962 if (res>0) action = res;
2992 }
else if (strlen(gcut->
GetVarX())) {
3001 for(
Int_t i2 = 1; i2<
n; i2++) {
3002 if (
x[i2] < min) min =
x[i2];
3003 if (
x[i2] > max) max =
x[i2];
3022 Error(
"DefinedVariable",
"Found a TCutG without leaf information (%s)",
3059 while ((leafcur = (
TLeaf*)nextleaf())) {
3087 if (clonesinfo) {
delete clonesinfo; clonesinfo = 0; }
3111 if (clones) cl = clones->
GetClass();
3153 leafinfo = clonesinfo;
3165 Int_t clones_offset = 0;
3170 else leafinfo->
fNext = sub_clonesinfo;
3171 else leafinfo = sub_clonesinfo;
3177 delete leafinfo; clonesinfo = 0;
3182 if (!clones)
continue;
3243 }
else if (
type > 60) {
3302 Error(
"BranchHasMethod",
"A TClonesArray was stored in a branch type no yet support (i.e. neither TBranchObject nor TBranchElement): %s",branch->IsA()->
GetName());
3305 cl = clones ? clones->
GetClass() : 0;
3339 Int_t real_instance = 0;
3374 if (local_index<0) {
3375 Error(
"EvalInstance",
"Index %s is out of bound (%d) in formula %s",
3382 real_instance = local_index *
fCumulSizes[codeindex][1];
3407 if (local_index<0) {
3408 Error(
"EvalInstance",
"Index %s is out of bound (%d) in formula %s",
3428 if (check)
return fNdata[0]+1;
3433 }
while( instance >= virt_accum && local_index<maxloop);
3439 if (local_index==(maxloop-1) && (instance >= virt_accum)) {
3441 if (check)
return fNdata[0]+1;
3447 if (check)
return fNdata[0]+1;
3455 local_index =
fIndexes[codeindex][0];
3482 if (
fIndexes[codeindex][vdim]>=0) {
3485 if (isize!=1 &&
fIndexes[codeindex][vdim]>isize) {
3490 for(
Int_t k=vdim -1; k>0; --k) {
3494 real_instance = local_index *
fCumulSizes[codeindex][1];
3498 for (
Int_t dim = 1; dim < max_dim; dim++) {
3509 if (
fIndexes[codeindex][dim]==-2) {
3516 if (local_index<0 ||
3518 Error(
"EvalInstance",
"Index %s is out of bound (%d/%d) in formula %s",
3526 real_instance += local_index *
fCumulSizes[codeindex][dim+1];
3530 if (
fIndexes[codeindex][max_dim]>=0) {
3531 if (!info) real_instance +=
fIndexes[codeindex][max_dim];
3537 local_index = instance;
3539 if (info && local_index>=
fCumulSizes[codeindex][max_dim]) {
3543 if (
fIndexes[codeindex][max_dim]==-2) {
3549 if (local_index<0 ||
3551 Error(
"EvalInstance",
"Index %s is of out bound (%d/%d) in formula %s",
3559 real_instance += local_index;
3564 return real_instance;
3662 else if (real_instance>=
fNdata[0])
return 0;
3668 if (real_instance) {
3669 Warning(
"EvalObject",
"Not yet implement for kDirect and arrays (for %s).\nPlease contact the developers",
GetName());
3688 const Int_t kMAXSTRINGFOUND = 10;
3689 const char *stringStack[kMAXSTRINGFOUND];
3700 }
else if (real_instance>=
fNdata[0]) {
3713 return stringStack[0];
3716#define TT_EVAL_INIT \
3717 TLeaf *leaf = (TLeaf*)fLeaves.UncheckedAt(0); \
3719 const Int_t real_instance = GetRealInstance(instance,0); \
3721 if (instance==0) fNeedLoading = kTRUE; \
3722 if (real_instance>=fNdata[0]) return 0; \
3728 if (fNeedLoading) { \
3729 fNeedLoading = kFALSE; \
3730 TBranch *br = leaf->GetBranch(); \
3731 Long64_t tentry = br->GetTree()->GetReadEntry(); \
3732 R__LoadBranch(br,tentry,fQuickLoad); \
3739 if (fLookupType[0]==kDirect) { \
3740 label = (char*)leaf->GetValuePointer(); \
3742 label = (char*)GetLeafInfo(0)->GetValuePointer(leaf,instance); \
3744 Int_t bin = fAxis->FindBin(label); \
3748#define TREE_EVAL_INIT \
3749 const Int_t real_instance = GetRealInstance(instance,0); \
3751 if (real_instance>=fNdata[0]) return 0; \
3757 label = (char*)GetLeafInfo(0)->GetValuePointer((TLeaf*)0x0,instance); \
3758 Int_t bin = fAxis->FindBin(label); \
3762#define TT_EVAL_INIT_LOOP \
3763 TLeaf *leaf = (TLeaf*)fLeaves.UncheckedAt(code); \
3766 const Int_t real_instance = GetRealInstance(instance,code); \
3769 TBranch *branch = (TBranch*)fBranches.UncheckedAt(code); \
3771 Long64_t treeEntry = branch->GetTree()->GetReadEntry(); \
3772 R__LoadBranch(branch,treeEntry,fQuickLoad); \
3773 } else if (fDidBooleanOptimization) { \
3774 branch = leaf->GetBranch(); \
3775 Long64_t treeEntry = branch->GetTree()->GetReadEntry(); \
3776 if (branch->GetReadEntry() != treeEntry) branch->GetEntry( treeEntry ); \
3782 if (fDidBooleanOptimization) { \
3783 TBranch *br = leaf->GetBranch(); \
3784 Long64_t treeEntry = br->GetTree()->GetReadEntry(); \
3785 if (br->GetReadEntry() != treeEntry) br->GetEntry( treeEntry ); \
3788 if (real_instance>=fNdata[code]) return 0;
3790#define TREE_EVAL_INIT_LOOP \
3792 const Int_t real_instance = GetRealInstance(instance,code); \
3794 if (real_instance>=fNdata[code]) return 0;
3800 for (
int i=0; i<len; ++i) res +=
sum->EvalInstance<
T>(i);
3809 for (
int i=1; i<len; ++i) {
3824 for (
int i=1; i<len; ++i) {
3843 }
while (!condval && i<len);
3844 if (!condval && i==len) {
3853 for (; i<len; ++i) {
3875 }
while (!condval && i<len);
3876 if (!condval && i==len) {
3885 for (; i<len; ++i) {
3900template <
typename T>
T fmod_local(
T x,
T y) {
return fmod(
x,
y); }
3917 if( !strncmp(
fExpr[op],
"0x", 2) || !strncmp(
fExpr[op],
"0X", 2) ) {
3919 sscanf(
fExpr[op],
"%llx", &val );
3945 return leaf->GetTypedValue<
T>(real_instance);
4003 const Int_t kMAXSTRINGFOUND = 10;
4004 const char *stringStackLocal[kMAXSTRINGFOUND];
4005 const char **stringStack = stringStackArg?stringStackArg:stringStackLocal;
4021 if (newaction==
kConstant) { pos++; tab[pos-1] = GetConstant<T>(oper &
kTFOperMask);
continue; }
4025 case kEnd :
return tab[0];
4026 case kAdd : pos--; tab[pos-1] += tab[pos];
continue;
4027 case kSubstract : pos--; tab[pos-1] -= tab[pos];
continue;
4028 case kMultiply : pos--; tab[pos-1] *= tab[pos];
continue;
4029 case kDivide : pos--;
if (tab[pos] == 0) tab[pos-1] = 0;
4030 else tab[pos-1] /= tab[pos];
4035 tab[pos-1] =
T(int1 % int2);
4055 case kacosh:
if (tab[pos-1] < 1) {tab[pos-1] = 0;}
4064 case kfmod : pos--; tab[pos-1] = fmod_local(tab[pos-1],tab[pos]);
continue;
4065 case kpow : pos--; tab[pos-1] =
TMath::Power(tab[pos-1],tab[pos]);
continue;
4066 case ksq : tab[pos-1] = tab[pos-1]*tab[pos-1];
continue;
4069 case kstrstr : pos2 -= 2; pos++;
if (strstr(stringStack[pos2],stringStack[pos2+1])) tab[pos-1]=1;
4073 case kmin : pos--; tab[pos-1] = std::min(tab[pos-1],tab[pos]);
continue;
4074 case kmax : pos--; tab[pos-1] = std::max(tab[pos-1],tab[pos]);
continue;
4076 case klog :
if (tab[pos-1] > 0) tab[pos-1] =
TMath::Log(tab[pos-1]);
4077 else {tab[pos-1] = 0;}
4080 if (dexp < -700) {tab[pos-1] = 0;
continue;}
4081 if (dexp > 700) {tab[pos-1] =
TMath::Exp(700);
continue;}
4085 else {tab[pos-1] = 0;}
4091 case ksign :
if (tab[pos-1] < 0) tab[pos-1] = -1;
else tab[pos-1] = 1;
4094 case kSignInv: tab[pos-1] = -1 * tab[pos-1];
continue;
4097 case kAnd : pos--;
if (tab[pos-1]!=0 && tab[pos]!=0) tab[pos-1]=1;
4100 case kOr : pos--;
if (tab[pos-1]!=0 || tab[pos]!=0) tab[pos-1]=1;
4104 case kEqual : pos--; tab[pos-1] = (tab[pos-1] == tab[pos]) ? 1 : 0;
continue;
4105 case kNotEqual : pos--; tab[pos-1] = (tab[pos-1] != tab[pos]) ? 1 : 0;
continue;
4106 case kLess : pos--; tab[pos-1] = (tab[pos-1] < tab[pos]) ? 1 : 0;
continue;
4107 case kGreater : pos--; tab[pos-1] = (tab[pos-1] > tab[pos]) ? 1 : 0;
continue;
4108 case kLessThan : pos--; tab[pos-1] = (tab[pos-1] <= tab[pos]) ? 1 : 0;
continue;
4109 case kGreaterThan: pos--; tab[pos-1] = (tab[pos-1] >= tab[pos]) ? 1 : 0;
continue;
4110 case kNot : tab[pos-1] = (tab[pos-1] != 0) ? 0 : 1;
continue;
4112 case kStringEqual : pos2 -= 2; pos++;
if (!strcmp(stringStack[pos2+1],stringStack[pos2])) tab[pos-1]=1;
4115 case kStringNotEqual: pos2 -= 2; pos++;
if (strcmp(stringStack[pos2+1],stringStack[pos2])) tab[pos-1]=1;
4140 pos2++; stringStack[pos2-1] = (
char*)
fExpr[i].Data();
4154 int op = param % 10;
4156 if (op == 1 && (!tab[pos-1]) ) {
4165 }
else if (op == 2 && tab[pos-1] ) {
4176 int toskip = param / 10;
4187 int fno = param / 1000;
4188 int nargs = param % 1000;
4196 UInt_t argloc = pos-nargs;
4197 for(
Int_t j=0;j<nargs;j++,argloc++,pos--) {
4198 SetMethodParam(method, tab[argloc]);
4221 switch (lookupType) {
4228 case kIteration: tab[pos++] = instance;
continue;
4236 GetTypedValue<T>(leaf,real_instance);
continue; }
4238 GetTypedValue<T>((
TLeaf*)0x0,real_instance);
continue; }
4243 default: tab[pos++] = 0;
continue;
4256 tab[pos++] = gcut->
IsInside(xcut,ycut);
4285 tab[pos] = param; pos++;
4303 T param = FindMin<T>(primary,condition);
4305 tab[pos] = param; pos++;
4312 T param = FindMax<T>(primary,condition);
4314 tab[pos] = param; pos++;
4324 if (instance < primary->
GetNdata()) {
4330 tab[pos] = param; pos++;
4344 if (instance < primary->
GetNdata()) {
4382 if (real_instance>=
fNdata[string_code])
return 0;
4404template double TTreeFormula::EvalInstance<double> (
int,
char const**);
4405template long double TTreeFormula::EvalInstance<long double> (
int,
char const**);
4406template long long TTreeFormula::EvalInstance<long long> (
int,
char const**);
4472 Warning(
"GetValueFromMethod",
"No streamer info for branch %s.", branch->
GetName());
4482 thisobj = *((
char**) (address + offset));
4494 m->Execute(thisobj,
l);
4500 m->Execute(thisobj,
d);
4504 m->Execute(thisobj);
4532 Warning(
"GetValuePointerFromMethod",
"No streamer info for branch %s.", branch->
GetName());
4542 thisobj = *((
char**) (address + offset));
4554 m->Execute(thisobj,
l);
4560 m->Execute(thisobj,
d);
4566 m->Execute(thisobj, &
c);
4570 m->Execute(thisobj);
4725 if (indexname[strlen(indexname)-1] ==
'_' ) {
4737 if (bid < 0)
return kFALSE;
4800 const int kMAXLENGTH = 1024;
4801 static char value[kMAXLENGTH];
4804 for (
int i = 0; i < kMAXLENGTH-1; i++)
4806 value[kMAXLENGTH-1] = 0;
4807 }
else if (mode == -1) {
4809 }
else if (mode == 0) {
4812 const char * val = 0;
4815 }
else if (instance<
fNdata[0]) {
4827 val = ((
TTreeFormula*)
this)->EvalStringInstance(instance);
4831 val = ((
TTreeFormula*)
this)->EvalStringInstance(instance);
4835 strlcpy(value, val, kMAXLENGTH);
4839 value[kMAXLENGTH-1] = 0;
4844 if (real_instance<
fNdata[0]) {
4845 Ssiz_t len = strlen(decform);
4846 Char_t outputSizeLevel = 1;
4849 switch (decform[len-2]) {
4852 outputSizeLevel = 2;
4853 if (len>3 && tolower(decform[len-3])==
'l') {
4854 outputSizeLevel = 3;
4858 case 'h': outputSizeLevel = 0;
break;
4861 switch(decform[len-1]) {
4866 switch (outputSizeLevel) {
4880 switch (outputSizeLevel) {
4895 switch (outputSizeLevel) {
4900 expo = strchr(value,
'e');
4905 expo = strchr(value,
'e');
4910 UInt_t declen = atoi(decform);
4911 if (strlen(value)>declen) {
4912 UInt_t off = strlen(value)-declen;
4913 char *start = expo - off;
4914 UInt_t vlen = strlen(expo);
4915 for(
UInt_t z=0;z<=vlen;++z) {
4922 if (isalpha(decform[strlen(decform)-1])) {
4923 TString short_decform(decform);
4946 for(
UInt_t dim=0; dim<max_dim ;++dim) {
4956 for(
Int_t k=0; k <=
n; ++k) {
4979 if (!axis) {
fAxis = 0;
return;}
5069 for (
Int_t i=0;i<nleaves;i++) {
5152 Int_t last_code = -1;
5154 for(TDimensionInfo * info; (info = (TDimensionInfo*)next()); ) {
5155 if (last_code!=info->fCode) {
5160 last_code = info->fCode;
5168 TDimensionInfo *nextinfo = (TDimensionInfo*)next();
5169 while(nextinfo && nextinfo->fCode==info->fCode) {
5171 nextinfo = (TDimensionInfo*)next();
5173 if (!nextinfo)
break;
5177 last_code = info->fCode;
5229 if (!gcut)
continue;
5259 if (!leaf)
continue;
5288 if (tleaf && tleaf != realtree && tleaf->
GetTreeIndex()) {
5294 Int_t virt_dim2 = 0;
5302 if (
fIndexes[i][k] < 0 ) virt_dim2++;
5330 for (i=0; i<
fNoper ; ++i) {
5332 if (leaf==0)
continue;
5342 for (
Int_t dim = 0; dim < max_dim; ++dim) {
5356 if (
fCodes[i] < 0)
continue;
5377 outofbounds =
kTRUE;
5384 if (tleaf && tleaf != realtree && tleaf->
GetTreeIndex()) {
5387 outofbounds =
kTRUE;
5402 if (readentry < 0) readentry=0;
5409 branchcount->TBranch::GetEntry(readentry);
5437 hasBranchCount2 =
kTRUE;
5444 for(
Int_t k=vdim -1; k>=0; k--) {
5458 if (readentry < 0) readentry=0;
5462 if (hasBranchCount2) {
5473 for(
Int_t j=0; j<size; j++) {
5486 }
else if (
fIndexes[i][0] >= size) {
5490 outofbounds =
kTRUE;
5491 }
else if (hasBranchCount2) {
5499 outofbounds =
kTRUE;
5507 if (readentry < 0) readentry=0;
5516 }
else if (
fIndexes[i][0] >= size) {
5520 outofbounds =
kTRUE;
5532 hasBranchCount2 =
kTRUE;
5534 for(
int z=0; z<size; ++z) {
5538 }
else if (
fIndexes[i][vdim] >= 0 ) {
5548 for(
Int_t k=vdim -1; k>=0; k--) {
5558 if (readentry < 0) readentry=0;
5561 outofbounds =
kTRUE;
5587 index<fManager->fUsedSizes[virt_dim]) {
5591 }
else if (hasBranchCount2 && info && k==info->
GetVarDim()) {
5595 if (
fManager->
fUsedSizes[virt_dim]==1 || (index!=1 && index<fManager->fUsedSizes[virt_dim]) )
5600 }
else if (hasBranchCount2 && info && k==info->
GetVarDim()) {
5613 return ! outofbounds;
5623 enum { kOldAlias = 100000+10000+1,
5624 kOldAliasString = kOldAlias+1,
5625 kOldAlternate = kOldAlias+2,
5626 kOldAlternateString = kOldAliasString+2
5629 for (
int k=0; k<
fNoper; k++) {
5636 case kOldAlias:
GetOper()[k] = -kOldAlias;
break;
5637 case kOldAliasString:
GetOper()[k] = -kOldAliasString;
break;
5638 case kOldAlternate:
GetOper()[k] = -kOldAlternate;
break;
5639 case kOldAlternateString:
GetOper()[k] = -kOldAlternateString;
break;
5645 for (
int i=0,offset=0; i<
fNoper; i++) {
5671 if (!leaf)
return kFALSE;
5685 last = clonesinfo->
fNext;
5689 }
else if (br->
GetType()==41) {
5694 if ( count->
GetID() >= 0 ) {
5713 last = collectioninfo->
fNext;
5717 }
else if (br->
GetID()<0) {
unsigned long long ULong64_t
const Int_t kDoNotProcess
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
void Set(Int_t n)
Set size of this array to n ints.
const Int_t * GetArray() const
void AddAt(Int_t c, Int_t i)
Add Int_t c at position i. Check for out of bounds.
Class to manage histogram axis.
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
A Branch for the case of an object.
TBranchElement * GetBranchCount() const
TStreamerInfo * GetInfo() const
Get streamer info for the branch class.
virtual char * GetAddress() const
Get the branch address.
virtual const char * GetClassName() const
Return the name of the user class whose content is stored in this branch, if any.
Int_t GetStreamerType() const
TBranchElement * GetBranchCount2() const
char * GetObject() const
Return a pointer to our object.
virtual void SetupAddresses()
If the branch address is not set, we set all addresses starting with the top level parent branch.
A Branch for the case of an object.
virtual const char * GetClassName() const
Return the name of the user class whose content is stored in this branch, if any.
A TTree is a list of TBranches.
virtual char * GetAddress() const
TObjArray * GetListOfBranches()
virtual Int_t GetEntry(Long64_t entry=0, Int_t getall=0)
Read all leaves of entry and return total number of bytes read.
virtual TLeaf * FindLeaf(const char *name)
Find the leaf corresponding to the name 'searchname'.
Long64_t GetReadEntry() const
virtual void Print(Option_t *option="") const
Print TBranch parameters.
virtual void ResetReadEntry()
virtual TBranch * FindBranch(const char *name)
Find the immediate sub-branch with passed name.
TObjArray * GetListOfLeaves()
TBranch * GetMother() const
Get our top-level parent branch in the tree.
Buffer base class used for serializing objects.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0
virtual void ReadFastArray(Bool_t *b, Int_t n)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
TClassRef is used to implement a permanent reference to a TClass object.
The ROOT global object gROOT contains a list of all defined classes.
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist,...
Bool_t HasDataMemberInfo() const
ClassInfo_t * GetClassInfo() const
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
TMethod * GetMethodAllAny(const char *method)
Return pointer to method without looking at parameters.
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
TVirtualRefProxy * GetReferenceProxy() const
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
An array of clone (identical) objects.
TClass * GetClass() const
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
const char * GetVarX() const
virtual void SetObjectY(TObject *obj)
Set the Y object (and delete the previous one if any).
TObject * GetObjectY() const
virtual void SetObjectX(TObject *obj)
Set the X object (and delete the previous one if any).
TObject * GetObjectX() const
const char * GetVarY() const
Describe directory structure in memory.
virtual Bool_t cd(const char *path=0)
Change current directory to "this" directory.
A List of entry numbers in a TTree or TChain.
virtual Int_t Contains(Long64_t entry, TTree *tree=0)
virtual Int_t IsInside(Double_t x, Double_t y) const
Return 1 if the point (x,y) is inside the polygon defined by the graph vertices 0 otherwise.
A TLeaf for the general case when using the branches created via a TStreamerInfo (i....
virtual Bool_t IsOnTerminalBranch() const
Return true if this leaf is does not have any sub-branch/leaf.
A TLeaf for a general object derived from TObject.
TClass * GetClass() const
TObject * GetObject() const
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
virtual void * GetValuePointer() const
virtual Bool_t IsOnTerminalBranch() const
virtual const char * GetTypeName() const
virtual Int_t GetLen() const
Return the number of effective elements of this leaf, for the current entry.
virtual TLeaf * GetLeafCount() const
If this leaf stores a variable-sized array or a multi-dimensional array whose last dimension has vari...
TBranch * GetBranch() const
virtual Int_t GetLenStatic() const
Return the fixed length of this leaf.
virtual Bool_t IsUnsigned() const
virtual void Add(TObject *obj)
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
Method or function calling interface.
EReturnType ReturnType()
Returns the return type of the method.
static const EReturnType kLong
static const EReturnType kString
void ResetParam()
Reset parameter list. To be used before the first call the SetParam().
static const EReturnType kOther
TFunction * GetMethod()
Returns the TMethod describing the method to be executed.
Bool_t IsValid() const
Return true if the method call has been properly initialized and is usable.
void Execute(const char *, const char *, int *=0)
Execute method on this object with the given parameter string, e.g.
static const EReturnType kDouble
void SetParam(Long_t l)
Add a long method parameter.
The TNamed class is the base class for all named ROOT classes.
virtual void SetName(const char *name)
Set the name of the TNamed.
virtual const char * GetTitle() const
Returns title of object.
virtual const char * GetName() const
Returns name of object.
Int_t IndexOf(const TObject *obj) const
Int_t GetEntriesFast() const
virtual void AddAtAndExpand(TObject *obj, Int_t idx)
Add object at position idx.
TObject * Last() const
Return the object in the last filled slot. Returns 0 if no entries.
Int_t GetEntries() const
Return the number of objects in array (i.e.
TObject * UncheckedAt(Int_t i) const
virtual void Delete(Option_t *option="")
Remove all objects from the array AND delete all heap based objects.
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
Int_t GetLast() const
Return index of last object in array.
virtual void AddAt(TObject *obj, Int_t idx)
Add object at position ids.
TObject * At(Int_t idx) const
Mother of all ROOT objects.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual Double_t Rndm()
Machine independent random number generator.
virtual TClass * GetClassPointer() const
Returns a pointer to the TClass of this element.
Int_t GetArrayDim() const
Int_t GetMaxIndex(Int_t i) const
virtual Bool_t IsaPointer() const
TClass * GetClass() const
Describe Streamer information for one class version.
TStreamerElement * GetStreamerElement(const char *datamember, Int_t &offset) const
Return the StreamerElement of "datamember" inside our class or any of its base classes.
Int_t GetElementOffset(Int_t id) const
TClass * GetClass() const
TStreamerElement * GetElement(Int_t id) const
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
A TTree object has a header with a name and a title.
virtual TBranch * FindBranch(const char *name)
Return the branch that correspond to the path 'branchname', which can include the name of the tree or...
virtual TObjArray * GetListOfLeaves()
virtual TVirtualIndex * GetTreeIndex() const
virtual Long64_t GetEntries() const
virtual TIterator * GetIteratorOnAllLeaves(Bool_t dir=kIterForward)
Creates a new iterator that will go through all the leaves on the tree itself and its friend.
virtual TLeaf * GetLeaf(const char *branchname, const char *leafname)
Return pointer to the 1st Leaf named name in any Branch of this Tree or any branch in the list of fri...
virtual Long64_t GetReadEntry() const
virtual TObjArray * GetListOfBranches()
virtual TTree * GetTree() const
virtual Long64_t LoadTree(Long64_t entry)
Set current entry.
virtual const char * GetAlias(const char *aliasName) const
Returns the expanded value of the alias. Search in the friends if any.
virtual Int_t GetTreeNumber() const
virtual TLeaf * FindLeaf(const char *name)
Find leaf..
virtual const char * GetFriendAlias(TTree *) const
If the 'tree' is a friend, this method returns its alias name.
virtual EDataType GetType() const =0
virtual TClass * GetValueClass() const =0
virtual TClass * GetValueClass(void *data) const =0
virtual Bool_t HasCounter() const =0
Bool_t IsCompiled() const
virtual TObjArray * GetElements() const =0
Namespace for new ROOT classes and functions.
static constexpr double second
Double_t ATan2(Double_t, Double_t)
Double_t Sqrt(Double_t x)
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Double_t Log10(Double_t x)
static long int sum(long int i)