00001 #include "dt_RunDrawTest.C"
00002
00003 #include "TClassTable.h"
00004 #include "TDirectory.h"
00005 #include "TFile.h"
00006 #include "TH1.h"
00007 #include "TH2.h"
00008 #include "TSystem.h"
00009
00010 #ifndef __CINT__
00011 #include "Event.h"
00012 #endif
00013
00014 TH1 *RefClone(TH1* orig) {
00015 TH1 *cloned = (TH1*)orig->Clone();
00016 TString name = orig->GetName();
00017 name.Prepend("ref");
00018 cloned->SetName(name);
00019 cloned->Reset();
00020 return cloned;
00021 };
00022
00023 TH1* RefClone(TDirectory* from, const char* name) {
00024 TH1 * orig = (TH1*)from->Get(name);
00025 if (!orig) {
00026 cerr << "Missing " << name << " from " << from->GetName() << endl;
00027 return 0;
00028 }
00029 return RefClone(orig);
00030 }
00031
00032 void MakeHisto(TTree *tree, TDirectory* To) {
00033
00034 cout << "Generating histograms from TTree::Draw" << endl;
00035 TDirectory* where = GenerateDrawHist(tree);
00036 To->cd();
00037
00038 Event *event = new Event();
00039 tree->SetBranchAddress("event",&event);
00040
00041
00042
00043
00044 TH1F *refNtrack = RefClone(where,"hNtrack");
00045 TH1F *refGetNtrack = RefClone(where,"hGetNtrack");
00046 TH1F *refNseg = RefClone(where,"hNseg");
00047 TH1F *refTemp = RefClone(where,"hTemp");
00048 TH1F *refHmean = RefClone(where,"hHmean");
00049 TH1F *refHAxisMax = RefClone(where,"hHAxisMax");
00050 TH1F *refHAxisGetMax = RefClone(where,"hHAxisGetMax");
00051 TH1F *refHGetAxisGetMax = RefClone(where,"hHGetAxisGetMax");
00052 TH1F *refHGetAxisMax = RefClone(where,"hHGetAxisMax");
00053 TH1F *refGetHGetAxisMax = RefClone(where,"hGetHGetAxisMax");
00054 TH1F *refGetRefHGetAxisMax = RefClone(where,"hGetRefHGetAxisMax");
00055
00056 TH1F *refPx = RefClone(where,"hPx");
00057 TH1F *refPy = RefClone(where,"hPy");
00058 TH1F *refPz = RefClone(where,"hPz");
00059 TH1F *refRandom = RefClone(where,"hRandom");
00060 TH1F *refMass2 = RefClone(where,"hMass2");
00061 TH1F *refBx = RefClone(where,"hBx");
00062 TH1F *refBy = RefClone(where,"hBy");
00063 TH1F *refXfirst = RefClone(where,"hXfirst");
00064 TH1F *refYfirst = RefClone(where,"hYfirst");
00065 TH1F *refZfirst = RefClone(where,"hZfirst");
00066 TH1F *refXlast = RefClone(where,"hXlast");
00067 TH1F *refYlast = RefClone(where,"hYlast");
00068 TH1F *refZlast = RefClone(where,"hZlast");
00069 TH1F *refCharge = RefClone(where,"hCharge");
00070 TH1F *refNpoint = RefClone(where,"hNpoint");
00071 TH1F *refValid = RefClone(where,"hValid");
00072 TH1F *refPointValue = RefClone(where,"hPointValue");
00073 TH1F *refAlias = RefClone(where,"hAlias");
00074 TH1F *refAliasSymbol = RefClone(where,"hAliasSymbol");
00075 TH1F *refAliasSymbolFunc = RefClone(where,"hAliasSymbolFunc");
00076 TH1F *refBool = RefClone(where,"hBool");
00077
00078 TH1F *refFullMatrix = RefClone(where,"hFullMatrix");
00079 TH1F *refColMatrix = RefClone(where,"hColMatrix");
00080 TH1F *refRowMatrix = RefClone(where,"hRowMatrix");
00081 TH1F *refCellMatrix = RefClone(where,"hCellMatrix");
00082 TH1F *refFullOper = RefClone(where,"hFullOper");
00083 TH1F *refCellOper = RefClone(where,"hCellOper");
00084 TH1F *refColOper = RefClone(where,"hColOper");
00085 TH1F *refRowOper = RefClone(where,"hRowOper");
00086 TH1F *refMatchRowOper = RefClone(where,"hMatchRowOper");
00087 TH1F *refMatchColOper = RefClone(where,"hMatchColOper");
00088 TH1F *refRowMatOper = RefClone(where,"hRowMatOper");
00089 TH1F *refMatchDiffOper= RefClone(where,"hMatchDiffOper");
00090 TH1F *refFullOper2 = RefClone(where,"hFullOper2");
00091
00092 TH1F *refClosestDistance = RefClone(where,"hClosestDistance");
00093 TH1F *refClosestDistance2 = RefClone(where,"hClosestDistance2");
00094 TH1F *refClosestDistance9 = RefClone(where,"hClosestDistance9");
00095
00096 TH1F *refClosestDistanceIndex = RefClone(where, "hClosestDistanceIndex");
00097 TH2F *refPxInd = (TH2F*)RefClone(where,"hPxInd");
00098
00099 TH1F *refSqrtNtrack = RefClone(where,"hSqrtNtrack");
00100 TH1F *refShiftValid = RefClone(where,"hShiftValid");
00101 TH1F *refAndValid = RefClone(where,"hAndValid");
00102
00103 TH1F *refString = RefClone(where,"hString");
00104 TH1F *refStringSpace = RefClone(where,"hStringSpace");
00105 TH1F *refAliasStr = RefClone(where,"hAliasStr");
00106
00107 TH1F *refPxBx = RefClone(where,"hPxBx");
00108 TH1F *refPxBxWeight = RefClone(where,"hPxBxWeight");
00109
00110 TH1F *refTriggerBits = RefClone(where,"hTriggerBits");
00111 TH1F *refTriggerBitsFunc = RefClone(where,"hTriggerBitsFunc");
00112 TH1F *refFiltTriggerBits = RefClone(where,"hFiltTriggerBits");
00113
00114 TH1F *refTrackTrigger = RefClone(where,"hTrackTrigger");
00115 TH1F *refFiltTrackTrigger = RefClone(where,"hFiltTrackTrigger");
00116
00117 TH1F *refBreit = RefClone(where,"hBreit");
00118
00119 TH1F *refAlt = RefClone(where,"hAlt");
00120
00121 TH1F *refSize = RefClone(where,"hSize");
00122 TH1F *refSize2 = RefClone(where,"hSize2");
00123
00124 TH1F *refSumPx = RefClone(where,"hSumPx");
00125 TH2F *refMaxPx = (TH2F*)RefClone(where,"hMaxPx");
00126 TH2F *refMinPx = (TH2F*)RefClone(where,"hMinPx");
00127
00128
00129
00130
00131 cout << "Recalculating the histograms with custom loop." << endl;
00132
00133 TClonesArray *tracks = event->GetTracks();
00134 Int_t nev = (Int_t)tree->GetEntries();
00135 Int_t i, ntracks, evmod,i0,i1, Nvertex;
00136 Track *t;
00137 EventHeader *head;
00138 Int_t nbin = 0;
00139 for (Int_t ev=0;ev<nev;ev++) {
00140 nbin += tree->GetEntry(ev);
00141 head = event->GetHeader();
00142 evmod = head->GetEvtNum()%10;
00143 refNtrack->Fill(event->GetNtrack());
00144 refGetNtrack->Fill(event->GetNtrack());
00145 refNseg->Fill(event->GetNseg());
00146 refTemp->Fill(event->GetTemperature());
00147 refHmean->Fill(event->GetHistogram()->GetMean());
00148 refHAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
00149 refHAxisGetMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
00150 refHGetAxisGetMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
00151 refHGetAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
00152 refGetHGetAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
00153 refGetRefHGetAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
00154 refSqrtNtrack->Fill(sqrt(event->GetNtrack()));
00155
00156 if (!strcmp("type1",event->GetType()))
00157 refString->Fill(event->GetHeader()->GetEvtNum());
00158 if (strstr(event->GetType(),"1")) {
00159 refString->Fill(event->GetHeader()->GetEvtNum());
00160 }
00161 if (strcmp("Event Histogram",event->GetHistogram()->GetTitle())==0) {
00162 refStringSpace->Fill(1);
00163 }
00164 refAliasStr->Fill(strstr(event->GetType(),"1")!=0);
00165 refBool->Fill(event->IsValid());
00166
00167 Nvertex = event->GetNvertex();
00168 for(i0=0;i0<Nvertex;i0++) {
00169 refClosestDistance->Fill(event->GetClosestDistance(i0));
00170 }
00171 if (Nvertex>2) refClosestDistance2->Fill(event->GetClosestDistance(2));
00172 if (Nvertex>9) refClosestDistance9->Fill(event->GetClosestDistance(9));
00173 refClosestDistanceIndex->Fill(event->GetClosestDistance(Nvertex/2));
00174
00175 for(i0=0;i0<4;i0++) {
00176 for(i1=0;i1<4;i1++) {
00177 refFullMatrix->Fill(event->GetMatrix(i0,i1));
00178
00179 int i2 = i0*4+i1;
00180 refAlt->Fill( event->GetMatrix(i0,i1) - ( (i2<Nvertex) ? event->GetClosestDistance(i2) : 0 ) );
00181
00182 }
00183 refColMatrix->Fill(event->GetMatrix(i0,0));
00184 refRowMatrix->Fill(event->GetMatrix(1,i0));
00185
00186 }
00187 refCellMatrix->Fill(event->GetMatrix(2,2));
00188
00189 TBits bits = event->GetTriggerBits();
00190 Int_t nbits = bits.GetNbits();
00191 Int_t ncx = refTriggerBits->GetXaxis()->GetNbins();
00192 Int_t nextbit = -1;
00193 while(1) {
00194 nextbit = bits.FirstSetBit(nextbit+1);
00195 if (nextbit >= nbits) break;
00196 if (nextbit > ncx) refTriggerBits->Fill(ncx+1);
00197 else refTriggerBits->Fill(nextbit);
00198 if (nextbit > ncx) refTriggerBitsFunc->Fill(ncx+1);
00199 else refTriggerBitsFunc->Fill(nextbit);
00200 }
00201 if (bits.TestBitNumber(28)) refFiltTriggerBits->Fill(nbits);
00202
00203 ntracks = event->GetNtrack();
00204 refSize->Fill(ntracks);
00205 refSize->Fill(ntracks);
00206 refSize2->Fill(ntracks);
00207 refSize2->Fill(ntracks);
00208 if ( 5 < ntracks ) {
00209 t = (Track*)tracks->UncheckedAt(5);
00210 for(i0=0;i0<4;i0++) {
00211 for(i1=0;i1<4;i1++) {
00212 }
00213 refColOper->Fill( event->GetMatrix(i0,1) - t->GetVertex(1) );
00214 refRowOper->Fill( event->GetMatrix(2,i0) - t->GetVertex(2) );
00215 }
00216 for(i0=0;i0<3;i0++) {
00217 refMatchRowOper->Fill( event->GetMatrix(2,i0) - t->GetVertex(i0) );
00218 refMatchDiffOper->Fill( event->GetMatrix(i0,2) - t->GetVertex(i0) );
00219 }
00220 refCellOper->Fill( event->GetMatrix(2,1) - t->GetVertex(1) );
00221 }
00222 Double_t sumPx = 0;
00223 Double_t maxPx = 0.0;
00224 Double_t maxPy = 0.0;
00225 Double_t minPx = 5.0;
00226 Double_t minPy = 5.0;
00227 for (i=0;i<ntracks;i++) {
00228 t = (Track*)tracks->UncheckedAt(i);
00229 sumPx += t->GetPx();
00230 if (t->GetPy() > 1.0) {
00231 if (t->GetPx() > maxPx) maxPx = t->GetPx();
00232 if (t->GetPx() < minPx) minPx = t->GetPx();
00233 }
00234 if (t->GetPy() > maxPy) maxPy = t->GetPy();
00235 if (t->GetPy() < minPy) minPy = t->GetPy();
00236 if (evmod == 0) refPx->Fill(t->GetPx());
00237 if (evmod == 0) refPy->Fill(t->GetPy());
00238 if (evmod == 0) refPz->Fill(t->GetPz());
00239 if (evmod == 1) refRandom->Fill(t->GetRandom(),3);
00240 if (evmod == 1) refMass2->Fill(t->GetMass2());
00241 if (evmod == 1) refBx->Fill(t->GetBx());
00242 if (evmod == 1) refBy->Fill(t->GetBy());
00243 if (evmod == 2) refXfirst->Fill(t->GetXfirst());
00244 if (evmod == 2) refYfirst->Fill(t->GetYfirst());
00245 if (evmod == 2) refZfirst->Fill(t->GetZfirst());
00246 if (evmod == 3) refXlast->Fill(t->GetXlast());
00247 if (evmod == 3) refYlast->Fill(t->GetYlast());
00248 if (evmod == 3) refZlast->Fill(t->GetZlast());
00249 if (t->GetPx() < 0) {
00250 refCharge->Fill(t->GetCharge());
00251 refNpoint->Fill(t->GetNpoint());
00252 refValid->Fill(t->GetValid());
00253 }
00254 Int_t valid = t->GetValid();
00255 refShiftValid->Fill(valid << 4);
00256 refShiftValid->Fill( (valid << 4) >> 2 );
00257 if (event->GetNvertex()>10 && event->GetNseg()<=6000) {
00258 refAndValid->Fill( t->GetValid() & 0x1 );
00259 }
00260
00261 Track * t2 = (Track*)tracks->At(t->GetNpoint()/6);
00262 if (t2 && t2->GetPy()>0) {
00263 refPxInd->Fill(t2->GetPy(),t->GetPx());
00264 }
00265 float Bx,By;
00266 Bx = t->GetBx();
00267 By = t->GetBy();
00268 if ((Bx>.15) || (By<=-.15)) refPxBx->Fill(t->GetPx());
00269 double weight = Bx*Bx*(Bx>.15) + By*By*(By<=-.15);
00270 if (weight) refPxBxWeight->Fill(t->GetPx(),weight);
00271
00272 if (i<4) {
00273 for(i1=0;i1<3;i1++) {
00274 refFullOper ->Fill( event->GetMatrix(i,i1) - t->GetVertex(i1) );
00275 refFullOper2->Fill( event->GetMatrix(i,i1) - t->GetVertex(i1) );
00276 refRowMatOper->Fill( event->GetMatrix(i,2) - t->GetVertex(i1) );
00277 }
00278 refMatchColOper->Fill( event->GetMatrix(i,2) - t->GetVertex(1) );
00279 }
00280 for(i1=0; i1<t->GetN(); i1++) {
00281 refPointValue->Fill( t->GetPointValue(i1) );
00282 }
00283 TBits bits = t->GetTriggerBits();
00284 Int_t nbits = bits.GetNbits();
00285 Int_t ncx = refTrackTrigger->GetXaxis()->GetNbins();
00286 Int_t nextbit = -1;
00287 while(1) {
00288 nextbit = bits.FirstSetBit(nextbit+1);
00289 if (nextbit >= nbits) break;
00290 if (nextbit > ncx) refTrackTrigger->Fill(ncx+1);
00291 else refTrackTrigger->Fill(nextbit);
00292 }
00293 if (bits.TestBitNumber(5)) refFiltTrackTrigger->Fill(t->GetPx());
00294 refBreit->Fill(TMath::BreitWigner(t->GetPx(),3,2));
00295
00296 refAlias->Fill(head->GetEvtNum()*6+t->GetPx()*t->GetPy());
00297 refAliasSymbol->Fill(t->GetPx()+t->GetPy());
00298 refAliasSymbolFunc->Fill(t->GetPx()+t->GetPy());
00299 }
00300 refSumPx->Fill(sumPx);
00301 if (maxPx > 0) {
00302 refMaxPx->Fill(maxPy,maxPx);
00303 }
00304 if (minPx < 5.0) {
00305 refMinPx->Fill(minPy,minPx);
00306 }
00307 }
00308
00309 delete event;
00310 Event::Reset();
00311
00312 }
00313
00314 void dt_MakeRef(const char* from, Int_t verboseLevel = 2) {
00315 SetVerboseLevel(verboseLevel);
00316
00317 if (!TClassTable::GetDict("Event")) {
00318 gSystem->Load("libEvent");
00319 gHasLibrary = kTRUE;
00320 }
00321
00322 gROOT->GetList()->Delete();
00323
00324 TFile *hfile = new TFile(from);
00325 TTree *tree = (TTree*)hfile->Get("T");
00326
00327 TFile* f= new TFile("dt_reference.root","recreate");
00328 MakeHisto(tree,f);
00329 f->Write();
00330 delete f;
00331
00332 delete hfile;
00333
00334 gROOT->cd();
00335 cout << "Checking histograms" << endl;
00336 Compare(gDirectory);
00337
00338
00339
00340 }