349 #include "PhysicalConstants.h"
352 #include "TObjString.h"
356 #include "TPaveLabel.h"
357 #include "TPaveText.h"
362 #include "StMessMgr.h"
364 #include "St_DataSetIter.h"
368 #include "TProfile.h"
370 #include "StHistUtil.h"
373 typedef const char* charptr;
375 const char* possibleQAPrefixes[10] = {
"",
"LM",
"MM",
"HM",
"HP",
"XX",
"MB",
"CL",
"HT",
"JP"};
376 const char* possibleQASuffixes[10] = {
389 enum QAprintModes {QAprintSet,
395 int sizeOfCharPtr =
sizeof(Char_t*);
396 int sizeOfTH1Ptr =
sizeof(TH1*);
401 Double_t StdEdxY2Maker_gaus2(Double_t *x, Double_t *p) {
402 Double_t NormL = p[0];
404 Double_t muP = mu + p[4];
405 Double_t sigma = p[2];
406 Double_t sigmaP = TMath::Sqrt(sigma*sigma + 0.101741*0.101741);
408 Double_t frac = TMath::Sin(phi);
410 return TMath::Exp(NormL)*((1 - frac)*TMath::Gaus(x[0],mu ,sigma ,kTRUE) +
411 frac *TMath::Gaus(x[0],muP,sigmaP,kTRUE));
413 TF1 *StdEdxY2Maker_Gaus2() {
414 TF1 *f =
new TF1(
"Gaus2",StdEdxY2Maker_gaus2,-3,3,5);
415 f->SetParName(0,
"NormL"); f->SetParLimits(0,-10.,10.);
416 f->SetParName(1,
"mu"); f->SetParLimits(1,-0.5,0.5);
417 f->SetParName(2,
"sigma"); f->SetParLimits(2, 0.2,0.5);
418 f->SetParName(3,
"phiP"); f->SetParLimits(3, 0.0,TMath::Pi()/4);
419 f->SetParName(4,
"muP");
420 f->SetParameters(10,0,0.3,0.1,1.315);
434 numOfPosPrefixes = 10;
435 possiblePrefixes = possibleQAPrefixes;
436 possibleSuffixes = possibleQASuffixes;
450 m_OutMultiPage = kTRUE;
451 m_OutIndividuals =
"";
452 m_QAShiftMode = kFALSE;
459 newHist =
new TH1ptr[maxHistCopy];
460 memset(newHist,0,maxHistCopy*sizeOfTH1Ptr);
463 ignorePrefixes = kFALSE;
466 m_refResultsFile[0] = 0;
471 m_PntrToPlainFile = 0;
480 m_ItemsToClear =
new TList();
481 m_ItemsToClear->SetOwner();
487 StHistUtil::~StHistUtil(){
488 SafeDelete(m_HistCanvas);
489 SafeDelete(m_HistCanvasR);
491 m_ListOfLogY->Delete();
492 SafeDelete(m_ListOfLogY);
495 m_ListOfLogX->Delete();
496 SafeDelete(m_ListOfLogX);
499 m_ListOfPrint->Delete();
500 SafeDelete(m_ListOfPrint);
503 for (
int ijk=0; ijk<maxHistCopy; ijk++)
delete newHist[ijk];
506 delete m_ItemsToClear;
509 void StHistUtil::Clear() {
510 m_ItemsToClear->Clear();
513 void StHistUtil::SetOutFile(
const Char_t *fileName,
const Char_t* type) {
514 m_OutFileName = fileName;
515 if (m_OutFileName.EndsWith(
"+")) {
516 m_OutIndividuals =
".eps";
517 m_PrintMode |= QAU1<<QAprintIndiv;
518 if (m_OutFileName.EndsWith(
"++")) m_PrintMode |= QAU1<<QAprintIndivRef;
519 while (m_OutFileName.EndsWith(
"+")) m_OutFileName.Chop();
524 if (m_OutFileName.EndsWith(
".ps")) m_OutType=
"ps";
525 else if (m_OutFileName.EndsWith(
".eps")) m_OutType=
"eps";
526 else if (m_OutFileName.EndsWith(
".epsf")) m_OutType=
"Preview";
527 else if (m_OutFileName.EndsWith(
".pdf")) m_OutType=
"pdf";
528 else if (m_OutFileName.EndsWith(
".jpg")) m_OutType=
"jpg";
529 else if (m_OutFileName.EndsWith(
".jpeg")) m_OutType=
"jpg";
530 else if (m_OutFileName.EndsWith(
".gif")) m_OutType=
"gif";
531 else if (m_OutFileName.EndsWith(
".tif")) m_OutType=
"tiff";
532 else if (m_OutFileName.EndsWith(
".tiff")) m_OutType=
"tiff";
533 else if (m_OutFileName.EndsWith(
".svg")) m_OutType=
"svg";
534 else if (m_OutFileName.EndsWith(
".xpm")) m_OutType=
"xpm";
535 else if (m_OutFileName.EndsWith(
".png")) m_OutType=
"png";
536 else if (m_OutFileName.EndsWith(
".CC")) m_OutType=
"CC";
537 else if (m_OutFileName.EndsWith(
".C")) m_OutType=
"C";
538 else if (m_OutFileName.EndsWith(
".root")) m_OutType=
"root";
539 else if (m_OutFileName.EndsWith(
"none")) m_OutType=
"none";
540 else if (m_OutFileName.EndsWith(
".qas")) m_OutType=
"qas";
542 LOG_INFO <<
"SetHistUtil::SetOutFile(): unknown type, assuming ps" << endm;
544 m_OutFileName.Append(
".ps");
547 if (!m_OutType.CompareTo(
"qas")) {
548 m_QAShiftMode = kTRUE;
549 m_OutIndividuals =
".svg";
550 m_PrintMode |= QAU1<<QAprintIndiv;
551 m_PrintMode |= QAU1<<QAprintIndivRef;
554 if (m_OutType.CompareTo(
"none")) {
555 m_PrintMode |= QAU1<<QAprintSet;
556 m_PrintMode |= QAU1<<QAprintSetRef;
560 m_OutMultiPage = !(m_OutType.CompareTo(
"ps")
561 && m_OutType.CompareTo(
"pdf") );
562 if (m_OutMultiPage) {
563 LOG_INFO <<
"StHistUtil::SetOutFile(): Multipage output" << endm;
565 LOG_INFO <<
"StHistUtil::SetOutFile(): Single page output" << endm;
569 void StHistUtil::CloseOutFile() {
570 m_HistCanvas->Modified();
571 m_HistCanvas->Update();
572 if (!m_CurFileName.IsNull()) {
573 if (m_OutMultiPage) m_CurFileName.Append(
")");
574 if (m_OutType.CompareTo(
"CC")) {
576 if (m_CurPage==1) m_CurFileName.Chop().Chop();
577 if (m_PrintMode & QAU1<<QAprintSet)
578 m_HistCanvas->Print(m_CurFileName.Data(),m_OutType.Data());
580 m_HistCanvas->SaveSource(m_CurFileName.Data());
582 m_HistCanvasR->Modified();
583 m_HistCanvasR->Update();
584 m_CurFileNameR.Append(
")");
586 if (m_CurPage==1) m_CurFileNameR.Chop().Chop();
587 if (m_PrintMode & QAU1<<QAprintSetRef)
588 m_HistCanvasR->Print(m_CurFileNameR.Data(),m_OutType.Data());
592 LOG_INFO <<
"StHistUtil::CloseOutFile(): No output file" << endm;
596 TString StHistUtil::StripPrefixes(
const Char_t* histName, Int_t& prenum, Int_t mode) {
601 TString hName(histName);
602 Char_t makerBuffer[4];
603 memset(makerBuffer,0,4);
604 if ((hName.BeginsWith(
"Tab")) || (hName.BeginsWith(
"StE"))) {
605 memcpy(makerBuffer,histName,3);
610 for (Int_t i=1; i<numOfPosPrefixes; i++) {
611 if (hName.BeginsWith(possiblePrefixes[i])) {
613 hName.Remove(0,strlen(possiblePrefixes[i]));
617 if (mode>0) hName.Prepend(makerBuffer);
622 Bool_t StHistUtil::CheckOutFile(
const Char_t *histName) {
626 Int_t newPrefix = -1;
627 StripPrefixes(histName,newPrefix);
629 if (newPrefix == m_CurPrefix)
return kFALSE;
632 m_CurPrefix = newPrefix;
633 if (m_OutType.CompareTo(
"C") && m_OutType.CompareTo(
"root")) {
634 m_CurFileName = m_OutFileName;
635 Ssiz_t insertPos = m_CurFileName.Last(
'.');
636 if (insertPos<0) insertPos = m_CurFileName.Length();
637 if (m_OutMultiPage) m_CurFileName.Append(
"(");
638 else m_CurFileName.Insert(insertPos,
"_");
639 m_CurFileName.Insert(insertPos,possiblePrefixes[m_CurPrefix]);
641 (m_CurFileNameR =
"Ref_") += m_CurFileName;
645 Ldesc->AddText(possibleSuffixes[m_CurPrefix]);
646 Ldesc->AddText(
"Hists");
651 Int_t StHistUtil::DrawHists(
const Char_t *dirName) {
655 LOG_INFO <<
" **** Now in StHistUtil::DrawHists **** " << endm;
657 Int_t canvasWidth,canvasHeight;
660 LOG_INFO <<
"In QA Shift Mode - overriding other inputs" << endm;
667 gStyle->SetPaperSize(m_PaperWidth,m_PaperHeight);
676 const Int_t numPads = m_PadColumns*m_PadRows;
677 gStyle->SetStatStyle(0);
678 gStyle->SetOptDate(0);
679 gStyle->SetPalette(1);
683 SafeDelete(m_HistCanvas);
684 SafeDelete(m_HistCanvasR);
687 m_HistCanvasR =
new TCanvas(
"CanvasNameR",
" STAR Reference Histogram Canvas",20,20,canvasWidth,canvasHeight);
689 m_HistCanvas =
new TCanvas(
"CanvasName",
" STAR Maker Histogram Canvas",0,0,canvasWidth,canvasHeight);
692 TPad *graphPad = m_HistCanvas;
693 TPad *graphPadR = m_HistCanvasR;
694 TPaveLabel* LtitleR = 0;
695 TPaveLabel *Ldatetime = 0;
696 TPaveLabel *Lpage = 0;
699 if (!m_QAShiftMode) {
703 Ltitle =
new TPaveLabel(0.08,0.96,0.88,1.0,m_GlobalTitle.Data(),
"br");
704 Ltitle->SetFillColor(18);
705 Ltitle->SetTextFont(32);
706 Ltitle->SetTextSize(0.5);
710 LtitleR =
new TPaveLabel(0.08,0.96,0.88,1.0,m_refInFile->GetName(),
"br");
711 LtitleR->SetFillColor(18);
712 LtitleR->SetTextFont(32);
713 LtitleR->SetTextSize(0.5);
719 Ldesc =
new TPaveText(0.90,0.96,0.99,1.0,
"br");
720 Ldesc->SetFillColor(18);
721 Ldesc->SetTextFont(32);
731 const Char_t *myTime = HistTime.AsString();
732 Ldatetime =
new TPaveLabel(0.7,0.01,0.95,0.03,myTime,
"br");
733 Ldatetime->SetTextSize(0.6);
743 Lpage =
new TPaveLabel(0.1,0.01,0.16,0.03,Form(
"%d",m_CurPage),
"br");
744 Lpage->SetTextSize(0.6);
755 graphPad =
new TPad(
"PadName",
"Pad Title",0.0,0.05,1.00,0.95);
758 graphPad->Divide(m_PadColumns,m_PadRows);
761 graphPadR =
new TPad(
"PadNameR",
"Pad TitleR",0.0,0.05,1.00,0.95);
764 graphPadR->Divide(m_PadColumns,m_PadRows);
771 Bool_t padAdvance = kTRUE;
776 PathCopy(m_dirName,dirName);
777 TList* dirList = (m_PntrToMaker ? FindHists(m_dirName) : FindHists(m_PntrToPlainFile));
778 if (!dirList) { LOG_INFO <<
" DrawHists - histograms not available! " << endm; }
780 TIter nextHist(dirList);
781 Int_t histCounter = 0;
782 Int_t histReadCounter = 0;
783 Bool_t started = kFALSE;
793 ofstream* C_ostr = 0;
794 TFile* root_ofile = 0;
795 if (!m_OutType.CompareTo(
"C")) {
796 C_ostr =
new ofstream(m_OutFileName);
797 (*C_ostr) <<
" gSystem->Load(\"St_base\");" << endl;
798 (*C_ostr) <<
" gSystem->Load(\"StUtilities\");" << endl;
800 }
else if (!m_OutType.CompareTo(
"root"))
801 root_ofile =
new TFile(m_OutFileName,
"RECREATE");
805 ofstream* R_ostr = 0;
807 dirListR = FindHists(m_refInFile);
809 if (!root_ofile) root_ofile =
new TFile(m_refOutFile,
"RECREATE");
813 static TF1* fitFRS = 0;
814 if (!fitFRS) fitFRS =
new TF1(
"fitFRS",
"[0]*(x<[1]-[2])+([0]+([3]-[0])*(x-([1]-[2]))/(2*[2]))*(x>[1]-[2])*(x<[1]+[2])+[3]*(x>[1]+[2])",6.5, 9.0);
816 while ((obj = nextHist())) {
818 if (!obj->InheritsFrom(
"TH1"))
continue;
820 TH1* hobj = (TH1*) obj;
821 const char* oname = hobj->GetName();
822 const char* otitle = hobj->GetTitle();
823 TString oName = oname;
824 oName.ReplaceAll(
' ',
'_');
826 LOG_INFO << Form(
" %d. Reading ... %s::%s; Title=\"%s\"\n",
827 histReadCounter,hobj->ClassName(),oname, otitle) << endm;
828 if (!started && (m_FirstHistName.CompareTo(
"*")==0 ||
829 m_FirstHistName.CompareTo(oName)==0))
834 if (oName.CompareTo(m_LastHistName)==0) started = kFALSE;
841 if (!m_ListOfPrint || (m_ListOfPrint->FindObject(oname))) {
849 hobj->SavePrimitive(*C_ostr);
854 LOG_INFO << Form(
" - %d. Drawing ... %s::%s; Title=\"%s\"\n",
855 histCounter,hobj->ClassName(),oname, otitle) << endm;
858 if (CheckOutFile(oname)) {
864 if (m_refInFile) graphPadR->Clear();
867 }
else if (padCount == numPads) {
869 m_HistCanvas->Modified();
870 m_HistCanvas->Update();
871 if (m_PrintMode & QAU1<<QAprintSet &&
872 m_CurPage>0 && !m_CurFileName.IsNull()) {
873 if (m_OutType.CompareTo(
"CC")) {
874 m_HistCanvas->Print(m_CurFileName.Data(),m_OutType.Data());
876 m_HistCanvas->SaveSource(m_CurFileName.Data());
877 m_CurFileName.ReplaceAll(
"(",0);
879 m_HistCanvas->Draw();
882 while (padCount > 0) graphPad->GetPad(padCount--)->Clear();
885 m_HistCanvasR->Modified();
886 m_HistCanvasR->Update();
887 if (m_PrintMode & QAU1<<QAprintSetRef &&
888 m_CurPage>0 && !m_CurFileName.IsNull()) {
889 m_HistCanvasR->Print(m_CurFileNameR.Data(),m_OutType.Data());
890 m_CurFileNameR.ReplaceAll(
"(",0);
891 }
else m_HistCanvasR->Draw();
893 while (padCount > 0) graphPadR->GetPad(padCount--)->Clear();
898 if (Lpage) Lpage->SetLabel(Form(
"%d",m_CurPage));
900 if (!m_OutMultiPage && !m_CurFileName.IsNull()) {
901 Ssiz_t last_us = m_CurFileName.Last(
'_') + 1;
902 Ssiz_t lastdot = m_CurFileName.Last(
'.') - last_us;
903 m_CurFileName.Replace(last_us,lastdot,Form(
"%d",m_CurPage));
908 Int_t chkdim = hobj->GetDimension();
911 int curPad = (++padCount);
919 TString onamebase = oname;
920 #define SingleTpcSectorReference false
921 if (SingleTpcSectorReference && onamebase.Contains(
"iTpcSector")) {
924 onamebase.Replace(onamebase.Index(
"iTpcSector")+10,2,
"16");
925 }
else if (SingleTpcSectorReference && onamebase.Contains(
"TpcSector")) {
928 onamebase.Replace(onamebase.Index(
"TpcSector")+9,2,
"9");
930 hobjR = (TH1*) (dirListR->FindObject(onamebase.Data()));
933 onamebase = StripPrefixes(oname,tempint,-1);
934 hobjR = (TH1*) (dirListR->FindObject(onamebase.Data()));
937 onamebase = StripPrefixes(oname,tempint,1);
938 hobjR = (TH1*) (dirListR->FindObject(onamebase.Data()));
941 onamebase = StripPrefixes(oname,tempint,0);
942 hobjR = (TH1*) (dirListR->FindObject(onamebase.Data()));
947 TString htitle = StripPrefixes(hobjR->GetTitle(),tempint,0);
948 if (!htitle.BeginsWith(
"Ref:")) htitle.Prepend(
"Ref:");
949 hobjR->SetTitle(htitle.Data());
952 TVirtualPad* objPad = 0;
953 for (
int analRepeat = 0;analRepeat < (hobjR ? 2 : 1); analRepeat++) {
958 graphPadR->cd(m_QAShiftMode ? 0 : curPad);
960 }
else graphPad->cd(m_QAShiftMode ? 0 : curPad);
964 if (oName.Contains(
"H_matchCand")) {
966 gStyle->SetGridStyle(6);
967 gStyle->SetGridColor(kOrange);
970 gStyle->SetGridStyle(3);
971 gStyle->SetGridColor(kGray);
975 if (oName.Contains(
"TpcSector") ||
976 oName.Contains(
"PointRPTpc") ||
977 oName.Contains(
"PointXYTpc") ||
978 oName.Contains(
"TrigBits")) {
979 gStyle->SetOptStat(11);
980 }
else if (oName.Contains(
"NullPrim")) {
981 gStyle->SetOptStat(1111);
983 gStyle->SetOptStat(111111);
987 if (oName.Contains(
"TrigBits")) {
988 gPad->SetBottomMargin(0.35);
989 hobj->GetXaxis()->SetLabelSize(0.03);
990 hobj->GetXaxis()->SetLabelFont(42);
992 gPad->SetBottomMargin(0.10);
995 if (oName.Contains(
"GtrkPadfT")) hobj->SetMinimum(0.8);
1000 Float_t BinCont0 = hobj->GetBinContent(0);
1002 LOG_INFO <<
" -- Will normalize by 1/" << -BinCont0 <<
": " << oname << endm;
1003 hobj->Scale(-1.0/BinCont0);
1009 if (m_ListOfLogY && m_ListOfLogY->FindObject(oname) &&
1010 hobj->GetEntries() && hobj->GetMaximum() ) {
1012 if (!analRepeat) {LOG_INFO <<
" -- Will draw in logY scale: " << oname <<endm;}
1013 }
else gPad->SetLogy(0);
1018 if (m_ListOfLogX && m_ListOfLogX->FindObject(oname) &&
1019 hobj->GetEntries() && hobj->GetMaximum() ) {
1021 if (!analRepeat) {LOG_INFO <<
" -- Will draw in logX scale: " << oname <<endm;}
1022 }
else gPad->SetLogx(0);
1025 if (oName.EndsWith(
"PVsDedx") ||
1026 oName.Contains(
"fms_qt_") ||
1027 oName.Contains(
"fpd_channel_") ||
1028 oName.Contains(
"TofPID") ||
1029 oName.Contains(
"multiplicity_etofHits") ||
1030 oName.Contains(
"eTofHits") ||
1031 oName.Contains(
"etofMult") ||
1032 oName.Contains(
"G_matchCand_") ||
1033 oName.Contains(
"RP_cluster_xy") ||
1034 oName.Contains(
"TpcSector") ||
1035 oName.Contains(
"PointRPTpc") ||
1036 oName.Contains(
"PointXYTpc")) {
1038 if (!analRepeat) {LOG_INFO <<
" -- Will draw in logZ scale: " << oname <<endm;}
1039 }
else gPad->SetLogz(0);
1042 if (oName.EndsWith(
"QaPointTpc") ||
1043 oName.EndsWith(
"QaPointSvt") ||
1044 oName.Contains(
"QaPointSvtLaser") ||
1045 oName.EndsWith(
"QaPointSsd") ||
1046 oName.EndsWith(
"QaPointFtpc") ||
1047 oName.EndsWith(
"QaRichTot") ||
1048 oName.EndsWith(
"QaV0Vtx") ||
1049 oName.EndsWith(
"QaXiVtxTot") ||
1050 oName.Contains(
"QaPmdTotal") ||
1051 oName.Contains(
"QaCpvTotal") ||
1052 oName.EndsWith(
"SImpactTime") ||
1053 oName.EndsWith(
"trkGoodTTS")) {
1054 Float_t mean = hobj->GetMean(1);
1055 Float_t window = hobj->GetRMS(1);
1056 Float_t bwid = hobj->GetXaxis()->GetBinWidth(1);
1057 if (window < bwid) window = bwid;
1058 hobj->SetAxisRange(mean-5*window,mean+5*window,
"X");
1062 if (oName.EndsWith(
"trkGoodF")) {
1063 Float_t mean1 = hobj->GetMean(1);
1064 Float_t mean2 = hobj->GetMean(2);
1065 Float_t window1 = hobj->GetRMS(1);
1066 Float_t window2 = hobj->GetRMS(2);
1067 Float_t bwid = hobj->GetXaxis()->GetBinWidth(1);
1068 if (window1 < bwid) window1 = bwid;
1069 if (window2 < bwid) window2 = bwid;
1070 Float_t lo = TMath::Min(mean1-5*window1,mean2-5*window2);
1071 Float_t hi = TMath::Max(mean1+5*window1,mean2+5*window2);
1072 hobj->SetAxisRange(lo,hi,
"X");
1073 hobj->SetAxisRange(lo,hi,
"Y");
1077 if (oName.Contains(
"VtxFtpc")&&oName.Contains(
"TpcXY")&&m_RunYear!=7){
1078 hobj->GetXaxis()->SetRangeUser(-2.0,2.0);
1079 hobj->GetYaxis()->SetRangeUser(-2.0,2.0);
1083 if (oName.Contains(
"Diff_etofHits")) {
1084 hobj->GetXaxis()->SetRangeUser(0.0,100.0);
1088 if ((chkdim == 3) && (hobj->InheritsFrom(
"StMultiH2F"))) {
1090 }
else if ((chkdim == 3) && (oName.Contains(
"Z3A"))) {
1091 latex.SetTextAngle(0);
1092 latex.SetTextAlign(12);
1093 TH3F* Z3A = (TH3F*) hobj;
1094 Bool_t noneYet = kTRUE;
1097 Double_t slope = 1.7502e-6;
1098 const Char_t *
IO[2] = {
"Inner",
"Outer"};
1099 Double_t xmin[2] = { 40, 40};
1100 Double_t xmax[2] = {200,180};
1101 TF1 *gg = StdEdxY2Maker_Gaus2();
1102 float histmiddle = 0;
1103 for (Int_t io = 1; io <= 2; io++) {
1104 Z3A->GetXaxis()->SetRange(io,io);
1105 TH2 *I = (TH2 *) Z3A->Project3D(Form(
"zy%i",io));
1108 TH1D *proj = (TH1D*) gDirectory->Get(Form(
"%s_1",I->GetName()));
1110 proj->Fit(
"pol1",
"erq",(noneYet ?
"" :
"same"),xmin[io-1],xmax[io-1]);
1111 proj->SetLineColor(8-io);
1112 proj->SetMarkerColor(8-io);
1113 proj->SetMarkerStyle(24-io);
1115 proj->SetTitle(otitle);
1116 TF1 *f = (TF1 *) proj->GetListOfFunctions()->FindObject(
"pol1");
1118 gMessMgr->Info() <<
"StHistUtil: Estimated content of O2 (ppm) "
1119 <<
"from slope in drift distance for "
1120 << Form(
"%s = %10.2f +/- %10.2f", IO[io-1],
1121 -f->GetParameter(1)/slope, f->GetParError(1)/slope)
1123 if (noneYet) histmiddle = f->Eval(100.0);
1124 f->SetLineColor(6-2*io);
1125 latex.SetTextColor(6-2*io);
1126 latex.DrawLatex(20,histmiddle+0.9-0.6*io,Form(
"%s : %10.2f +/- %10.2f\n",
1127 IO[io-1],-f->GetParameter(1)/slope,f->GetParError(1)/slope));
1130 proj->SetMinimum(histmiddle-0.4);
1131 proj->SetMaximum(histmiddle+0.4);
1137 latex.SetTextColor(1);
1138 }
else if ((chkdim==2) && (oName.Contains(
"PointRPTpc") ||
1139 (oName.Contains(
"PointXYTpc") &&
1140 TMath::Abs((hobj->GetYaxis()->GetXmax()/TMath::Pi())-2)<1e-5))) {
1141 TH2F* htmp =
new TH2F(Form(
"%s.",hobj->GetName()),hobj->GetTitle(),1,-200,200,1,-200,200);
1142 float hmin = (oName.Contains(
"PointRPTpcQ") ? 1e-4 : 1.0);
1143 htmp->Fill(0.,0.,hmin); htmp->SetMinimum(hmin);
1144 htmp->SetStats(kFALSE);
1146 hobj->SetMinimum(0.9*hmin);
1147 if (gROOT->GetVersionInt() < 52800) {
1148 hobj->Draw(
"Pol ZCol Same");
1154 FlipAxes(hobj)->Draw(
"Pol ZCol Same");
1156 }
else if ((chkdim == 2) &&
1157 (oName.EndsWith(
"SImpactTime"))) {
1158 hobj->SetMarkerStyle(7);
1159 ((TH2F*) hobj)->Rebin2D(100,1,0);
1160 hobj->SetXTitle(
"Time in run [sec]");
1161 hobj->SetYTitle(
"signed impact (sDCA) [cm]");
1162 ((TH2F*) hobj)->ProfileX()->Draw();
1163 }
else if ((chkdim == 2) &&
1164 (oName.EndsWith(
"SvtLoc") ||
1165 oName.EndsWith(
"PVsDedx") ||
1166 oName.EndsWith(
"VtxPrXY") ||
1167 oName.EndsWith(
"SSD") ||
1168 oName.EndsWith(
"PointXYSvt") ||
1169 oName.Contains(
"TpcSector") ||
1170 oName.Contains(
"PointXYTpc") ||
1171 oName.Contains(
"SectorvsSensor") ||
1172 oName.Contains(
"LaddervsSensor"))) {
1173 if (oName.Contains(
"TpcSector")) {
1175 Double_t max1 = hobj->GetMaximum();
1176 Double_t max2 = hobj->GetMaximum(max1);
1177 if (max1/max2 > 5) hobj->SetBinContent(hobj->GetMaximumBin(),max2);
1180 }
else if ((chkdim == 2) && (!hobj->InheritsFrom(
"StMultiH1F"))) {
1182 if ((oName.EndsWith(
"trkGoodF"))||(oName.EndsWith(
"VtxSvtvsTpc"))) {
1183 ruler.SetLineColor(46);
1184 ruler.SetLineWidth(2);
1185 ruler.DrawLineNDC(0.1,0.1,0.9,0.9);
1188 if (oName.Contains(
"QaBbc") ||
1189 (oName.Contains(
"QaPmd") && !oName.Contains(
"Total")) ||
1190 (oName.Contains(
"QaFpd") && !oName.Contains(
"Sums"))) {
1191 hobj->SetBarOffset();
1193 if (oName.Contains(
"TrigBits")) {
1194 hobj->SetLineWidth(1);
1196 hobj->SetLineWidth(2);
1198 if (oName.EndsWith(
"Mass")) hobj->Draw(
"e");
1200 if (oName.BeginsWith(
"fcl_radial") && (hobj->GetEntries() > 0)) {
1202 hobj->GetXaxis()->SetRangeUser(6.5,9.0);
1203 hobj->Fit(
"pol0",
"",
"", 6.5, 7.2);
1204 double n1= hobj->GetFunction(
"pol0")->GetParameter(0);
1205 hobj->Fit(
"pol0",
"",
"",8.3,9.0);
1206 double n2= hobj->GetFunction(
"pol0")->GetParameter(0);
1207 fitFRS->SetParameters(n1, 7.85, 0.35, n2);
1208 hobj->Fit(fitFRS,
"R");
1210 double rstep = fitFRS->GetParameter(1);
1211 double erstep = fitFRS->GetParError(1);
1212 float hmin = hobj->GetMinimum();
1213 float hmax = hobj->GetMaximum();
1214 ruler.SetLineColor(kBlack);
1215 ruler.SetLineWidth(2);
1216 ruler.DrawLine(7.8,hmin,7.8,hmax);
1217 ruler.SetLineColor(kGreen);
1218 ruler.SetLineWidth(3);
1219 ruler.DrawLine(rstep,hmin,rstep,hmax);
1220 ruler.SetLineWidth(1);
1221 ruler.DrawLine(rstep-erstep,hmin,rstep-erstep,hmax);
1222 ruler.DrawLine(rstep+erstep,hmin,rstep+erstep,hmax);
1228 if (oName.Contains(
"NullPrimVtx")) {
1229 int msdVtx = (int) (hobj->GetBinContent(hobj->FindBin(-1.)));
1230 int qstVtx = (int) (hobj->GetBinContent(hobj->FindBin(0.)));
1231 int goodVtx = (int) (hobj->GetBinContent(hobj->FindBin(1.)));
1232 int fndVtx = qstVtx + goodVtx;
1233 int totVtx = fndVtx + msdVtx;
1234 Float_t txtSiz = latex.GetTextSize();
1235 latex.SetTextSize(txtSiz*1.5);
1236 latex.SetTextAngle(90);
1237 latex.SetTextAlign(3);
1238 latex.SetTextColor(4);
1239 latex.DrawLatex(-0.8,0,Form(
" missed: %d",msdVtx));
1240 latex.DrawLatex(0.2,0,Form(
" questionable: %d",qstVtx));
1241 latex.DrawLatex(1.2,0,Form(
" good: %d",goodVtx));
1242 latex.SetTextSize(txtSiz*2);
1243 latex.SetTextColor(2);
1244 latex.DrawLatex(-1.8,0,Form(
" total: %d",totVtx));
1245 latex.SetTextAlign(1);
1246 latex.SetTextColor(kGreen+3);
1247 latex.DrawLatex(-1.1,0,Form(
" found: %d",fndVtx));
1249 latex.SetTextColor(1);
1250 latex.SetTextSize(txtSiz);
1251 LOG_INFO << (m_CurPrefix ? possiblePrefixes[m_CurPrefix] :
"GE")
1252 << (analRepeat ?
" Ref" :
"")
1253 <<
" QA Events (found vtx/total) "
1254 << fndVtx <<
" / " << totVtx << endm;
1257 if (oName.Contains(
"h1_inv_mass_cluster")) {
1258 ruler.SetLineColor(2);
1259 ruler.SetLineWidth(1);
1260 ruler.DrawLine(0.135,0.,0.135,hobj->GetMaximum());
1263 if (oName.Contains(
"h2_cluster_dgg_vs_E1pE2")) {
1265 fcsFunc1=
new TF1(
"Zgg=0",
"156.20/x",4,30);
1266 fcsFunc1->SetTitle(
"Z_{gg}=0");
1267 fcsFunc2=
new TF1(
"Zgg=0.35",
"166.747/x",4,30);
1268 fcsFunc2->SetTitle(
"Z_{gg}=0.35");
1269 fcsFunc3=
new TF1(
"Zgg=0.70",
"218.72/x",4,30);
1270 fcsFunc3->SetTitle(
"Z_{gg}=0.7");
1271 fcsFunc1->SetLineColor(2);
1272 fcsFunc2->SetLineColor(6);
1273 fcsFunc3->SetLineColor(28);
1275 fcsFunc1->Draw(
"same");
1276 fcsFunc2->Draw(
"same");
1277 fcsFunc3->Draw(
"same");
1280 if (oName.Contains(
"iTpcSector")) {
1282 ruler.SetLineColor(1);
1283 ruler.SetLineWidth(1);
1285 float pitch = 0.67/2.0;
1286 ruler.DrawLine(-137*pitch,64.5,137*pitch,64.5);
1287 ruler.DrawLine(-123*pitch,56.5,123*pitch,56.5);
1288 ruler.DrawLine(-111*pitch,48.5,111*pitch,48.5);
1289 ruler.DrawLine( -97*pitch,40.5, 97*pitch,40.5);
1292 int row_width = 70;
int in_step1 = 52;
int in_step2 = 54;
1293 float row1=10.5;
float row2 = row1+1.0;
float row3 = row1+2.0;
1294 ruler.DrawLine(-(row_width-in_step2)*pitch,row3,(row_width-in_step2)*pitch,row3);
1295 ruler.DrawLine(-(row_width-in_step2)*pitch,row2,-(row_width-in_step1)*pitch,row2);
1296 ruler.DrawLine((row_width-in_step2)*pitch,row2,(row_width-in_step1)*pitch,row2);
1297 ruler.DrawLine(-row_width*pitch,row1,-(row_width-in_step1)*pitch,row1);
1298 ruler.DrawLine((row_width-in_step1)*pitch,row1,row_width*pitch,row1);
1299 ruler.DrawLine(-(row_width-in_step1)*pitch,row1,-(row_width-in_step1)*pitch,row2);
1300 ruler.DrawLine((row_width-in_step1)*pitch,row1,(row_width-in_step1)*pitch,row2);
1301 ruler.DrawLine(-(row_width-in_step2)*pitch,row3,-(row_width-in_step2)*pitch,row2);
1302 ruler.DrawLine((row_width-in_step2)*pitch,row3,(row_width-in_step2)*pitch,row2);
1304 bool east = (atoi(&(oName.Data()[oName.Last(
'r')+1])) > 12);
1305 pitch = (east ? 0.50 : -0.50);
1306 float p01 = 46*pitch;
float row01 = 22.5;
1307 float p02 = 36*pitch;
float row02 = 22.5;
1308 float p03 = 36*pitch;
float row03 = 21.5;
1309 float p04 = 39*pitch;
float row04 = 21.5;
1310 float p05 = 39*pitch;
float row05 = 20.5;
1311 float p06 = 19*pitch;
float row06 = 20.5;
1312 float p07 = 19*pitch;
float row07 = 22.5;
1313 float p08 = 9*pitch;
float row08 = 22.5;
1314 float p09 = 9*pitch;
float row09 = 23.5;
1315 float p10 = 2*pitch;
float row10 = 23.5;
1316 float p11 = 2*pitch;
float row11 = 24.5;
1317 ruler.DrawLine( p01,row01, p02,row02);
1318 ruler.DrawLine( p02,row02, p03,row03);
1319 ruler.DrawLine( p03,row03, p04,row04);
1320 ruler.DrawLine( p04,row04, p05,row05);
1321 ruler.DrawLine( p05,row05, p06,row06);
1322 ruler.DrawLine( p06,row06, p07,row07);
1323 ruler.DrawLine( p07,row07, p08,row08);
1324 ruler.DrawLine( p08,row08, p09,row09);
1325 ruler.DrawLine( p09,row09, p10,row10);
1326 ruler.DrawLine( p10,row10, p11,row11);
1327 ruler.DrawLine(-p01,row01,-p02,row02);
1328 ruler.DrawLine(-p02,row02,-p03,row03);
1329 ruler.DrawLine(-p03,row03,-p04,row04);
1330 ruler.DrawLine(-p04,row04,-p05,row05);
1331 ruler.DrawLine(-p05,row05,-p06,row06);
1332 ruler.DrawLine(-p06,row06,-p07,row07);
1333 ruler.DrawLine(-p07,row07,-p08,row08);
1334 ruler.DrawLine(-p08,row08,-p09,row09);
1335 ruler.DrawLine(-p09,row09,-p10,row10);
1336 ruler.DrawLine(-p10,row10,-p11,row11);
1337 ruler.DrawLine(-p11,row11, p11,row11);
1339 p01 = 0*pitch; row01 = 24.5;
1340 p02 = 0*pitch; row02 = 26.5;
1341 p03 = -7*pitch; row03 = 26.5;
1342 p04 = -7*pitch; row04 = 28.5;
1343 p05 = -8*pitch; row05 = 28.5;
1344 p06 = -8*pitch; row06 = 30.5;
1345 p07 = 10*pitch; row07 = 30.5;
1346 p08 = 10*pitch; row08 = 32.5;
1347 p09 = 11*pitch; row09 = 32.5;
1348 p10 = 11*pitch; row10 = 35.5;
1349 p11 = 10*pitch; row11 = 35.5;
1350 float p12 = 10*pitch;
float row12 = 36.5;
1351 float p13 = 0*pitch;
float row13 = 36.5;
1352 float p14 = 0*pitch;
float row14 = 40.5;
1353 ruler.DrawLine(p01,row01,p02,row02);
1354 ruler.DrawLine(p02,row02,p03,row03);
1355 ruler.DrawLine(p03,row03,p04,row04);
1356 ruler.DrawLine(p04,row04,p05,row05);
1357 ruler.DrawLine(p05,row05,p06,row06);
1358 ruler.DrawLine(p06,row06,p07,row07);
1359 ruler.DrawLine(p07,row07,p08,row08);
1360 ruler.DrawLine(p08,row08,p09,row09);
1361 ruler.DrawLine(p09,row09,p10,row10);
1362 ruler.DrawLine(p10,row10,p11,row11);
1363 ruler.DrawLine(p11,row11,p12,row12);
1364 ruler.DrawLine(p12,row12,p13,row13);
1365 ruler.DrawLine(p13,row13,p14,row14);
1366 latex.SetTextAngle(0);
1367 latex.SetTextAlign(32);
1368 latex.DrawLatex(50,5,
"RDO 1");
1369 latex.DrawLatex(50,18,
"2");
1370 latex.DrawLatex(50,33,(east ?
"4 , 3" :
"3 , 4"));
1371 latex.DrawLatex(50,44,
"5");
1372 latex.DrawLatex(50,52,
"6");
1373 latex.DrawLatex(50,60,
"7");
1374 latex.DrawLatex(50,68,
"8");
1377 ruler.SetLineColor(2);
1378 ruler.DrawLine(-52,10.5,-47,10.5);
1379 ruler.DrawLine(-52,20.5,-47,20.5);
1380 ruler.DrawLine(-52,30.5,-47,30.5);
1381 ruler.DrawLine(-52,40.5,-47,40.5);
1382 ruler.DrawLine(-52,48.1,-47,48.1);
1383 ruler.DrawLine(-52,56.1,-47,56.1);
1384 ruler.DrawLine(-52,64.1,-47,64.1);
1385 latex.SetTextAlign(12);
1386 latex.SetTextColor(2);
1387 latex.DrawLatex(-50, 5.1,
"1 Anode");
1388 latex.DrawLatex(-50,15.1,
"2");
1389 latex.DrawLatex(-50,25.1,
"3");
1390 latex.DrawLatex(-50,35.1,
"4");
1391 latex.DrawLatex(-50,44.1,
"5");
1392 latex.DrawLatex(-50,52.1,
"6");
1393 latex.DrawLatex(-50,60.1,
"7");
1394 latex.DrawLatex(-50,68.1,
"8");
1395 latex.SetTextColor(1);
1396 }
else if (oName.Contains(
"TpcSector")) {
1398 ruler.SetLineColor(1);
1399 ruler.SetLineWidth(1);
1401 float pitch = 0.67/2.0;
1402 ruler.DrawLine(-137*pitch,37.5,137*pitch,37.5);
1403 ruler.DrawLine(-123*pitch,29.5,123*pitch,29.5);
1404 ruler.DrawLine(-111*pitch,21.5,111*pitch,21.5);
1405 ruler.DrawLine( -97*pitch,13.5, 97*pitch,13.5);
1408 int row_width = 134;
int in_step = 68;
float row1=6.5;
1410 float row2 = row1+1.0;
1411 ruler.DrawLine(-(row_width-in_step)*pitch,row2,(row_width-in_step)*pitch,row2);
1412 ruler.DrawLine(-row_width*pitch,row1,-(row_width-in_step)*pitch,row1);
1413 ruler.DrawLine((row_width-in_step)*pitch,row1,row_width*pitch,row1);
1414 ruler.DrawLine(-(row_width-in_step)*pitch,row1,-(row_width-in_step)*pitch,row2);
1415 ruler.DrawLine((row_width-in_step)*pitch,row1,(row_width-in_step)*pitch,row2);
1416 latex.SetTextAngle(0);
1417 latex.SetTextAlign(32);
1418 latex.DrawLatex(50,4,
"RDO 1");
1419 latex.DrawLatex(50,10,
"2");
1420 latex.DrawLatex(50,17,
"3");
1421 latex.DrawLatex(50,25,
"4");
1422 latex.DrawLatex(50,33,
"5");
1423 latex.DrawLatex(50,41,
"6");
1426 ruler.SetLineColor(2);
1427 ruler.DrawLine(-52,2.9,-47,2.9);
1428 ruler.DrawLine(-52,6.2,-47,6.2);
1429 ruler.DrawLine(-52,9.4,-47,9.4);
1430 ruler.DrawLine(-52,13.5,-47,13.5);
1431 ruler.DrawLine(-52,21.1,-47,21.1);
1432 ruler.DrawLine(-52,29.1,-47,29.1);
1433 ruler.DrawLine(-52,37.1,-47,37.1);
1434 latex.SetTextAlign(12);
1435 latex.SetTextColor(2);
1436 latex.DrawLatex(-50,1.5,
"1 Anode");
1437 latex.DrawLatex(-50,4.6,
"2");
1438 latex.DrawLatex(-50,7.8,
"3");
1439 latex.DrawLatex(-50,11.4,
"4");
1440 latex.DrawLatex(-50,17.1,
"5");
1441 latex.DrawLatex(-50,25.1,
"6");
1442 latex.DrawLatex(-50,33.1,
"7");
1443 latex.DrawLatex(-50,41.1,
"8");
1444 latex.SetTextColor(1);
1447 if (oName.Contains(
"PointRPTpc") ||
1448 oName.Contains(
"PointXYTpc") ) {
1450 int eastsec = (oName.Contains(
"TpcE") || oName.Contains(
"TpcQE") ? 12 : 0);
1451 ruler.SetLineColor(0);
1452 ruler.SetLineStyle(2);
1453 float sz = latex.GetTextSize();
1454 latex.SetTextAlign(32);
1455 latex.SetTextSize(0.032);
1456 int secn = (eastsec ? 21 : 13);
1457 float phistep = TMath::Pi()/12;
1458 for (
float phi=phistep; phi<6.2; phi+=phistep) {
1459 float xsec = TMath::Cos(phi);
1460 float ysec = TMath::Sin(phi);
1461 ruler.DrawLine(50*xsec,50*ysec,199*xsec,199*ysec);
1463 xsec = TMath::Cos(phi);
1464 ysec = TMath::Sin(phi);
1465 latex.SetTextAngle(phi*180/TMath::Pi()+1);
1466 latex.DrawLatex(52*xsec,52*ysec,Form(
"%d",secn%12 + eastsec + 1));
1467 secn += (eastsec ? 1 : -1);
1469 latex.SetTextSize(sz);
1470 ruler.SetLineStyle(1);
1473 if (oName.EndsWith(
"QaPointPhiT")) {
1474 float hmin = hobj->GetMinimum() ;
1475 float hmax = hobj->GetMaximum() ;
1476 float hmid = hmin+0.12*(hmax-hmin);
1477 float sz = latex.GetTextSize();
1478 latex.SetTextSize(0.045);
1479 latex.SetTextColor(2);
1480 latex.SetTextAngle(90);
1481 latex.SetTextAlign(22);
1482 for (
int secn = 1; secn < 13; secn++) {
1483 float phisec = 87 - secn*30;
1484 while (phisec < 1) phisec += 360;
1485 latex.DrawLatex(phisec,hmid,Form(
"%d / %d",secn,(23-secn)%12 + 13));
1487 latex.SetTextSize(sz);
1488 latex.SetTextColor(1);
1489 latex.SetTextAngle(0);
1492 if ((chkdim == 2) && (oName.Contains(
"TPC_charge"))) {
1493 TH2F* hobj_TPC_charge = (TH2F*) hobj;
1495 TProfile *prof_hobjTPC = (TProfile*) hobj_TPC_charge->ProfileX();
1496 prof_hobjTPC->SetMarkerStyle(20);
1497 prof_hobjTPC->SetMarkerSize(0.6);
1498 prof_hobjTPC->SetMarkerColor(6);
1499 prof_hobjTPC->SetLineColor(6);
1502 static TF1 *flandau = 0;
1503 if (!flandau) flandau =
new TF1(
"flandau",
"[0]*TMath::Landau(x,[1],[2])",0,200);
1504 flandau->SetParameters(2e-3*(hobj->GetEntries()), 125, 30);
1505 hobj_TPC_charge->FitSlicesY(flandau);
1507 TH1D *mean_landau = (TH1D*) (gDirectory->Get(Form(
"%s_1",hobj_TPC_charge->GetName())));
1509 mean_landau->SetMarkerStyle(20);
1510 mean_landau->SetMarkerSize(0.6);
1511 mean_landau->SetMarkerColor(1);
1512 mean_landau->Draw(
"same p");
1514 LOG_WARN <<
"TPC_charge Landau FitSlicesY failed for " << hobj->GetName() << endm;
1526 prof_hobjTPC->Draw(
"same p");
1529 TLegend *ilegend =
new TLegend(0.15,0.80,0.38,0.90);
1530 ilegend->SetFillColor(0);
1531 ilegend->SetHeader(
"Legend");
1532 ilegend->SetMargin(0.25);
1533 ilegend->AddEntry(prof_hobjTPC,
"Profile mean",
"pz");
1534 ilegend->AddEntry(mean_landau,
"Landau MPV",
"pz");
1538 if (padAdvance) {
if (gPad) gPad->Update();}
1539 else {
if (!analRepeat) padCount--;}
1552 TString onamebase = StripPrefixes(oname,tempint,-1);
1553 huR = (
StHistUtilRef*) (m_refCuts->FindObject(onamebase.Data()));
1556 onamebase = StripPrefixes(oname,tempint,1);
1557 huR = (
StHistUtilRef*) (m_refCuts->FindObject(onamebase.Data()));
1560 onamebase = StripPrefixes(oname,tempint,0);
1561 huR = (
StHistUtilRef*) (m_refCuts->FindObject(onamebase.Data()));
1569 int mode = ( huR ? huR->Mode : 2 );
1570 double cut = ( huR ? huR->Cut : 0);
1575 result = hobjO->Chi2Test(hobjR,(huR ? huR->Options() :
"WW"));
1583 result = hobjO->KolmogorovTest(hobjR,(huR ? huR->Options() :
""));
1587 TString analOpts = (huR ? huR->Options() :
"");
1589 if (! analOpts.Contains(
'M')) analOpts +=
'M';
1590 result = 1.0 - hobjO->KolmogorovTest(hobjR,analOpts.Data());
1593 bool analPass = (result >= cut);
1595 TString score = Form(
"Score: %4.2f (%s vs. %4.2f)",result,
1596 (analPass ?
"PASS" :
"FAIL"),cut);
1598 if (m_PrintMode & QAU1<<QAprintIndivRef)
1599 gPad->Print(Form(
"Ref_%s%s",oName.Data(),m_OutIndividuals.Data()));
1601 gPad->Print(Form(
"Ref_%s.png",oName.Data()));
1605 float sz = latex.GetTextSize();
1606 latex.SetTextSize(0.038);
1607 latex.SetTextAngle(90);
1608 latex.SetTextAlign(11);
1609 latex.SetTextColor(analPass ? kGreen+4 : kRed+2);
1610 latex.DrawTextNDC(0.999,0.001,score.Data());
1612 latex.SetTextColor(1);
1613 latex.SetTextSize(sz);
1614 if (m_PrintMode & QAU1<<QAprintIndiv)
1615 gPad->Print(Form(
"%s%s",oName.Data(),m_OutIndividuals.Data()));
1617 gPad->Print(Form(
"%s.png",oName.Data()));
1621 LOG_INFO << Form(
" - %d. Reference Test (mode=%d) %s",
1622 histReadCounter,mode,score.Data()) << endm;
1623 if (strlen(m_refResultsFile)) {
1624 if (!R_ostr) R_ostr =
new ofstream(m_refResultsFile);
1625 (*R_ostr) << m_CurPage <<
" " << curPad <<
" " << oName <<
" " << result << endl;
1628 if (m_PrintMode & QAU1<<QAprintIndiv)
1629 gPad->Print(Form(
"%s%s",oName.Data(),m_OutIndividuals.Data()));
1631 gPad->Print(Form(
"%s.png",oName.Data()));
1632 if (strlen(m_refResultsFile)) {
1633 if (!R_ostr) R_ostr =
new ofstream(m_refResultsFile);
1634 (*R_ostr) << m_CurPage <<
" " << curPad <<
" " << oName <<
" 1.0" << endl;
1649 if (C_ostr)
delete C_ostr;
1650 if (R_ostr)
delete R_ostr;
1651 if (root_ofile)
delete root_ofile;
1660 TList* StHistUtil::FindHists(
const Char_t *dirName,
const Char_t *withPrefix)
1673 LOG_INFO <<
" Beg: FindHists, dList pointer = " << dList << endm;
1683 PathCopy(m_dirName,dirName);
1684 StMaker *temp = m_PntrToMaker->GetMaker(m_dirName);
1687 LOG_INFO <<
"FindHists - found pointer to maker" << endm;
1688 dList = temp->Histograms();
1694 if (dList) test = dList->First();
1696 LOG_INFO <<
" FindHists - found hist. in Maker-Branch " << endm;
1699 LOG_INFO <<
" Mid: FindHists, dList pointer = " << dList << endm;
1700 LOG_INFO <<
" Mid: FindHists, test pointer = " << test << endm;
1704 if (!test) dList = 0;
1706 LOG_INFO <<
" Mid2: FindHists, dList pointer = " << dList << endm;
1707 LOG_INFO <<
" Mid2: FindHists, test pointer = " << test << endm;
1718 hist = m_PntrToMaker->GetDataSet(
"hist");
1726 TString hBN(m_dirName);
1731 QAH = hist->
Find(hBN.Data());
1743 LOG_INFO <<
" FindHists - found hist. in histBranch, with name: "
1744 << m_dirName << endm;
1747 LOG_INFO <<
" FindHists - histogram branch has not been found for branch --> "
1748 << m_dirName << endm;
1753 if (dList && (withPrefix || m_ListOfPrint)) dList = TrimListByPrefix(dList,withPrefix);
1755 LOG_INFO <<
" FindHists, dList pointer = " << dList << endm;
1762 TList* StHistUtil::FindHists(TFile* histFile,
const Char_t* withPrefix) {
1763 if (!histFile)
return 0;
1764 TList* dList = histFile->GetList();
1765 if (dList->GetSize() == 0) {
1766 histFile->ReadAll();
1767 dList = histFile->GetList();
1770 TObject* test = (dList ? dList->First() : 0);
1771 LOG_INFO <<
" Mid5: FindHists, dList pointer = " << dList << endm;
1772 LOG_INFO <<
" Mid5: FindHists, test pointer = " << test << endm;
1773 if (!test) dList = 0;
1775 if (dList && (withPrefix || m_ListOfPrint)) dList = TrimListByPrefix(dList,withPrefix);
1780 TList* StHistUtil::TrimListByPrefix(TList* dList,
const Char_t* withPrefix) {
1781 TList* dList2 =
new TList;
1785 TIter nextObj(dList);
1787 int withPrefixNumber = -1;
1788 int prefixNumber = -1;
1789 if (withPrefix) StripPrefixes(withPrefix,withPrefixNumber);
1790 while ((obj = nextObj())) {
1791 Bool_t addIt = kTRUE;
1793 StripPrefixes(obj->GetName(),prefixNumber);
1794 if (prefixNumber != withPrefixNumber) addIt = kFALSE;
1796 if (addIt && ((!m_ListOfPrint) ||
1797 (obj->InheritsFrom(
"TH1") &&
1798 m_ListOfPrint->FindObject(obj->GetName())))) dList2->AddLast(obj);
1800 m_ItemsToClear->Add(dList2);
1806 Int_t StHistUtil::ListHists(
const Char_t *dirName)
1812 LOG_INFO <<
" **** Now in StHistUtil::ListHists **** " << endm;
1816 TList* dirList = (m_PntrToMaker ? FindHists(dirName) : FindHists(m_PntrToPlainFile));
1818 if (!dirList) { LOG_INFO <<
" ListHists - histograms not available! " << endm; }
1822 TIter nextObj(dirList);
1823 Int_t histReadCount = 0;
1827 while ((obj = nextObj())) {
1830 if (obj->InheritsFrom(
"TH1")) {
1835 LOG_INFO <<
" ListHists: Hist No. " << histReadCount <<
", Type: " << obj->ClassName()
1836 <<
", Name: " << obj->GetName() <<
", Title \"" << obj->GetTitle() <<
"\" "<< endm;
1840 LOG_INFO <<
" ListHists: Total No. Histograms Booked = " << histReadCount <<endm;
1841 return histReadCount;
1847 Int_t StHistUtil::PrintInfoHists(TList *dirList,
const Char_t *fname )
1850 LOG_INFO <<
" **** Now in StHistUtil::PrintInfoHists **** " << endm;
1851 LOG_INFO <<
" output file = " << fname << endm;
1853 ofstream fout(fname);
1855 if (!dirList) { LOG_INFO <<
" PrintInfoHists - histograms not available! " << endm; }
1857 Int_t histInfoCount = 0;
1863 TIter nextObj(dirList);
1866 LOG_INFO <<
" Hist #, Name, #Entries, Mean, RMS " << endm;
1867 fout <<
" Hist #, Name, #Entries, Mean, RMS " << endl;
1871 while ((obj = nextObj())) {
1874 if (obj->InheritsFrom(
"TH1")) {
1879 histInfoCount <<
" " <<
1880 obj->GetName() <<
" " <<
1881 ((TH1 *)obj)->GetEntries() <<
" " <<
1882 ((TH1 *)obj)->GetMean() <<
" " <<
1883 ((TH1 *)obj)->GetRMS() <<
" " <<
1887 histInfoCount <<
" " <<
1888 obj->GetName() <<
" " <<
1889 ((TH1 *)obj)->GetEntries() <<
" " <<
1890 ((TH1 *)obj)->GetMean() <<
" " <<
1891 ((TH1 *)obj)->GetRMS() <<
" " <<
1898 LOG_INFO <<
" PrintInfoHists: # hist read = " << histInfoCount <<endm;
1900 return histInfoCount;
1907 Int_t StHistUtil::CopyHists(TList *dirList)
1910 LOG_INFO <<
" **** Now in StHistUtil::CopyHists **** " << endm;
1913 if (!dirList) { LOG_INFO <<
" StHistUtil::CopyHists - histogram Pointer not set! " << endm; }
1917 Int_t tempint,ijk=0;
1918 Int_t histCopyCount = 0;
1921 TIter nextObj(dirList);
1923 while ((obj = nextObj())) {
1924 if (obj->InheritsFrom(
"TH1") &&
1925 (!m_ListOfPrint || (m_ListOfPrint->FindObject(obj->GetName())))) {
1927 if (ijk >= maxHistCopy - 1){
1928 Int_t newMaxHistCopy = maxHistCopy * 4;
1929 TH1** temp1 =
new TH1ptr[newMaxHistCopy];
1930 memset(temp1,0,newMaxHistCopy*sizeOfTH1Ptr);
1931 memcpy(temp1,newHist,maxHistCopy*sizeOfTH1Ptr);
1934 maxHistCopy = newMaxHistCopy;
1936 newHist[ijk] = ((TH1 *)obj->Clone());
1937 if (ignorePrefixes) {
1938 newHist[ijk]->SetName (StripPrefixes(newHist[ijk]->GetName (),tempint).Data());
1939 newHist[ijk]->SetTitle(StripPrefixes(newHist[ijk]->GetTitle(),tempint).Data());
1946 LOG_INFO <<
" ListHists: Total No. Histograms Copied = " <<
1947 histCopyCount <<endm;
1960 return histCopyCount;
1970 Int_t StHistUtil::AddHists(TList *dirList,Int_t numHistCopy)
1973 LOG_INFO <<
" **** Now in StHistUtil::AddHists **** " << endm;
1977 if (!dirList) { LOG_INFO <<
1978 " StHistUtil::AddHists - histogram Pointer not set! " << endm; }
1980 Int_t histAddCount = 0;
1984 if (numHistCopy < 0) numHistCopy = dirList->GetSize();
1985 TIter nextObj(dirList);
1988 while ((obj = nextObj())) {
1989 if (obj->InheritsFrom(
"TH1")) {
1990 TString oName = obj->GetName();
1991 if (ignorePrefixes) oName = StripPrefixes(oName.Data(),tempInt);
1993 Int_t tempint,imk = 0;
1994 Bool_t notfound =
true;
1995 for (imk=0;imk<maxHistCopy;imk++) {
1997 TString nName = newHist[imk]->GetName();
1998 if (ignorePrefixes) nName = StripPrefixes(nName.Data(),tempInt);
1999 if (! (nName.CompareTo(oName))) {
2001 newHist[imk]->Add((TH1 *)obj);
2011 if (imk >= maxHistCopy-1){
2012 Int_t newMaxHistCopy = maxHistCopy * 4;
2013 TH1** temp1 =
new TH1ptr[newMaxHistCopy];
2014 memset(temp1,0,newMaxHistCopy*sizeOfTH1Ptr);
2015 memcpy(temp1,newHist,maxHistCopy*sizeOfTH1Ptr);
2018 maxHistCopy = newMaxHistCopy;
2020 newHist[imk] = ((TH1 *)obj->Clone());
2021 if (ignorePrefixes) {
2022 newHist[imk]->SetName (StripPrefixes(newHist[imk]->GetName (),tempint).Data());
2023 newHist[imk]->SetTitle(StripPrefixes(newHist[imk]->GetTitle(),tempint).Data());
2033 LOG_INFO <<
" StHistUtil::AddHists: Total No. Histograms Added = " <<
2034 histAddCount <<endm;
2037 return histAddCount;
2043 Int_t StHistUtil::ExamineLogYList()
2049 LOG_INFO <<
" **** Now in StHistUtil::ExamineLogYList **** " << endm;
2056 TIter nextObj(m_ListOfLogY);
2057 Int_t LogYCount = 0;
2060 while ((obj = nextObj())) {
2062 if (Debug()) { LOG_INFO <<
" StHistUtil::ExamineLogYList has hist " << obj->GetName() << endm; }
2067 LOG_INFO <<
" Now in StHistUtil::ExamineLogYList, No. Hist. in LogY scale = " << LogYCount <<endm;
2074 Int_t StHistUtil::ExamineLogXList()
2080 LOG_INFO <<
" **** Now in StHistUtil::ExamineLogXList **** " << endm;
2087 TIter nextObj(m_ListOfLogX);
2088 Int_t LogXCount = 0;
2091 while ((obj = nextObj())) {
2094 LOG_INFO <<
" StHistUtil::ExamineLogXList has hist " << obj->GetName() << endm;
2100 LOG_INFO <<
" Now in StHistUtil::ExamineLogXList, No. Hist. in LogX scale = " << LogXCount <<endm;
2107 Int_t StHistUtil::ExaminePrintList()
2113 LOG_INFO <<
" **** Now in StHistUtil::ExaminePrintList **** " << endm;
2119 if (!m_ListOfPrint){
2120 LOG_INFO <<
" no subset print list was setup - all hist in directory will be printed " << endm;
2129 TIter nextObj(m_ListOfPrint);
2130 Int_t PrintCount = 0;
2133 while ((obj = nextObj())) {
2136 LOG_INFO <<
" StHistUtil::ExaminePrintList has hist " << obj->GetName() << endm;
2142 LOG_INFO <<
" Now in StHistUtil::ExaminePrintList, No. Hist. to Print,Draw = " << PrintCount <<endm;
2143 return m_ListOfPrint->GetSize();
2149 Int_t StHistUtil::AddToLogYList(
const Char_t *HistName){
2154 LOG_INFO <<
" **** Now in StHistUtil::AddToLogYList **** " << endm;
2159 if (!m_ListOfLogY) m_ListOfLogY =
new TList;
2163 TObjString *HistNameObj =
new TObjString(HistName);
2167 lobj = m_ListOfLogY->FindObject(HistName);
2170 m_ListOfLogY->Add(HistNameObj);
2172 LOG_INFO <<
" StHistUtil::AddToLogYList: " << HistName <<endm;
2175 LOG_INFO <<
" StHistUtil::AddToLogYList: " << HistName <<
" already in list - not added" <<endm;
2179 return m_ListOfLogY->GetSize();
2186 Int_t StHistUtil::AddToLogXList(
const Char_t *HistName){
2191 LOG_INFO <<
" **** Now in StHistUtil::AddToLogXList **** " << endm;
2196 if (!m_ListOfLogX) m_ListOfLogX =
new TList;
2200 TObjString *HistNameObj =
new TObjString(HistName);
2204 lobj = m_ListOfLogX->FindObject(HistName);
2207 m_ListOfLogX->Add(HistNameObj);
2209 LOG_INFO <<
" StHistUtil::AddToLogXList: " << HistName <<endm;
2212 LOG_INFO <<
" StHistUtil::AddToLogXList: " << HistName <<
" already in list - not added" <<endm;
2216 return m_ListOfLogX->GetSize();
2223 Int_t StHistUtil::AddToPrintList(
const Char_t *HistName){
2229 LOG_INFO <<
" **** Now in StHistUtil::AddToPrintList **** " << endm;
2234 if (!m_ListOfPrint) m_ListOfPrint =
new TList;
2238 TObjString *HistNameObj =
new TObjString(HistName);
2241 if (!m_ListOfPrint->Contains(HistName)) {
2242 m_ListOfPrint->Add(HistNameObj);
2244 LOG_INFO <<
" StHistUtil::AddToPrintList: " << HistName <<endm;
2247 LOG_INFO <<
" StHistUtil::AddToPrintList: " << HistName <<
" already in list - not added" <<endm;
2251 return m_ListOfPrint->GetSize();
2257 Int_t StHistUtil::RemoveFromLogYList(
const Char_t *HistName){
2262 LOG_INFO <<
" **** Now in StHistUtil::RemoveFromLogYList **** " << endm;
2271 lobj = m_ListOfLogY->FindObject(HistName);
2274 m_ListOfLogY->Remove(lobj);
2276 LOG_INFO <<
" RemoveLogYList: " << HistName <<
" has been removed from list" <<endm;
2279 LOG_INFO <<
" RemoveLogYList: " << HistName <<
" not on list - not removing" <<endm;
2283 return m_ListOfLogY->GetSize();
2286 LOG_INFO <<
" RemoveLogYList: " << HistName <<
" not on list - not removing" <<endm;
2293 Int_t StHistUtil::RemoveFromLogXList(
const Char_t *HistName){
2298 LOG_INFO <<
" **** Now in StHistUtil::RemoveFromLogXList **** " << endm;
2307 lobj = m_ListOfLogX->FindObject(HistName);
2310 m_ListOfLogX->Remove(lobj);
2312 LOG_INFO <<
" RemoveLogXList: " << HistName <<
" has been removed from list" <<endm;
2315 LOG_INFO <<
" RemoveLogXList: " << HistName <<
" not on list - not removing" <<endm;
2319 return m_ListOfLogX->GetSize();
2322 LOG_INFO <<
" RemoveLogXList: " << HistName <<
" not on list - not removing" <<endm;
2329 Int_t StHistUtil::RemoveFromPrintList(
const Char_t *HistName){
2334 LOG_INFO <<
" **** Now in StHistUtil::RemoveFromPrintList **** " << endm;
2338 if (m_ListOfPrint) {
2343 lobj = m_ListOfPrint->FindObject(HistName);
2346 m_ListOfPrint->Remove(lobj);
2348 LOG_INFO <<
" RemovePrintList: " << HistName <<
" has been removed from list" <<endm;
2351 LOG_INFO <<
" RemovePrintList: " << HistName <<
" not on list - not removing" <<endm;
2355 return m_ListOfPrint->GetSize();
2358 LOG_INFO <<
" RemovePrintList: " << HistName <<
" not on list - not removing" <<endm;
2367 void StHistUtil::SetDefaultLogYList(
const Char_t *dirName)
2373 LOG_INFO <<
" **** Now in StHistUtil::SetDefaultLogYList **** " << endm;
2377 PathCopy(m_dirName,dirName);
2379 if (!strcmp(m_dirName,
"QA"))
2381 else if (!strcmp(m_dirName,
"EventQA"))
2386 const Char_t* sdefList[] = {
2387 #include "St_QA_Maker/QAhlist_logy.h"
2390 Int_t lengofList =
sizeof(sdefList)/sizeOfCharPtr;
2393 for (ilg=0;ilg<lengofList;ilg++) {
2394 TString listString = sdefList[ilg];
2395 if (!(listString.BeginsWith(
"fcl") ||
2396 listString.BeginsWith(
"fms_qt_") ||
2397 listString.BeginsWith(
"fpd_channel_"))) {
2398 for (Int_t k=0; k<numOfPosPrefixes; k++) {
2399 ((listString = type) += possiblePrefixes[k]) += sdefList[ilg];
2400 numLog = AddToLogYList(listString.Data());
2402 }
else numLog = AddToLogYList(listString.Data());
2405 LOG_INFO <<
" !!! StHistUtil::SetDefaultLogYList, # histogram put in list " << numLog << endm;
2413 void StHistUtil::SetDefaultLogXList(
const Char_t *dirName)
2419 LOG_INFO <<
" **** Now in StHistUtil::SetDefaultLogXList **** " << endm;
2422 PathCopy(m_dirName,dirName);
2424 if (!strcmp(m_dirName,
"QA"))
2426 else if (!strcmp(m_dirName,
"EventQA"))
2431 const Char_t* sdefList[] = {
2432 #include "St_QA_Maker/QAhlist_logx.h"
2435 Int_t lengofList =
sizeof(sdefList)/sizeOfCharPtr;
2438 for (ilg=0;ilg<lengofList;ilg++) {
2439 TString listString = sdefList[ilg];
2440 if (!(listString.BeginsWith(
"fcl") ||
2441 listString.BeginsWith(
"fms_qt_") ||
2442 listString.BeginsWith(
"fpd_channel_"))) {
2443 for (Int_t k=0; k<numOfPosPrefixes; k++) {
2444 ((listString = type) += possiblePrefixes[k]) += sdefList[ilg];
2445 numLog = AddToLogXList(listString.Data());
2447 }
else numLog = AddToLogXList(listString.Data());
2450 LOG_INFO <<
" !!! StHistUtil::SetDefaultLogXList, # histogram put in list " << numLog << endm;
2463 void StHistUtil::SetDefaultPrintList(
const Char_t *dirName,
const Char_t *analType)
2466 LOG_INFO <<
" **** Now in StHistUtil::SetDefaultPrintList **** " << endm;
2468 const Char_t **sdefList=0;
2469 Int_t lengofList = 0;
2470 bool mustDeleteList =
false;
2472 PathCopy(m_dirName,dirName);
2474 if (!strcmp(m_dirName,
"QA"))
2476 else if (!strcmp(m_dirName,
"EventQA"))
2483 if ((!strcmp(analType,
"")) || (!strcmp(analType,
"All")) ) {
2484 LOG_INFO <<
" All histograms in directory will be printed/drawn, no list set" << endm;
2489 const Char_t* sdefList1[] = {
2490 #include "St_QA_Maker/QAhlist_QA_Cosmic.h"
2492 if ((!strcmp(m_dirName,
"QA")) && (!strcmp(analType,
"Cosmic"))) {
2493 sdefList = sdefList1; lengofList =
sizeof(sdefList1)/sizeOfCharPtr;
2497 const Char_t* sdefList2[] = {
2498 #include "St_QA_Maker/QAhlist_QA_TestQATable.h"
2500 if ((!strcmp(m_dirName,
"QA")) && (!strcmp(analType,
"TestQATable"))) {
2501 sdefList = sdefList2; lengofList =
sizeof(sdefList2)/sizeOfCharPtr;
2505 const Char_t* sdefList3[] = {
2506 #include "St_QA_Maker/QAhlist_QA_Ftpc.h"
2508 if ((!strcmp(m_dirName,
"QA")) && (!strcmp(analType,
"Ftpc"))) {
2509 sdefList = sdefList3; lengofList =
sizeof(sdefList3)/sizeOfCharPtr;
2513 const Char_t* sdefList4[] = {
2514 #include "St_QA_Maker/QAhlist_QA_MDC3.h"
2516 if ((!strcmp(m_dirName,
"FlowTag")) && (!strcmp(analType,
"MDC3"))) {
2517 sdefList = sdefList4; lengofList =
sizeof(sdefList4)/sizeOfCharPtr;
2521 const Char_t* sdefList5[] = {
2522 #include "St_QA_Maker/QAhlist_QA_year1.h"
2524 if ((!strcmp(m_dirName,
"QA")) && (!strcmp(analType,
"year1"))) {
2525 sdefList = sdefList5; lengofList =
sizeof(sdefList5)/sizeOfCharPtr;
2529 const Char_t* sdefList6[] = {
2530 #include "St_QA_Maker/QAhlist_EventQA_year1.h"
2532 if ((!strcmp(m_dirName,
"EventQA")) && (!strcmp(analType,
"year1"))) {
2533 sdefList = sdefList6; lengofList =
sizeof(sdefList6)/sizeOfCharPtr;
2537 const Char_t* sdefList7[] = {
2538 #include "St_QA_Maker/QAhlist_QA_qa_shift.h"
2540 if ((!strcmp(m_dirName,
"QA")) && (!strcmp(analType,
"qa_shift"))) {
2541 sdefList = sdefList7; lengofList =
sizeof(sdefList7)/sizeOfCharPtr;
2545 const Char_t* sdefList8[] = {
2546 #include "St_QA_Maker/QAhlist_EventQA_qa_shift.h"
2548 if ((!strcmp(m_dirName,
"EventQA")) && (!strcmp(analType,
"qa_shift"))) {
2549 sdefList = sdefList8; lengofList =
sizeof(sdefList8)/sizeOfCharPtr;
2553 const Char_t* sdefList9[] = {
2554 #include "St_QA_Maker/QAhlist_tpcSectors.h"
2556 if ((!strcmp(m_dirName,
"EventQA")) && (!strcmp(analType,
"tpcSectors"))) {
2557 sdefList = sdefList9; lengofList =
sizeof(sdefList9)/sizeOfCharPtr;
2561 const Char_t* sdefList10[] = {
2562 #include "St_QA_Maker/QAhlist_Svt.h"
2564 if (!strcmp(analType,
"Svt")) {
2565 sdefList = sdefList10; lengofList =
sizeof(sdefList10)/sizeOfCharPtr;
2569 const Char_t* sdefList11[] = {
2570 #include "St_QA_Maker/QAhlist_subsystems.h"
2572 if (!strcmp(analType,
"subsys")) {
2573 sdefList = sdefList11; lengofList =
sizeof(sdefList11)/sizeOfCharPtr;
2578 ifstream analFile(analType);
2579 if (analFile.good()) {
2580 LOG_INFO <<
"Reading print list from: " << analType << endm;
2581 sdefList =
new charptr[4096];
2582 mustDeleteList =
true;
2583 char analBuffer[256];
2585 Bool_t commenting = kFALSE;
2586 Int_t commentIdx = -1;
2587 while (analFile.getline(analBuffer,255)) {
2588 analString = analBuffer;
2590 commentIdx = analString.Index(
"*/");
2591 if (commentIdx>=0) {
2592 analString.Remove(0,commentIdx+2);
2593 commenting = kFALSE;
2597 commentIdx = analString.Index(
"/*");
2598 if (commentIdx>=0) {
2599 analString.Remove(commentIdx);
2603 commentIdx = analString.Index(
"//");
2604 if (commentIdx>=0) analString.Remove(commentIdx);
2605 analString.Remove(TString::kBoth,
' ').Remove(TString::kBoth,
',').Remove(TString::kBoth,
' ').Remove(TString::kBoth,
'"');
2606 Int_t alen = analString.Length();
2607 if (alen<1)
continue;
2608 Char_t* tempc =
new Char_t[alen+1];
2609 strcpy(tempc,analString.Data());
2610 sdefList[lengofList] = tempc;
2614 LOG_WARN <<
"Could not find list of histograms specified by: " << analType << endm;
2620 for (ilg=0;ilg<lengofList;ilg++) {
2621 TString ilgString = sdefList[ilg];
2622 if (mustDeleteList)
delete [] sdefList[ilg];
2623 Bool_t addIt = kTRUE;
2624 if (ilgString.BeginsWith(
":")) {
2625 Ssiz_t endDetSpec = ilgString.Index(
":",1) + 1;
2626 TString detSpec = ilgString(0,endDetSpec);
2627 addIt = DetectorIn(detSpec.Data());
2628 if (addIt) ilgString.Remove(0,endDetSpec);
2631 TRegexp fcsPattern(
"^h[12]_.+"); Ssiz_t ext=0;
2632 if (!(ilgString.BeginsWith(
"fcl") ||
2633 ilgString.BeginsWith(
"fms_qt_") ||
2634 ilgString.BeginsWith(
"Z3A") ||
2635 ilgString.Contains(
"etof",TString::ECaseCompare::kIgnoreCase) ||
2636 ilgString.Contains(
"_matchCand_") ||
2637 ilgString.BeginsWith(
"G_primary") ||
2638 ilgString.Index(fcsPattern,&ext)==0 ||
2639 ilgString.BeginsWith(
"fpd_channel_"))) {
2640 for (Int_t k=0; k<numOfPosPrefixes; k++) {
2641 TString listString = type;
2642 (listString += possiblePrefixes[k]) += ilgString;
2643 numPrt = AddToPrintList(listString.Data());
2645 }
else numPrt = AddToPrintList(ilgString.Data());
2647 LOG_INFO <<
" !!! adding histogram " << ilgString <<
" to print list " << endm ;
2651 if (mustDeleteList)
delete [] sdefList;
2653 LOG_INFO <<
" !!! StHistUtil::SetDefaultPrintList, # histogram put in list " << numPrt << endm;
2662 Int_t StHistUtil::Overlay1D(Char_t *dirName,Char_t *inHist1,
2665 LOG_INFO <<
" **** Now in StHistUtil::Overlay1D **** " << endm;
2668 PathCopy(m_dirName,dirName);
2671 TList* dirList = (m_PntrToMaker ? FindHists(m_dirName) : FindHists(m_PntrToPlainFile));
2677 LOG_INFO <<
"Histogram directory exists -> Find and overlay histograms" << endm;
2680 TIter nextObj(dirList);
2684 TH1F *hist1f1 =
new TH1F;
2685 TH1F *hist1f2 =
new TH1F;
2689 while ((obj = nextObj())) {
2692 if (obj->InheritsFrom(
"TH1")) {
2693 if (obj->GetName() == (TString)inHist1 ||
2694 obj->GetName() == (TString)inHist2) {
2695 LOG_INFO <<
" Found Histogram: Type '" << obj->ClassName() <<
"', Name '"
2696 << obj->GetName() <<
"', Title '" << obj->GetTitle() <<
"'"
2700 if (obj->ClassName() == (TString)
"TH1F") {
2701 if (obj->GetName() == (TString)inHist1) {
2702 *hist1f1 = *(TH1F *)obj;
2705 if (obj->GetName() == (TString)inHist2) {
2706 *hist1f2 = *(TH1F *)obj;
2710 LOG_INFO <<
" ERROR: histogram not of type TH1F !!!" << endm;
2717 if (n1dHists == 2) {
2718 hist1f1->SetLineColor(4);
2719 hist1f1->SetLineStyle(1);
2720 hist1f2->SetLineColor(2);
2721 hist1f2->SetLineStyle(2);
2723 hist1f1->SetStats(kFALSE);
2724 hist1f2->SetStats(kFALSE);
2726 hist1f1->SetTitle(hist1f1->GetTitle()+(TString)
" and "+hist1f2->GetTitle());
2727 hist1f2->SetTitle(hist1f1->GetTitle());
2729 TCanvas *newCanvas =
new TCanvas(
"c1d",
"Combined 1D Histogram",600,780);
2733 Ltitle =
new TPaveLabel(0.1,0.96,0.9,1.0,m_GlobalTitle.Data(),
"br");
2734 Ltitle->SetFillColor(18);
2735 Ltitle->SetTextFont(32);
2736 Ltitle->SetTextSize(0.5);
2741 const Char_t *myTime = HistTime.AsString();
2742 TPaveLabel *Ldatetime =
new TPaveLabel(0.7,0.01,0.95,0.03,myTime,
"br");
2743 Ldatetime->SetTextSize(0.6);
2747 TPad *newPad =
new TPad(
"p1d",
"Combined 1D Histogram",0.02,0.04,0.98,0.93);
2752 if (hist1f1->GetMaximum() >= hist1f2->GetMaximum()) {
2754 hist1f2->Draw(
"Same");
2758 hist1f1->Draw(
"Same");
2762 TLegend *legend =
new TLegend(0.75,0.85,0.98,0.95);
2763 legend->SetFillColor(0);
2764 legend->SetHeader(
"Legend");
2765 legend->SetMargin(0.25);
2766 legend->AddEntry(hist1f1,inHist1,
"l");
2767 legend->AddEntry(hist1f2,inHist2,
"l");
2770 newCanvas->Update();
2783 Int_t StHistUtil::Overlay2D(Char_t *dirName,Char_t *inHist1,
2786 LOG_INFO <<
" **** Now in StHistUtil::Overlay2D **** " << endm;
2789 PathCopy(m_dirName,dirName);
2792 TList* dirList = (m_PntrToMaker ? FindHists(m_dirName) : FindHists(m_PntrToPlainFile));
2798 LOG_INFO <<
"Histogram directory exists -> Find and overlay histograms" << endm;
2801 TIter nextObj(dirList);
2805 TH2F *hist2f1 =
new TH2F;
2806 TH2F *hist2f2 =
new TH2F;
2810 while ((obj = nextObj())) {
2813 if (obj->InheritsFrom(
"TH1")) {
2814 if (obj->GetName() == (TString)inHist1 ||
2815 obj->GetName() == (TString)inHist2) {
2816 LOG_INFO <<
" Found Histogram: Type '" << obj->ClassName() <<
"', Name '"
2817 << obj->GetName() <<
"', Title '" << obj->GetTitle() <<
"'"
2821 if (obj->ClassName() == (TString)
"TH2F") {
2822 if (obj->GetName() == (TString)inHist1) {
2823 *hist2f1 = *(TH2F *)obj;
2826 if (obj->GetName() == (TString)inHist2) {
2827 *hist2f2 = *(TH2F *)obj;
2831 LOG_INFO <<
" ERROR: histogram is not of type TH2F !!!" << endm;
2838 if (n2dHists == 2) {
2839 hist2f1->SetLineColor(4);
2840 hist2f2->SetLineColor(2);
2842 hist2f1->SetStats(kFALSE);
2843 hist2f2->SetStats(kFALSE);
2845 hist2f1->SetTitle(hist2f1->GetTitle()+(TString)
" and "+hist2f2->GetTitle());
2846 hist2f2->SetTitle(hist2f1->GetTitle());
2849 TCanvas *newCanvas =
new TCanvas(
"c2d",
"Combined 2D Histogram",600,780);
2853 Ltitle =
new TPaveLabel(0.1,0.96,0.9,1.0,m_GlobalTitle.Data(),
"br");
2854 Ltitle->SetFillColor(18);
2855 Ltitle->SetTextFont(32);
2856 Ltitle->SetTextSize(0.5);
2861 const Char_t *myTime = HistTime.AsString();
2862 TPaveLabel *Ldatetime =
new TPaveLabel(0.7,0.01,0.95,0.03,myTime,
"br");
2863 Ldatetime->SetTextSize(0.6);
2867 TPad *newPad =
new TPad(
"p2d",
"Combined 2D Histogram",0.02,0.04,0.98,0.93);
2872 if (hist2f1->GetMaximum() >= hist2f2->GetMaximum()) {
2873 hist2f1->Draw(
"Box");
2874 hist2f2->Draw(
"BoxSame");
2877 hist2f2->Draw(
"Box");
2878 hist2f1->Draw(
"BoxSame");
2882 TLegend *legend =
new TLegend(0.75,0.85,0.98,0.95);
2883 legend->SetFillColor(0);
2884 legend->SetHeader(
"Legend");
2885 legend->SetMargin(0.25);
2886 legend->AddEntry(hist2f1,inHist1,
"f");
2887 legend->AddEntry(hist2f2,inHist2,
"f");
2890 newCanvas->Update();
2905 Int_t StHistUtil::GetRunYear(
const Char_t *filename) {
2908 TString FileName = filename;
2909 TString delim =
"_";
2910 TObjArray* tokens = FileName.Tokenize(delim);
2911 for (
int tk=2; tk<tokens->GetEntries(); tk++) {
2912 TString& tok = ((TObjString*) (tokens->At(tk)))->String();
2913 if (tok.IsDigit()) {
2914 Ssiz_t loc = tok.Length()-6;
2915 if (loc>0) m_RunYear = atoi(tok.Remove(loc).Data());
2928 void StHistUtil::SetRefAnalysis(
const Char_t* refOutFile,
const Char_t* refResultsFile,
2929 const Char_t* refCutsFile,
const Char_t* refInFile) {
2931 LOG_INFO <<
"StHistUtil: Will run in reference histogram analysis mode." << endm;
2934 if (refInFile && strlen(refInFile)) {
2935 LOG_INFO <<
"StHistUtil: Using reference histogram file " << refInFile << endm;
2936 m_refInFile =
new TFile(refInFile);
2937 if (!m_refInFile) {LOG_ERROR <<
"file not found: " << refInFile << endm;}
2939 if (refCutsFile && strlen(refCutsFile)) {
2940 LOG_INFO <<
"StHistUtil: Using reference cuts file " << refCutsFile << endm;
2941 m_refCuts =
new TList;
2942 ifstream refCuts(refCutsFile);
2943 if (!refCuts.is_open()) {
2944 LOG_ERROR <<
"StHistUtil: Unable to open cuts file! Proceeding with no cuts..." << endm;
2949 while (refCuts.good()) {
2950 refCuts >> buf_name;
2951 if (!refCuts.good())
break;
2954 refCuts >> mode >> cut >> buf_opts;
2955 if (!refCuts.good())
break;
2956 if (buf_opts[0] ==
'!') buf_opts[0] = 0;
2958 LOG_INFO <<
"StHistUtil: Loading cut : " << buf_name <<
" : " << mode
2959 <<
" : " << cut <<
" : " << buf_opts <<
" :" << endm;
2961 m_refCuts->AddLast(
new StHistUtilRef(buf_name,buf_opts,mode,cut));
2966 PathCopy(m_refResultsFile,refResultsFile);
2968 PathCopy(m_refOutFile,refOutFile);
2973 void StHistUtil::SetDetectors(
const Char_t *detectors) {
2977 m_Detectors = detectors;
2979 m_Detectors.ReplaceAll(
" ",
":");
2980 m_Detectors.ReplaceAll(
",",
":");
2981 m_Detectors.Prepend(
":");
2982 m_Detectors.Append(
":");
2983 while (m_Detectors.Index(
"::") >= 0) m_Detectors.ReplaceAll(
"::",
":");
2984 LOG_INFO <<
"StHistUtil::SetDetectors(): using detectors " << m_Detectors << endm;
2987 LOG_INFO <<
"StHistUtil::SetDetectors(): using all detectors" << endm;
2993 Bool_t StHistUtil::DetectorIn(
const Char_t *detector) {
2998 Bool_t isIn = kFALSE;
2999 if (m_Detectors.Length()) {
3001 TString detOpts = detector;
3002 TString curDetSet =
"";
3003 TString curDet =
"";
3004 while (idx < detOpts.Length() && ! isIn) {
3005 Ssiz_t D1 = detOpts.Index(
";",idx);
3006 Ssiz_t setLength = (D1 < idx ? detOpts.Length() : D1+1) - idx;
3007 curDetSet = detOpts(idx,setLength);
3010 while (idx2 < curDetSet.Length() && isIn) {
3011 Ssiz_t D2 = curDetSet.Index(
",",idx2);
3012 Ssiz_t detLength = (D2 < idx2 ? curDetSet.Length() : D2+1) - idx2;
3013 curDet = curDetSet(idx2,detLength);
3014 curDet.ReplaceAll(
";",
":");
3015 curDet.ReplaceAll(
",",
":");
3016 curDet.Prepend(
":");
3018 while (curDet.Index(
"::") >= 0) curDet.ReplaceAll(
"::",
":");
3019 if (m_Detectors.Index(curDet.Data()) < 0) isIn = kFALSE;
3020 else idx2 += detLength;
3033 TH1* StHistUtil::FlipAxes(TH1* hist) {
3034 if (!(hist->InheritsFrom(
"TH2")))
return hist;
3037 Int_t xbins = hist->GetNbinsX();
3038 Int_t ybins = hist->GetNbinsY();
3039 TH2D* newhist =
new TH2D(Form(
"%s_flip",hist->GetName()),hist->GetTitle(),
3040 ybins,hist->GetYaxis()->GetXmin(),hist->GetYaxis()->GetXmax(),
3041 xbins,hist->GetXaxis()->GetXmin(),hist->GetXaxis()->GetXmax());
3042 for (
int xbin=1; xbin<=xbins; xbin++) {
3043 for (
int ybin=1; ybin<=ybins; ybin++) {
3044 newhist->SetBinContent(ybin,xbin,hist->GetBinContent(xbin,ybin));
3045 newhist->SetBinError(ybin,xbin,hist->GetBinError(xbin,ybin));
3048 newhist->SetMinimum(hist->GetMinimumStored());
3049 newhist->SetMaximum(hist->GetMaximumStored());
3055 void StHistUtil::PathCopy(
char* destination,
const char* source) {
3057 if (source && strcmp(destination,source)) {
3058 if (strlen(source) < maxPathLen) {
3059 strncpy(destination,source,maxPathLen-1);
3060 destination[maxPathLen-1] = 0;
3062 LOG_ERROR <<
" source path too long: " << source << endm;
3074 const
int mode, const
double cut):
3075 TNamed(name,opts),Mode(mode),
Cut(cut) {}
virtual TObject * GetObject() const
The depricated method (left here for the sake of the backward compatibility)
virtual TDataSet * Find(const char *path) const