38 #include "Riostream.h"
45 #include "TFriendElement.h"
47 #include "TTreeFormula.h"
48 #include "TTreeFormulaManager.h"
50 #include "TEntryList.h"
53 #include "AliSysInfo.h"
91 TObjArray *queryArray=query.Tokenize(
"[=]");
95 if (queryArray->GetEntries()>1) {
96 TString stringFormula=
"";
97 varArray = TString(queryArray->At(1)->GetName()).
Tokenize(
"\"&|!()[]+-/");
98 vecParam.ResizeTo(varArray->GetEntriesFast());
99 stringFormula=queryArray->At(1)->GetName();
100 stringFormula.ReplaceAll(
"\"",
"");
101 for (Int_t ivar=0; ivar<varArray->GetEntriesFast(); ivar++){
102 stringFormula.ReplaceAll(varArray->At(ivar)->GetName(),TString::Format(
"x[%d]",ivar).Data());
105 pFormula=
new TFormula(
"printMetadataFromula",stringFormula.Data());
106 if (verbose&0x2) pFormula->Print();
109 if (queryArray->GetEntriesFast()<=0 ){
112 if (queryArray->GetEntriesFast()>2) {
120 Int_t entries = metaData->GetEntries();
122 for (Int_t ientry=0;ientry<entries; ientry++){
123 TString index=metaData->At(ientry)->GetName();
124 if (strstr(metaData->At(ientry)->GetName(),queryArray->At(0)->GetName())==NULL)
continue;
125 Bool_t isSelected=
kTRUE;
126 if (queryArray->GetEntriesFast()>1){
127 for (Int_t ipar=0; ipar< vecParam.GetNrows(); ipar++){
128 vecParam[ipar]=strstr(metaData->At(ientry)->GetTitle(),varArray->At(ipar)->GetName())!=NULL;
130 isSelected=pFormula->EvalPar(vecParam.GetMatrixArray());
132 vecParam.GetMatrixArray();
136 selected->AddLast(metaData->At(ientry));
138 printf(
"%s:%s:%d\n",metaData->At(ientry)->GetName(),metaData->At(ientry)->GetTitle(),isSelected);
167 TObjArray *queryArray=query.Tokenize(
"&|()!");
168 Int_t formulaEntries=queryArray->GetEntries();
169 for (Int_t i=0;i<formulaEntries; i++){
170 if (TString(queryArray->At(i)->GetName()).ReplaceAll(
" ",
"").Length()<=0) queryArray->RemoveAt(i);
172 queryArray->Compress();
173 formulaEntries=queryArray->GetEntries();
174 if (formulaEntries<=0){
175 ::Error(
"selectTreeInfo",
"Empty or wrong selection %s", query.Data());
180 TString stringFormula=query;
182 TVectorF formType(formulaEntries);
183 TVectorF formExact(formulaEntries);
186 for (Int_t ivar=0; ivar<formulaEntries; ivar++){
187 TString formName=queryArray->At(ivar)->GetName();
188 stringFormula.ReplaceAll(queryArray->At(ivar)->GetName(),TString::Format(
"x[%d]",ivar).Data());
189 formName.ReplaceAll(
" ",
"");
190 formName.ReplaceAll(
"\t",
"");
191 TObjArray *tokenArray=formName.Tokenize(
"[=:]");
192 if (tokenArray->GetEntries()<2){
193 ::Error(
"selectTreeInfo",
"Wrong subformula %s",formName.Data());
194 ::Error(
"selectTreeInfo",
"Full formula was %s",query.Data());
201 formMatch[ivar]=tokenArray->At(1);
202 formMatchType[ivar]=tokenArray->At(0);
203 TString queryType(tokenArray->At(0)->GetName());
206 if (queryType.Contains(
".name",TString::kIgnoreCase)){
209 if (formName.Contains(
":")){
216 TFormula *pFormula=
new TFormula(
"printMetadataFormula",stringFormula.Data());
218 ::Info(
"selectTreeInfo",
"Formula:");
220 ::Info(
"selectTreeInfo",
"Query array:");
222 ::Info(
"selectTreeInfo",
"To match array:");
224 ::Info(
"selectTreeInfo",
"Exact type:");
232 if (tree->GetListOfFriends()!=NULL) nTrees+=tree->GetListOfFriends()->GetEntries();
233 for (Int_t iTree=0; iTree<nTrees; iTree++){
234 TTree * cTree =
tree;
235 if (iTree>0) cTree=tree->GetFriend(tree->GetListOfFriends()->At(iTree-1)->GetName());
236 if (cTree==NULL)
continue;
237 for (Int_t itype=0; itype<2; itype++){
240 TSeqCollection* elemList=0;
241 if (itype==0) elemList=cTree->GetListOfBranches();
242 if (itype==1) elemList=cTree->GetListOfAliases();
243 if (elemList==NULL)
continue;
244 Int_t elemEntries=elemList->GetEntries();
245 for (Int_t ientry=0; ientry<elemEntries; ientry++){
246 TString elemName(elemList->At(ientry)->GetName());
248 for (Int_t icheck=0; icheck<formulaEntries; icheck++){
250 if (formType[icheck]==0){
251 if (formExact[icheck]==1) formValue[icheck]=(elemName==formMatch.At(icheck)->GetName());
252 if (formExact[icheck]==0) formValue[icheck]=(strstr(elemName.Data(),formMatch.UncheckedAt(icheck)->GetName())!=NULL);
254 if (formType[icheck]==1){
255 TObject* metaObject =
TStatToolkit::GetMetadata(cTree,TString::Format(
"%s%s",elemName.Data(), formMatchType.UncheckedAt(icheck)->GetName()).Data());
257 TString metaName(metaObject->GetTitle());
258 if (formExact[icheck]==1) formValue[icheck]=(metaName==formMatch.At(icheck)->GetName());
259 if (formExact[icheck]==0) formValue[icheck]=(strstr(metaName.Data(),formMatch.UncheckedAt(icheck)->GetName())!=NULL);
263 Bool_t isSelected=pFormula->EvalPar(formValue.GetMatrixArray());
265 if (iTree==0) selected->AddLast(
new TObjString(elemList->At(ientry)->GetName()));
266 if (iTree>0) selected->AddLast(
new TObjString(TString::Format(
"%s.%s",tree->GetListOfFriends()->At(iTree-1)->GetName(),elemList->At(ientry)->GetName())));
267 if (verbose&0x1)
printf(
"%s\n",elemName.Data());
308 TList * treeFriends = tree->GetListOfFriends();
309 Int_t ntrees = 1+( (treeFriends!=NULL)?treeFriends->GetEntries():0 );
310 TPRegexp pregExpFriend=regExpFriend;
311 TPRegexp pregExpTag=regExpTag;
312 const char* dataTypes[3]={
"branch",
"alias",
"metaData"};
313 for (Int_t itree=0; itree<ntrees; itree++){
314 TTree * currentTree = 0;
317 if (pregExpFriend.Match(currentTree->GetName())==0)
continue;
319 if (pregExpFriend.Match(treeFriends->At(itree-1)->GetName())==0)
continue;
320 currentTree = ((TFriendElement*)(treeFriends->At(itree-1)))->GetTree();
324 ::Info(
"printSelectedTreeInfo",
"tree %s selected", currentTree->GetName());
326 for (Int_t iDataType=0; iDataType<3; iDataType++){
327 if (infoType.Contains(dataTypes[iDataType], TString::kIgnoreCase)==0)
continue;
329 if (iDataType==0) selList=(TList*)currentTree->GetListOfBranches();
330 if (iDataType==1) selList=(TList*)currentTree->GetListOfAliases();
331 if (iDataType==2 && tree->GetUserInfo()) selList=(TList*)(currentTree->GetUserInfo()->FindObject(
"metaTable"));
333 if (selList==NULL)
continue;
334 Int_t selListEntries=selList->GetEntries();
335 for (Int_t iEntry=0; iEntry<selListEntries; iEntry++){
336 if (pregExpTag.Match(selList->At(iEntry)->GetName())<=0)
continue;
338 ::Info(
" printSelectedTreeInfo",
"%s.%s", currentTree->GetName(),selList->At(iEntry)->GetName());
340 if (result.Length()>0) result+=
":";
342 result+=treeFriends->At(itree-1)->GetName();
345 result+=selList->At(iEntry)->GetName();
369 if (tree==NULL || tree->GetPlayer()==NULL){
370 ::Error(
"AliTreePlayer::selectWhatWhereOrderBy",
"Input tree not defiend");
374 if (firstentry +nentries >tree->GetEntriesFriend()) nentries=tree->GetEntriesFriend()-firstentry;
375 if (tree->GetEntryList()){
376 if (tree->GetEntryList()->GetN()<nentries) nentries=tree->GetEntryList()->GetN();
380 Bool_t isHTML=outputFormat.Contains(
"html",TString::kIgnoreCase );
381 Bool_t isCSV=outputFormat.Contains(
"csv",TString::kIgnoreCase);
382 Bool_t isElastic=outputFormat.Contains(
"elastic",TString::kIgnoreCase);
383 Bool_t isJSON=outputFormat.Contains(
"json",TString::kIgnoreCase)||isElastic;
386 FILE *default_fp = stdout;
387 if (outputName.Length()>0){
388 default_fp=fopen (outputName.Data(),
"w");
391 Int_t nCols=fArray->GetEntries();
393 TTreeFormula ** rFormulaList =
new TTreeFormula*[nCols+1];
394 TObjString **printFormatList =
new TObjString*[nCols];
395 TObjString **columnNameList =
new TObjString*[nCols];
396 TObjString **outputFormatList =
new TObjString*[nCols];
397 Bool_t isIndex[nCols];
398 Bool_t isParent[nCols];
399 TPRegexp indexPattern(
"^%I");
400 TPRegexp parentPattern(
"^%P");
401 for (Int_t iCol=0; iCol<nCols; iCol++){
403 if (arrayDesc->GetEntries()<=0) {
404 ::Error(
"AliTreePlayer::selectWhatWhereOrderBy",
"Invalid descriptor %s", arrayDesc->At(iCol)->GetName());
407 TString fieldName=arrayDesc->At(0)->GetName();
408 if (fieldName.Contains(indexPattern)){
410 indexPattern.Substitute(fieldName,
"");
412 isIndex[iCol]=kFALSE;
414 if (fieldName.Contains(parentPattern)){
415 isParent[iCol]=
kTRUE;
416 parentPattern.Substitute(fieldName,
"");
418 isParent[iCol]=kFALSE;
421 TTreeFormula * formula =
new TTreeFormula(fieldName.Data(), fieldName.Data(),
tree);
422 if (formula->GetTree()==NULL){
423 ::Error(
"AliTreePlayer::selectWhatWhereOrderBy",
"Invalid formula %s, parsed from the original string %s",fieldName.Data(),what.Data());
424 if (isJSON==kFALSE)
return -1;
426 TString printFormat=
"";
427 TString colName=arrayDesc->At(0)->GetName();
428 TString outputFormat=
"";
430 if (arrayDesc->At(1)!=NULL){
431 printFormat=arrayDesc->At(1)->GetName();
433 if (formula->IsInteger()) {
439 if (arrayDesc->At(2)!=NULL) {
440 colName=arrayDesc->At(2)->GetName();
442 colName=arrayDesc->At(0)->GetName();
445 if (arrayDesc->At(3)!=NULL){
446 outputFormat= arrayDesc->At(3)->GetName();
449 if (formula->IsInteger()) outputFormat=
"/I";
450 if (formula->IsString()) outputFormat=
"/C";
452 fFormulaList->AddLast(formula);
453 rFormulaList[iCol]=formula;
454 printFormatList[iCol]=
new TObjString(printFormat);
455 outputFormatList[iCol]=
new TObjString(outputFormat);
456 columnNameList[iCol]=
new TObjString(colName);
458 TTreeFormula *select =
new TTreeFormula(
"Selection",where.Data(),
tree);
459 fFormulaList->AddLast(select);
460 rFormulaList[nCols]=select;
463 Bool_t hasArray = kFALSE;
464 Bool_t forceDim = kFALSE;
465 for (Int_t iCol=0; iCol<nCols; iCol++){
466 rFormulaList[iCol]->UpdateFormulaLeaves();
468 switch( rFormulaList[iCol]->GetManager()->GetMultiplicity() ) {
485 fprintf(default_fp,
"<table>");
486 fprintf(default_fp,
"<tr>");
487 for (Int_t iCol=0; iCol<nCols; iCol++){
488 fprintf(default_fp,
"<th>%s</th>",columnNameList[iCol]->GetName());
490 fprintf(default_fp,
"<tr>");
494 for (Int_t iCol=0; iCol<nCols; iCol++){
495 fprintf(default_fp,
"%s%s",columnNameList[iCol]->GetName(), outputFormatList[iCol]->GetName());
497 fprintf(default_fp,
":");
499 fprintf(default_fp,
"\n");
505 for (Int_t ientry=firstentry; ientry<firstentry+nentries; ientry++){
506 Int_t entryNumber = tree->GetEntryNumber(ientry);
507 if (entryNumber < 0)
break;
508 Long64_t localEntry = tree->LoadTree(entryNumber);
510 if (tnumber != tree->GetTreeNumber()) {
511 tnumber = tree->GetTreeNumber();
512 for(Int_t iCol=0;iCol<nCols;iCol++) {
513 rFormulaList[iCol]->UpdateFormulaLeaves();
515 select->UpdateFormulaLeaves();
519 if (select->EvalInstance(0) == 0) {
528 fprintf(default_fp,
"}\n{\"index\":{\"_id\": \"");
531 fprintf(default_fp,
"},\n{\n");
535 fprintf(default_fp,
"{\"index\":{\"_id\": \"");
537 fprintf(default_fp,
"{{\n");
540 for (Int_t icol=0; icol<nCols; icol++){
541 if (rFormulaList[icol]->
GetTree()==NULL)
continue;
542 Int_t nData=rFormulaList[icol]->GetNdata();
543 if (isElastic==kFALSE){
544 fprintf(default_fp,
"\t\"%s\":",rFormulaList[icol]->GetName());
546 if (isIndex[icol]==kFALSE && isParent[icol]==kFALSE){
547 TString fieldName(rFormulaList[icol]->GetName());
548 fieldName.ReplaceAll(
".",
"%_");
549 if (icol>0 && isIndex[icol-1]==kFALSE && isParent[icol-1]==kFALSE ){
550 fprintf(default_fp,
"\t,\"%s\":",fieldName.Data());
552 fprintf(default_fp,
"\t\"%s\":",fieldName.Data());
557 if ((isIndex[icol]==kFALSE)&&(isParent[icol]==kFALSE)){
558 if (isElastic && rFormulaList[icol]->IsString()){
559 fprintf(default_fp,
"\t\"%s\"",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
561 fprintf(default_fp,
"\t%s",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
565 fprintf(default_fp,
"%s",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
566 if (isIndex[icol+1]){
567 fprintf(default_fp,
".");
569 if (isParent[icol+1]==kFALSE){
570 fprintf(default_fp,
"\"}}\n{");
573 if (isParent[icol]==
kTRUE){
574 fprintf(default_fp,
"\", \"parent\": \"%s\"}}\n{",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
577 fprintf(default_fp,
"\t[");
578 for (Int_t iData=0; iData<nData;iData++){
579 fprintf(default_fp,
"%f",rFormulaList[icol]->EvalInstance(iData));
581 fprintf(default_fp,
",");
583 fprintf(default_fp,
"]");
594 fprintf(default_fp,
"<tr>\n");
595 for (Int_t icol=0; icol<nCols; icol++){
596 Int_t nData=rFormulaList[icol]->GetNdata();
598 fprintf(default_fp,
"\t<td>%s</td>",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
600 fprintf(default_fp,
"\t<td>");
601 for (Int_t iData=0; iData<nData;iData++){
602 fprintf(default_fp,
"%f",rFormulaList[icol]->EvalInstance(iData));
604 fprintf(default_fp,
",");
606 fprintf(default_fp,
"</td>");
610 fprintf(default_fp,
"\n");
612 fprintf(default_fp,
"</tr>\n");
616 for (Int_t icol=0; icol<nCols; icol++){
617 Int_t nData=rFormulaList[icol]->GetNdata();
619 fprintf(default_fp,
"%s\t",rFormulaList[icol]->PrintValue(0,0,printFormatList[icol]->GetName()));
621 for (Int_t iData=0; iData<nData;iData++){
622 fprintf(default_fp,
"%f",rFormulaList[icol]->EvalInstance(iData));
624 fprintf(default_fp,
",");
626 fprintf(default_fp,
"\t");
631 fprintf(default_fp,
"\n");
634 if (isJSON) fprintf(default_fp,
"}\n");
636 fprintf(default_fp,
"</table>");
639 if (default_fp!=stdout) fclose (default_fp);
657 if(!stat.CompareTo(
"median",TString::kIgnoreCase)){
659 }
else if(!stat.CompareTo(
"medianLeft",TString::kIgnoreCase)){
661 }
else if(!stat.CompareTo(
"medianRight",TString::kIgnoreCase)){
663 }
else if(!stat.CompareTo(
"RMS",TString::kIgnoreCase)){
665 }
else if(!stat.CompareTo(
"Mean",TString::kIgnoreCase)){
667 }
else if(stat.BeginsWith(
"LTMRMS",TString::kIgnoreCase)){
669 }
else if(stat.BeginsWith(
"LTM",TString::kIgnoreCase)){
672 ::Error(
"GetStatType()",
"Cannot decode string \"%s\"."
673 " Use one of \"median\", \"medianLeft\", \"medianRight\", \"RMS\", or \"Mean\". "
674 " Also supported is \"LTM\", or \"LTMRMS\", which should be succeeded by a float like"
675 " \"LTM0.95\" or an integer (interpreted as percentage) like \"LTMRMS95\" to specify "
676 " the fraction of data to be kept."
677 " Use a colon separated list like \"median:medianLeft:medianRight:RMS\""
678 " as the fifth argument to the AddStatInfo().",stat.Data());
684 const TString statString,
691 treeRight->SetEstimate(treeRight->GetEntries()*540);
692 Int_t entries = treeRight->Draw(refQuery.Data(),
"",
"goffpara",maxEntries);
694 ::Error(
"AddStatInfo",
"No matching entries for query");
697 Int_t * indexArr =
new Int_t[entries];
698 TMath::Sort(entries, treeRight->GetV1(), indexArr,kFALSE);
699 Double_t * coordArray =
new Double_t[entries];
700 for (Int_t icoord=0; icoord<entries; icoord++) coordArray[icoord]=treeRight->GetV1()[indexArr[icoord]];
709 if(!refQuery.Tokenize(var,from,
":")){
710 ::Error(
"AddStatInfo",
"Cannot tokenize query \'%s\'. Use colon separated list"
712 delete[]indexArr;indexArr=0;
713 delete[]coordArray;coordArray=0;
716 Int_t entriesCoord = treeLeft->GetEntries();
717 TBranch * br = treeLeft->GetBranch(var.Data());
719 br->SetAddress(&coordValue);
722 while(refQuery.Tokenize(var,from,
":")){
726 while(statString.Tokenize(stat,fromStat,
":")){
730 if(statType==
kUndef)
continue;
737 tmp.ReplaceAll(
"LTMRMS",
"");
738 tmp.ReplaceAll(
"LTM",
"");
740 if(frac>1)frac/=100.;
744 Double_t leftOffset=-1e99,rightOffset=-1e99;
747 leftOffset=-deltaT;rightOffset=deltaT;
749 leftOffset=-2.*deltaT;rightOffset=0.;
751 leftOffset=0.;rightOffset=2.*deltaT;
754 TString brName=Form(
"%s_%s",var.Data(),stat.Data());
755 brName.ReplaceAll(
"[",
"_");
756 brName.ReplaceAll(
"]",
"_");
757 brName.ReplaceAll(
".",
"_");
758 Double_t statValue=0;
759 TBranch *brToFill = treeLeft->Branch(brName.Data(),&statValue, (brName+
"/D").Data());
762 for (Int_t icoord=0; icoord<entriesCoord; icoord++){
764 br->GetEntry(icoord);
765 Double_t startCoord=coordValue+leftOffset;
766 Double_t endCoord =coordValue+rightOffset;
772 Int_t index1=TMath::BinarySearch(entries, coordArray, endCoord) +1;
774 if (index1>=0 && index0>=0){
776 for (Int_t i=0; i<index1-index0; i++){
777 dvalues[i]=treeRight->GetV2()[indexArr[i+index0]];
782 statValue=TMath::Median(index1-index0, dvalues.GetMatrixArray());
783 }
else if(statType==
kRMS){
784 statValue=TMath::RMS(index1-index0, dvalues.GetMatrixArray());
785 }
else if(statType==
kMean){
786 statValue=TMath::Mean(index1-index0, dvalues.GetMatrixArray());
787 }
else if(statType==
kLTM){
791 statValue = params[1];
796 statValue = params[2];
798 ::Error(
"AddStatInfo()",
"String %s StatType %d not implemented",stat.Data(),statType);
814 brToFill->FlushBaskets();
818 delete[]indexArr;indexArr=0;
819 delete[]coordArray;coordArray=0;
877 const Int_t kMaxDim=10;
878 Int_t entriesAll=tree->GetEntriesFast();
879 if (chunkSize<=0) chunkSize=entriesAll;
880 if (lastEntry>entriesAll) lastEntry=entriesAll;
882 TObjArray *hisDescriptionList=hisString.Tokenize(
";");
883 Int_t nHistograms = hisDescriptionList->GetEntries();
888 TArrayI hisDims(nHistograms);
890 Int_t nExpressions=hisString.CountChar(
':')+hisString.CountChar(
';')+1;
892 TString queryString =
"";
898 for (Int_t iHis=0; iHis<nHistograms; iHis++){
899 TString hisDescription = hisDescriptionList->At(iHis)->GetName();
900 Int_t hisIndex=hisDescription.Index(
">>");
903 ::Error(
"AliTreePlayer::MakeHistograms",
"Invalid expression %s",hisDescription.Data());
906 hisDescriptionArray->AddAtAndExpand(
new TObjString(((hisDescriptionList->At(iHis)->GetName()))+(hisIndex+2)),iHis);
908 hisDescription.Remove(hisIndex);
909 TObjArray *hisDimArray=hisDescription.Tokenize(
":");
910 Int_t nDims=hisDimArray->GetEntries();
913 ::Error(
"AliTreePlayer::MakeHistograms",
"Invalid description %s",hisDescription.Data());
918 if (hisDimArray->At(nDims-1)->GetName()[0]==
'#'){
919 TString formulaName=&((hisDimArray->At(nDims-1)->GetName())[1]);
921 TObjString *tFormula =
new TObjString(formulaName.Data());
922 hisWeightArray->AddAt(tFormula,iHis);
923 if (formulaArray->FindObject(formulaName.Data())==NULL){
924 formulaArray->AddLast(tFormula);
925 varArray->AddAt(tFormula,nDims);
928 for (Int_t iDim=0; iDim<nDims;iDim++){
929 TObjString *tFormula = (TObjString*) (formulaArray->FindObject(hisDimArray->At(iDim)->GetName()));
931 tFormula =
new TObjString(hisDimArray->At(iDim)->GetName());
932 formulaArray->AddLast(tFormula);
934 varArray->AddAt(tFormula,iDim);
936 hisFormulaArray->AddAt(varArray,iHis);
941 Int_t nFormulas=formulaArray->GetEntries();
942 for (Int_t iFor=0; iFor<nFormulas; iFor++){
943 queryString+=formulaArray->At(iFor)->GetName();
946 queryString+=formulaArray->At(nFormulas-1)->GetName();
947 if (verbose&0x2) hisDescriptionArray->Print();
948 if (verbose&0x4) formulaArray->Print();
953 for (Int_t bEntry=firstEntry; bEntry<lastEntry; bEntry+=chunkSize){
954 AliSysInfo::AddStamp(TString::Format(
"Begin.%s",tree->GetName()).Data(),0, bEntry);
955 Int_t toQuery=TMath::Min(chunkSize, lastEntry-bEntry);
956 Int_t qLength = tree->Draw(queryString,defaultCut,
"goffpara",toQuery, bEntry);
957 if (qLength>tree->GetEstimate()){
958 tree->SetEstimate(qLength*1.5);
959 qLength = tree->Draw(queryString,defaultCut,
"goffpara",chunkSize, bEntry);
963 if (hisArray->GetEntriesFast()==0){
964 for (Int_t iHis=0; iHis<nHistograms; iHis++){
965 if (hisDescriptionArray->At(iHis)==NULL){
966 ::Error(
"AliTreePlayer::MakeHistograms",
"Empty description %d",iHis);
969 TString hisDescription= hisDescriptionArray->At(iHis)->GetName();
970 TString varDecription=hisDescriptionList->At(iHis)->GetName();
971 TObjArray * descriptionArray=hisDescription.Tokenize(
"(,)");
972 TObjArray * varArray= TString(hisDescriptionList->At(iHis)->GetName()).
Tokenize(
":");
973 Int_t nLength=descriptionArray->GetEntries();
974 if ((nLength-1)/3 < hisDims[iHis]){
975 ::Error(
"AliTreePlayer::MakeHistograms",
"Histogram dimension Mismatch %s", hisDescriptionArray->At(iHis)->GetName());
978 if (varArray->GetEntries()<hisDims[iHis]){
979 ::Error(
"AliTreePlayer::MakeHistograms",
"Variable mismatch %s", hisDescriptionArray->At(iHis)->GetName());
982 TString hName(descriptionArray->At(0)->GetName());
984 Int_t
nBins[kMaxDim];
985 Double_t xMin[kMaxDim], xMax[kMaxDim];
986 for (Int_t iDim=0; iDim<hisDims[iHis]; iDim++){
987 nBins[iDim]= TString(descriptionArray->At(3*iDim+1)->GetName()).Atoi();
988 if (descriptionArray->At(3*iDim+2)->GetName()[0]!=
'%'){
989 xMin[iDim]= TString(descriptionArray->At(3*iDim+2)->GetName()).Atof();
991 if (descriptionArray->At(3*iDim+2)->GetName()[1]==
'A'){
992 TTreeFormula falias(
"falias",&(descriptionArray->At(3*iDim+2)->GetName()[2]),tree);
993 xMin[iDim]=falias.EvalInstance();
996 if (descriptionArray->At(3*iDim+3)->GetName()[0]!=
'%'){
997 xMax[iDim]= TString(descriptionArray->At(3*iDim+3)->GetName()).Atof();
999 if (descriptionArray->At(3*iDim+3)->GetName()[1]==
'A'){
1000 TTreeFormula falias(
"falias",&(descriptionArray->At(3*iDim+3)->GetName()[2]),tree);
1001 xMax[iDim]=falias.EvalInstance();
1004 if (xMax[iDim]<=xMin[iDim]){
1005 ::Error(
"AliTreePlayer::MakeHistograms",
"Invalid hstogram range specification for histogram %s: %s\t%s",hisDescription.Data(), \
1006 descriptionArray->At(3*iDim+2)->GetName(), descriptionArray->At(3*iDim+3)->GetName() );
1009 THnF * phis =
new THnF(hName.Data(),hName.Data(), hisDims[iHis],
nBins, xMin,xMax);
1010 hisArray->AddAt(phis,iHis);
1011 AliSysInfo::AddStamp(hName.Data(),10, phis->GetNbins());
1013 ::Info(
"AliTreePlayer::MakeHistograms",
"%s: size=%d",hisDescription.Data(), phis->GetNbins());
1015 hisSizeFull+= phis->GetNbins();
1016 for (Int_t iDim=0;iDim<hisDims[iHis]; iDim++){
1017 phis->GetAxis(iDim)->SetName(varArray->At(iDim)->GetName());
1018 phis->GetAxis(iDim)->SetTitle(varArray->At(iDim)->GetName());
1020 if (axisTitle) phis->GetAxis(iDim)->SetTitle(axisTitle->GetTitle());
1024 ::Info(
"AliTreePlayer::MakeHistograms",
"Total size=%d",hisSizeFull);
1028 Double_t values[kMaxDim];
1029 for (Int_t iHis=0; iHis<nHistograms; iHis++){
1030 Int_t indeces[kMaxDim+1];
1032 for (Int_t iVec=0; iVec<formulaArrayHis->GetEntriesFast(); iVec++){
1033 indeces[iVec]= formulaArray->IndexOf(formulaArray->FindObject(formulaArrayHis->At(iVec)->GetName()));
1036 if (hisWeightArray->GetEntriesFast()>=iHis){
1037 if (hisWeightArray->UncheckedAt(iHis)!=NULL){
1038 if (hisWeightArray->UncheckedAt(iHis)->GetName()){
1039 indexW= formulaArray->IndexOf(formulaArray->FindObject(hisWeightArray->UncheckedAt(iHis)->GetName()));
1041 ::Error(
"xxx",
"Problem to find %s", hisWeightArray->UncheckedAt(iHis)->GetName());
1045 THnBase * his = (THnBase*) hisArray->UncheckedAt(iHis);
1046 for (Int_t cEvent=0; cEvent<qLength; cEvent++){
1047 for (Int_t iDim=0; iDim<hisDims[iHis]; iDim++){
1048 values[iDim]=tree->GetVal(indeces[iDim])[cEvent];
1050 Double_t weight=(indexW<0)? 1: tree->GetVal(indexW)[cEvent];
1051 if (weight>0) his->Fill(values,weight);
1054 AliSysInfo::AddStamp(TString::Format(
"End.%s",tree->GetName()).Data(),0, bEntry);
1057 delete hisDescriptionArray;
1058 delete formulaArray;
1078 TString projType[8]={
"f-mean",
"f-rms",
"f-ltm",
"f-ltmsigma",
"f-gmean",
"f-grms",
"f-median",
"f-gmean"};
1080 TObjArray *drawList=drawExpression.Tokenize(
":");
1082 TString padDescription=drawList->At(0)->GetName();
1084 pad =
new TCanvas(drawExpression, drawExpression,1000,800);
1087 Int_t nPads=0, nRows=0;
1088 TObjArray *padRows=padDescription.Tokenize(
"[](),");
1089 nRows=padRows->GetEntries();
1090 for (Int_t iRow=0; iRow<nRows; iRow++){
1091 Int_t nCols=TString(padRows->At(iRow)->GetName()).Atoi();
1092 for (Int_t iCol=0; iCol<nCols; iCol++){
1094 TPad * newPad=
new TPad(
"pad",
"pad",iCol/Double_t(nCols),(nRows-iRow-1)/Double_t(nRows),(iCol+1)/Double_t(nCols),(nRows-iRow)/Double_t(nRows));
1097 newPad->SetNumber(nPads);
1103 TPRegexp isPadOption(
"^%O");
1104 Bool_t isLogY=kFALSE;
1105 for (Int_t iPad=0; iPad<nPads; iPad++){
1106 if (drawList->At(iPad+1)==NULL)
break;
1109 TLegend * legend =
new TLegend(0.11,0.85, 0.89,0.99, TString::Format(
"Pad%d",iPad));
1110 legend->SetNColumns(2);
1111 legend->SetBorderSize(0);
1112 TString padSetup=drawList->At(iPad+1)->GetName();
1113 TString padOption=
"";
1114 Bool_t isTimeX=kFALSE, isTimeY=kFALSE;
1116 if (padSetup.Contains(isPadOption)){
1117 padOption=TString(&padSetup[2]);
1118 padOption.Remove(padOption.First(
";"));
1119 padOption.ToLower();
1120 if (padOption.Contains(
"logy")) {
1121 pad->cd(iPad+1)->SetLogy();
1124 if (padOption.Contains(
"logx")) {
1125 pad->cd(iPad+1)->SetLogx();
1127 if (padOption.Contains(
"gridy")) pad->cd(iPad+1)->SetGridy();
1128 if (padOption.Contains(
"gridx")) pad->cd(iPad+1)->SetGridx();
1129 if (padOption.Contains(
"timex")) isTimeX=
kTRUE;
1130 if (padOption.Contains(
"timey")) isTimeY=
kTRUE;
1131 padSetup.Remove(0,padSetup.First(
';')+1);
1134 TObjArray * padDrawList= padSetup.Tokenize(
";");
1135 Double_t hisMin=0, hisMax=-1;
1137 TGraphErrors * grToDraw=0;
1139 for (Int_t ihis=0; ihis<padDrawList->GetEntries(); ihis++){
1140 TObjArray *hisDescription= TString(padDrawList->At(ihis)->GetName()).
Tokenize(
"()");
1141 THn * his = (THn*)hisArray->FindObject(hisDescription->At(0)->GetName());
1142 if (his==NULL)
continue;
1144 ::Info(
"AliTreePlayer::DrawHistograms",
"Pad %d. Processing his %s",iPad, hisDescription->At(0)->GetName());
1146 Int_t ndim=his->GetNdimensions();
1147 TString rangeDescription(hisDescription->At(1)->GetName());
1148 Int_t ndimRange= (rangeDescription.CountChar(
','));
1149 if (ndimRange>0) ndimRange=ndimRange/2+1;
1151 TObjArray *rangeArray=rangeDescription.Tokenize(
",");
1152 for (Int_t iDim=0; iDim<ndimRange; iDim++){
1153 if (rangeArray->At(iDim*2)->GetName()[0]==
'U') {
1154 Double_t min=TString(&(rangeArray->At(iDim*2)->GetName()[1])).Atof();
1155 Double_t max=TString(&(rangeArray->At(iDim*2+1)->GetName()[1])).Atof();
1157 ::Info(
"AliTreePlayer::DrawHistograms",
"Pad %d. %s.GetAxis(%d).SetRangeUser(%f,%f).",iPad,hisDescription->At(0)->GetName(), iDim, min,max);
1159 his->GetAxis(iDim)->SetRangeUser(min,max);
1161 Int_t min=TString((rangeArray->At(iDim*2)->GetName())).Atoi();
1162 Int_t max=TString((rangeArray->At(iDim*2+1)->GetName())).Atoi();
1164 ::Info(
"AliTreePlayer::DrawHistograms",
"Pad %d. %s.GetAxis(%d).SetRange(%d,%d).",iPad,hisDescription->At(0)->GetName(), iDim, min,max);
1166 his->GetAxis(iDim)->SetRange(min,max);
1171 TString drawOption = hisDescription->At(3)->GetName();
1172 drawOption.ToLower();
1173 TString projString=hisDescription->At(2)->GetName();
1174 Int_t nDims = projString.CountChar(
',')+1;
1178 if (nDims==1) hProj=his->Projection(projString.Atoi());
1180 Int_t dim0 = projString.Atoi();
1181 Int_t dim1 = TString(&(projString[2])).Atoi();
1182 TH2* his2D =his->Projection(dim0,dim1);
1183 for (Int_t iProj=0; iProj<8; iProj++){
1184 if (drawOption.Contains(projType[iProj])){
1186 gr->SetName(padDrawList->At(ihis)->GetName());
1187 gr->SetTitle(padDrawList->At(ihis)->GetName());
1188 gr->GetXaxis()->SetTitle(his2D->GetXaxis()->GetTitle());
1189 gr->GetYaxis()->SetTitle(his2D->GetYaxis()->GetTitle());
1190 drawOption.ReplaceAll(projType[iProj].Data(),
"");
1196 Double_t grMinI=TMath::MinElement(gr->GetN(),gr->GetY())-3.*TMath::Median(gr->GetN(),gr->GetEY());
1197 Double_t grMaxI=TMath::MaxElement(gr->GetN(),gr->GetY())+3.*TMath::Median(gr->GetN(),gr->GetEY());
1198 if (hisMax<hisMin) {hisMin=grMinI; hisMax=grMaxI;}
1199 if (hisMax<grMaxI) hisMax=grMaxI;
1200 if (hisMin>grMinI) hisMin=grMinI;
1203 gr->Draw((drawOption+
"a").Data());
1204 legend->AddEntry(gr,
"",
"p");
1207 gr->Draw(drawOption.Data());
1208 legend->AddEntry(gr,
"",
"p");
1210 if (keepArray) keepArray->AddLast(gr);
1213 hProj->SetMarkerColor(ihis+1);
1214 hProj->SetLineColor(ihis+1);
1215 hProj->SetMarkerStyle(21+ihis);
1216 if (keepArray) keepArray->AddLast(hProj);
1218 if (hisMax<hisMin) {
1219 hisMin=hProj->GetMinimum();
1220 hisMax=hProj->GetMaximum();
1222 if (hisMax<hProj->GetMaximum()) hisMax=hProj->GetMaximum();
1223 if (hisMin>hProj->GetMinimum()) hisMin=hProj->GetMinimum();
1226 hProj->Draw((TString(hisDescription->At(3)->GetName())+
"").Data());
1227 legend->AddEntry(hProj);
1230 hProj->Draw((TString(hisDescription->At(3)->GetName())+
"same").Data());
1231 legend->AddEntry(hProj);
1236 if (hisToDraw!=NULL){
1237 hisToDraw->SetMaximum(hisMax+(hisMax-hisMin)/2.);
1238 if (hisMin<=0) hisMin=TMath::Min(0.01, hisMax*0.01);
1239 hisToDraw->SetMinimum(hisMin);
1241 hisToDraw->SetMaximum(hisMax*TMath::Max(10.,(hisMax/hisMin)/4.));
1244 if ((verbose&0x8)>0){
1245 ::Info(
"AliTreePlayer::DrawHistograms:",
"Pad %d. %s SetMinimum(%f). SetMaximum(%f)",iPad,padDrawList->At(0)->GetName(), hisMin,hisMax+(hisMax-hisMin)/2.);
1247 if (isTimeX) hisToDraw->GetXaxis()->SetTimeDisplay(1);
1248 if (isTimeY) hisToDraw->GetYaxis()->SetTimeDisplay(1);
1249 pad->cd(iPad+1)->Modified();
1250 pad->cd(iPad+1)->Update();
1251 legend->Draw(
"same");
1253 if (grToDraw!=NULL){
1254 grToDraw->SetMaximum(hisMax+(hisMax-hisMin)/2.);
1255 grToDraw->SetMinimum(hisMin-(hisMax-hisMin)/3.);
1256 if (isTimeX) grToDraw->GetXaxis()->SetTimeDisplay(1);
1257 if (isTimeY) grToDraw->GetYaxis()->SetTimeDisplay(1);
1259 if ((verbose&0x8)>0){
1260 ::Info(
"AliTreePlayer::DrawHistograms:",
"Pad %d. %s SetMinimum(%f). SetMaximum(%f)",iPad,padDrawList->At(0)->GetName(), hisMax+(hisMax-hisMin)/2.,hisMin-(hisMax-hisMin)/3.);
1263 pad->cd(iPad+1)->Modified();
1264 pad->cd(iPad+1)->Update();
1265 legend->Draw(
"same");
1286 TTreeSRedirector *
pcstream =
new TTreeSRedirector(outFile,
"recreate");
1287 if (tree->GetEstimate()<tree->GetEntries()) tree->SetEstimate(tree->GetEntries());
1288 Int_t entries=tree->Draw(varList.Data(),selection,
"goffpara");
1289 TObjArray * varName=varList.Tokenize(
":");
1290 const Int_t nVars=varName->GetEntries();
1291 Double_t vars[nVars];
1292 TTree *treeOut=NULL;
1293 for (Int_t iPoint=0; iPoint <entries; iPoint++){
1294 for (Int_t iVar=0; iVar<nVars; iVar++){
1295 vars[iVar]=tree->GetVal(iVar)[iPoint];
1296 if (iPoint==0) (*pcstream)<<outTree.Data()<<TString::Format(
"%s=",varName->At(iVar)->GetName()).Data()<<vars[iVar];
1299 (*pcstream)<<outTree.Data()<<
"\n";
1300 treeOut=((*pcstream)<<outTree.Data()).
GetTree();
static TString printSelectedTreeInfo(TTree *tree, TString infoType, TString regExpFriend, TString regExpTag, Int_t verbose)
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
static TObjArray * selectMetadata(TTree *tree, TString query, Int_t verbose)
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 Int_t GetStatType(const TString &stat)
TTreeSRedirector * pcstream
strP3 Tokenize("+") -> Print()
ClassImp(AliTreePlayer) AliTreePlayer
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)
class TVectorT< Double_t > TVectorD
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", Int_t maxEntries=100000000)
TTree * GetTree(Int_t ievent)
static void MakeCacheTree(TTree *tree, TString varList, TString outFile, TString outTree, TCut selection)