dt_MakeRef.C

Go to the documentation of this file.
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    //We make clones of the generated histograms
00042    //We set new names and reset the clones.
00043    //We want to have identical histogram limits
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    // Loop with user code on all events and fill the ref histograms
00129    // The code below should produce identical results to the tree->Draw above
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)); // done here because the matrix is square!
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++) { // 3 is the min of the 2nd dim of Matrix and Vertex
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     //   gROOT->GetList()->Delete();
00339 
00340 }

Generated on Tue Jul 5 15:14:48 2011 for ROOT_528-00b_version by  doxygen 1.5.1