00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00272
00274
00275
00276 #include <Stiostream.h>
00277 #include <math.h>
00278 #include <stdlib.h>
00279 #include <string.h>
00280 #include <Stsstream.h>
00281 #include "TFile.h"
00282
00283 #include "PhysicalConstants.h"
00284 #include "TStyle.h"
00285 #include "TCanvas.h"
00286 #include "TObjString.h"
00287 #include "TMath.h"
00288 #include "TString.h"
00289 #include "TPaveLabel.h"
00290 #include "TPaveText.h"
00291 #include "TLegend.h"
00292 #include "TDatime.h"
00293 #include "TLine.h"
00294 #include "TLatex.h"
00295 #include "StMessMgr.h"
00296
00297 #include "St_DataSetIter.h"
00298 #include "StMaker.h"
00299 #include "TF1.h"
00300
00301 #include "StHistUtil.h"
00302
00303 typedef TH1* TH1ptr;
00304 typedef const char* charptr;
00305
00306 const char* possibleQAPrefixes[10] = {"","LM","MM","HM","HP","XX","MB","CL","HT","JP"};
00307 const char* possibleQASuffixes[10] = {
00308 "General",
00309 "Low Mult",
00310 "Mid Mult",
00311 "High Mult",
00312 "High Pt",
00313 "Other Physics",
00314 "MinBias",
00315 "Central",
00316 "High Tower",
00317 "Jet Patch"
00318 };
00319
00320 enum QAprintModes {QAprintSet,
00321 QAprintSetRef,
00322 QAprintIndiv,
00323 QAprintIndivRef};
00324 UInt_t QAU1 = 1;
00325
00326 int sizeOfCharPtr = sizeof(Char_t*);
00327 int sizeOfTH1Ptr = sizeof(TH1*);
00328
00329 ClassImp(StHistUtil)
00330
00331
00332
00333
00334
00335 StHistUtil::StHistUtil(){
00336
00337 numOfPosPrefixes = 10;
00338 possiblePrefixes = possibleQAPrefixes;
00339 possibleSuffixes = possibleQASuffixes;
00340
00341 m_ListOfLogY = 0;
00342 m_ListOfLogX = 0;
00343 m_ListOfPrint = 0;
00344 m_HistCanvas = 0;
00345 m_HistCanvasR = 0;
00346 debug = kFALSE;
00347 m_CurPrefix = -1;
00348 m_CurPage = 0;
00349 m_CurFileName = "";
00350 m_OutFileName = "";
00351 m_OutType = "ps";
00352 m_PrintMode = 0;
00353 m_OutMultiPage = kTRUE;
00354 m_OutIndividuals = "";
00355 m_QAShiftMode = kFALSE;
00356 m_RunYear = 0;
00357
00358 Ltitle = 0;
00359 Ldesc = 0;
00360
00361 maxHistCopy = 4096;
00362 newHist = new TH1ptr[maxHistCopy];
00363 memset(newHist,0,maxHistCopy*sizeOfTH1Ptr);
00364 m_dirName[0] = 0;
00365
00366 ignorePrefixes = kFALSE;
00367
00368 m_analMode = kFALSE;
00369 m_refResultsFile[0] = 0;
00370 m_refOutFile[0] = 0;
00371 m_refCuts = 0;
00372 m_refInFile = 0;
00373 m_PntrToMaker = 0;
00374 m_PntrToPlainFile = 0;
00375
00376 m_Detectors = "";
00377 }
00378
00379
00380
00381
00382 StHistUtil::~StHistUtil(){
00383 SafeDelete(m_HistCanvas);
00384 SafeDelete(m_HistCanvasR);
00385 if (m_ListOfLogY) {
00386 m_ListOfLogY->Delete();
00387 SafeDelete(m_ListOfLogY);
00388 }
00389 if (m_ListOfLogX) {
00390 m_ListOfLogX->Delete();
00391 SafeDelete(m_ListOfLogX);
00392 }
00393 if (m_ListOfPrint) {
00394 m_ListOfPrint->Delete();
00395 SafeDelete(m_ListOfPrint);
00396 }
00397
00398
00399
00400 }
00401
00402 void StHistUtil::SetOutFile(const Char_t *fileName, const Char_t* type) {
00403 m_OutFileName = fileName;
00404 if (m_OutFileName.EndsWith("+")) {
00405 m_OutIndividuals = ".eps";
00406 m_PrintMode |= QAU1<<QAprintIndiv;
00407 if (m_OutFileName.EndsWith("++")) m_PrintMode |= QAU1<<QAprintIndivRef;
00408 while (m_OutFileName.EndsWith("+")) m_OutFileName.Chop();
00409 }
00410 if (type) {
00411 m_OutType = type;
00412 } else {
00413 if (m_OutFileName.EndsWith(".ps")) m_OutType="ps";
00414 else if (m_OutFileName.EndsWith(".eps")) m_OutType="eps";
00415 else if (m_OutFileName.EndsWith(".epsf")) m_OutType="Preview";
00416 else if (m_OutFileName.EndsWith(".pdf")) m_OutType="pdf";
00417 else if (m_OutFileName.EndsWith(".jpg")) m_OutType="jpg";
00418 else if (m_OutFileName.EndsWith(".jpeg")) m_OutType="jpg";
00419 else if (m_OutFileName.EndsWith(".gif")) m_OutType="gif";
00420 else if (m_OutFileName.EndsWith(".tif")) m_OutType="tiff";
00421 else if (m_OutFileName.EndsWith(".tiff")) m_OutType="tiff";
00422 else if (m_OutFileName.EndsWith(".svg")) m_OutType="svg";
00423 else if (m_OutFileName.EndsWith(".xpm")) m_OutType="xpm";
00424 else if (m_OutFileName.EndsWith(".png")) m_OutType="png";
00425 else if (m_OutFileName.EndsWith(".CC")) m_OutType="CC";
00426 else if (m_OutFileName.EndsWith(".C")) m_OutType="C";
00427 else if (m_OutFileName.EndsWith(".root")) m_OutType="root";
00428 else if (m_OutFileName.EndsWith("none")) m_OutType="none";
00429 else if (m_OutFileName.EndsWith(".qas")) m_OutType="qas";
00430 else {
00431 LOG_INFO << "SetHistUtil::SetOutFile(): unknown type, assuming ps" << endm;
00432 m_OutType = "ps";
00433 m_OutFileName.Append(".ps");
00434 }
00435 }
00436 if (!m_OutType.CompareTo("qas")) {
00437 m_QAShiftMode = kTRUE;
00438 m_OutIndividuals = ".svg";
00439 m_PrintMode |= QAU1<<QAprintIndiv;
00440 m_PrintMode |= QAU1<<QAprintIndivRef;
00441 m_OutType = "none";
00442 }
00443 if (m_OutType.CompareTo("none")) {
00444 m_PrintMode |= QAU1<<QAprintSet;
00445 m_PrintMode |= QAU1<<QAprintSetRef;
00446 }
00447
00448
00449 m_OutMultiPage = !(m_OutType.CompareTo("ps")
00450 && m_OutType.CompareTo("pdf") );
00451 if (m_OutMultiPage) {
00452 LOG_INFO << "StHistUtil::SetOutFile(): Multipage output" << endm;
00453 } else {
00454 LOG_INFO << "StHistUtil::SetOutFile(): Single page output" << endm;
00455 }
00456 }
00457
00458 void StHistUtil::CloseOutFile() {
00459 m_HistCanvas->Modified();
00460 m_HistCanvas->Update();
00461 if (!m_CurFileName.IsNull()) {
00462 if (m_OutMultiPage) m_CurFileName.Append(")");
00463 if (m_OutType.CompareTo("CC")) {
00464
00465 if (m_CurPage==1) m_CurFileName.Chop().Chop();
00466 if (m_PrintMode & QAU1<<QAprintSet)
00467 m_HistCanvas->Print(m_CurFileName.Data(),m_OutType.Data());
00468 } else
00469 m_HistCanvas->SaveSource(m_CurFileName.Data());
00470 if (m_refInFile) {
00471 m_HistCanvasR->Modified();
00472 m_HistCanvasR->Update();
00473 m_CurFileNameR.Append(")");
00474
00475 if (m_CurPage==1) m_CurFileNameR.Chop().Chop();
00476 if (m_PrintMode & QAU1<<QAprintSetRef)
00477 m_HistCanvasR->Print(m_CurFileNameR.Data(),m_OutType.Data());
00478
00479 }
00480 } else {
00481 LOG_INFO << "StHistUtil::CloseOutFile(): No output file" << endm;
00482 }
00483 }
00484
00485 TString StHistUtil::StripPrefixes(const Char_t* histName, Int_t& prenum, Int_t mode) {
00486
00487
00488
00489
00490 TString hName(histName);
00491 Char_t makerBuffer[4];
00492 memset(makerBuffer,0,4);
00493 if ((hName.BeginsWith("Tab")) || (hName.BeginsWith("StE"))) {
00494 memcpy(makerBuffer,histName,3);
00495 hName.Remove(0,3);
00496 }
00497 prenum = 0;
00498 if (mode >= 0) {
00499 for (Int_t i=1; i<numOfPosPrefixes; i++) {
00500 if (hName.BeginsWith(possiblePrefixes[i])) {
00501 prenum = i;
00502 hName.Remove(0,strlen(possiblePrefixes[i]));
00503 break;
00504 }
00505 }
00506 if (mode>0) hName.Prepend(makerBuffer);
00507 }
00508 return hName;
00509 }
00510
00511 Bool_t StHistUtil::CheckOutFile(const Char_t *histName) {
00512
00513
00514
00515 Int_t newPrefix = -1;
00516 StripPrefixes(histName,newPrefix);
00517
00518 if (newPrefix == m_CurPrefix) return kFALSE;
00519
00520 CloseOutFile();
00521 m_CurPrefix = newPrefix;
00522 if (m_OutType.CompareTo("C") && m_OutType.CompareTo("root")) {
00523 m_CurFileName = m_OutFileName;
00524 Ssiz_t insertPos = m_CurFileName.Last('.');
00525 if (insertPos<0) insertPos = m_CurFileName.Length();
00526 if (m_OutMultiPage) m_CurFileName.Append("(");
00527 else m_CurFileName.Insert(insertPos,"_");
00528 m_CurFileName.Insert(insertPos,possiblePrefixes[m_CurPrefix]);
00529 }
00530 (m_CurFileNameR = "Ref_") += m_CurFileName;
00531
00532 if (Ldesc) {
00533 Ldesc->Clear();
00534 Ldesc->AddText(possibleSuffixes[m_CurPrefix]);
00535 Ldesc->AddText("Hists");
00536 }
00537 return kTRUE;
00538 }
00539
00540 Int_t StHistUtil::DrawHists(const Char_t *dirName) {
00541
00542
00543
00544 LOG_INFO << " **** Now in StHistUtil::DrawHists **** " << endm;
00545
00546 Int_t canvasWidth,canvasHeight;
00547
00548 if (m_QAShiftMode) {
00549 LOG_INFO << "In QA Shift Mode - overriding other inputs" << endm;
00550 m_PadColumns=1;
00551 m_PadRows=1;
00552 canvasWidth = 250;
00553 canvasHeight = 250;
00554 } else {
00555
00556 gStyle->SetPaperSize(m_PaperWidth,m_PaperHeight);
00557
00558
00559
00560 canvasWidth = 600;
00561 canvasHeight = 780;
00562 }
00563
00564
00565 const Int_t numPads = m_PadColumns*m_PadRows;
00566 gStyle->SetOptStat(111111);
00567 gStyle->SetStatStyle(0);
00568 gStyle->SetOptDate(0);
00569 gStyle->SetPalette(1);
00570
00571
00572
00573 SafeDelete(m_HistCanvas);
00574 SafeDelete(m_HistCanvasR);
00575
00576 if (m_refInFile) {
00577 m_HistCanvasR = new TCanvas("CanvasNameR"," STAR Reference Histogram Canvas",20,20,canvasWidth,canvasHeight);
00578 }
00579 m_HistCanvas = new TCanvas("CanvasName"," STAR Maker Histogram Canvas",0,0,canvasWidth,canvasHeight);
00580
00581
00582 TPad *graphPad = m_HistCanvas;
00583 TPad *graphPadR = m_HistCanvasR;
00584 TPaveLabel* LtitleR = 0;
00585 TPaveLabel *Ldatetime = 0;
00586 TPaveLabel *Lpage = 0;
00587 m_CurPage=1;
00588
00589 if (!m_QAShiftMode) {
00590
00591
00592
00593 Ltitle = new TPaveLabel(0.08,0.96,0.88,1.0,m_GlobalTitle.Data(),"br");
00594 Ltitle->SetFillColor(18);
00595 Ltitle->SetTextFont(32);
00596 Ltitle->SetTextSize(0.5);
00597 Ltitle->Draw();
00598 if (m_refInFile) {
00599 m_HistCanvasR->cd();
00600 LtitleR = new TPaveLabel(0.08,0.96,0.88,1.0,m_refInFile->GetName(),"br");
00601 LtitleR->SetFillColor(18);
00602 LtitleR->SetTextFont(32);
00603 LtitleR->SetTextSize(0.5);
00604 LtitleR->Draw();
00605 m_HistCanvas->cd();
00606 }
00607
00608
00609 Ldesc = new TPaveText(0.90,0.96,0.99,1.0,"br");
00610 Ldesc->SetFillColor(18);
00611 Ldesc->SetTextFont(32);
00612 Ldesc->Draw();
00613 if (m_refInFile) {
00614 m_HistCanvasR->cd();
00615 Ldesc->Draw();
00616 m_HistCanvas->cd();
00617 }
00618
00619
00620 TDatime HistTime;
00621 const Char_t *myTime = HistTime.AsString();
00622 Ldatetime = new TPaveLabel(0.7,0.01,0.95,0.03,myTime,"br");
00623 Ldatetime->SetTextSize(0.6);
00624 Ldatetime->Draw();
00625 if (m_refInFile) {
00626 m_HistCanvasR->cd();
00627 Ldatetime->Draw();
00628 m_HistCanvas->cd();
00629 }
00630
00631
00632
00633 Lpage = new TPaveLabel(0.1,0.01,0.16,0.03,Form("%d",m_CurPage),"br");
00634 Lpage->SetTextSize(0.6);
00635 Lpage->Draw();
00636 if (m_refInFile) {
00637 m_HistCanvasR->cd();
00638 Lpage->Draw();
00639 m_HistCanvas->cd();
00640 }
00641
00642
00643
00644
00645 graphPad = new TPad("PadName","Pad Title",0.0,0.05,1.00,0.95);
00646 graphPad->Draw();
00647 graphPad->cd();
00648 graphPad->Divide(m_PadColumns,m_PadRows);
00649 if (m_refInFile) {
00650 m_HistCanvasR->cd();
00651 graphPadR = new TPad("PadNameR","Pad TitleR",0.0,0.05,1.00,0.95);
00652 graphPadR->Draw();
00653 graphPadR->cd();
00654 graphPadR->Divide(m_PadColumns,m_PadRows);
00655 graphPad->cd();
00656 }
00657
00658 }
00659
00660 Int_t padCount = 0;
00661 Bool_t padAdvance = kTRUE;
00662
00663
00664
00665
00666 if (dirName && strcmp(m_dirName,dirName)) strcpy(m_dirName,dirName);
00667 TList* dirList = (m_PntrToMaker ? FindHists(m_dirName) : FindHists(m_PntrToPlainFile));
00668 if (!dirList) { LOG_INFO << " DrawHists - histograms not available! " << endm; }
00669
00670 TIter nextHist(dirList);
00671 Int_t histCounter = 0;
00672 Int_t histReadCounter = 0;
00673 Bool_t started = kFALSE;
00674
00675
00676 TObject *obj = 0;
00677 TLine ruler;
00678 TLatex latex;
00679
00680 ofstream* C_ostr = 0;
00681 TFile* root_ofile = 0;
00682 if (!m_OutType.CompareTo("C")) {
00683 C_ostr = new ofstream(m_OutFileName);
00684 (*C_ostr) << " gSystem->Load(\"St_base\");" << endl;
00685 (*C_ostr) << " gSystem->Load(\"StUtilities\");" << endl;
00686
00687 } else if (!m_OutType.CompareTo("root"))
00688 root_ofile = new TFile(m_OutFileName,"RECREATE");
00689
00690
00691 TList* dirListR = 0;
00692 ofstream* R_ostr = 0;
00693 if (m_analMode) {
00694 dirListR = FindHists(m_refInFile);
00695
00696 if (!root_ofile) root_ofile = new TFile(m_refOutFile,"RECREATE");
00697 }
00698
00699
00700 static TF1* fitFRS = 0;
00701 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);
00702
00703 while ((obj = nextHist())) {
00704
00705 if (obj->InheritsFrom("TH1")) {
00706 TH1* hobj = (TH1*) obj;
00707 const char* oname = hobj->GetName();
00708 const char* otitle = hobj->GetTitle();
00709 TString oName = oname;
00710 oName.ReplaceAll(' ','_');
00711 histReadCounter++;
00712 LOG_INFO << Form(" %d. Reading ... %s::%s; Title=\"%s\"\n",
00713 histReadCounter,hobj->ClassName(),oname, otitle) << endm;
00714 if (!started && (m_FirstHistName.CompareTo("*")==0 ||
00715 m_FirstHistName.CompareTo(oName)==0))
00716 started = kTRUE;
00717
00718
00719 if (started) {
00720 if (oName.CompareTo(m_LastHistName)==0) started = kFALSE;
00721 histCounter++;
00722
00723
00724
00725
00726
00727
00728 if (!m_ListOfPrint || (m_ListOfPrint->FindObject(oname))) {
00729
00730
00731 if (root_ofile) {
00732 root_ofile->cd();
00733 hobj->Write();
00734 }
00735 if (C_ostr) {
00736 hobj->SavePrimitive(*C_ostr);
00737 continue;
00738 }
00739
00740
00741 LOG_INFO << Form(" - %d. Drawing ... %s::%s; Title=\"%s\"\n",
00742 histCounter,hobj->ClassName(),oname, otitle) << endm;
00743
00744
00745 if (CheckOutFile(oname)) {
00746 padCount = numPads;
00747 m_CurPage = 0;
00748 }
00749 if (m_QAShiftMode) {
00750 graphPad->Clear();
00751 if (m_refInFile) graphPadR->Clear();
00752 padCount = 0;
00753 m_CurPage++;
00754 } else if (padCount == numPads) {
00755
00756 m_HistCanvas->Modified();
00757 m_HistCanvas->Update();
00758 if (m_PrintMode & QAU1<<QAprintSet &&
00759 m_CurPage>0 && !m_CurFileName.IsNull()) {
00760 if (m_OutType.CompareTo("CC")) {
00761 m_HistCanvas->Print(m_CurFileName.Data(),m_OutType.Data());
00762 } else
00763 m_HistCanvas->SaveSource(m_CurFileName.Data());
00764 m_CurFileName.ReplaceAll("(",0);
00765 } else {
00766 m_HistCanvas->Draw();
00767 }
00768
00769 while (padCount > 0) graphPad->GetPad(padCount--)->Clear();
00770
00771 if (m_refInFile) {
00772 m_HistCanvasR->Modified();
00773 m_HistCanvasR->Update();
00774 if (m_PrintMode & QAU1<<QAprintSetRef &&
00775 m_CurPage>0 && !m_CurFileName.IsNull()) {
00776 m_HistCanvasR->Print(m_CurFileNameR.Data(),m_OutType.Data());
00777 m_CurFileNameR.ReplaceAll("(",0);
00778 } else m_HistCanvasR->Draw();
00779 padCount = numPads;
00780 while (padCount > 0) graphPadR->GetPad(padCount--)->Clear();
00781 }
00782
00783
00784 m_CurPage++;
00785 if (Lpage) Lpage->SetLabel(Form("%d",m_CurPage));
00786
00787 if (!m_OutMultiPage && !m_CurFileName.IsNull()) {
00788 Ssiz_t last_us = m_CurFileName.Last('_') + 1;
00789 Ssiz_t lastdot = m_CurFileName.Last('.') - last_us;
00790 m_CurFileName.Replace(last_us,lastdot,Form("%d",m_CurPage));
00791 }
00792 }
00793
00794
00795 Int_t chkdim = hobj->GetDimension();
00796
00797
00798 int curPad = (++padCount);
00799
00800
00801 TH1* hobjO = hobj;
00802 TH1* hobjR = 0;
00803 if (dirListR) {
00804 Int_t tempint = -1;
00805
00806 hobjR = (TH1*) (dirListR->FindObject(oname));
00807 if (!hobjR) {
00808
00809 TString onamebase = StripPrefixes(oname,tempint,-1);
00810 hobjR = (TH1*) (dirListR->FindObject(onamebase.Data()));
00811 if (!hobjR) {
00812
00813 onamebase = StripPrefixes(oname,tempint,1);
00814 hobjR = (TH1*) (dirListR->FindObject(onamebase.Data()));
00815 if (!hobjR) {
00816
00817 onamebase = StripPrefixes(oname,tempint,0);
00818 hobjR = (TH1*) (dirListR->FindObject(onamebase.Data()));
00819 }
00820 }
00821 }
00822 if (hobjR) {
00823 TString htitle = StripPrefixes(hobjR->GetTitle(),tempint,0);
00824 if (!htitle.BeginsWith("Ref:")) htitle.Prepend("Ref:");
00825 hobjR->SetTitle(htitle.Data());
00826 }
00827 }
00828 TVirtualPad* objPad = 0;
00829 for (int analRepeat = 0;analRepeat < (hobjR ? 2 : 1); analRepeat++) {
00830
00831 padAdvance = kTRUE;
00832 if (analRepeat) {
00833 objPad=gPad;
00834 graphPadR->cd(m_QAShiftMode ? 0 : curPad);
00835 hobj=hobjR;
00836 } else graphPad->cd(m_QAShiftMode ? 0 : curPad);
00837
00838
00839 gPad->SetGridy(0);
00840 gPad->SetGridx(0);
00841
00842
00843
00844
00845
00846 if (m_ListOfLogY && m_ListOfLogY->FindObject(oname) &&
00847 hobj->GetEntries() && hobj->GetMaximum() ) {
00848 gPad->SetLogy(1);
00849 if (!analRepeat) {LOG_INFO << " -- Will draw in logY scale: " << oname <<endm;}
00850 } else gPad->SetLogy(0);
00851
00852
00853
00854
00855 if (m_ListOfLogX && m_ListOfLogX->FindObject(oname) &&
00856 hobj->GetEntries() && hobj->GetMaximum() ) {
00857 gPad->SetLogx(1);
00858 if (!analRepeat) {LOG_INFO << " -- Will draw in logX scale: " << oname <<endm;}
00859 } else gPad->SetLogx(0);
00860
00861
00862
00863 if (oName.EndsWith("PVsDedx") ||
00864 oName.Contains("TpcSector") ||
00865 oName.Contains("PointRPTpc") ||
00866 oName.Contains("PointXYTpc") ) {
00867 gPad->SetLogz(1);
00868 if (!analRepeat) {LOG_INFO << " -- Will draw in logZ scale: " << oname <<endm;}
00869 } else gPad->SetLogz(0);
00870
00871
00872 if (oName.EndsWith("QaPointTpc") ||
00873 oName.EndsWith("QaPointSvt") ||
00874 oName.Contains("QaPointSvtLaser") ||
00875 oName.EndsWith("QaPointSsd") ||
00876 oName.EndsWith("QaPointFtpc") ||
00877 oName.EndsWith("QaRichTot") ||
00878 oName.EndsWith("QaV0Vtx") ||
00879 oName.EndsWith("QaXiVtxTot") ||
00880 oName.Contains("QaPmdTotal") ||
00881 oName.Contains("QaCpvTotal") ||
00882 oName.EndsWith("trkGoodTTS")) {
00883 Float_t mean = hobj->GetMean(1);
00884 Float_t window = hobj->GetRMS(1);
00885 Float_t bwid = hobj->GetBinWidth(1);
00886 if (window < bwid) window = bwid;
00887 hobj->SetAxisRange(mean-5*window,mean+5*window,"X");
00888 }
00889
00890
00891 if (oName.EndsWith("trkGoodF")) {
00892 Float_t mean1 = hobj->GetMean(1);
00893 Float_t mean2 = hobj->GetMean(2);
00894 Float_t window1 = hobj->GetRMS(1);
00895 Float_t window2 = hobj->GetRMS(2);
00896 Float_t bwid = hobj->GetBinWidth(1);
00897 if (window1 < bwid) window1 = bwid;
00898 if (window2 < bwid) window2 = bwid;
00899 Float_t lo = TMath::Min(mean1-5*window1,mean2-5*window2);
00900 Float_t hi = TMath::Max(mean1+5*window1,mean2+5*window2);
00901 hobj->SetAxisRange(lo,hi,"X");
00902 hobj->SetAxisRange(lo,hi,"Y");
00903 }
00904
00905
00906 if (oName.Contains("VtxFtpc")&&oName.Contains("TpcXY")&&m_RunYear!=7){
00907 hobj->GetXaxis()->SetRangeUser(-2.0,2.0);
00908 hobj->GetYaxis()->SetRangeUser(-2.0,2.0);
00909 }
00910
00911
00912 if ((chkdim == 3) && (hobj->InheritsFrom("StMultiH2F"))) {
00913 hobj->Draw("Col");
00914 } else if ((chkdim==2) && (oName.Contains("PointRPTpc") ||
00915 (oName.Contains("PointXYTpc") &&
00916 TMath::Abs((hobj->GetYaxis()->GetXmax()/TMath::Pi())-2)<1e-5))) {
00917 TH2F* htmp = new TH2F(Form("%s.",hobj->GetName()),hobj->GetTitle(),1,-200,200,1,-200,200);
00918 htmp->Fill(0.,0.,.1);htmp->SetMinimum(1);
00919 htmp->SetStats(kFALSE);
00920 htmp->Draw();
00921 hobj->Draw("Pol ZCol Same");
00922 } else if ((chkdim == 2) &&
00923 (oName.EndsWith("SvtLoc") ||
00924 oName.EndsWith("PVsDedx") ||
00925 oName.EndsWith("VtxPrXY") ||
00926 oName.EndsWith("SSD") ||
00927 oName.EndsWith("PointXYSvt") ||
00928 oName.Contains("TpcSector") ||
00929 oName.Contains("PointXYTpc"))) {
00930 hobj->Draw("ZCol");
00931 } else if ((chkdim == 2) && (!hobj->InheritsFrom("StMultiH1F"))) {
00932 hobj->Draw("Col");
00933 if ((oName.EndsWith("trkGoodF"))||(oName.EndsWith("VtxSvtvsTpc"))) {
00934 ruler.SetLineColor(46);
00935 ruler.SetLineWidth(2);
00936 ruler.DrawLineNDC(0.1,0.1,0.9,0.9);
00937 }
00938 } else {
00939 if (oName.Contains("QaBbc") ||
00940 (oName.Contains("QaPmd") && !oName.Contains("Total")) ||
00941 (oName.Contains("QaFpd") && !oName.Contains("Sums"))) {
00942 hobj->SetBarOffset();
00943 }
00944 hobj->SetLineWidth(2);
00945 if (oName.EndsWith("Mass")) hobj->Draw("e");
00946 else hobj->Draw();
00947 if (oName.BeginsWith("fcl_radial") && (hobj->GetEntries() > 0)) {
00948
00949 hobj->GetXaxis()->SetRangeUser(6.5,9.0);
00950 hobj->Fit("pol0","","", 6.5, 7.2);
00951 double n1= hobj->GetFunction("pol0")->GetParameter(0);
00952 hobj->Fit("pol0","","",8.3,9.0);
00953 double n2= hobj->GetFunction("pol0")->GetParameter(0);
00954 fitFRS->SetParameters(n1, 7.85, 0.35, n2);
00955 hobj->Fit(fitFRS, "R");
00956
00957 double rstep = fitFRS->GetParameter(1);
00958 double erstep = fitFRS->GetParError(1);
00959 float hmin = hobj->GetMinimum();
00960 float hmax = hobj->GetMaximum();
00961 ruler.SetLineColor(kBlack);
00962 ruler.SetLineWidth(2);
00963 ruler.DrawLine(7.8,hmin,7.8,hmax);
00964 ruler.SetLineColor(kGreen);
00965 ruler.SetLineWidth(3);
00966 ruler.DrawLine(rstep,hmin,rstep,hmax);
00967 ruler.SetLineWidth(1);
00968 ruler.DrawLine(rstep-erstep,hmin,rstep-erstep,hmax);
00969 ruler.DrawLine(rstep+erstep,hmin,rstep+erstep,hmax);
00970 }
00971
00972
00973 }
00974
00975 if (oName.Contains("NullPrimVtx")) {
00976 int msdVtx = (int) (hobj->GetBinContent(hobj->FindBin(-1.)));
00977 int qstVtx = (int) (hobj->GetBinContent(hobj->FindBin(0.)));
00978 int goodVtx = (int) (hobj->GetBinContent(hobj->FindBin(1.)));
00979 int fndVtx = qstVtx + goodVtx;
00980 int totVtx = fndVtx + msdVtx;
00981 Float_t txtSiz = latex.GetTextSize();
00982 latex.SetTextSize(txtSiz*1.5);
00983 latex.SetTextAngle(90);
00984 latex.SetTextAlign(3);
00985 latex.SetTextColor(4);
00986 latex.DrawLatex(-0.8,0,Form(" missed: %d",msdVtx));
00987 latex.DrawLatex(0.2,0,Form(" questionable: %d",qstVtx));
00988 latex.DrawLatex(1.2,0,Form(" good: %d",goodVtx));
00989 latex.SetTextSize(txtSiz*2);
00990 latex.SetTextColor(2);
00991 latex.DrawLatex(-1.8,0,Form(" total: %d",totVtx));
00992 latex.SetTextAlign(1);
00993 latex.SetTextColor(kGreen+3);
00994 latex.DrawLatex(-1.1,0,Form(" found: %d",fndVtx));
00995
00996 latex.SetTextColor(1);
00997 latex.SetTextSize(txtSiz);
00998 LOG_INFO << (m_CurPrefix ? possiblePrefixes[m_CurPrefix] : "GE")
00999 << (analRepeat ? " Ref" : "")
01000 << " QA Events (found vtx/total) "
01001 << fndVtx << " / " << totVtx << endm;
01002 }
01003
01004 if (oName.Contains("TpcSector")) {
01005
01006 ruler.SetLineColor(1);
01007 ruler.SetLineWidth(1);
01008
01009 float pitch = 0.67/2.0;
01010 ruler.DrawLine(-137*pitch,37.5,137*pitch,37.5);
01011 ruler.DrawLine(-123*pitch,29.5,123*pitch,29.5);
01012 ruler.DrawLine(-111*pitch,21.5,111*pitch,21.5);
01013 ruler.DrawLine( -97*pitch,13.5, 97*pitch,13.5);
01014
01015 pitch = 0.335/2.0;
01016 ruler.DrawLine(-(142-24)*pitch,8.5,(142-24)*pitch,8.5);
01017 ruler.DrawLine(-138*pitch,7.5,-(138-24)*pitch,7.5);
01018 ruler.DrawLine((142-24)*pitch,7.5,146*pitch,7.5);
01019 ruler.DrawLine(-(142-24)*pitch,7.5,-(142-24)*pitch,8.5);
01020 ruler.DrawLine((142-24)*pitch,7.5,(142-24)*pitch,8.5);
01021 latex.SetTextAngle(0);
01022 latex.SetTextAlign(32);
01023 latex.DrawLatex(50,4,"RDO 1");
01024 latex.DrawLatex(50,10,"2");
01025 latex.DrawLatex(50,17,"3");
01026 latex.DrawLatex(50,25,"4");
01027 latex.DrawLatex(50,33,"5");
01028 latex.DrawLatex(50,41,"6");
01029
01030
01031 ruler.SetLineColor(2);
01032 ruler.DrawLine(-52,2.9,-47,2.9);
01033 ruler.DrawLine(-52,6.2,-47,6.2);
01034 ruler.DrawLine(-52,9.4,-47,9.4);
01035 ruler.DrawLine(-52,13.5,-47,13.5);
01036 ruler.DrawLine(-52,21.1,-47,21.1);
01037 ruler.DrawLine(-52,29.1,-47,29.1);
01038 ruler.DrawLine(-52,37.1,-47,37.1);
01039 latex.SetTextAlign(12);
01040 latex.SetTextColor(2);
01041 latex.DrawLatex(-50,1.5,"1 Anode");
01042 latex.DrawLatex(-50,4.6,"2");
01043 latex.DrawLatex(-50,7.8,"3");
01044 latex.DrawLatex(-50,11.4,"4");
01045 latex.DrawLatex(-50,17.1,"5");
01046 latex.DrawLatex(-50,25.1,"6");
01047 latex.DrawLatex(-50,33.1,"7");
01048 latex.DrawLatex(-50,41.1,"8");
01049 latex.SetTextColor(1);
01050 }
01051
01052 if (oName.Contains("PointRPTpc") ||
01053 oName.Contains("PointXYTpc") ) {
01054
01055 int eastsec = (oName.Contains("TpcE") ? 12 : 0);
01056 ruler.SetLineColor(0);
01057 ruler.SetLineStyle(2);
01058 float sz = latex.GetTextSize();
01059 latex.SetTextAlign(32);
01060 latex.SetTextSize(0.032);
01061 int secn = (eastsec ? 21 : 13);
01062 float phistep = TMath::Pi()/12;
01063 for (float phi=phistep; phi<6.2; phi+=phistep) {
01064 float xsec = TMath::Cos(phi);
01065 float ysec = TMath::Sin(phi);
01066 ruler.DrawLine(50*xsec,50*ysec,199*xsec,199*ysec);
01067 phi+=phistep;
01068 xsec = TMath::Cos(phi);
01069 ysec = TMath::Sin(phi);
01070 latex.SetTextAngle(phi*180/TMath::Pi()+1);
01071 latex.DrawLatex(52*xsec,52*ysec,Form("%d",secn%12 + eastsec + 1));
01072 secn += (eastsec ? 1 : -1);
01073 }
01074 latex.SetTextSize(sz);
01075 ruler.SetLineStyle(1);
01076 }
01077
01078 if (oName.EndsWith("QaPointPhiT")) {
01079 float hmin = hobj->GetMinimum() ;
01080 float hmax = hobj->GetMaximum() ;
01081 float hmid = hmin+0.12*(hmax-hmin);
01082 float sz = latex.GetTextSize();
01083 latex.SetTextSize(0.045);
01084 latex.SetTextColor(2);
01085 latex.SetTextAngle(90);
01086 latex.SetTextAlign(22);
01087 for (int secn = 1; secn < 13; secn++) {
01088 float phisec = 87 - secn*30;
01089 while (phisec < 1) phisec += 360;
01090 latex.DrawLatex(phisec,hmid,Form("%d / %d",secn,(23-secn)%12 + 13));
01091 }
01092 latex.SetTextSize(sz);
01093 latex.SetTextColor(1);
01094 latex.SetTextAngle(0);
01095 }
01096
01097 if (padAdvance) {if (gPad) gPad->Update();}
01098 else {if (!analRepeat) padCount--;}
01099
01100 }
01101
01102
01103 if (hobjR) {
01104 StHistUtilRef* huR = 0;
01105 if (m_refCuts) {
01106
01107 huR = (StHistUtilRef*) (m_refCuts->FindObject(oname));
01108 if (!huR) {
01109
01110 Int_t tempint = -1;
01111 TString onamebase = StripPrefixes(oname,tempint,-1);
01112 huR = (StHistUtilRef*) (m_refCuts->FindObject(onamebase.Data()));
01113 if (!huR) {
01114
01115 onamebase = StripPrefixes(oname,tempint,1);
01116 huR = (StHistUtilRef*) (m_refCuts->FindObject(onamebase.Data()));
01117 if (!huR) {
01118
01119 onamebase = StripPrefixes(oname,tempint,0);
01120 huR = (StHistUtilRef*) (m_refCuts->FindObject(onamebase.Data()));
01121 }
01122 }
01123 }
01124 }
01125 double result = 0;
01126
01127
01128 int mode = ( huR ? huR->Mode : 2 );
01129 double cut = ( huR ? huR->Cut : 0);
01130
01131
01132 switch (mode) {
01133 case (0) :
01134 result = hobjO->Chi2Test(hobjR,(huR ? huR->Options() : "WW"));
01135 break;
01136 case (1) :
01137
01138
01139
01140
01141
01142 result = hobjO->KolmogorovTest(hobjR,(huR ? huR->Options() : ""));
01143 break;
01144 case (2) :
01145
01146 TString analOpts = (huR ? huR->Options() : "");
01147 analOpts.ToUpper();
01148 if (! analOpts.Contains('M')) analOpts += 'M';
01149 result = 1.0 - hobjO->KolmogorovTest(hobjR,analOpts.Data());
01150 break;
01151 }
01152 bool analPass = (result >= cut);
01153
01154 TString score = Form("Score: %4.2f (%s vs. %4.2f)",result,
01155 (analPass ? "PASS" : "FAIL"),cut);
01156
01157 if (m_PrintMode & QAU1<<QAprintIndivRef)
01158 gPad->Print(Form("Ref_%s%s",oName.Data(),m_OutIndividuals.Data()));
01159 if (m_QAShiftMode)
01160 gPad->Print(Form("Ref_%s.png",oName.Data()));
01161
01162 if (objPad) {
01163 objPad->cd();
01164 float sz = latex.GetTextSize();
01165 latex.SetTextSize(0.038);
01166 latex.SetTextAngle(90);
01167 latex.SetTextAlign(11);
01168 latex.SetTextColor(analPass ? kGreen+4 : kRed+2);
01169 latex.DrawTextNDC(0.999,0.001,score.Data());
01170 objPad->Update();
01171 latex.SetTextColor(1);
01172 latex.SetTextSize(sz);
01173 if (m_PrintMode & QAU1<<QAprintIndiv)
01174 gPad->Print(Form("%s%s",oName.Data(),m_OutIndividuals.Data()));
01175 if (m_QAShiftMode)
01176 gPad->Print(Form("%s.png",oName.Data()));
01177 }
01178
01179
01180 LOG_INFO << Form(" - %d. Reference Test (mode=%d) %s",
01181 histReadCounter,mode,score.Data()) << endm;
01182 if (strlen(m_refResultsFile)) {
01183 if (!R_ostr) R_ostr = new ofstream(m_refResultsFile);
01184 (*R_ostr) << m_CurPage << " " << curPad << " " << oName << " " << result << endl;
01185 }
01186 } else {
01187 if (m_PrintMode & QAU1<<QAprintIndiv)
01188 gPad->Print(Form("%s%s",oName.Data(),m_OutIndividuals.Data()));
01189 if (m_QAShiftMode)
01190 gPad->Print(Form("%s.png",oName.Data()));
01191 if (strlen(m_refResultsFile)) {
01192 if (!R_ostr) R_ostr = new ofstream(m_refResultsFile);
01193 (*R_ostr) << m_CurPage << " " << curPad << " " << oName << " 1.0" << endl;
01194 }
01195 }
01196
01197 }
01198 }
01199
01200
01201
01202
01203
01204
01205
01206
01207 }
01208 }
01209
01210 if (C_ostr) delete C_ostr;
01211 if (R_ostr) delete R_ostr;
01212 if (root_ofile) delete root_ofile;
01213
01214 CloseOutFile();
01215 return histCounter;
01216 }
01217
01218
01219
01220
01221 TList* StHistUtil::FindHists(const Char_t *dirName, const Char_t *withPrefix)
01222 {
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232 TList *dList=0;
01233
01234 LOG_INFO << " Beg: FindHists, dList pointer = " << dList << endm;
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244 if (dirName && strcmp(m_dirName,dirName)) strcpy(m_dirName,dirName);
01245 StMaker *temp = m_PntrToMaker->GetMaker(m_dirName);
01246 if (temp) {
01247 LOG_INFO << "FindHists - found pointer to maker" << endm;
01248 dList = temp->Histograms();
01249 }
01250
01251
01252
01253 TObject *test=0;
01254 if (dList) test = dList->First();
01255 if (test){
01256 LOG_INFO << " FindHists - found hist. in Maker-Branch " << endm;
01257 }
01258
01259 LOG_INFO << " Mid: FindHists, dList pointer = " << dList << endm;
01260 LOG_INFO << " Mid: FindHists, test pointer = " << test << endm;
01261
01262
01263
01264 if (!test) dList = 0;
01265
01266 LOG_INFO << " Mid2: FindHists, dList pointer = " << dList << endm;
01267 LOG_INFO << " Mid2: FindHists, test pointer = " << test << endm;
01268
01269
01270 if (!dList) {
01271
01272
01273
01274
01275
01276
01277 St_DataSet *hist=0;
01278 hist = m_PntrToMaker->GetDataSet("hist");
01279 if (hist) {
01280
01281
01282
01283
01284
01285
01286 TString hBN(m_dirName);
01287 hBN += "Hist";
01288
01289
01290 St_DataSet *QAH = 0;
01291 QAH = hist->Find(hBN.Data());
01292
01293
01294
01295 if (QAH) {
01296 dList = (TList *)QAH->GetObject();
01297 }
01298
01299 }
01300
01301
01302 if (dList){
01303 LOG_INFO << " FindHists - found hist. in histBranch, with name: "
01304 << m_dirName << endm;
01305 }
01306 else {
01307 LOG_INFO << " FindHists - histogram branch has not been found for branch --> "
01308 << m_dirName << endm;
01309 }
01310
01311 }
01312
01313 if (dList && (withPrefix || m_ListOfPrint)) dList = TrimListByPrefix(dList,withPrefix);
01314
01315 LOG_INFO << " FindHists, dList pointer = " << dList << endm;
01316
01317
01318 return dList;
01319 }
01320
01321
01322 TList* StHistUtil::FindHists(TFile* histFile, const Char_t* withPrefix) {
01323 if (!histFile) return 0;
01324 TList* dList = histFile->GetList();
01325 if (dList->GetSize() == 0) {
01326 histFile->ReadAll();
01327 dList = histFile->GetList();
01328 }
01329
01330 TObject* test = (dList ? dList->First() : 0);
01331 LOG_INFO << " Mid5: FindHists, dList pointer = " << dList << endm;
01332 LOG_INFO << " Mid5: FindHists, test pointer = " << test << endm;
01333 if (!test) dList = 0;
01334
01335 if (dList && (withPrefix || m_ListOfPrint)) dList = TrimListByPrefix(dList,withPrefix);
01336 return dList;
01337 }
01338
01339
01340 TList* StHistUtil::TrimListByPrefix(TList* dList, const Char_t* withPrefix) {
01341 TList* dList2 = new TList;
01342
01343
01344
01345 TIter nextObj(dList);
01346 TObject *obj = 0;
01347 int withPrefixNumber = -1;
01348 int prefixNumber = -1;
01349 if (withPrefix) StripPrefixes(withPrefix,withPrefixNumber);
01350 while ((obj = nextObj())) {
01351 Bool_t addIt = kTRUE;
01352 if (withPrefix) {
01353 StripPrefixes(obj->GetName(),prefixNumber);
01354 if (prefixNumber != withPrefixNumber) addIt = kFALSE;
01355 }
01356 if (addIt && ((!m_ListOfPrint) ||
01357 (obj->InheritsFrom("TH1") &&
01358 m_ListOfPrint->FindObject(obj->GetName())))) dList2->AddLast(obj);
01359 }
01360 return dList2;
01361 }
01362
01363
01364
01365 Int_t StHistUtil::ListHists(const Char_t *dirName)
01366 {
01367
01368
01369
01370 if (Debug()) {
01371 LOG_INFO << " **** Now in StHistUtil::ListHists **** " << endm;
01372 }
01373
01374
01375 TList* dirList = (m_PntrToMaker ? FindHists(dirName) : FindHists(m_PntrToPlainFile));
01376
01377 if (!dirList) { LOG_INFO << " ListHists - histograms not available! " << endm; }
01378
01379
01380
01381 TIter nextObj(dirList);
01382 Int_t histReadCount = 0;
01383 TObject *obj = 0;
01384
01385
01386 while ((obj = nextObj())) {
01387
01388
01389 if (obj->InheritsFrom("TH1")) {
01390
01391 histReadCount++;
01392
01393
01394 LOG_INFO << " ListHists: Hist No. " << histReadCount << ", Type: " << obj->ClassName()
01395 << ", Name: " << obj->GetName() << ", Title \"" << obj->GetTitle() << "\" "<< endm;
01396 }
01397 }
01398
01399 LOG_INFO << " ListHists: Total No. Histograms Booked = " << histReadCount <<endm;
01400 return histReadCount;
01401 }
01402
01403
01404
01405
01406 Int_t StHistUtil::PrintInfoHists(TList *dirList, const Char_t *fname )
01407 {
01408
01409 LOG_INFO << " **** Now in StHistUtil::PrintInfoHists **** " << endm;
01410 LOG_INFO << " output file = " << fname << endm;
01411
01412 ofstream fout(fname);
01413
01414 if (!dirList) { LOG_INFO << " PrintInfoHists - histograms not available! " << endm; }
01415
01416 Int_t histInfoCount = 0;
01417
01418 if (dirList){
01419
01420
01421
01422 TIter nextObj(dirList);
01423 TObject *obj = 0;
01424
01425 LOG_INFO << " Hist #, Name, #Entries, Mean, RMS " << endm;
01426 fout << " Hist #, Name, #Entries, Mean, RMS " << endl;
01427
01428
01429
01430 while ((obj = nextObj())) {
01431
01432
01433 if (obj->InheritsFrom("TH1")) {
01434
01435 histInfoCount++;
01436
01437 LOG_INFO <<
01438 histInfoCount << " " <<
01439 obj->GetName() << " " <<
01440 ((TH1 *)obj)->GetEntries() << " " <<
01441 ((TH1 *)obj)->GetMean() << " " <<
01442 ((TH1 *)obj)->GetRMS() << " " <<
01443 endm;
01444
01445 fout <<
01446 histInfoCount << " " <<
01447 obj->GetName() << " " <<
01448 ((TH1 *)obj)->GetEntries() << " " <<
01449 ((TH1 *)obj)->GetMean() << " " <<
01450 ((TH1 *)obj)->GetRMS() << " " <<
01451 endl;
01452
01453 }
01454 }
01455 }
01456
01457 LOG_INFO << " PrintInfoHists: # hist read = " << histInfoCount <<endm;
01458
01459 return histInfoCount;
01460 }
01461
01462
01463
01464
01465
01466 Int_t StHistUtil::CopyHists(TList *dirList)
01467 {
01468 if (Debug()) {
01469 LOG_INFO << " **** Now in StHistUtil::CopyHists **** " << endm;
01470 }
01471
01472 if (!dirList) { LOG_INFO << " StHistUtil::CopyHists - histogram Pointer not set! " << endm; }
01473
01474
01475
01476 Int_t tempint,ijk=0;
01477 Int_t histCopyCount = 0;
01478
01479 if (dirList){
01480 TIter nextObj(dirList);
01481 TObject *obj = 0;
01482 while ((obj = nextObj())) {
01483 if (obj->InheritsFrom("TH1") &&
01484 (!m_ListOfPrint || (m_ListOfPrint->FindObject(obj->GetName())))) {
01485 histCopyCount++;
01486 if (ijk >= maxHistCopy - 1){
01487 Int_t newMaxHistCopy = maxHistCopy * 4;
01488 TH1** temp1 = new TH1ptr[newMaxHistCopy];
01489 memset(temp1,0,newMaxHistCopy*sizeOfTH1Ptr);
01490 memcpy(temp1,newHist,maxHistCopy*sizeOfTH1Ptr);
01491 delete newHist;
01492 newHist = temp1;
01493 maxHistCopy = newMaxHistCopy;
01494 }
01495 newHist[ijk] = ((TH1 *)obj->Clone());
01496 if (ignorePrefixes) {
01497 newHist[ijk]->SetName (StripPrefixes(newHist[ijk]->GetName (),tempint).Data());
01498 newHist[ijk]->SetTitle(StripPrefixes(newHist[ijk]->GetTitle(),tempint).Data());
01499 }
01500 ijk++;
01501 }
01502 }
01503 }
01504
01505 LOG_INFO << " ListHists: Total No. Histograms Copied = " <<
01506 histCopyCount <<endm;
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519 return histCopyCount;
01520 }
01521
01522
01523
01524
01525
01526
01527
01528
01529 Int_t StHistUtil::AddHists(TList *dirList,Int_t numHistCopy)
01530 {
01531 if (Debug()) {
01532 LOG_INFO << " **** Now in StHistUtil::AddHists **** " << endm;
01533 }
01534
01535
01536 if (!dirList) { LOG_INFO <<
01537 " StHistUtil::AddHists - histogram Pointer not set! " << endm; }
01538
01539 Int_t histAddCount = 0;
01540 Int_t tempInt=0;
01541
01542 if (dirList){
01543 if (numHistCopy < 0) numHistCopy = dirList->GetSize();
01544 TIter nextObj(dirList);
01545 TObject *obj = 0;
01546
01547 while ((obj = nextObj())) {
01548 if (obj->InheritsFrom("TH1")) {
01549 TString oName = obj->GetName();
01550 if (ignorePrefixes) oName = StripPrefixes(oName.Data(),tempInt);
01551
01552 Int_t tempint,imk = 0;
01553 Bool_t notfound = true;
01554 for (imk=0;imk<maxHistCopy;imk++) {
01555 if (newHist[imk]) {
01556 TString nName = newHist[imk]->GetName();
01557 if (ignorePrefixes) nName = StripPrefixes(nName.Data(),tempInt);
01558 if (! (nName.CompareTo(oName))) {
01559
01560 newHist[imk]->Add((TH1 *)obj);
01561 histAddCount++;
01562 notfound = false;
01563
01564 }
01565 } else break;
01566 }
01567
01568 if (notfound) {
01569
01570 if (imk >= maxHistCopy-1){
01571 Int_t newMaxHistCopy = maxHistCopy * 4;
01572 TH1** temp1 = new TH1ptr[newMaxHistCopy];
01573 memset(temp1,0,newMaxHistCopy*sizeOfTH1Ptr);
01574 memcpy(temp1,newHist,maxHistCopy*sizeOfTH1Ptr);
01575 delete newHist;
01576 newHist = temp1;
01577 maxHistCopy = newMaxHistCopy;
01578 }
01579 newHist[imk] = ((TH1 *)obj->Clone());
01580 if (ignorePrefixes) {
01581 newHist[imk]->SetName (StripPrefixes(newHist[imk]->GetName (),tempint).Data());
01582 newHist[imk]->SetTitle(StripPrefixes(newHist[imk]->GetTitle(),tempint).Data());
01583 }
01584 numHistCopy++;
01585 histAddCount++;
01586
01587 }
01588 }
01589 }
01590 }
01591
01592 LOG_INFO << " StHistUtil::AddHists: Total No. Histograms Added = " <<
01593 histAddCount <<endm;
01594
01595
01596 return histAddCount;
01597 }
01598
01599
01600
01601
01602 Int_t StHistUtil::ExamineLogYList()
01603 {
01604
01605
01606
01607 if (Debug()) {
01608 LOG_INFO << " **** Now in StHistUtil::ExamineLogYList **** " << endm;
01609 }
01610
01611
01612
01613 TObject *obj = 0;
01614
01615 TIter nextObj(m_ListOfLogY);
01616 Int_t LogYCount = 0;
01617
01618
01619 while ((obj = nextObj())) {
01620
01621 if (Debug()) { LOG_INFO << " StHistUtil::ExamineLogYList has hist " << obj->GetName() << endm; }
01622 LogYCount++;
01623
01624 }
01625
01626 LOG_INFO << " Now in StHistUtil::ExamineLogYList, No. Hist. in LogY scale = " << LogYCount <<endm;
01627 return LogYCount;
01628 }
01629
01630
01631
01632
01633 Int_t StHistUtil::ExamineLogXList()
01634 {
01635
01636
01637
01638 if (Debug()) {
01639 LOG_INFO << " **** Now in StHistUtil::ExamineLogXList **** " << endm;
01640 }
01641
01642
01643
01644 TObject *obj = 0;
01645
01646 TIter nextObj(m_ListOfLogX);
01647 Int_t LogXCount = 0;
01648
01649
01650 while ((obj = nextObj())) {
01651
01652 if (Debug()) {
01653 LOG_INFO << " StHistUtil::ExamineLogXList has hist " << obj->GetName() << endm;
01654 }
01655 LogXCount++;
01656
01657 }
01658
01659 LOG_INFO << " Now in StHistUtil::ExamineLogXList, No. Hist. in LogX scale = " << LogXCount <<endm;
01660 return LogXCount;
01661 }
01662
01663
01664
01665
01666 Int_t StHistUtil::ExaminePrintList()
01667 {
01668
01669
01670
01671 if (Debug()) {
01672 LOG_INFO << " **** Now in StHistUtil::ExaminePrintList **** " << endm;
01673 }
01674
01675
01676
01677
01678 if (!m_ListOfPrint){
01679 LOG_INFO << " no subset print list was setup - all hist in directory will be printed " << endm;
01680
01681 return 0;
01682 }
01683
01684
01685 TObject *obj = 0;
01686
01687
01688 TIter nextObj(m_ListOfPrint);
01689 Int_t PrintCount = 0;
01690
01691
01692 while ((obj = nextObj())) {
01693
01694 if (Debug()) {
01695 LOG_INFO << " StHistUtil::ExaminePrintList has hist " << obj->GetName() << endm;
01696 }
01697 PrintCount++;
01698
01699 }
01700
01701 LOG_INFO << " Now in StHistUtil::ExaminePrintList, No. Hist. to Print,Draw = " << PrintCount <<endm;
01702 return m_ListOfPrint->GetSize();
01703 }
01704
01705
01706
01707
01708 Int_t StHistUtil::AddToLogYList(const Char_t *HistName){
01709
01710
01711
01712 if (Debug()) {
01713 LOG_INFO << " **** Now in StHistUtil::AddToLogYList **** " << endm;
01714 }
01715
01716
01717
01718 if (!m_ListOfLogY) m_ListOfLogY = new TList;
01719
01720
01721
01722 TObjString *HistNameObj = new TObjString(HistName);
01723
01724
01725 TObject *lobj = 0;
01726 lobj = m_ListOfLogY->FindObject(HistName);
01727
01728 if (!lobj) {
01729 m_ListOfLogY->Add(HistNameObj);
01730 if (Debug()) {
01731 LOG_INFO << " StHistUtil::AddToLogYList: " << HistName <<endm;
01732 }
01733 } else {
01734 LOG_INFO << " StHistUtil::AddToLogYList: " << HistName << " already in list - not added" <<endm;
01735 }
01736
01737
01738 return m_ListOfLogY->GetSize();
01739 }
01740
01741
01742
01743
01744
01745 Int_t StHistUtil::AddToLogXList(const Char_t *HistName){
01746
01747
01748
01749 if (Debug()) {
01750 LOG_INFO << " **** Now in StHistUtil::AddToLogXList **** " << endm;
01751 }
01752
01753
01754
01755 if (!m_ListOfLogX) m_ListOfLogX = new TList;
01756
01757
01758
01759 TObjString *HistNameObj = new TObjString(HistName);
01760
01761
01762 TObject *lobj = 0;
01763 lobj = m_ListOfLogX->FindObject(HistName);
01764
01765 if (!lobj) {
01766 m_ListOfLogX->Add(HistNameObj);
01767 if (Debug()) {
01768 LOG_INFO << " StHistUtil::AddToLogXList: " << HistName <<endm;
01769 }
01770 } else {
01771 LOG_INFO << " StHistUtil::AddToLogXList: " << HistName << " already in list - not added" <<endm;
01772 }
01773
01774
01775 return m_ListOfLogX->GetSize();
01776 }
01777
01778
01779
01780
01781
01782 Int_t StHistUtil::AddToPrintList(const Char_t *HistName){
01783
01784
01785
01786
01787 if (Debug()) {
01788 LOG_INFO << " **** Now in StHistUtil::AddToPrintList **** " << endm;
01789 }
01790
01791
01792
01793 if (!m_ListOfPrint) m_ListOfPrint = new TList;
01794
01795
01796
01797 TObjString *HistNameObj = new TObjString(HistName);
01798
01799
01800 if (!m_ListOfPrint->Contains(HistName)) {
01801 m_ListOfPrint->Add(HistNameObj);
01802 if (Debug()) {
01803 LOG_INFO << " StHistUtil::AddToPrintList: " << HistName <<endm;
01804 }
01805 } else {
01806 LOG_INFO << " StHistUtil::AddToPrintList: " << HistName << " already in list - not added" <<endm;
01807 }
01808
01809
01810 return m_ListOfPrint->GetSize();
01811
01812 }
01813
01814
01815
01816 Int_t StHistUtil::RemoveFromLogYList(const Char_t *HistName){
01817
01818
01819
01820 if (Debug()) {
01821 LOG_INFO << " **** Now in StHistUtil::RemoveFromLogYList **** " << endm;
01822 }
01823
01824
01825 if (m_ListOfLogY) {
01826
01827
01828
01829 TObject *lobj = 0;
01830 lobj = m_ListOfLogY->FindObject(HistName);
01831
01832 if (lobj) {
01833 m_ListOfLogY->Remove(lobj);
01834 if (Debug()) {
01835 LOG_INFO << " RemoveLogYList: " << HistName << " has been removed from list" <<endm;
01836 }
01837 } else {
01838 LOG_INFO << " RemoveLogYList: " << HistName << " not on list - not removing" <<endm;
01839 }
01840
01841 }
01842
01843 return m_ListOfLogY->GetSize();
01844 }
01845
01846
01847
01848
01849 Int_t StHistUtil::RemoveFromLogXList(const Char_t *HistName){
01850
01851
01852
01853 if (Debug()) {
01854 LOG_INFO << " **** Now in StHistUtil::RemoveFromLogXList **** " << endm;
01855 }
01856
01857
01858 if (m_ListOfLogX) {
01859
01860
01861
01862 TObject *lobj = 0;
01863 lobj = m_ListOfLogX->FindObject(HistName);
01864
01865 if (lobj) {
01866 m_ListOfLogX->Remove(lobj);
01867 if (Debug()) {
01868 LOG_INFO << " RemoveLogXList: " << HistName << " has been removed from list" <<endm;
01869 }
01870 } else {
01871 LOG_INFO << " RemoveLogXList: " << HistName << " not on list - not removing" <<endm;
01872 }
01873
01874 }
01875
01876 return m_ListOfLogX->GetSize();
01877 }
01878
01879
01880
01881
01882 Int_t StHistUtil::RemoveFromPrintList(const Char_t *HistName){
01883
01884
01885
01886 if (Debug()) {
01887 LOG_INFO << " **** Now in StHistUtil::RemoveFromPrintList **** " << endm;
01888 }
01889
01890
01891 if (m_ListOfPrint) {
01892
01893
01894
01895 TObject *lobj = 0;
01896 lobj = m_ListOfPrint->FindObject(HistName);
01897
01898 if (lobj) {
01899 m_ListOfPrint->Remove(lobj);
01900 if (Debug()) {
01901 LOG_INFO << " RemovePrintList: " << HistName << " has been removed from list" <<endm;
01902 }
01903 } else {
01904 LOG_INFO << " RemovePrintList: " << HistName << " not on list - not removing" <<endm;
01905 }
01906
01907 }
01908
01909 return m_ListOfPrint->GetSize();
01910 }
01911
01912
01913
01914
01915
01916
01917 void StHistUtil::SetDefaultLogYList(const Char_t *dirName)
01918 {
01919
01920
01921
01922 if (Debug()) {
01923 LOG_INFO << " **** Now in StHistUtil::SetDefaultLogYList **** " << endm;
01924 }
01925
01926
01927 if (dirName && strcmp(m_dirName,dirName)) strcpy(m_dirName,dirName);
01928 TString type;
01929 if (!strcmp(m_dirName,"QA"))
01930 type = "Tab";
01931 else if (!strcmp(m_dirName,"EventQA"))
01932 type = "StE";
01933 else
01934 type = "StE";
01935
01936 const Char_t* sdefList[] = {
01937 #include "St_QA_Maker/QAhlist_logy.h"
01938 };
01939
01940 Int_t lengofList = sizeof(sdefList)/sizeOfCharPtr;
01941 Int_t numLog = 0;
01942 Int_t ilg = 0;
01943 for (ilg=0;ilg<lengofList;ilg++) {
01944 TString listString = sdefList[ilg];
01945 if (!listString.BeginsWith("fcl")) {
01946 for (Int_t k=0; k<numOfPosPrefixes; k++) {
01947 ((listString = type) += possiblePrefixes[k]) += sdefList[ilg];
01948 numLog = AddToLogYList(listString.Data());
01949 }
01950 } else numLog = AddToLogYList(listString.Data());
01951 }
01952
01953 LOG_INFO << " !!! StHistUtil::SetDefaultLogYList, # histogram put in list " << numLog << endm;
01954
01955 }
01956
01957
01958
01959
01960
01961 void StHistUtil::SetDefaultLogXList(const Char_t *dirName)
01962 {
01963
01964
01965
01966 if (Debug()) {
01967 LOG_INFO << " **** Now in StHistUtil::SetDefaultLogXList **** " << endm;
01968 }
01969
01970 if (dirName && strcmp(m_dirName,dirName)) strcpy(m_dirName,dirName);
01971 TString type;
01972 if (!strcmp(m_dirName,"QA"))
01973 type = "Tab";
01974 else if (!strcmp(m_dirName,"EventQA"))
01975 type = "StE";
01976 else
01977 type = "StE";
01978
01979 const Char_t* sdefList[] = {
01980 #include "St_QA_Maker/QAhlist_logx.h"
01981 };
01982
01983 Int_t lengofList = sizeof(sdefList)/sizeOfCharPtr;
01984 Int_t numLog = 0;
01985 Int_t ilg = 0;
01986 for (ilg=0;ilg<lengofList;ilg++) {
01987 TString listString = sdefList[ilg];
01988 if (!listString.BeginsWith("fcl")) {
01989 for (Int_t k=0; k<numOfPosPrefixes; k++) {
01990 ((listString = type) += possiblePrefixes[k]) += sdefList[ilg];
01991 numLog = AddToLogXList(listString.Data());
01992 }
01993 } else numLog = AddToLogXList(listString.Data());
01994 }
01995
01996 LOG_INFO << " !!! StHistUtil::SetDefaultLogXList, # histogram put in list " << numLog << endm;
01997
01998 }
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009 void StHistUtil::SetDefaultPrintList(const Char_t *dirName, const Char_t *analType)
02010 {
02011
02012 LOG_INFO << " **** Now in StHistUtil::SetDefaultPrintList **** " << endm;
02013
02014 const Char_t **sdefList=0;
02015 Int_t lengofList = 0;
02016
02017 if (dirName && strcmp(m_dirName,dirName)) strcpy(m_dirName,dirName);
02018 TString type;
02019 if (!strcmp(m_dirName,"QA"))
02020 type = "Tab";
02021 else if (!strcmp(m_dirName,"EventQA"))
02022 type = "StE";
02023 else
02024 type = "StE";
02025
02026
02027
02028 if ((!strcmp(analType,"")) || (!strcmp(analType,"All")) ) {
02029 LOG_INFO << " All histograms in directory will be printed/drawn, no list set" << endm;
02030 return;
02031 }
02032
02033
02034 const Char_t* sdefList1[] = {
02035 #include "St_QA_Maker/QAhlist_QA_Cosmic.h"
02036 };
02037 if ((!strcmp(m_dirName,"QA")) && (!strcmp(analType,"Cosmic"))) {
02038 sdefList = sdefList1; lengofList = sizeof(sdefList1)/sizeOfCharPtr;
02039 }
02040
02041
02042 const Char_t* sdefList2[] = {
02043 #include "St_QA_Maker/QAhlist_QA_TestQATable.h"
02044 };
02045 if ((!strcmp(m_dirName,"QA")) && (!strcmp(analType,"TestQATable"))) {
02046 sdefList = sdefList2; lengofList = sizeof(sdefList2)/sizeOfCharPtr;
02047 }
02048
02049
02050 const Char_t* sdefList3[] = {
02051 #include "St_QA_Maker/QAhlist_QA_Ftpc.h"
02052 };
02053 if ((!strcmp(m_dirName,"QA")) && (!strcmp(analType,"Ftpc"))) {
02054 sdefList = sdefList3; lengofList = sizeof(sdefList3)/sizeOfCharPtr;
02055 }
02056
02057
02058 const Char_t* sdefList4[] = {
02059 #include "St_QA_Maker/QAhlist_QA_MDC3.h"
02060 };
02061 if ((!strcmp(m_dirName,"FlowTag")) && (!strcmp(analType,"MDC3"))) {
02062 sdefList = sdefList4; lengofList = sizeof(sdefList4)/sizeOfCharPtr;
02063 }
02064
02065
02066 const Char_t* sdefList5[] = {
02067 #include "St_QA_Maker/QAhlist_QA_year1.h"
02068 };
02069 if ((!strcmp(m_dirName,"QA")) && (!strcmp(analType,"year1"))) {
02070 sdefList = sdefList5; lengofList = sizeof(sdefList5)/sizeOfCharPtr;
02071 }
02072
02073
02074 const Char_t* sdefList6[] = {
02075 #include "St_QA_Maker/QAhlist_EventQA_year1.h"
02076 };
02077 if ((!strcmp(m_dirName,"EventQA")) && (!strcmp(analType,"year1"))) {
02078 sdefList = sdefList6; lengofList = sizeof(sdefList6)/sizeOfCharPtr;
02079 }
02080
02081
02082 const Char_t* sdefList7[] = {
02083 #include "St_QA_Maker/QAhlist_QA_qa_shift.h"
02084 };
02085 if ((!strcmp(m_dirName,"QA")) && (!strcmp(analType,"qa_shift"))) {
02086 sdefList = sdefList7; lengofList = sizeof(sdefList7)/sizeOfCharPtr;
02087 }
02088
02089
02090 const Char_t* sdefList8[] = {
02091 #include "St_QA_Maker/QAhlist_EventQA_qa_shift.h"
02092 };
02093 if ((!strcmp(m_dirName,"EventQA")) && (!strcmp(analType,"qa_shift"))) {
02094 sdefList = sdefList8; lengofList = sizeof(sdefList8)/sizeOfCharPtr;
02095 }
02096
02097
02098 const Char_t* sdefList9[] = {
02099 #include "St_QA_Maker/QAhlist_tpcSectors.h"
02100 };
02101 if ((!strcmp(m_dirName,"EventQA")) && (!strcmp(analType,"tpcSectors"))) {
02102 sdefList = sdefList9; lengofList = sizeof(sdefList9)/sizeOfCharPtr;
02103 }
02104
02105
02106 const Char_t* sdefList10[] = {
02107 #include "St_QA_Maker/QAhlist_Svt.h"
02108 };
02109 if (!strcmp(analType,"Svt")) {
02110 sdefList = sdefList10; lengofList = sizeof(sdefList10)/sizeOfCharPtr;
02111 }
02112
02113 if (!sdefList) {
02114
02115 ifstream analFile(analType);
02116 if (analFile.good()) {
02117 LOG_INFO << "Reading print list from: " << analType << endm;
02118 sdefList = new charptr[4096];
02119 char analBuffer[256];
02120 TString analString;
02121 Bool_t commenting = kFALSE;
02122 Int_t commentIdx = -1;
02123 while (analFile.getline(analBuffer,255)) {
02124 analString = analBuffer;
02125 if (commenting) {
02126 commentIdx = analString.Index("*/");
02127 if (commentIdx>=0) {
02128 analString.Remove(0,commentIdx+2);
02129 commenting = kFALSE;
02130 } else continue;
02131 }
02132 if (!commenting) {
02133 commentIdx = analString.Index("/*");
02134 if (commentIdx>=0) {
02135 analString.Remove(commentIdx);
02136 commenting = kTRUE;
02137 }
02138 }
02139 commentIdx = analString.Index("//");
02140 if (commentIdx>=0) analString.Remove(commentIdx);
02141 analString.Remove(TString::kBoth,' ').Remove(TString::kBoth,',').Remove(TString::kBoth,' ').Remove(TString::kBoth,'"');
02142 Int_t alen = analString.Length();
02143 if (alen<1) continue;
02144 Char_t* tempc = new Char_t[alen+1];
02145 strcpy(tempc,analString.Data());
02146 sdefList[lengofList] = tempc;
02147 lengofList++;
02148 }
02149 } else {
02150 LOG_WARN << "Could not find list of histograms specified by: " << analType << endm;
02151 }
02152 }
02153
02154 Int_t numPrt = 0;
02155 Int_t ilg = 0;
02156 for (ilg=0;ilg<lengofList;ilg++) {
02157 TString ilgString = sdefList[ilg];
02158 Bool_t addIt = kTRUE;
02159 if (ilgString.BeginsWith(":")) {
02160 Ssiz_t endDetSpec = ilgString.Index(":",1) + 1;
02161 TString detSpec = ilgString(0,endDetSpec);
02162 addIt = DetectorIn(detSpec.Data());
02163 if (addIt) ilgString.Remove(0,endDetSpec);
02164 }
02165 if (addIt) {
02166 if (!ilgString.BeginsWith("fcl")) {
02167 for (Int_t k=0; k<numOfPosPrefixes; k++) {
02168 TString listString = type;
02169 (listString += possiblePrefixes[k]) += ilgString;
02170 numPrt = AddToPrintList(listString.Data());
02171 }
02172 } else numPrt = AddToPrintList(ilgString.Data());
02173 if (Debug()) {
02174 LOG_INFO << " !!! adding histogram " << ilgString << " to print list " << endm ;
02175 }
02176 }
02177 }
02178
02179 LOG_INFO << " !!! StHistUtil::SetDefaultPrintList, # histogram put in list " << numPrt << endm;
02180
02181 }
02182
02183
02184
02185
02186
02187
02188 Int_t StHistUtil::Overlay1D(Char_t *dirName,Char_t *inHist1,
02189 Char_t *inHist2) {
02190
02191 LOG_INFO << " **** Now in StHistUtil::Overlay1D **** " << endm;
02192
02193 Int_t n1dHists = 0;
02194 if (dirName && strcmp(m_dirName,dirName)) strcpy(m_dirName,dirName);
02195
02196
02197 TList* dirList = (m_PntrToMaker ? FindHists(m_dirName) : FindHists(m_PntrToPlainFile));
02198
02199
02200 if (!dirList)
02201 return kStErr;
02202
02203 LOG_INFO << "Histogram directory exists -> Find and overlay histograms" << endm;
02204
02205
02206 TIter nextObj(dirList);
02207 TObject *obj = 0;
02208
02209
02210 TH1F *hist1f1 = new TH1F;
02211 TH1F *hist1f2 = new TH1F;
02212
02213
02214
02215 while ((obj = nextObj())) {
02216
02217
02218 if (obj->InheritsFrom("TH1")) {
02219 if (obj->GetName() == (TString)inHist1 ||
02220 obj->GetName() == (TString)inHist2) {
02221 LOG_INFO << " Found Histogram: Type '" << obj->ClassName() << "', Name '"
02222 << obj->GetName() << "', Title '" << obj->GetTitle() << "'"
02223 << endm;
02224
02225
02226 if (obj->ClassName() == (TString)"TH1F") {
02227 if (obj->GetName() == (TString)inHist1) {
02228 *hist1f1 = *(TH1F *)obj;
02229 n1dHists++;
02230 }
02231 if (obj->GetName() == (TString)inHist2) {
02232 *hist1f2 = *(TH1F *)obj;
02233 n1dHists++;
02234 }
02235 } else {
02236 LOG_INFO << " ERROR: histogram not of type TH1F !!!" << endm;
02237 }
02238 }
02239 }
02240 }
02241
02242
02243 if (n1dHists == 2) {
02244 hist1f1->SetLineColor(4);
02245 hist1f1->SetLineStyle(1);
02246 hist1f2->SetLineColor(2);
02247 hist1f2->SetLineStyle(2);
02248
02249 hist1f1->SetStats(kFALSE);
02250 hist1f2->SetStats(kFALSE);
02251
02252 hist1f1->SetTitle(hist1f1->GetTitle()+(TString)" and "+hist1f2->GetTitle());
02253 hist1f2->SetTitle(hist1f1->GetTitle());
02254
02255 TCanvas *newCanvas = new TCanvas("c1d","Combined 1D Histogram",600,780);
02256 newCanvas->Draw();
02257
02258
02259 Ltitle = new TPaveLabel(0.1,0.96,0.9,1.0,m_GlobalTitle.Data(),"br");
02260 Ltitle->SetFillColor(18);
02261 Ltitle->SetTextFont(32);
02262 Ltitle->SetTextSize(0.5);
02263 Ltitle->Draw();
02264
02265
02266 TDatime HistTime;
02267 const Char_t *myTime = HistTime.AsString();
02268 TPaveLabel *Ldatetime = new TPaveLabel(0.7,0.01,0.95,0.03,myTime,"br");
02269 Ldatetime->SetTextSize(0.6);
02270 Ldatetime->Draw();
02271
02272
02273 TPad *newPad = new TPad("p1d","Combined 1D Histogram",0.02,0.04,0.98,0.93);
02274 newPad->Draw();
02275 newPad->cd();
02276
02277
02278 if (hist1f1->GetMaximum() >= hist1f2->GetMaximum()) {
02279 hist1f1->Draw();
02280 hist1f2->Draw("Same");
02281 }
02282 else {
02283 hist1f2->Draw();
02284 hist1f1->Draw("Same");
02285 }
02286
02287
02288 TLegend *legend = new TLegend(0.75,0.85,0.98,0.95);
02289 legend->SetFillColor(0);
02290 legend->SetHeader("Legend");
02291 legend->SetMargin(0.25);
02292 legend->AddEntry(hist1f1,inHist1,"l");
02293 legend->AddEntry(hist1f2,inHist2,"l");
02294 legend->Draw();
02295
02296 newCanvas->Update();
02297
02298 return kStOk;
02299 }
02300
02301 return kStErr;
02302 }
02303
02304
02305
02306
02307
02308
02309 Int_t StHistUtil::Overlay2D(Char_t *dirName,Char_t *inHist1,
02310 Char_t *inHist2) {
02311
02312 LOG_INFO << " **** Now in StHistUtil::Overlay2D **** " << endm;
02313
02314 Int_t n2dHists = 0;
02315 if (dirName && strcmp(m_dirName,dirName)) strcpy(m_dirName,dirName);
02316
02317
02318 TList* dirList = (m_PntrToMaker ? FindHists(m_dirName) : FindHists(m_PntrToPlainFile));
02319
02320
02321 if (!dirList)
02322 return kStErr;
02323
02324 LOG_INFO << "Histogram directory exists -> Find and overlay histograms" << endm;
02325
02326
02327 TIter nextObj(dirList);
02328 TObject *obj = 0;
02329
02330
02331 TH2F *hist2f1 = new TH2F;
02332 TH2F *hist2f2 = new TH2F;
02333
02334
02335
02336 while ((obj = nextObj())) {
02337
02338
02339 if (obj->InheritsFrom("TH1")) {
02340 if (obj->GetName() == (TString)inHist1 ||
02341 obj->GetName() == (TString)inHist2) {
02342 LOG_INFO << " Found Histogram: Type '" << obj->ClassName() << "', Name '"
02343 << obj->GetName() << "', Title '" << obj->GetTitle() << "'"
02344 << endm;
02345
02346
02347 if (obj->ClassName() == (TString)"TH2F") {
02348 if (obj->GetName() == (TString)inHist1) {
02349 *hist2f1 = *(TH2F *)obj;
02350 n2dHists++;
02351 }
02352 if (obj->GetName() == (TString)inHist2) {
02353 *hist2f2 = *(TH2F *)obj;
02354 n2dHists++;
02355 }
02356 } else {
02357 LOG_INFO << " ERROR: histogram is not of type TH2F !!!" << endm;
02358 }
02359 }
02360 }
02361 }
02362
02363
02364 if (n2dHists == 2) {
02365 hist2f1->SetLineColor(4);
02366 hist2f2->SetLineColor(2);
02367
02368 hist2f1->SetStats(kFALSE);
02369 hist2f2->SetStats(kFALSE);
02370
02371 hist2f1->SetTitle(hist2f1->GetTitle()+(TString)" and "+hist2f2->GetTitle());
02372 hist2f2->SetTitle(hist2f1->GetTitle());
02373
02374
02375 TCanvas *newCanvas = new TCanvas("c2d","Combined 2D Histogram",600,780);
02376 newCanvas->Draw();
02377
02378
02379 Ltitle = new TPaveLabel(0.1,0.96,0.9,1.0,m_GlobalTitle.Data(),"br");
02380 Ltitle->SetFillColor(18);
02381 Ltitle->SetTextFont(32);
02382 Ltitle->SetTextSize(0.5);
02383 Ltitle->Draw();
02384
02385
02386 TDatime HistTime;
02387 const Char_t *myTime = HistTime.AsString();
02388 TPaveLabel *Ldatetime = new TPaveLabel(0.7,0.01,0.95,0.03,myTime,"br");
02389 Ldatetime->SetTextSize(0.6);
02390 Ldatetime->Draw();
02391
02392
02393 TPad *newPad = new TPad("p2d","Combined 2D Histogram",0.02,0.04,0.98,0.93);
02394 newPad->Draw();
02395 newPad->cd();
02396
02397
02398 if (hist2f1->GetMaximum() >= hist2f2->GetMaximum()) {
02399 hist2f1->Draw("Box");
02400 hist2f2->Draw("BoxSame");
02401 }
02402 else {
02403 hist2f2->Draw("Box");
02404 hist2f1->Draw("BoxSame");
02405 }
02406
02407
02408 TLegend *legend = new TLegend(0.75,0.85,0.98,0.95);
02409 legend->SetFillColor(0);
02410 legend->SetHeader("Legend");
02411 legend->SetMargin(0.25);
02412 legend->AddEntry(hist2f1,inHist1,"f");
02413 legend->AddEntry(hist2f2,inHist2,"f");
02414 legend->Draw();
02415
02416 newCanvas->Update();
02417
02418 return kStOk;
02419 }
02420
02421 return kStErr;
02422 }
02423
02424
02425
02426
02427
02428
02429
02430
02431 Int_t StHistUtil::GetRunYear(const Char_t *filename) {
02432
02433 m_RunYear = 0;
02434 TString FileName = filename;
02435 TString delim = "_";
02436 TObjArray* tokens = FileName.Tokenize(delim);
02437 for (int tk=2; tk<tokens->GetEntries(); tk++) {
02438 TString& tok = ((TObjString*) (tokens->At(tk)))->String();
02439 if (tok.IsDigit()) {
02440 Ssiz_t loc = tok.Length()-6;
02441 if (loc>0) m_RunYear = atoi(tok.Remove(loc).Data());
02442 break;
02443 }
02444 }
02445 return m_RunYear;
02446
02447 }
02448
02449
02450
02451
02452
02453
02454 void StHistUtil::SetRefAnalysis(const Char_t* refOutFile, const Char_t* refResultsFile,
02455 const Char_t* refCutsFile, const Char_t* refInFile) {
02456
02457 LOG_INFO << "StHistUtil: Will run in reference histogram analysis mode." << endm;
02458 m_analMode = kTRUE;
02459
02460 if (refInFile && strlen(refInFile)) {
02461 LOG_INFO << "StHistUtil: Using reference histogram file " << refInFile << endm;
02462 m_refInFile = ( refInFile ? new TFile(refInFile) : 0 );
02463 if (!m_refInFile) {LOG_ERROR << "file not found: " << refInFile << endm;}
02464 }
02465 if (refCutsFile && strlen(refCutsFile)) {
02466 LOG_INFO << "StHistUtil: Using reference cuts file " << refCutsFile << endm;
02467 m_refCuts = new TList;
02468 ifstream refCuts(refCutsFile);
02469 if (!refCuts.is_open()) {
02470 LOG_ERROR << "StHistUtil: Unable to open cuts file! Proceeding with no cuts..." << endm;
02471 return;
02472 }
02473 char buf_name[256];
02474 char buf_opts[64];
02475 while (refCuts.good()) {
02476 refCuts >> buf_name;
02477 if (!refCuts.good()) break;
02478 int mode;
02479 double cut;
02480 refCuts >> mode >> cut >> buf_opts;
02481 if (!refCuts.good()) break;
02482 if (buf_opts[0] == '!') buf_opts[0] = 0;
02483 if (Debug()) {
02484 LOG_INFO << "StHistUtil: Loading cut : " << buf_name << " : " << mode
02485 << " : " << cut << " : " << buf_opts << " :" << endm;
02486 }
02487 m_refCuts->AddLast(new StHistUtilRef(buf_name,buf_opts,mode,cut));
02488 }
02489 }
02490
02491
02492 strcpy(m_refResultsFile,refResultsFile);
02493
02494 strcpy(m_refOutFile,refOutFile);
02495 }
02496
02497
02498
02499 void StHistUtil::SetDetectors(const Char_t *detectors) {
02500
02501
02502 if (detectors) {
02503 m_Detectors = detectors;
02504
02505 m_Detectors.ReplaceAll(" ",":");
02506 m_Detectors.ReplaceAll(",",":");
02507 m_Detectors.Prepend(":");
02508 m_Detectors.Append(":");
02509 while (m_Detectors.Index("::") >= 0) m_Detectors.ReplaceAll("::",":");
02510 LOG_INFO << "StHistUtil::SetDetectors(): using detectors " << m_Detectors << endm;
02511 } else {
02512 m_Detectors = "";
02513 LOG_INFO << "StHistUtil::SetDetectors(): using all detectors" << endm;
02514 }
02515 }
02516
02517
02518
02519 Bool_t StHistUtil::DetectorIn(const Char_t *detector) {
02520
02521
02522
02523
02524 Bool_t isIn = kFALSE;
02525 if (m_Detectors.Length()) {
02526 Ssiz_t idx = 0;
02527 TString detOpts = detector;
02528 TString curDetSet = "";
02529 TString curDet = "";
02530 while (idx < detOpts.Length() && ! isIn) {
02531 Ssiz_t D1 = detOpts.Index(";",idx);
02532 Ssiz_t setLength = (D1 < idx ? detOpts.Length() : D1+1) - idx;
02533 curDetSet = detOpts(idx,setLength);
02534 Ssiz_t idx2 = 0;
02535 isIn = kTRUE;
02536 while (idx2 < curDetSet.Length() && isIn) {
02537 Ssiz_t D2 = curDetSet.Index(",",idx2);
02538 Ssiz_t detLength = (D2 < idx2 ? curDetSet.Length() : D2+1) - idx2;
02539 curDet = curDetSet(idx2,detLength);
02540 curDet.ReplaceAll(";",":");
02541 curDet.ReplaceAll(",",":");
02542 curDet.Prepend(":");
02543 curDet.Append(":");
02544 while (curDet.Index("::") >= 0) curDet.ReplaceAll("::",":");
02545 if (m_Detectors.Index(curDet.Data()) < 0) isIn = kFALSE;
02546 else idx2 += detLength;
02547 }
02548 idx += setLength;
02549 }
02550 } else {
02551
02552 isIn = kTRUE;
02553 }
02554 return isIn;
02555 }
02556
02557
02558
02559
02560
02561
02562 ClassImp(StHistUtilRef)
02563 StHistUtilRef::StHistUtilRef(const char* name, const char* opts,
02564 const int mode, const double cut):
02565 TNamed(name,opts),Mode(mode),Cut(cut) {}