00001 #include "TTree.h"
00002 #include "TFile.h"
00003 #include "TList.h"
00004 #include "TROOT.h"
00005 #include <TBenchmark.h>
00006
00007 int gHasLibrary = kFALSE;
00008 int gBranchStyle = 1;
00009 TList gSkipped;
00010
00011 void DrawSkippable(TTree* tree, const char* what, const char* where, Bool_t draw = true) {
00012
00013 if (draw) {
00014 TString cut = what;
00015 cut.Append(">>");
00016 cut.Append(where);
00017 tree->Draw(cut.Data(),"","goff");
00018 TH1* h = (TH1*)gDirectory->FindObject(where);
00019 if (h) h->SetTitle(Form("histo made from T->Draw(\"%s\")",what));
00020 } else {
00021 gSkipped.Add(new TNamed(where,where));
00022 }
00023 };
00024
00025 void DrawSkippable(TTree* tree, const char* what, const char* cond,
00026 const char* where, Bool_t draw = true) {
00027
00028 if (draw) {
00029 TString cut = what;
00030 cut.Append(">>");
00031 cut.Append(where);
00032 tree->Draw(cut.Data(),cond,"goff");
00033 TH1* h = (TH1*)gDirectory->FindObject(where);
00034 if (h) h->SetTitle(Form("histo made from T->Draw(\"%s\",\"%s\")",what,cond));
00035 } else {
00036 gSkipped.Add(new TNamed(where,where));
00037 }
00038 };
00039
00040
00041 void DrawMarks() {
00042
00043
00044 Float_t rt_base = 2.33/10.0;
00045 Float_t cp_base = 2.34/10.0;
00046
00047 Float_t rt = gBenchmark->GetRealTime("DrawTest");
00048 Float_t ct = gBenchmark->GetCpuTime("DrawTest");
00049
00050
00051
00052 Float_t rootmarks = 200*(rt_base + cp_base)/(rt + ct);
00053
00054 printf("* ROOTMARKS =%6.1f * Root%-8s %d/%d\n",rootmarks,gROOT->GetVersion(),gROOT->GetVersionDate(),gROOT->GetVersionTime());
00055
00056 }
00057
00058
00059
00060 TDirectory* GenerateDrawHist(TTree *tree, int quietLevel = 0, int level = 3)
00061 {
00062
00063
00064
00065
00066
00067
00068
00069 gROOT->cd();
00070 TDirectory *hfile = gDirectory;
00071
00072 gBenchmark = new TBenchmark();
00073 gBenchmark->Start("DrawTest");
00074
00075
00076 DrawSkippable(tree,"GetNtrack()","hGetNtrack",(level>0 && gHasLibrary));
00077
00078
00079
00080 DrawSkippable(tree,"fNtrack","hNtrack");
00081 DrawSkippable(tree,"fNseg","hNseg");
00082 DrawSkippable(tree,"fTemperature","hTemp");
00083
00084 DrawSkippable(tree,"fH.GetMean()","hHmean");
00085 if (level>0) DrawSkippable(tree,"fH.fXaxis.fXmax","hHAxisMax");
00086 if (level>0) DrawSkippable(tree,"fH.fXaxis.GetXmax()","hHAxisGetMax");
00087 DrawSkippable(tree,"fH.GetXaxis().GetXmax()","hHGetAxisGetMax",(level>0));
00088 DrawSkippable(tree,"fH.GetXaxis().fXmax","hHGetAxisMax",(level>0));
00089 DrawSkippable(tree,"GetHistogram().GetXaxis().GetXmax()","hGetHGetAxisMax",
00090 (level>0&&gHasLibrary));
00091 DrawSkippable(tree,"event.GetHistogram().GetXaxis().GetXmax()",
00092 "hGetRefHGetAxisMax",(level>0&&gHasLibrary));
00093
00094 DrawSkippable(tree,"fTracks.fPx","fEvtHdr.fEvtNum%10 == 0","hPx");
00095 DrawSkippable(tree,"fTracks.fPy","fEvtHdr.fEvtNum%10 == 0","hPy");
00096 DrawSkippable(tree,"fTracks.fPz","fEvtHdr.fEvtNum%10 == 0","hPz");
00097 DrawSkippable(tree,"fRandom","3*(fEvtHdr.fEvtNum%10 == 1)","hRandom");
00098 DrawSkippable(tree,"fMass2", "fEvtHdr.fEvtNum%10 == 1","hMass2");
00099 DrawSkippable(tree,"fBx", "fEvtHdr.fEvtNum%10 == 1","hBx");
00100 DrawSkippable(tree,"fBy", "fEvtHdr.fEvtNum%10 == 1","hBy");
00101 DrawSkippable(tree,"fXfirst","fEvtHdr.fEvtNum%10 == 2","hXfirst");
00102 DrawSkippable(tree,"fYfirst","fEvtHdr.fEvtNum%10 == 2","hYfirst");
00103 DrawSkippable(tree,"fZfirst","fEvtHdr.fEvtNum%10 == 2","hZfirst");
00104 DrawSkippable(tree,"fXlast", "fEvtHdr.fEvtNum%10 == 3","hXlast");
00105 DrawSkippable(tree,"fYlast", "fEvtHdr.fEvtNum%10 == 3","hYlast");
00106 DrawSkippable(tree,"fZlast", "fEvtHdr.fEvtNum%10 == 3","hZlast");
00107 DrawSkippable(tree,"fCharge","fPx < 0","hCharge");
00108 DrawSkippable(tree,"fNpoint","fPx < 0","hNpoint");
00109 DrawSkippable(tree,"fValid", "fPx < 0","hValid");
00110 DrawSkippable(tree,"fPointValue","hPointValue", gBranchStyle!=0);
00111 tree->SetAlias("mult","fPx*fPy");
00112 DrawSkippable(tree,"fEvtHdr.fEvtNum*6+mult", "hAlias", 1);
00113 tree->SetAlias("track","event.fTracks");
00114 DrawSkippable(tree,"track.fPx+track.fPy", "hAliasSymbol", 1);
00115 DrawSkippable(tree,"track.GetPx()+track.GetPy()","hAliasSymbolFunc", gBranchStyle!=0 && gHasLibrary);
00116
00117 DrawSkippable(tree,"fIsValid","hBool");
00118
00119 DrawSkippable(tree,"fMatrix","hFullMatrix");
00120 DrawSkippable(tree,"fMatrix[][0]","hColMatrix");
00121 DrawSkippable(tree,"fMatrix[1][]","hRowMatrix");
00122 DrawSkippable(tree,"fMatrix[2][2]","hCellMatrix");
00123
00124 DrawSkippable(tree,"fMatrix - fVertex","hFullOper");
00125 DrawSkippable(tree,"fMatrix[2][1] - fVertex[5][1]","hCellOper");
00126 DrawSkippable(tree,"fMatrix[][1] - fVertex[5][1]","hColOper");
00127 DrawSkippable(tree,"fMatrix[2][] - fVertex[5][2]","hRowOper");
00128 DrawSkippable(tree,"fMatrix[2][] - fVertex[5][]","hMatchRowOper");
00129 DrawSkippable(tree,"fMatrix[][2] - fVertex[][1]","hMatchColOper");
00130 DrawSkippable(tree,"fMatrix[][2] - fVertex[][]","hRowMatOper");
00131 DrawSkippable(tree,"fMatrix[][2] - fVertex[5][]","hMatchDiffOper");
00132 DrawSkippable(tree,"fMatrix[][] - fVertex[][]","hFullOper2");
00133
00134
00135 DrawSkippable(tree,"fClosestDistance","hClosestDistance",gBranchStyle!=0);
00136 DrawSkippable(tree,"fClosestDistance[2]","hClosestDistance2",gBranchStyle!=0);
00137 DrawSkippable(tree,"fClosestDistance[9]","hClosestDistance9",gBranchStyle!=0);
00138
00139
00140 DrawSkippable(tree,"fClosestDistance[fNvertex/2]","hClosestDistanceIndex",
00141 (level>0)&&gBranchStyle!=0);
00142 DrawSkippable(tree,"fPx:fPy[fNpoint/6]","fPy[fNpoint/6]>0","hPxInd",(level>0));
00143
00144
00145 DrawSkippable(tree,"sqrt(fNtrack)","hSqrtNtrack",(level>0));
00146
00147
00148 DrawSkippable(tree,"fEvtHdr.fEvtNum","fType==\"type1\" ","hString",(level>0));
00149 DrawSkippable(tree,"fEvtHdr.fEvtNum","1 && strstr(fType,\"1\") ","+hString",(level>0));
00150 tree->SetAlias("typ","fType");
00151 DrawSkippable(tree,"strstr(typ,\"1\") ", "hAliasStr", 1);
00152 DrawSkippable(tree,"fH.fTitle.fData==\"Event Histogram\"","hStringSpace",1);
00153
00154
00155 DrawSkippable(tree,"fValid<<4","hShiftValid",(level>0));
00156 DrawSkippable(tree,"((fValid<<4)>>2)","+hShiftValid",(level>0));
00157 DrawSkippable(tree,"fValid&0x1","(fNvertex>10) && (fNseg<=6000)"
00158 ,"hAndValid",(level>0));
00159
00160
00161 DrawSkippable(tree,"fPx","(fBx>.15) || (fBy<=-.15)","hPxBx",(level>0));
00162 DrawSkippable(tree,"fPx","fBx*fBx*(fBx>.15) + fBy*fBy*(fBy<=-.15)",
00163 "hPxBxWeight",(level>0));
00164
00165 DrawSkippable(tree,"event.fTriggerBits",
00166 "hTriggerBits",level>1 && gBranchStyle!=0);
00167 DrawSkippable(tree,"event.fTriggerBits.fNbits",
00168 "event.fTriggerBits.TestBitNumber(28)",
00169 "hFiltTriggerBits",level>1 && gBranchStyle!=0);
00170
00171 DrawSkippable(tree,"event.GetTriggerBits()",
00172 "hTriggerBitsFunc",level>1 && gBranchStyle!=0 && gHasLibrary );
00173
00174 DrawSkippable(tree,"fTracks.fTriggerBits",
00175 "hTrackTrigger", level>1 && gBranchStyle!=0);
00176 DrawSkippable(tree,"fPx",
00177 "fTracks.fTriggerBits.TestBitNumber(5)",
00178 "hFiltTrackTrigger", level>1 && gBranchStyle!=0);
00179
00180 DrawSkippable(tree,"TMath::BreitWigner(fPx,3,2)",
00181 "",
00182 "hBreit", level>1 && gBranchStyle!=0);
00183
00184
00185 DrawSkippable(tree,"fMatrix-Alt$(fClosestDistance,0)",
00186 "",
00187 "hAlt", level>1 && gBranchStyle!=0);
00188
00189
00190 DrawSkippable(tree,"event.@fTracks.size()","","hSize",level>2 && !(gBranchStyle==0 && !gHasLibrary));
00191 DrawSkippable(tree,"event.fTracks@.size()","","+hSize",level>2 && !(gBranchStyle==0 && !gHasLibrary));
00192 DrawSkippable(tree,"@fTracks.size()","","hSize2",level>2 && gBranchStyle!=0);
00193 DrawSkippable(tree,"fTracks@.size()","","+hSize2",level>2 && gBranchStyle!=0);
00194 DrawSkippable(tree,"Sum$(fPx)","","hSumPx",level>2);
00195 DrawSkippable(tree,"MaxIf$(fPx,fPy>1.0):Max$(fPy)","Sum$(fPy>1.0)>0","hMaxPx",level>2);
00196 DrawSkippable(tree,"MinIf$(fPx,fPy>1.0):Min$(fPy)","Sum$(fPy>1.0)>0","hMinPx",level>2);
00197
00198 if (quietLevel<2) gBenchmark->Show("DrawTest");
00199 else gBenchmark->Stop("DrawTest");
00200 gBenchmark->Start("DrawTest");
00201
00202 return hfile;
00203
00204 }
00205