20 #include "Riostream.h" 27 #include "TFriendElement.h" 29 #include "TTreeFormula.h" 30 #include "TTreeFormulaManager.h" 32 #include "TEntryList.h" 35 #include "TBufferJSON.h" 38 #include "TTimeStamp.h" 53 TTreeFormula(), fTextArray(NULL), fFormatArray(NULL), fFormulaArray(NULL), fValue(
""), fDebug(debug) {
75 TString fquery = expression;
91 for (iChar = 0; iChar < fquery.Length(); iChar++) {
92 if (fquery[iChar] !=
'{')
continue;
93 Int_t delta0 = 1, deltaf = 0;
94 for (delta0 = 1; delta0 + iChar < fquery.Length(); delta0++)
if (fquery[iChar + delta0] ==
'}')
break;
95 for (deltaf = -1; deltaf + iChar >= 0; deltaf--)
if (fquery[iChar + deltaf] ==
'%')
break;
96 TString stext(fquery(lastI, iChar + deltaf - lastI));
97 TString sformat(fquery(iChar + deltaf + 1, -(deltaf + 1)));
98 TString sformula(fquery(iChar + 1, delta0 - 1));
100 printf(
"%d\t%d\t%d\n", iChar, deltaf, delta0);
101 printf(
"%d\t%s\t%s\t%s\n", nVars, stext.Data(), sformat.Data(), sformula.Data());
103 fFormatArray->AddAtAndExpand(
new TObjString(sformat.Data()), nVars);
104 fTextArray->AddAtAndExpand(
new TObjString(stext.Data()), nVars);
105 fFormulaArray->AddAtAndExpand(
new TTreeFormula(sformula.Data(), sformula.Data(),
tree), nVars);
107 lastI = iChar + delta0 + 1;
109 TString stext(fquery(lastI, fquery.Length() - lastI));
110 fTextArray->AddAtAndExpand(
new TObjString(stext.Data()), nVars);
132 std::stringstream stream;
134 for (Int_t iVar = 0; iVar <= nVars; iVar++) {
136 if (
fDebug&2) cout<<
"T"<<iVar<<
"\t\t"<<
fTextArray->At(iVar)->GetName()<<endl;
137 if (
fDebug&4) cout<<
"F"<<iVar<<
"\t\t"<<stream.str().data()<<endl;
139 TTreeFormula *treeFormula = (TTreeFormula *)
fFormulaArray->At(iVar);
140 Bool_t isHex=TString(
fFormatArray->At(iVar)->GetName()).Contains(
"x") || TString(
fFormatArray->At(iVar)->GetName()).Contains(
"X");
143 Int_t value=treeFormula->EvalInstance();
145 sprintf(buffer,
"%X",(Int_t)value);
150 Long64_t value=treeFormula->EvalInstance();
152 stream<<b.to_string();
156 Long64_t value=treeFormula->EvalInstance64();
157 TTimeStamp stamp(value);
158 stream<<stamp.AsString(
"s");
161 TString value=treeFormula->PrintValue(0, instance,
fFormatArray->At(iVar)->GetName());
162 stream << value.Data();
163 if (
fDebug&&1) cout<<
"F"<<iVar<<
"\t\t"<<value.Data()<<
"\t"<<
fFormatArray->At(iVar)->GetName()<<endl;
167 fValue=stream.str().data();
168 return (
char *)
fValue.Data();
175 for (Int_t iVar = 0; iVar <= nVars; iVar++) {
176 TTreeFormula *treeFormula = (TTreeFormula *)
fFormulaArray->At(iVar);
177 treeFormula->UpdateFormulaLeaves();
218 TObjArray *queryArray=query.Tokenize(
"[=]");
221 TFormula *pFormula=0;
222 if (queryArray->GetEntries()>1) {
223 TString stringFormula=
"";
224 varArray = TString(queryArray->At(1)->GetName()).
Tokenize(
"\"&|!()[]+-/");
225 vecParam.ResizeTo(varArray->GetEntriesFast());
226 stringFormula=queryArray->At(1)->GetName();
227 stringFormula.ReplaceAll(
"\"",
"");
228 for (Int_t ivar=0; ivar<varArray->GetEntriesFast(); ivar++){
229 stringFormula.ReplaceAll(varArray->At(ivar)->GetName(),TString::Format(
"x[%d]",ivar).Data());
232 pFormula=
new TFormula(
"printMetadataFromula",stringFormula.Data());
233 if (verbose&0x2) pFormula->Print();
236 if (queryArray->GetEntriesFast()<=0 ){
239 if (queryArray->GetEntriesFast()>2) {
247 Int_t entries = metaData->GetEntries();
249 for (Int_t ientry=0;ientry<entries; ientry++){
250 TString index=metaData->At(ientry)->GetName();
251 if (strstr(metaData->At(ientry)->GetName(),queryArray->At(0)->GetName())==NULL)
continue;
252 Bool_t isSelected=kTRUE;
253 if (queryArray->GetEntriesFast()>1){
254 for (Int_t ipar=0; ipar< vecParam.GetNrows(); ipar++){
255 vecParam[ipar]=strstr(metaData->At(ientry)->GetTitle(),varArray->At(ipar)->GetName())!=NULL;
257 isSelected=pFormula->EvalPar(vecParam.GetMatrixArray());
259 vecParam.GetMatrixArray();
263 selected->AddLast(metaData->At(ientry));
265 TString
id=metaData->At(ientry)->GetName();
266 id.Remove(
id.Last(
'.'),
id.Length());
273 printf(
"%s:%s:%d\n",metaData->At(ientry)->GetName(),metaData->At(ientry)->GetTitle(),isSelected);
312 TObjArray *queryArray=query.Tokenize(
"&|()!");
313 Int_t formulaEntries=queryArray->GetEntries();
314 for (Int_t i=0;i<formulaEntries; i++){
315 if (TString(queryArray->At(i)->GetName()).ReplaceAll(
" ",
"").Length()<=0) queryArray->RemoveAt(i);
317 queryArray->Compress();
318 formulaEntries=queryArray->GetEntries();
319 if (formulaEntries<=0){
320 ::Error(
"selectTreeInfo",
"Empty or wrong selection %s", query.Data());
324 TString stringFormula=query;
325 TVectorD formValue(formulaEntries);
326 TVectorF formType(formulaEntries);
327 TVectorF formExact(formulaEntries);
330 for (Int_t ivar=0; ivar<formulaEntries; ivar++){
331 TString formName=queryArray->At(ivar)->GetName();
332 stringFormula.ReplaceAll(queryArray->At(ivar)->GetName(),TString::Format(
"x[%d]",ivar).Data());
333 formName.ReplaceAll(
" ",
"");
334 formName.ReplaceAll(
"\t",
"");
335 TObjArray *tokenArray=formName.Tokenize(
"[=:]");
336 if (tokenArray->GetEntries()<2){
337 ::Error(
"selectTreeInfo",
"Wrong subformula %s",formName.Data());
338 ::Error(
"selectTreeInfo",
"Full formula was %s",query.Data());
345 formMatch[ivar]=tokenArray->At(1);
346 formMatchType[ivar]=tokenArray->At(0);
347 TString queryType(tokenArray->At(0)->GetName());
350 if (queryType.Contains(
".name",TString::kIgnoreCase)){
353 if (formName.Contains(
":")){
360 TFormula *pFormula=
new TFormula(
"printMetadataFormula",stringFormula.Data());
362 ::Info(
"selectTreeInfo",
"Formula:");
364 ::Info(
"selectTreeInfo",
"Query array:");
366 ::Info(
"selectTreeInfo",
"To match array:");
368 ::Info(
"selectTreeInfo",
"Exact type:");
376 if (tree->GetListOfFriends()!=NULL) nTrees+=tree->GetListOfFriends()->GetEntries();
377 for (Int_t iTree=0; iTree<nTrees; iTree++){
378 TTree * cTree =
tree;
379 if (iTree>0) cTree=tree->GetFriend(tree->GetListOfFriends()->At(iTree-1)->GetName());
380 if (cTree==NULL)
continue;
381 for (Int_t itype=0; itype<2; itype++){
384 TSeqCollection* elemList=0;
385 if (itype==0) elemList=cTree->GetListOfBranches();
386 if (itype==1) elemList=cTree->GetListOfAliases();
387 if (elemList==NULL)
continue;
388 Int_t elemEntries=elemList->GetEntries();
389 for (Int_t ientry=0; ientry<elemEntries; ientry++){
390 TString elemName(elemList->At(ientry)->GetName());
392 for (Int_t icheck=0; icheck<formulaEntries; icheck++){
394 if (formType[icheck]==0){
395 if (formExact[icheck]==1) formValue[icheck]=(elemName==formMatch.At(icheck)->GetName());
396 if (formExact[icheck]==0) formValue[icheck]=(strstr(elemName.Data(),formMatch.UncheckedAt(icheck)->GetName())!=NULL);
398 if (formType[icheck]==1){
399 TObject* metaObject =
TStatToolkit::GetMetadata(cTree,TString::Format(
"%s%s",elemName.Data(), formMatchType.UncheckedAt(icheck)->GetName()).Data());
401 TString metaName(metaObject->GetTitle());
402 if (formExact[icheck]==1) formValue[icheck]=(metaName==formMatch.At(icheck)->GetName());
403 if (formExact[icheck]==0) formValue[icheck]=(strstr(metaName.Data(),formMatch.UncheckedAt(icheck)->GetName())!=NULL);
407 Bool_t isSelected=pFormula->EvalPar(formValue.GetMatrixArray());
409 if (iTree==0) selected->AddLast(
new TObjString(elemList->At(ientry)->GetName()));
410 if (iTree>0) selected->AddLast(
new TObjString(TString::Format(
"%s.%s",tree->GetListOfFriends()->At(iTree-1)->GetName(),elemList->At(ientry)->GetName())));
411 if (verbose&0x1)
printf(
"%s\n",elemName.Data());
450 TList *treeFriends = tree->GetListOfFriends();
451 Int_t ntrees = 1 + ((treeFriends != NULL) ? treeFriends->GetEntries() : 0);
452 TPRegexp pregExpFriend = regExpFriend;
453 TPRegexp pregExpTag = regExpTag;
454 const char *dataTypes[3] = {
"branch",
"alias",
"metaData"};
455 for (Int_t itree = 0; itree < ntrees; itree++) {
456 TTree *currentTree = 0;
459 if (pregExpFriend.Match(currentTree->GetName()) == 0)
continue;
461 if (pregExpFriend.Match(treeFriends->At(itree - 1)->GetName()) == 0)
continue;
462 currentTree = ((TFriendElement * )(treeFriends->At(itree - 1)))->GetTree();
466 ::Info(
"printSelectedTreeInfo",
"tree %s selected", currentTree->GetName());
468 for (Int_t iDataType = 0; iDataType < 3; iDataType++) {
469 if (infoType.Contains(dataTypes[iDataType], TString::kIgnoreCase) == 0)
continue;
471 if (iDataType == 0) selList = (TList *) currentTree->GetListOfBranches();
472 if (iDataType == 1) selList = (TList *) currentTree->GetListOfAliases();
473 if (iDataType == 2 && tree->GetUserInfo())
474 selList = (TList * )(currentTree->GetUserInfo()->FindObject(
"metaTable"));
476 if (selList == NULL)
continue;
477 Int_t selListEntries = selList->GetEntries();
478 for (Int_t iEntry = 0; iEntry < selListEntries; iEntry++) {
479 if (pregExpTag.Match(selList->At(iEntry)->GetName()) <= 0)
continue;
481 ::Info(
" printSelectedTreeInfo",
"%s.%s", currentTree->GetName(), selList->At(iEntry)->GetName());
483 if (result.Length() > 0) result +=
":";
485 result += treeFriends->At(itree - 1)->GetName();
488 result += selList->At(iEntry)->GetName();
520 if (tree==NULL || tree->GetPlayer()==NULL){
521 ::Error(
"AliTreePlayer::selectWhatWhereOrderBy",
"Input tree not defiend");
525 if (firstentry +nentries >tree->GetEntriesFriend()) nentries=tree->GetEntriesFriend()-firstentry;
526 if (tree->GetEntryList()){
527 if (tree->GetEntryList()->GetN()<nentries) nentries=tree->GetEntryList()->GetN();
531 Bool_t isHTML=outputFormat.Contains(
"html",TString::kIgnoreCase );
532 Bool_t isCSV=outputFormat.Contains(
"csv",TString::kIgnoreCase);
533 Bool_t isElastic=outputFormat.Contains(
"elastic",TString::kIgnoreCase);
534 Bool_t isJSON=outputFormat.Contains(
"json",TString::kIgnoreCase)||isElastic;
537 FILE *default_fp = stdout;
538 if (outputName.Length()>0){
539 default_fp=fopen (outputName.Data(),
"w");
542 Int_t nCols=fArray->GetEntries();
544 TTreeFormula ** rFormulaList =
new TTreeFormula*[nCols+1];
545 TObjString **printFormatList =
new TObjString*[nCols];
546 TObjString **columnNameList =
new TObjString*[nCols];
547 TObjString **outputFormatList =
new TObjString*[nCols];
548 Bool_t isIndex[nCols];
549 Bool_t isParent[nCols];
550 TClass* isClass[nCols];
551 TPRegexp indexPattern(
"^%I");
552 TPRegexp parentPattern(
"^%P");
553 for (Int_t iCol=0; iCol<nCols; iCol++){
555 rFormulaList[iCol]=NULL;
557 if (arrayDesc->GetEntries()<=0) {
558 ::Error(
"AliTreePlayer::selectWhatWhereOrderBy",
"Invalid descriptor %s", arrayDesc->At(iCol)->GetName());
561 TString fieldName=arrayDesc->At(0)->GetName();
562 if (tree->GetBranch(fieldName.Data())){
563 if (TString(tree->GetBranch(fieldName.Data())->GetClassName()).Length()>0) {
564 isClass[iCol]=TClass::GetClass(tree->GetBranch(fieldName.Data())->GetClassName());
567 if (fieldName.Contains(indexPattern)){
569 indexPattern.Substitute(fieldName,
"");
571 isIndex[iCol]=kFALSE;
573 if (fieldName.Contains(parentPattern)){
574 isParent[iCol]=kTRUE;
575 parentPattern.Substitute(fieldName,
"");
577 isParent[iCol]=kFALSE;
579 TTreeFormula * formula = NULL;
581 Bool_t isFormulaF= (fieldName[0]==
'#') || htmlTag!=NULL;
584 formula=
new TTreeFormula(fieldName.Data(), fieldName.Data(),
tree);
586 TString fstring = fieldName;
588 fstring=htmlTag->GetTitle();
590 fieldName.Replace(0, 1,
"");
591 if (tree->GetAlias(fieldName.Data())) {
592 fstring = tree->GetAlias(fieldName.Data());
598 if (formula->GetTree()==NULL){
599 ::Error(
"AliTreePlayer::selectWhatWhereOrderBy",
"Invalid formula %s, parsed from the original string %s",fieldName.Data(),what.Data());
600 if (isJSON==kFALSE)
return -1;
602 TString printFormat=
"";
603 TString colName=arrayDesc->At(0)->GetName();
604 TString outputFormat=
"";
605 if (arrayDesc->At(1)!=NULL){
606 printFormat=arrayDesc->At(1)->GetName();
608 if (formula->IsInteger()) {
614 if (arrayDesc->At(2)!=NULL) {
615 colName=arrayDesc->At(2)->GetName();
617 colName=arrayDesc->At(0)->GetName();
620 if (arrayDesc->At(3)!=NULL){
621 outputFormat= arrayDesc->At(3)->GetName();
624 if (formula->IsInteger()) outputFormat=
"/I";
625 if (formula->IsString()) outputFormat=
"/C";
627 fFormulaList->AddAt(formula,iCol);
628 rFormulaList[iCol]=formula;
629 printFormatList[iCol]=
new TObjString(printFormat);
630 outputFormatList[iCol]=
new TObjString(outputFormat);
631 columnNameList[iCol]=
new TObjString(colName);
633 TTreeFormula *select =
new TTreeFormula(
"Selection",where.Data(),
tree);
634 fFormulaList->AddLast(select);
635 rFormulaList[nCols]=select;
638 Bool_t hasArray = kFALSE;
639 Bool_t forceDim = kFALSE;
640 for (Int_t iCol=0; iCol<nCols; iCol++){
641 if (rFormulaList[iCol]!=NULL) rFormulaList[iCol]->UpdateFormulaLeaves();
642 if (rFormulaList[iCol]->GetManager()==NULL)
continue;
644 switch( rFormulaList[iCol]->GetManager()->GetMultiplicity() ) {
661 fprintf(default_fp,
"%s",
"<table class=\"display\" cellspacing=\"0\" width=\"100%\">\n");
662 fprintf(default_fp,
"\t<thead class=\"header\">\n");
663 fprintf(default_fp,
"\t<tr>\n");
664 for (Int_t iCol=0; iCol<nCols; iCol++){
667 TString sthName=(tHeadName!=NULL) ? tHeadName->GetTitle() : columnNameList[iCol]->GetName();
669 fprintf(default_fp,
"\t\t<th");
670 if (tooltipName!=0) fprintf(default_fp,
" class=\"tooltip\" data-tooltip=\"%s\"", tooltipName->GetTitle());
671 if (descriptionName!=0) fprintf(default_fp,
" title=\"%s\"", descriptionName->GetTitle());
672 fprintf(default_fp,
">%s</th>\n", sthName.Data());
679 fprintf(default_fp,
"\t</tr>\n");
680 fprintf(default_fp,
"\t</thead>\n");
682 fprintf(default_fp,
"\t<tfoot class=\"header\">\n");
683 fprintf(default_fp,
"\t<tr>\n");
684 for (Int_t iCol=0; iCol<nCols; iCol++){
685 fprintf(default_fp,
"\t\t<th>%s</th>\n",columnNameList[iCol]->GetName());
687 fprintf(default_fp,
"\t</tr>\n");
688 fprintf(default_fp,
"\t</tfoot>\n");
689 fprintf(default_fp,
"\t<tbody>\n");
691 if (isCSV && outputFormat.Contains(
"csvroot")){
693 for (Int_t iCol=0; iCol<nCols; iCol++){
694 fprintf(default_fp,
"%s%s",columnNameList[iCol]->GetName(), outputFormatList[iCol]->GetName());
696 fprintf(default_fp,
":");
698 fprintf(default_fp,
"\n");
702 if (isJSON&&!isElastic){
703 fprintf(default_fp,
"{\n\t \"tree\": [\n ");
707 for (Int_t ientry=firstentry; ientry<firstentry+nentries; ientry++){
708 Int_t entryNumber = tree->GetEntryNumber(ientry);
709 if (entryNumber < 0)
break;
710 Long64_t localEntry = tree->LoadTree(entryNumber);
712 if (tnumber != tree->GetTreeNumber()) {
713 tnumber = tree->GetTreeNumber();
714 for(Int_t iCol=0;iCol<nCols;iCol++) {
715 rFormulaList[iCol]->UpdateFormulaLeaves();
717 select->UpdateFormulaLeaves();
721 if (select->EvalInstance(0) == 0) {
730 fprintf(default_fp,
"}\n{\"index\":{\"_id\": \"");
733 fprintf(default_fp,
"},\n{\n");
737 fprintf(default_fp,
"{\"index\":{\"_id\": \"");
739 fprintf(default_fp,
"{\n");
742 for (Int_t icol=0; icol<nCols; icol++){
745 const char*bname=rFormulaList[icol]->GetName();
746 TBranch *br = tree->GetBranch(bname);
747 br->GetEntry(entryNumber);
748 void **ppobject=(
void**)br->GetAddress();
750 obuffer = TBufferJSON::ConvertToJSON(*ppobject, isClass[icol]);
751 if (isElastic) obuffer.ReplaceAll(
"\n",
"");
755 if (rFormulaList[icol]->
GetTree()==NULL)
continue;
756 Int_t nData=rFormulaList[icol]->GetNdata();
758 fprintf(default_fp,
"\t\"%s\":",rFormulaList[icol]->GetName());
760 if (isIndex[icol]==kFALSE && isParent[icol]==kFALSE){
761 TString fieldName(rFormulaList[icol]->GetName());
763 if (isClass[icol]) fieldName.Remove(fieldName.Length() - 1);
764 fieldName.ReplaceAll(
".",
"%_");
766 if (icol>0 && isIndex[icol-1]==kFALSE && isParent[icol-1]==kFALSE ){
767 fprintf(default_fp,
"\t,\"%s\":",fieldName.Data());
769 fprintf(default_fp,
"\t\"%s\":",fieldName.Data());
774 if ((isIndex[icol]==kFALSE)&&(isParent[icol]==kFALSE)){
775 if (isClass[icol]!=NULL){
776 fprintf(default_fp,
"%s",obuffer.Data());
778 if ( (isElastic || isJSON) && rFormulaList[icol]->IsString()) {
779 fprintf(default_fp,
"\t\"%s\"",
780 rFormulaList[icol]->PrintValue(0, 0, printFormatList[icol]->GetName()));
782 fprintf(default_fp,
"\t%s",
783 rFormulaList[icol]->PrintValue(0, 0, printFormatList[icol]->GetName()));
788 fprintf(default_fp,
"%s",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
789 if (isIndex[icol+1]){
790 fprintf(default_fp,
".");
792 if (isParent[icol+1]==kFALSE){
793 fprintf(default_fp,
"\"}}\n{");
796 if (isParent[icol]==kTRUE){
797 fprintf(default_fp,
"\", \"parent\": \"%s\"}}\n{",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
800 fprintf(default_fp,
"\t[");
801 for (Int_t iData=0; iData<nData;iData++){
802 fprintf(default_fp,
"%f",rFormulaList[icol]->EvalInstance(iData));
804 fprintf(default_fp,
",");
806 fprintf(default_fp,
"]");
817 fprintf(default_fp,
"<tr>\n");
818 for (Int_t icol=0; icol<nCols; icol++){
819 Int_t nData=rFormulaList[icol]->GetNdata();
821 fprintf(default_fp,
"\t<td>%s</td>",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
823 fprintf(default_fp,
"\t<td>");
824 for (Int_t iData=0; iData<nData;iData++){
825 fprintf(default_fp,
"%f",rFormulaList[icol]->EvalInstance(iData));
827 fprintf(default_fp,
",");
829 fprintf(default_fp,
"</td>");
833 fprintf(default_fp,
"\n");
835 fprintf(default_fp,
"</tr>\n");
839 for (Int_t icol=0; icol<nCols; icol++){
840 Int_t nData=rFormulaList[icol]->GetNdata();
842 fprintf(default_fp,
"%s\t",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
844 for (Int_t iData=0; iData<nData;iData++){
845 fprintf(default_fp,
"%f",rFormulaList[icol]->EvalInstance(iData));
847 fprintf(default_fp,
",");
849 fprintf(default_fp,
"\t");
854 fprintf(default_fp,
"\n");
857 if (isJSON) fprintf(default_fp,
"}\t]\n}\n");
859 fprintf(default_fp,
"\t</tbody>");
860 fprintf(default_fp,
"</table>");
863 if (default_fp!=stdout) fclose (default_fp);
873 if(!stat.CompareTo(
"median",TString::kIgnoreCase)){
875 }
else if(!stat.CompareTo(
"medianLeft",TString::kIgnoreCase)){
877 }
else if(!stat.CompareTo(
"medianRight",TString::kIgnoreCase)){
879 }
else if(!stat.CompareTo(
"RMS",TString::kIgnoreCase)){
881 }
else if(!stat.CompareTo(
"Mean",TString::kIgnoreCase)){
883 }
else if(!stat.CompareTo(
"Max",TString::kIgnoreCase)){
885 }
else if(!stat.CompareTo(
"Min",TString::kIgnoreCase)){
887 }
else if(stat.BeginsWith(
"LTMRMS",TString::kIgnoreCase)){
889 }
else if(stat.BeginsWith(
"LTM",TString::kIgnoreCase)){
892 ::Error(
"GetStatType()",
"Cannot decode string \"%s\"." 893 " Use one of \"median\", \"medianLeft\", \"medianRight\", \"RMS\", or \"Mean\". " 894 " Also supported is \"LTM\", or \"LTMRMS\", which should be succeeded by a float like" 895 " \"LTM0.95\" or an integer (interpreted as percentage) like \"LTMRMS95\" to specify " 896 " the fraction of data to be kept." 897 " Use a colon separated list like \"median:medianLeft:medianRight:RMS\"" 898 " as the fifth argument to the AddStatInfo().",stat.Data());
910 const TString statString,
916 Int_t entries = treeRight->Draw(refQuery.Data(),
"",
"goffpara",maxEntries);
918 ::Error(
"AddStatInfo",
"No matching entries for query");
920 }
else if (entries>treeRight->GetEstimate()){
921 treeRight->SetEstimate(entries*2);
922 entries = treeRight->Draw(refQuery.Data(),
"",
"goffpara",maxEntries);
924 Int_t * indexArr =
new Int_t[entries];
925 TMath::Sort(entries, treeRight->GetV1(), indexArr,kFALSE);
926 Double_t * coordArray =
new Double_t[entries];
927 for (Int_t icoord=0; icoord<entries; icoord++) coordArray[icoord]=treeRight->GetV1()[indexArr[icoord]];
934 if(!refQuery.Tokenize(var,from,
":")){
935 ::Error(
"AddStatInfo",
"Cannot tokenize query \'%s\'. Use colon separated list" 937 delete[]indexArr;indexArr=0;
938 delete[]coordArray;coordArray=0;
941 Int_t entriesCoord = treeLeft->GetEntries();
942 TBranch * br = treeLeft->GetBranch(var.Data());
944 br->SetAddress(&coordValue);
947 while(refQuery.Tokenize(var,from,
":")){
951 while(statString.Tokenize(stat,fromStat,
":")){
955 if(statType==
kUndef)
continue;
962 tmp.ReplaceAll(
"LTMRMS",
"");
963 tmp.ReplaceAll(
"LTM",
"");
965 if(frac>1)frac/=100.;
969 Double_t leftOffset=-1e99,rightOffset=-1e99;
972 leftOffset=-deltaT;rightOffset=deltaT;
974 leftOffset=-2.*deltaT;rightOffset=0.;
976 leftOffset=0.;rightOffset=2.*deltaT;
979 TString brName=Form(
"%s_%s",var.Data(),stat.Data());
980 brName.ReplaceAll(
"[",
"_");
981 brName.ReplaceAll(
"]",
"_");
982 brName.ReplaceAll(
".",
"_");
983 Double_t statValue=0;
984 if (treeLeft->GetDirectory()) treeLeft->GetDirectory()->cd();
985 TBranch *brToFill = treeLeft->Branch(brName.Data(),&statValue, (brName+
"/D").Data());
986 TVectorD dvalues(entries);
988 for (Int_t icoord=0; icoord<entriesCoord; icoord++){
990 br->GetEntry(icoord);
991 Double_t startCoord=coordValue+leftOffset;
992 Double_t endCoord =coordValue+rightOffset;
998 Int_t index1=TMath::BinarySearch(entries, coordArray, endCoord) +1;
1000 if (index1>=0 && index0>=0){
1002 if (index1-index0<=0){
1005 if (index0<0) index0=0;
1006 if (index1>=entries) index1=entries-1;
1008 for (Int_t i=0; i<index1-index0; i++){
1009 dvalues[i]=treeRight->GetV2()[indexArr[i+index0]];
1013 statValue=TMath::Median(index1-index0, dvalues.GetMatrixArray());
1014 }
else if(statType==
kRMS){
1015 statValue=TMath::RMS(index1-index0, dvalues.GetMatrixArray());
1016 }
else if(statType==
kMean){
1017 statValue=TMath::Mean(index1-index0, dvalues.GetMatrixArray());
1018 }
else if(statType==
kMin){
1019 statValue=TMath::MinElement(index1-index0, dvalues.GetMatrixArray());
1020 }
else if(statType==
kMax){
1021 statValue=TMath::MaxElement(index1-index0, dvalues.GetMatrixArray());
1022 }
else if(statType==
kLTM){
1029 cout <<
"TStatToolkit::LTMUnbinned. Catch Exception Nr. " << e <<
'\n';
1032 statValue = params[1];
1040 cout <<
"TStatToolkit::LTMUnbinned. Catch Exception Nr. " << e <<
'\n';
1043 statValue = params[2];
1045 ::Error(
"AddStatInfo()",
"String %s StatType %d not implemented",stat.Data(),statType);
1050 brToFill->FlushBaskets();
1054 delete[]indexArr;indexArr=0;
1055 delete[]coordArray;coordArray=0;
1125 const Int_t kMaxDim=10;
1126 Int_t entriesAll=tree->GetEntries();
1127 if (chunkSize<=0) chunkSize=entriesAll;
1128 if (lastEntry>entriesAll) lastEntry=entriesAll;
1130 ::Info(
"AliTreePlayer::MakeHistograms",
"firstEntry %d", firstEntry);
1131 ::Info(
"AliTreePlayer::MakeHistograms",
"lastEntry %d", lastEntry);
1132 ::Info(
"AliTreePlayer::MakeHistograms",
"entriesAll %d", entriesAll);
1135 TObjArray *hisDescriptionList=hisString.Tokenize(
";");
1136 Int_t nHistograms = hisDescriptionList->GetEntries();
1141 TArrayI hisDims(nHistograms);
1143 Int_t nExpressions=hisString.CountChar(
':')+hisString.CountChar(
';')+1;
1145 TString queryString =
"";
1146 Int_t hisSizeFull=0;
1151 for (Int_t iHis=0; iHis<nHistograms; iHis++){
1152 TString hisDescription = hisDescriptionList->At(iHis)->GetName();
1153 Int_t hisIndex=hisDescription.Index(
">>");
1156 ::Error(
"AliTreePlayer::MakeHistograms",
"Invalid expression %s",hisDescription.Data());
1159 hisDescriptionArray->AddAtAndExpand(
new TObjString(((hisDescriptionList->At(iHis)->GetName()))+(hisIndex+2)),iHis);
1161 hisDescription.Remove(hisIndex);
1162 TObjArray *hisDimArray=hisDescription.Tokenize(
":");
1163 Int_t nDims=hisDimArray->GetEntries();
1166 ::Error(
"AliTreePlayer::MakeHistograms",
"Invalid description %s",hisDescription.Data());
1171 if (hisDimArray->At(nDims-1)->GetName()[0]==
'#'){
1172 TString formulaName=&((hisDimArray->At(nDims-1)->GetName())[1]);
1174 TObjString *tFormula =
new TObjString(formulaName.Data());
1175 hisWeightArray->AddAt(tFormula,iHis);
1176 if (formulaArray->FindObject(formulaName.Data())==NULL){
1177 formulaArray->AddLast(tFormula);
1178 varArray->AddAt(tFormula,nDims);
1181 for (Int_t iDim=0; iDim<nDims;iDim++){
1182 TObjString *tFormula = (TObjString*) (formulaArray->FindObject(hisDimArray->At(iDim)->GetName()));
1183 if (tFormula==NULL){
1184 tFormula =
new TObjString(hisDimArray->At(iDim)->GetName());
1185 formulaArray->AddLast(tFormula);
1187 varArray->AddAt(tFormula,iDim);
1189 hisFormulaArray->AddAt(varArray,iHis);
1190 hisDims[iHis]=nDims;
1194 Int_t nFormulas=formulaArray->GetEntries();
1195 for (Int_t iFor=0; iFor<nFormulas; iFor++){
1196 queryString+=formulaArray->At(iFor)->GetName();
1199 queryString+=formulaArray->At(nFormulas-1)->GetName();
1200 if (verbose&0x2) hisDescriptionArray->Print();
1201 if (verbose&0x4) formulaArray->Print();
1206 for (Int_t bEntry=firstEntry; bEntry<lastEntry; bEntry+=chunkSize){
1207 Int_t toQuery=TMath::Min(chunkSize, lastEntry-bEntry);
1208 Int_t qLength = tree->Draw(queryString,defaultCut,
"goffpara",toQuery, bEntry);
1209 if (qLength>tree->GetEstimate()){
1210 tree->SetEstimate(qLength*1.5);
1211 qLength = tree->Draw(queryString,defaultCut,
"goffpara",chunkSize, bEntry);
1215 if (hisArray->GetEntriesFast()==0){
1216 for (Int_t iHis=0; iHis<nHistograms; iHis++){
1217 if (hisDescriptionArray->At(iHis)==NULL){
1218 ::Error(
"AliTreePlayer::MakeHistograms",
"Empty description %d",iHis);
1221 TString hisDescription= hisDescriptionArray->At(iHis)->GetName();
1222 TString varDecription=hisDescriptionList->At(iHis)->GetName();
1223 TObjArray * descriptionArray=hisDescription.Tokenize(
"(,)");
1224 TObjArray * varArray= TString(hisDescriptionList->At(iHis)->GetName()).
Tokenize(
":");
1225 Int_t nLength=descriptionArray->GetEntries();
1226 if ((nLength-1)/3 < hisDims[iHis]){
1227 ::Error(
"AliTreePlayer::MakeHistograms",
"Histogram dimension Mismatch %s", hisDescriptionArray->At(iHis)->GetName());
1230 if (varArray->GetEntries()<hisDims[iHis]){
1231 ::Error(
"AliTreePlayer::MakeHistograms",
"Variable mismatch %s", hisDescriptionArray->At(iHis)->GetName());
1234 TString hName(descriptionArray->At(0)->GetName());
1236 Int_t
nBins[kMaxDim];
1237 Double_t xMin[kMaxDim], xMax[kMaxDim];
1238 for (Int_t iDim=0; iDim<hisDims[iHis]; iDim++){
1239 nBins[iDim]= TString(descriptionArray->At(3*iDim+1)->GetName()).Atoi();
1240 if (descriptionArray->At(3*iDim+2)->GetName()[0]!=
'%'){
1241 xMin[iDim]= TString(descriptionArray->At(3*iDim+2)->GetName()).Atof();
1243 if (descriptionArray->At(3*iDim+2)->GetName()[1]==
'A'){
1244 TTreeFormula falias(
"falias",&(descriptionArray->At(3*iDim+2)->GetName()[2]),tree);
1245 xMin[iDim]=falias.EvalInstance();
1248 if (descriptionArray->At(3*iDim+3)->GetName()[0]!=
'%'){
1249 xMax[iDim]= TString(descriptionArray->At(3*iDim+3)->GetName()).Atof();
1251 if (descriptionArray->At(3*iDim+3)->GetName()[1]==
'A'){
1252 TTreeFormula falias(
"falias",&(descriptionArray->At(3*iDim+3)->GetName()[2]),tree);
1253 xMax[iDim]=falias.EvalInstance();
1256 if (xMax[iDim]<=xMin[iDim]){
1257 ::Error(
"AliTreePlayer::MakeHistograms",
"Invalid hstogram range specification for histogram %s: %s\t%s",hisDescription.Data(), \
1258 descriptionArray->At(3*iDim+2)->GetName(), descriptionArray->At(3*iDim+3)->GetName() );
1261 THnF * phis =
new THnF(hName.Data(),hName.Data(), hisDims[iHis],
nBins, xMin,xMax);
1262 hisArray->AddAt(phis,iHis);
1264 ::Info(
"AliTreePlayer::MakeHistograms",
"%s: size=%lld",hisDescription.Data(), phis->GetNbins());
1266 hisSizeFull+= phis->GetNbins();
1267 for (Int_t iDim=0;iDim<hisDims[iHis]; iDim++){
1268 phis->GetAxis(iDim)->SetName(varArray->At(iDim)->GetName());
1269 phis->GetAxis(iDim)->SetTitle(varArray->At(iDim)->GetName());
1271 if (axisTitle) phis->GetAxis(iDim)->SetTitle(axisTitle->GetTitle());
1275 ::Info(
"AliTreePlayer::MakeHistograms",
"Total size=%d",hisSizeFull);
1279 if (tree->GetVal(0)==NULL){
1280 ::Error(
" AliTreePlayer::MakeHistograms",
"Info not available");
1283 Double_t values[kMaxDim];
1284 for (Int_t iHis=0; iHis<nHistograms; iHis++){
1285 Int_t indeces[kMaxDim+1];
1287 for (Int_t iVec=0; iVec<formulaArrayHis->GetEntriesFast(); iVec++){
1288 indeces[iVec]= formulaArray->IndexOf(formulaArray->FindObject(formulaArrayHis->At(iVec)->GetName()));
1291 if (hisWeightArray->GetEntriesFast()>=iHis){
1292 if (hisWeightArray->UncheckedAt(iHis)!=NULL){
1293 if (hisWeightArray->UncheckedAt(iHis)->GetName()){
1294 indexW= formulaArray->IndexOf(formulaArray->FindObject(hisWeightArray->UncheckedAt(iHis)->GetName()));
1296 ::Error(
"xxx",
"Problem to find %s", hisWeightArray->UncheckedAt(iHis)->GetName());
1300 THnBase * his = (THnBase*) hisArray->UncheckedAt(iHis);
1301 for (Int_t cEvent=0; cEvent<qLength; cEvent++){
1302 for (Int_t iDim=0; iDim<hisDims[iHis]; iDim++){
1303 if (tree->GetVal(indeces[iDim])==NULL){
1304 ::Error(
" AliTreePlayer::MakeHistograms",
"Info %d not avaliable",iDim);
1307 values[iDim]=tree->GetVal(indeces[iDim])[cEvent];
1309 Double_t weight=(indexW<0)? 1: tree->GetVal(indexW)[cEvent];
1310 if (weight>0) his->Fill(values,weight);
1315 delete hisDescriptionArray;
1316 delete formulaArray;
1336 TString projType[8]={
"f-mean",
"f-rms",
"f-ltm",
"f-ltmsigma",
"f-gmean",
"f-grms",
"f-median",
"f-gmean"};
1338 TObjArray *drawList=drawExpression.Tokenize(
":");
1340 TString padDescription=drawList->At(0)->GetName();
1342 static Int_t counter=0;
1343 pad =
new TCanvas(TString::Format(
"canvasCounter%d",counter).Data(), drawExpression,1000,800);
1347 Int_t nPads=0, nRows=0;
1348 TObjArray *padRows=padDescription.Tokenize(
"[](),");
1349 nRows=padRows->GetEntries();
1350 for (Int_t iRow=0; iRow<nRows; iRow++){
1351 Int_t nCols=TString(padRows->At(iRow)->GetName()).Atoi();
1352 for (Int_t iCol=0; iCol<nCols; iCol++){
1354 TPad * newPad=
new TPad(Form(
"pad%d",nPads),Form(
"pad%d",nPads),iCol/Double_t(nCols),(nRows-iRow-1)/Double_t(nRows),(iCol+1)/Double_t(nCols),(nRows-iRow)/Double_t(nRows));
1357 newPad->SetNumber(nPads);
1363 TPRegexp isPadOption(
"^%O");
1364 Bool_t isLogY=kFALSE;
1365 for (Int_t iPad=0; iPad<nPads; iPad++){
1366 Int_t nGraphs=0, nHistos=0;
1367 if (drawList->At(iPad+1)==NULL)
break;
1369 TVirtualPad *cPad = pad->cd(iPad+1);
1370 TLegend * legend =
new TLegend(cPad->GetLeftMargin()+0.02,0.7,1-cPad->GetRightMargin()-0.02 ,1-cPad->GetTopMargin()-0.02, TString::Format(
"Pad%d",iPad));
1371 legend->SetNColumns(2);
1372 legend->SetBorderSize(0);
1373 TString padSetup=drawList->At(iPad+1)->GetName();
1374 TString padOption=
"";
1375 Bool_t isTimeX=kFALSE, isTimeY=kFALSE;
1377 if (padSetup.Contains(isPadOption)){
1378 padOption=TString(&padSetup[2]);
1379 padOption.Remove(padOption.First(
";"));
1380 padOption.ToLower();
1381 if (padOption.Contains(
"logy")) {
1382 pad->cd(iPad+1)->SetLogy();
1385 if (padOption.Contains(
"logx")) {
1386 pad->cd(iPad+1)->SetLogx();
1388 if (padOption.Contains(
"gridy")) pad->cd(iPad+1)->SetGridy();
1389 if (padOption.Contains(
"gridx")) pad->cd(iPad+1)->SetGridx();
1390 if (padOption.Contains(
"timex")) isTimeX=kTRUE;
1391 if (padOption.Contains(
"timey")) isTimeY=kTRUE;
1392 padSetup.Remove(0,padSetup.First(
';')+1);
1395 TObjArray * padDrawList= padSetup.Tokenize(
";");
1396 Double_t hisMin=0, hisMax=-1;
1398 TGraphErrors * grToDraw=0;
1400 for (Int_t ihis=0; ihis<padDrawList->GetEntries(); ihis++){
1401 TObjArray *hisDescription= TString(padDrawList->At(ihis)->GetName()).
Tokenize(
"()");
1402 THn * his = (THn*)hisArray->FindObject(hisDescription->At(0)->GetName());
1403 if (his==NULL)
continue;
1405 ::Info(
"AliTreePlayer::DrawHistograms",
"Pad %d. Processing his %s",iPad, hisDescription->At(0)->GetName());
1407 Int_t ndim=his->GetNdimensions();
1408 TString rangeDescription(hisDescription->At(1)->GetName());
1409 Int_t ndimRange= (rangeDescription.CountChar(
','));
1410 if (ndimRange>0) ndimRange=ndimRange/2+1;
1412 TObjArray *rangeArray=rangeDescription.Tokenize(
",");
1413 for (Int_t iDim=0; iDim<ndimRange; iDim++){
1414 if (rangeArray->At(iDim*2)->GetName()[0]==
'U') {
1415 Double_t min=TString(&(rangeArray->At(iDim*2)->GetName()[1])).Atof();
1416 Double_t max=TString(&(rangeArray->At(iDim*2+1)->GetName()[1])).Atof();
1418 ::Info(
"AliTreePlayer::DrawHistograms",
"Pad %d. %s.GetAxis(%d).SetRangeUser(%f,%f).",iPad,hisDescription->At(0)->GetName(), iDim, min,max);
1420 his->GetAxis(iDim)->SetRangeUser(min,max);
1422 Int_t min=TString((rangeArray->At(iDim*2)->GetName())).Atoi();
1423 Int_t max=TString((rangeArray->At(iDim*2+1)->GetName())).Atoi();
1425 ::Info(
"AliTreePlayer::DrawHistograms",
"Pad %d. %s.GetAxis(%d).SetRange(%d,%d).",iPad,hisDescription->At(0)->GetName(), iDim, min,max);
1427 his->GetAxis(iDim)->SetRange(min,max);
1432 TString drawOption = hisDescription->At(3)->GetName();
1433 drawOption.ToLower();
1434 TString projString=hisDescription->At(2)->GetName();
1435 Int_t nDims = projString.CountChar(
',')+1;
1440 hProj=his->Projection(projString.Atoi());
1445 Int_t dim0 = projString.Atoi();
1446 Int_t dim1 = TString(&(projString[2])).Atoi();
1447 TH2* his2D =his->Projection(dim0,dim1);
1448 for (Int_t iProj=0; iProj<8; iProj++){
1449 if (drawOption.Contains(projType[iProj])){
1454 gr->SetTitle(padDrawList->At(ihis)->GetName());
1455 gr->GetXaxis()->SetTitle(his2D->GetXaxis()->GetTitle());
1456 gr->GetYaxis()->SetTitle(his2D->GetYaxis()->GetTitle());
1457 drawOption.ReplaceAll(projType[iProj].Data(),
"");
1463 Double_t grMinI=TMath::MinElement(gr->GetN(),gr->GetY())-3.*TMath::Median(gr->GetN(),gr->GetEY());
1464 Double_t grMaxI=TMath::MaxElement(gr->GetN(),gr->GetY())+3.*TMath::Median(gr->GetN(),gr->GetEY());
1465 if (hisMax<hisMin) {hisMin=grMinI; hisMax=grMaxI;}
1466 if (hisMax<grMaxI) hisMax=grMaxI;
1467 if (hisMin>grMinI) hisMin=grMinI;
1470 gr->Draw((drawOption+
"a").Data());
1471 legend->AddEntry(gr,
"",
"p");
1474 gr->Draw(drawOption.Data());
1475 legend->AddEntry(gr,
"",
"p");
1477 if (keepArray) keepArray->AddLast(gr);
1480 hProj->SetMarkerColor(ihis+1);
1481 hProj->SetLineColor(ihis+1);
1482 hProj->SetMarkerStyle(21+ihis);
1483 if (keepArray) keepArray->AddLast(hProj);
1485 if (hisMax<hisMin) {
1486 hisMin=hProj->GetMinimum();
1487 hisMax=hProj->GetMaximum();
1489 if (hisMax<hProj->GetMaximum()) hisMax=hProj->GetMaximum();
1490 if (hisMin>hProj->GetMinimum()) hisMin=hProj->GetMinimum();
1493 hProj->Draw((TString(hisDescription->At(3)->GetName())+
"").Data());
1494 legend->AddEntry(hProj);
1497 hProj->Draw((TString(hisDescription->At(3)->GetName())+
"same").Data());
1498 legend->AddEntry(hProj);
1503 if (hisToDraw!=NULL){
1504 hisToDraw->SetMaximum(hisMax+(hisMax-hisMin)/2.);
1505 if (hisMin<=0) hisMin=TMath::Min(0.01, hisMax*0.01);
1506 hisToDraw->SetMinimum(hisMin);
1508 hisToDraw->SetMaximum(hisMax*TMath::Max(10.,(hisMax/hisMin)/4.));
1511 if ((verbose&0x8)>0){
1512 ::Info(
"AliTreePlayer::DrawHistograms:",
"Pad %d. %s SetMinimum(%f). SetMaximum(%f)",iPad,padDrawList->At(0)->GetName(), hisMin,hisMax+(hisMax-hisMin)/2.);
1514 if (isTimeX) hisToDraw->GetXaxis()->SetTimeDisplay(1);
1515 if (isTimeY) hisToDraw->GetYaxis()->SetTimeDisplay(1);
1516 pad->cd(iPad+1)->Modified();
1517 pad->cd(iPad+1)->Update();
1518 legend->Draw(
"same");
1520 if (grToDraw!=NULL){
1521 grToDraw->SetMaximum(hisMax+(hisMax-hisMin)/2.);
1522 grToDraw->SetMinimum(hisMin-(hisMax-hisMin)/3.);
1523 if (isTimeX) grToDraw->GetXaxis()->SetTimeDisplay(1);
1524 if (isTimeY) grToDraw->GetYaxis()->SetTimeDisplay(1);
1526 if ((verbose&0x8)>0){
1527 ::Info(
"AliTreePlayer::DrawHistograms:",
"Pad %d. %s SetMinimum(%f). SetMaximum(%f)",iPad,padDrawList->At(0)->GetName(), hisMax+(hisMax-hisMin)/2.,hisMin-(hisMax-hisMin)/3.);
1530 pad->cd(iPad+1)->Modified();
1531 pad->cd(iPad+1)->Update();
1532 legend->Draw(
"same");
1553 if (tree->GetEstimate()<tree->GetEntries()) tree->SetEstimate(tree->GetEntries());
1555 if (firstEntry>=0 && nEntries>0) {
1556 entries = tree->Draw(varList.Data(),selection,
"goffpara",nEntries,firstEntry);
1558 entries = tree->Draw(varList.Data(),selection,
"goffpara");
1560 TObjArray * varName=varList.Tokenize(
":");
1561 const Int_t nVars=varName->GetEntries();
1562 Double_t vars[nVars];
1563 TTree *treeOut=NULL;
1564 for (Int_t iPoint=0; iPoint <entries; iPoint++){
1565 for (Int_t iVar=0; iVar<nVars; iVar++){
1566 vars[iVar]=tree->GetVal(iVar)[iPoint];
1567 if (iPoint==0) (*pcstream)<<outTree.Data()<<TString::Format(
"%s=",varName->At(iVar)->GetName()).Data()<<vars[iVar];
1570 (*pcstream)<<outTree.Data()<<
"\n";
1571 treeOut=((*pcstream)<<outTree.Data()).
GetTree();
1587 TTree*
AliTreePlayer::LoadTrees(
const char *inputDataList,
const char *chRegExp,
const char *chNotReg, TString inputFileSelection, TString axisAlias, TString axisTitle) {
1589 TPRegexp regExp(chRegExp);
1590 TPRegexp notReg(chNotReg);
1591 TObjArray *regExpArray = inputFileSelection.Tokenize(
":");
1592 TObjArray *residualMapList = gSystem->GetFromPipe(inputDataList).Tokenize(
"\n");
1593 Int_t nFiles = residualMapList->GetEntries();
1594 TTree *treeBase = 0;
1595 TObjArray *arrayAxisAlias = axisAlias.Tokenize(
":");
1596 TObjArray *arrayAxisTitle = axisTitle.Tokenize(
":");
1597 std::map<string,string> tagValue;
1600 for (Int_t iFile = 0; iFile < nFiles; iFile++) {
1603 for (Int_t jFile=iFile;jFile<nFiles; jFile++){
1604 TString name = residualMapList->At(jFile)->GetName();
1606 Int_t first=name.First(
":");
1607 TString tag=name(1,name.First(
":")-1);
1608 TString value=name(name.First(
":")+1,name.Length());
1609 tagValue[tag.Data()]=value.Data();
1615 TString
fileName = residualMapList->At(iFile)->GetName();
1616 Bool_t isSelected = kTRUE;
1618 if (regExpArray->GetEntries() > 0) {
1619 isSelected = kFALSE;
1620 for (Int_t entry = 0; entry < regExpArray->GetEntries(); entry++) {
1621 TPRegexp reg(regExpArray->At(entry)->GetName());
1622 if (reg.Match(fileName)) isSelected |= kTRUE;
1625 if (!isSelected)
continue;
1626 ::Info(
"LoadTrees",
"Load file\t%s", fileName.Data());
1627 TString description =
"";
1629 if (finput == NULL) {
1630 ::Error(
"MakeResidualDistortionReport",
"Invalid file name %s", fileName.Data());
1633 TList *keys = finput->GetListOfKeys();
1634 Int_t isLegend = kFALSE;
1636 for (Int_t iKey = 0; iKey < keys->GetEntries(); iKey++) {
1637 if (regExp.Match(keys->At(iKey)->GetName()) == 0)
continue;
1638 if (notReg.Match(keys->At(iKey)->GetName()) != 0)
continue;
1639 TTree *
tree = (TTree *) finput->Get(keys->At(iKey)->GetName());
1640 if (treeBase == NULL) {
1642 treeBase = (TTree *) finput2->Get(keys->At(iKey)->GetName());
1644 TString fileTitle=tagValue[
"Title"];
1645 if (fileTitle.Length()){
1646 treeBase->AddFriend(tree, TString::Format(
"%s.%s", fileTitle.Data(), keys->At(iKey)->GetName()).Data());
1648 treeBase->AddFriend(tree, TString::Format(
"%s", keys->At(iKey)->GetName()).Data());
1650 Int_t entriesF = tree->GetEntries();
1651 Int_t entriesB = treeBase->GetEntries();
1652 if (entriesB == entriesF) {
1653 ::Info(
"InitMapTree",
"%s\t%s.%s:\t%d\t%d", treeBase->GetName(), fileName.Data(), keys->At(iKey)->GetName(), entriesB, entriesF);
1655 ::Error(
"InitMapTree",
"%s\t%s.%s:\t%d\t%d", treeBase->GetName(), fileName.Data(), keys->At(iKey)->GetName(), entriesB, entriesF);
1661 for (Int_t iAxis = 0; iAxis < arrayAxisAlias->GetEntries(); iAxis++) {
1662 treeBase->SetAlias(arrayAxisAlias->At(iAxis)->GetName(), TString::Format(
"%s%dCenter", arrayAxisAlias->At(iAxis)->GetName(), iAxis + 1).Data());
1663 TStatToolkit::AddMetadata(treeBase, TString::Format(
"%s.AxisTitle", arrayAxisAlias->At(iAxis)->GetName()).Data(), arrayAxisTitle->At(iAxis)->GetName());
static TString printSelectedTreeInfo(TTree *tree, TString infoType, TString regExpFriend, TString regExpTag, Int_t verbose)
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
TFile * Open(const char *filename, Long64_t &nevents)
static TPad * DrawHistograms(TPad *pad, TObjArray *hisArray, TString drawExpression, TObjArray *keepArray=0, Int_t verbose=0)
static TObjArray * selectTreeInfo(TTree *tree, TString query, Int_t verbose)
static TTree * LoadTrees(const char *inputDataList, const char *chRegExp, const char *chNotReg, TString inputFileSelection, TString axisAlias, TString axisTitle)
LoadTrees and and append friend trees.
static Int_t GetStatType(const TString &stat)
TTreeSRedirector * pcstream
strP3 Tokenize("+") -> Print()
TString fileName(const char *dir, int runNumber, const char *da, int i, const char *type)
Set of functions to extend functionality of the TTreePlayer.
static TObjArray * selectMetadata(TTree *tree, TString query, Int_t verbose, TString *idList=NULL)
static TObjArray * MakeHistograms(TTree *tree, TString hisString, TString defaultCut, Int_t firstEntry, Int_t lastEntry, Int_t chunkSize=-1, Int_t verbose=1)
static Long64_t BinarySearchSmaller(Long64_t n, const T *array, T value)
static Int_t selectWhatWhereOrderBy(TTree *tree, TString what, TString where, TString orderBy, Int_t firstentry, Int_t nentries, TString outputFormat, TString outputName)
static void AddStatInfo(TTree *treeLeft, TTree *treeRight, const TString refQuery, Double_t deltaT, const TString statString="median:medianLeft:medianRight:RMS:Mean:LTM0.60:LTMRMS0.60:Max:Min", Int_t maxEntries=100000000)
static void MakeCacheTree(TTree *tree, TString varList, TString outFile, TString outTree, TCut selection, Int_t nEntries=-1, Int_t firstEntry=0)
Fill tree with information specified in varList of TTreeFormulas Used to cache CPU consuming formulas...
TTree * GetTree(Int_t ievent)