// Simple example of reading a generated Root file void verification_HitsChargeTime(char *filename=NULL, char *filename2, bool verbose=false) { // Clear global scope //gROOT->Reset(); gStyle->SetOptStat(0); gStyle->SetCanvasColor(0); gStyle->SetTitleColor(1); gStyle->SetStatColor(0); gStyle->SetFrameFillColor(0); gStyle->SetPadColor(0); gStyle->SetPadTickX(1); gStyle->SetPadTickY(1); gStyle->SetTitleSize(0.04); gStyle->SetCanvasBorderMode(0); gStyle->SetFrameBorderMode(0); gStyle->SetFrameLineWidth(2); gStyle->SetPadBorderMode(0); gStyle->SetPalette(1); gStyle->SetTitleAlign(23); gStyle->SetTitleX(.5); gStyle->SetTitleY(0.99); gStyle->SetTitleBorderSize(0); gStyle->SetTitleFillColor(0); gStyle->SetHatchesLineWidth(2); gStyle->SetLineWidth(1.5); gStyle->SetTitleFontSize(0.07); gStyle->SetLabelSize(0.05,"X"); gStyle->SetLabelSize(0.05,"Y"); gStyle->SetTitleSize(0.04,"X"); gStyle->SetTitleSize(0.04,"Y"); gStyle->SetTitleBorderSize(0); gStyle->SetCanvasBorderMode(0); // Load the library with class dictionary info // (create with "gmake shared") char* wcsimdirenv; wcsimdirenv = getenv ("WCSIMDIR"); if(wcsimdirenv != NULL){ gSystem->Load("${WCSIMDIR}/libWCSimRoot.so"); }else{ gSystem->Load("../libWCSimRoot.so"); } TFile *f; // Open the file if (filename==NULL){ f = new TFile("wcsimtest.root","read"); filename = "wcsimtest.root"; }else{ f = new TFile(filename,"read"); } if (!f->IsOpen()){ cout << "Error, could not open input file: " << filename << endl; return -1; } TFile *f2; // Open the file if (filename2==NULL){ f2 = new TFile("../../WCSim_clean/verification-test-scripts/wcsimtest.root","read"); filename2 = "../../WCSim_clean/verification-test-scripts/wcsimtest.root"; }else{ f2 = new TFile(filename2,"read"); } if (!f2->IsOpen()){ cout << "Error, could not open input file: " << filename2 << endl; return -1; } TTree *wcsimT = f->Get("wcsimT"); int nevent = wcsimT->GetEntries(); WCSimRootEvent *wcsimrootsuperevent = new WCSimRootEvent(); wcsimT->SetBranchAddress("wcsimrootevent",&wcsimrootsuperevent); // Force deletion to prevent memory leak when issuing multiple // calls to GetEvent() wcsimT->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); wcsimT->GetEvent(0); // In the default vis.mac, only one event is run. I suspect you could loop over more events, if they existed. WCSimRootTrigger *wcsimrootevent = wcsimrootsuperevent->GetTrigger(0); cout << "Stats for the first event in your version of WCSim using " << filename << endl; cout << "Number of tube hits " << wcsimrootevent->GetNumTubesHit() << endl; cout << "Number of digitized tube hits " << wcsimrootevent->GetNumDigiTubesHit() << endl; cout << "Number of photoelectron hit times " << wcsimrootevent->GetCherenkovHitTimes()->GetEntries() << endl; //Save these to compare with the clean version of the code. int num_tubes = wcsimrootevent->GetNumTubesHit(); int num_digi_tubes = wcsimrootevent->GetNumDigiTubesHit(); int hit_times = wcsimrootevent->GetCherenkovHitTimes()->GetEntries(); // Create a WCSimRootEvent to put stuff from the tree in WCSimRootEvent* wcsimrootsuperevent = new WCSimRootEvent(); // Set the branch address for reading from the tree TBranch *branch = wcsimT->GetBranch("wcsimrootevent"); branch->SetAddress(&wcsimrootsuperevent); // Force deletion to prevent memory leak wcsimT->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); // start with the main "subevent", as it contains most of the info // and always exists. WCSimRootTrigger* wcsimrootevent; TH1F *h1 = new TH1F("PMT Hits", "# Digitized Hits", 500, 0, 3000); TH1F *time = new TH1F("Average time", "Average time", 600, 900, 2000); TH1F *pe = new TH1F("Q/# Digitzed PMT", "Average Charge", 200, 0, 5); // Now loop over events for (int ev=0; ev<nevent; ev++) { // Read the event from the tree into the WCSimRootEvent instance wcsimT->GetEntry(ev); wcsimrootevent = wcsimrootsuperevent->GetTrigger(0); if(verbose){ printf("********************************************************"); printf("Evt, date %d %d\n", wcsimrootevent->GetHeader()->GetEvtNum(), wcsimrootevent->GetHeader()->GetDate()); printf("Mode %d\n", wcsimrootevent->GetMode()); printf("Number of subevents %d\n", wcsimrootsuperevent->GetNumberOfSubEvents()); printf("Vtxvol %d\n", wcsimrootevent->GetVtxvol()); printf("Vtx %f %f %f\n", wcsimrootevent->GetVtx(0), wcsimrootevent->GetVtx(1),wcsimrootevent->GetVtx(2)); } for (int index = 0 ; index < wcsimrootsuperevent->GetNumberOfEvents(); index++) { int ncherenkovdigihits = wcsimrootevent->GetNcherenkovdigihits(); h1->Fill(ncherenkovdigihits); float totalq = 0.; float totalt = 0.; // Loop through elements in the TClonesArray of WCSimRootCherenkovHits for (int i=0; i< ncherenkovdigihits; i++) { TObject *Digi = (wcsimrootevent->GetCherenkovDigiHits())->At(i); WCSimRootCherenkovDigiHit *wcsimrootcherenkovdigihit = dynamic_cast<WCSimRootCherenkovDigiHit*>(Digi); int tubeNumber = (wcsimrootcherenkovdigihit->GetT(),wcsimrootcherenkovdigihit->GetTubeId()); float q = wcsimrootcherenkovdigihit->GetQ(); float t = wcsimrootcherenkovdigihit->GetT(); totalq+=q; totalt+=t; } float av_time = totalt/ncherenkovdigihits; float av_q = totalq/ncherenkovdigihits; } pe->Fill(av_q); time->Fill(av_time); // reinitialize super event between loops. wcsimrootsuperevent->ReInitialize(); }// End of loop over events TTree *wcsimT2 = f2->Get("wcsimT"); int nevent2 = wcsimT2->GetEntries(); WCSimRootEvent *wcsimrootsuperevent = new WCSimRootEvent(); wcsimT2->SetBranchAddress("wcsimrootevent",&wcsimrootsuperevent); // Force deletion to prevent memory leak when issuing multiple // calls to GetEvent() wcsimT2->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); wcsimT2->GetEvent(0); // In the default vis.mac, only one event is run. I suspect you could loop over more events, if they existed. WCSimRootTrigger *wcsimrootevent = wcsimrootsuperevent->GetTrigger(0); cout << "***********************************************************" << endl; cout << "Stats for the first event of WCSim version on GitHub using "<< filename2 << endl; cout << "Number of tube hits " << wcsimrootevent->GetNumTubesHit() << endl; cout << "Number of digitized tube hits " << wcsimrootevent->GetNumDigiTubesHit() << endl; cout << "Number of photoelectron hit times " << wcsimrootevent->GetCherenkovHitTimes()->GetEntries() << endl; cout << "***********************************************************" << endl; if (abs(num_tubes- wcsimrootevent->GetNumTubesHit())>1.0e-6){cout << "FIRST EVENT TEST FAILED: Number of hit tubes do not match" << endl;} else {cout << "FIRST EVENT TEST PASSED: Number of hit tubes matches" << endl;} if (abs(num_digi_tubes-wcsimrootevent->GetNumDigiTubesHit())>1.0e-6){cout << "FIRST EVENT TEST FAILED: Number of digitized tubes do not match" << endl; } else {cout << "FIRST EVENT TEST PASSED: Number of digitized tubes matches" << endl; } if (abs(hit_times-(wcsimrootevent->GetCherenkovHitTimes()->GetEntries()))> 1.0e-6){cout << "FIRST EVENT TEST FAILED: Number of hit times do not match" << endl;} else {cout << "FIRST EVENT TEST PASSED: Number of hit times matches" << endl;} // Create a WCSimRootEvent to put stuff from the tree in WCSimRootEvent* wcsimrootsuperevent = new WCSimRootEvent(); // Set the branch address for reading from the tree TBranch *branch = wcsimT2->GetBranch("wcsimrootevent"); branch->SetAddress(&wcsimrootsuperevent); // Force deletion to prevent memory leak wcsimT2->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); // start with the main "subevent", as it contains most of the info // and always exists. WCSimRootTrigger* wcsimrootevent; TH1F *h2 = new TH1F("PMT Hits 2", "Digitized Hits", 500, 0, 3000); TH1F *time2 = new TH1F("Average time 2", "Average time", 600, 900, 2000); TH1F *pe2 = new TH1F("Q/# Digitzed PMT 2", "Q/# Digitzed PMT", 200, 0, 5); // Now loop over events for (int ev=0; ev<nevent; ev++) { // Read the event from the tree into the WCSimRootEvent instance wcsimT2->GetEntry(ev); wcsimrootevent = wcsimrootsuperevent->GetTrigger(0); if(verbose){ printf("********************************************************"); printf("Evt, date %d %d\n", wcsimrootevent->GetHeader()->GetEvtNum(), wcsimrootevent->GetHeader()->GetDate()); printf("Mode %d\n", wcsimrootevent->GetMode()); printf("Number of subevents %d\n", wcsimrootsuperevent->GetNumberOfSubEvents()); printf("Vtxvol %d\n", wcsimrootevent->GetVtxvol()); printf("Vtx %f %f %f\n", wcsimrootevent->GetVtx(0), wcsimrootevent->GetVtx(1),wcsimrootevent->GetVtx(2)); } for (int index = 0 ; index < wcsimrootsuperevent->GetNumberOfEvents(); index++) { int ncherenkovdigihits = wcsimrootevent->GetNcherenkovdigihits(); h2->Fill(ncherenkovdigihits); float totalq = 0.; float totalt = 0.; // Loop through elements in the TClonesArray of WCSimRootCherenkovHits for (int i=0; i< ncherenkovdigihits; i++) { TObject *Digi = (wcsimrootevent->GetCherenkovDigiHits())->At(i); WCSimRootCherenkovDigiHit *wcsimrootcherenkovdigihit = dynamic_cast<WCSimRootCherenkovDigiHit*>(Digi); int tubeNumber = (wcsimrootcherenkovdigihit->GetT(),wcsimrootcherenkovdigihit->GetTubeId()); float q = wcsimrootcherenkovdigihit->GetQ(); float t = wcsimrootcherenkovdigihit->GetT(); totalq+=q; totalt+=t; } float av_time = totalt/ncherenkovdigihits; float av_q = totalq/ncherenkovdigihits; } pe2->Fill(av_q); time2->Fill(av_time); // reinitialize super event between loops. wcsimrootsuperevent->ReInitialize(); }// End of loop over events Double_t ks_hits = h1->KolmogorovTest(h2); Double_t ks_charge = pe->KolmogorovTest(pe2); Double_t ks_time = time->KolmogorovTest(time2); cout << "***********************************************************" << endl; cout << "ks test for # of digitized hits: " << ks_hits << endl; cout << "ks test for average charge: " << ks_charge << endl; cout << "ks test for average time: " << ks_time << endl; // TCanvas c1("c1"); float win_scale = 0.75; int n_wide(2); int n_high(2); TCanvas* c1 = new TCanvas("c1", "Test Plots", 500*n_wide*win_scale, 500*n_high*win_scale); c1->Draw(); c1->Divide(2,2); c1->cd(1); h2->SetLineColor(kRed); h1->Draw(); c1->cd(1); h2->Draw("SAME"); TLegend *leg = new TLegend(0.2,0.7,0.55,0.85, ""); leg->SetFillColor(0); leg->SetBorderSize(0); leg->AddEntry(h1,filename, "l"); leg->AddEntry(h2,filename2, "l"); leg->Draw(); c1->cd(2); pe->GetXaxis()->SetTitle("Total Charge / # digitized hits"); pe->Draw(); pe2->SetLineColor(kRed); c1->cd(2); pe2->Draw("SAME"); c1->cd(3); time->GetXaxis()->SetTitle("Total Time / # digitized hits (ns)"); time->Draw(); time2->SetLineColor(kRed); c1->cd(3); time2->Draw("SAME"); }
void compare_wls1(TString filename="../p15m_nwls/wcsim.root",TString histoname="p15m_nwls", Int_t *flag, TString rootfile = "temp.root") { TFile *file1; if (*flag!=0) { //file1 = new TFile(rootfile,"Update"); file1 = new TFile(rootfile,"RECREATE"); } else { file1 = new TFile(rootfile,"RECREATE"); } TString filename1; filename1 = histoname + "_digi"; TTree *T = new TTree(filename1,filename1); T->SetDirectory(file1); Double_t diginpe,digitime,cor_digitime,digitheta,dis_digihit; Int_t neve; Double_t mom; Double_t pos_x,pos_y,pos_z; Double_t dir_x,dir_y,dir_z; Double_t tube_x,tube_y,tube_z; Double_t totankdis; Double_t vertex[3],dir[3]; Double_t tube_pos[3]; T->Branch("digi_eve",&neve,"data/I"); T->Branch("diginpe",&diginpe,"data/D"); T->Branch("digitime",&digitime,"data/D"); T->Branch("cor_digitime",&cor_digitime,"data/D"); T->Branch("digitheta",&digitheta,"data/D"); T->Branch("dis_dighit",&dis_digihit,"data/D"); T->Branch("mom",&mom,"data/D"); T->Branch("totankdis",&totankdis,"data/D"); T->Branch("pos_x",&vertex[0],"data/D"); T->Branch("pos_y",&vertex[1],"data/D"); T->Branch("pos_z",&vertex[2],"data/D"); T->Branch("dir_x",&dir[0],"data/D"); T->Branch("dir_y",&dir[1],"data/D"); T->Branch("dir_z",&dir[2],"data/D"); T->Branch("tube_x",&tube_pos[0],"data/D"); T->Branch("tube_y",&tube_pos[1],"data/D"); T->Branch("tube_z",&tube_pos[2],"data/D"); filename1 = histoname + "_hit"; TTree *t1 = new TTree(filename1,filename1); t1->SetDirectory(file1); Double_t wavelength, truetime, corr_time,theta,distance,index; Int_t qe_flag,parentid,tubeid,totalpe; Int_t ntracks; t1->Branch("ntracks",&ntracks,"data/I"); t1->Branch("neve",&neve,"data/I"); t1->Branch("wavelength",&wavelength,"data/D"); t1->Branch("truetime",&truetime,"data/D"); t1->Branch("corr_time",&corr_time,"data/D"); t1->Branch("theta",&theta,"data/D"); t1->Branch("distance",&distance,"data/D"); t1->Branch("index",&index,"data/D"); t1->Branch("mom",&mom,"data/D"); t1->Branch("totankdis",&totankdis,"data/D"); t1->Branch("pos_x",&vertex[0],"data/D"); t1->Branch("pos_y",&vertex[1],"data/D"); t1->Branch("pos_z",&vertex[2],"data/D"); t1->Branch("dir_x",&dir[0],"data/D"); t1->Branch("dir_y",&dir[1],"data/D"); t1->Branch("dir_z",&dir[2],"data/D"); t1->Branch("tube_x",&tube_pos[0],"data/D"); t1->Branch("tube_y",&tube_pos[1],"data/D"); t1->Branch("tube_z",&tube_pos[2],"data/D"); // t1->Branch("pos_x",&pos_x,"data/D"); // t1->Branch("pos_y",&pos_y,"data/D"); // t1->Branch("pos_z",&pos_z,"data/D"); // t1->Branch("dir_x",&dir_x,"data/D"); // t1->Branch("dir_y",&dir_y,"data/D"); // t1->Branch("dir_z",&dir_z,"data/D"); // t1->Branch("tube_x",&tube_x,"data/D"); // t1->Branch("tube_y",&tube_y,"data/D"); // t1->Branch("tube_z",&tube_z,"data/D"); t1->Branch("qe_flag",&qe_flag,"data/I"); t1->Branch("parentid",&parentid,"data/I"); t1->Branch("tubeid",&tubeid,"data/I"); t1->Branch("totalpe",&totalpe,"data/I"); TFile *file = new TFile(filename); TTree *wcsimT = file->Get("wcsimT"); WCSimRootEvent *wcsimrootsuperevent = new WCSimRootEvent(); wcsimT->SetBranchAddress("wcsimrootevent",&wcsimrootsuperevent); wcsimT->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); TTree *gtree = file->Get("wcsimGeoT"); WCSimRootGeom *wcsimrootgeom = new WCSimRootGeom(); gbranch = gtree->GetBranch("wcsimrootgeom"); gbranch->SetAddress(&wcsimrootgeom); gtree->GetEntry(0); WCSimRootPMT *pmt; Double_t pmt_pos[500000][3]; for (Int_t i=0; i!=wcsimrootgeom->GetWCNumPMT(); i++) { pmt_pos[i][0] = (wcsimrootgeom->GetPMT(i)).GetPosition(0); pmt_pos[i][1] = (wcsimrootgeom->GetPMT(i)).GetPosition(1); pmt_pos[i][2] = (wcsimrootgeom->GetPMT(i)).GetPosition(2); } //in terms of wavelength (total NPE) real hit filename1 = histoname + "_total_wl"; TH1F *hqx = new TH1F(filename1,filename1,600,200,800); //NPE in each event sum over digi hit filename1 = histoname + "_total_npe"; TH1F *hqx2 = new TH1F(filename1,filename1,1000,0.,10000); //digitized hit time filename1 = histoname + "_digitime"; TH1F *hqx1 = new TH1F(filename1,filename1,500,900,1400); //corrected digitized hit time filename1 = histoname + "_cor_digitime"; TH1F *hqx4 = new TH1F(filename1,filename1,1000,400,1400); //digitized hit angle filename1 = histoname + "_digitheta"; TH1F *hqx5 = new TH1F(filename1,filename1,180,0,180); //TH2F *h1 = new TH2F("h1","h1",100,1000,20000,100,90000,140000); Double_t index = 1.333; neve = *flag; cout << histoname << "\t" << wcsimT->GetEntries() << endl; for (Int_t j=0; j!=wcsimT->GetEntries(); j++) { //for (Int_t j=0;j!=90;j++){ // cout << j << endl; wcsimT->GetEvent(j); neve ++; WCSimRootTrigger *wcsimrootevent = wcsimrootsuperevent->GetTrigger(0); temp = (TClonesArray*)wcsimrootevent->GetTracks(); Int_t ntrack = wcsimrootevent->GetNtrack(); //cout << ntrack << endl; ntracks = ntrack; mom = ((WCSimRootTrack*)temp->At(ntrack-1))->GetP(); //get the vertex information vertex[0] = ((WCSimRootTrack*)temp->At(ntrack-1))->GetStart(0); vertex[1] = ((WCSimRootTrack*)temp->At(ntrack-1))->GetStart(1); vertex[2] = ((WCSimRootTrack*)temp->At(ntrack-1))->GetStart(2); //get position information dir[0] = ((WCSimRootTrack*)temp->At(ntrack-1))->GetDir(0); dir[1] = ((WCSimRootTrack*)temp->At(ntrack-1))->GetDir(1); dir[2] = ((WCSimRootTrack*)temp->At(ntrack-1))->GetDir(2); totankdis=ToTankDistance(vertex,dir); TVector3 vertex3(vertex[0],vertex[1],vertex[2]); TVector3 dir3(dir[0],dir[1],dir[2]); //loop through digi hit int max = wcsimrootevent->GetNcherenkovdigihits(); double sum = 0; for (int i=0; i<max; i++) { // cout << max << "\t" << i << endl; WCSimRootCherenkovDigiHit *cDigiHit = ((WCSimRootCherenkovDigiHit*)wcsimrootevent->GetCherenkovDigiHits()->At(i)); hqx1->Fill(cDigiHit->GetT()); tube_pos[0] = pmt_pos[(cDigiHit->GetTubeId()-1)][0]; tube_pos[1] = pmt_pos[(cDigiHit->GetTubeId()-1)][1]; tube_pos[2] = pmt_pos[(cDigiHit->GetTubeId()-1)][2]; TVector3 hit3(tube_pos[0],tube_pos[1],tube_pos[2]); TVector3 dis = hit3-vertex3; diginpe = cDigiHit->GetQ(); digitime = cDigiHit->GetT(); cor_digitime = digitime-dis.Mag()/299792458.*1.333*1.e7; digitheta = dis.Angle(dir3)/3.1415926*180.; dis_digihit = dis.Mag(); hqx4->Fill(cor_digitime,diginpe); hqx5->Fill(digitheta,diginpe); sum += diginpe; T->Fill(); } hqx2->Fill(sum); //loop through real hit //loop through PMT hit first max = wcsimrootevent-> GetNcherenkovhits(); //cout << max << endl; if (max ==0) { t1->Fill(); } for (int i=0; i<max; i++) { WCSimRootCherenkovHit* wcsimrootcherenkovhit = dynamic_cast<WCSimRootCherenkovHit*>((wcsimrootevent->GetCherenkovHits())->At(i)); totalpe = wcsimrootcherenkovhit->GetTotalPe(1); tubeid = wcsimrootcherenkovhit->GetTubeID() ; //loop through hit time etc for (int k=0; k<totalpe; k++) { TObject *element2 = (wcsimrootevent->GetCherenkovHitTimes())-> At(wcsimrootcherenkovhit->GetTotalPe(0)+k); WCSimRootCherenkovHitTime *wcsimrootcherenkovhittime = dynamic_cast<WCSimRootCherenkovHitTime*>(element2); wavelength =wcsimrootcherenkovhittime->GetWavelength(); qe_flag = wcsimrootcherenkovhittime->GetQe_flag(); truetime = wcsimrootcherenkovhittime->GetTruetime(); parentid = wcsimrootcherenkovhittime->GetParentID(); pos_x = wcsimrootcherenkovhittime->GetPosX() ; pos_y = wcsimrootcherenkovhittime->GetPosY() ; pos_z = wcsimrootcherenkovhittime->GetPosZ() ; dir_x = wcsimrootcherenkovhittime->GetDirX() ; dir_y = wcsimrootcherenkovhittime->GetDirY() ; dir_z = wcsimrootcherenkovhittime->GetDirZ() ; tube_pos[0] = pmt_pos[tubeid-1][0]; tube_pos[1] = pmt_pos[tubeid-1][1]; tube_pos[2] = pmt_pos[tubeid-1][2]; tube_x = tube_pos[0]; tube_y = tube_pos[1]; tube_z = tube_pos[2]; TVector3 hit3(tube_pos[0],tube_pos[1],tube_pos[2]); TVector3 dis = hit3-vertex3; distance = dis.Mag(); theta = dis.Angle(dir3)/3.1415926*180.; //index = index(wavelength); index = 1.34; corr_time = truetime - distance/299792458.*1e7*index; if (qe_flag==1) { hqx->Fill(wavelength); } t1->Fill(); } } } if (flag==1) { hqx->SetDirectory(file1); hqx2->SetDirectory(file1); hqx1->SetDirectory(file1); hqx4->SetDirectory(file1); hqx5->SetDirectory(file1); file1->Write(); file1->Close(); } else { hqx->SetDirectory(file1); hqx2->SetDirectory(file1); hqx1->SetDirectory(file1); hqx4->SetDirectory(file1); hqx5->SetDirectory(file1); file1->Write(); file1->Close(); } *flag = neve; }
void pmtremove(TString infile, TString outfile, double removefrac) { // read old geometry from the input rootfile TFile *f2 = new TFile(infile); TTree *oldtree = (TTree*)f2->Get("wcsimGeoT"); WCSimRootGeom* oldgeom = new WCSimRootGeom(); TBranch *gb = oldtree->GetBranch("wcsimrootgeom"); gb->SetAddress(&oldgeom); oldtree->GetEntry(0); int oldpmtnum = oldgeom->GetWCNumPMT(); Printf("Initial Number of PMTs: %d", oldpmtnum); // set up the new output file TFile *f3 = new TFile(outfile,"RECREATE"); TTree *newtree = oldtree->CloneTree(0); WCSimRootGeom* newgeom = new WCSimRootGeom(); newtree->SetBranchAddress("wcsimrootgeom",&newgeom); newgeom->SetWCCylRadius(oldgeom->GetWCCylRadius()); newgeom->SetWCCylLength(oldgeom->GetWCCylLength()); newgeom->SetMailBox_x(oldgeom->GetMailBox_x()); newgeom->SetMailBox_y(oldgeom->GetMailBox_y()); newgeom->SetMailBox_z(oldgeom->GetMailBox_z()); newgeom->SetGeo_Type(oldgeom->GetGeo_Type()); newgeom->SetWCOffset(oldgeom->GetWCOffset(0), oldgeom->GetWCOffset(1), oldgeom->GetWCOffset(2)); newgeom->SetOrientation(oldgeom->GetOrientation()); newgeom->SetWCPMTRadius(oldgeom->GetWCPMTRadius()); // associates old PMTs with new PMTs Index into it is the old pmt number, // gives back new PMT number. If PMT is removed, this array has -1 in it. const int asize = oldpmtnum + 1; int pmtassoc[asize]; int newpmtnum = 0; int ict = 0; // old floor count for (int i=0;i<oldpmtnum;i++) { WCSimRootPMT pmt = oldgeom->GetPMT(i); int oldtubeno = pmt.GetTubeNo(); double ft = removefrac*( (double) i); int icc = (int) floor(ft); // check to see when this rolls around another integer if ( ict != icc) { ict = icc; pmtassoc[oldtubeno] = -1; // and remove this tube } else { pmtassoc[oldtubeno] = newpmtnum+1; float rot[3]; float pos[3]; for (int j=0;j<3;j++) { rot[j] = pmt.GetOrientation(j); pos[j] = pmt.GetPosition(j); } newgeom->SetPMT(newpmtnum,newpmtnum+1,pmt.GetCylLoc(),rot,pos,true); newpmtnum++; } //if (i<100) std::cout << "input pmt: " << i << " " << oldtubeno << " assoc: " << pmtassoc[oldtubeno] << std::endl; } newgeom->SetWCNumPMT(newpmtnum); std::cout << "New PMT count: " << newpmtnum << std::endl; newtree->Fill(); newtree->Write(); //------------------------------------------------------------------------------------------- //---------- Go through events -- drop PMT hits and renumber PMTs with the ones we have. //------------------------------------------------------------------------------------------- TTree *oldevtree = (TTree*) f2->Get("wcsimT"); int nevent = oldevtree->GetEntries(); std::cout << "Number of events: " << nevent << std::endl; // Create a WCSimRootEvent to put stuff from the old tree in WCSimRootEvent* oldsuperevent = new WCSimRootEvent(); TBranch *branch = oldevtree->GetBranch("wcsimrootevent"); branch->SetAddress(&oldsuperevent); // Force deletion to prevent memory leak oldevtree->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); // Initialize the output tree TTree *newevtree = oldevtree->CloneTree(0); WCSimRootEvent *newsuperevent = new WCSimRootEvent(); newsuperevent->Initialize(); newevtree->SetBranchAddress("wcsimrootevent",&newsuperevent); // Now loop over events for (int ev=0; ev<nevent; ev++) { // Read the event from the tree into the WCSimRootEvent instance oldevtree->GetEntry(ev); // new output event -- allocate memory here and let it go out of scope at the end of the loop. // performance isn't so much an issue here. for (int itrigger = 0; itrigger < oldsuperevent->GetNumberOfEvents(); itrigger++) { //std::cout << "about to get a trigger: Event: " << ev << " Trigger: " << itrigger << std::endl; WCSimRootTrigger *oldtrigger; oldtrigger = oldsuperevent->GetTrigger(itrigger); if (itrigger > 0) newsuperevent->AddSubEvent(); // don't have to add the first trigger, done by initialize WCSimRootTrigger *newtrigger = newsuperevent->GetTrigger(itrigger); WCSimRootEventHeader *oldheader = oldtrigger->GetHeader(); newtrigger->SetHeader(oldheader->GetEvtNum(),oldheader->GetRun(),oldheader->GetDate(),oldheader->GetSubEvtNumber()); newtrigger->SetMode(oldtrigger->GetMode()); newtrigger->SetVtxvol(oldtrigger->GetVtxvol()); for (int i=0;i<3;i++) newtrigger->SetVtx(i,oldtrigger->GetVtx(i)); newtrigger->SetJmu(oldtrigger->GetJmu()); newtrigger->SetJp(oldtrigger->GetJp()); newtrigger->SetNpar(oldtrigger->GetNpar()); WCSimRootPi0 *pi0info = oldtrigger->GetPi0Info(); float pi0vtx[3],gammae[2],gammavtx[2][3]; int gammaid[2]; for (int i=0;i<3;i++) { pi0vtx[i] = pi0info->GetPi0Vtx(i); gammavtx[0][i] = pi0info->GetGammaVtx(0,i); gammavtx[1][i] = pi0info->GetGammaVtx(1,i); } for (int i=0;i<2;i++) { gammaid[i] = pi0info->GetGammaID(i); gammae[i] = pi0info->GetGammaE(i); } newtrigger->SetPi0Info(pi0vtx,gammaid,gammae,gammavtx); // Get the number of tracks int ntrack = oldtrigger->GetNtrack(); //printf("ntracks=%d\n",ntrack); // Loop through elements in the TClonesArray of WCSimTracks for (int i=0; i<ntrack; i++) { TObject *element = (oldtrigger->GetTracks())->At(i); WCSimRootTrack *track = dynamic_cast<WCSimRootTrack*>(element); float dir[3],pdir[3],stop[3],start[3]; for (int j=0;j<3;j++) { dir[j] = track->GetDir(j); pdir[j] = track->GetPdir(j); stop[j] = track->GetStop(j); start[j] = track->GetStart(j); } newtrigger->AddTrack(track->GetIpnu(), track->GetFlag(), track->GetM(), track->GetP(), track->GetE(), track->GetStartvol(), track->GetStopvol(), dir, pdir, stop, start, track->GetParenttype(), track->GetTime(), track->GetId()); } // End of loop over tracks // stopped here March 22 -- keep copying info from the old trigger to the new trigger // Now look at the Cherenkov hits // Get the number of Cherenkov hits. // Note... this is *NOT* the number of photons that hit tubes. // It is the number of tubes hit with Cherenkov photons. // The number of digitized tubes will be smaller because of the threshold. // Each hit "raw" tube has several photon hits. The times are recorded. // See chapter 5 of ../doc/DetectorDocumentation.pdf // for more information on the structure of the root file. // // For digitized info (one time/charge tube after a trigger) use // the digitized information. // int ncherenkovhits = oldtrigger->GetNcherenkovhits(); int ncherenkovdigihits = oldtrigger->GetNcherenkovdigihits(); // Grab the big arrays of times and parent IDs TClonesArray *timeArray = oldtrigger->GetCherenkovHitTimes(); // Loop through elements in the TClonesArray of WCSimRootCherenkovHits and copy info for non-removed PMT's for (int i=0; i< ncherenkovhits; i++) { TObject *Hit = (oldtrigger->GetCherenkovHits())->At(i); WCSimRootCherenkovHit *wcsimrootcherenkovhit = dynamic_cast<WCSimRootCherenkovHit*>(Hit); int tubeNumber = wcsimrootcherenkovhit->GetTubeID(); int timeArrayIndex = wcsimrootcherenkovhit->GetTotalPe(0); int peForTube = wcsimrootcherenkovhit->GetTotalPe(1); if (tubeNumber < 1 || tubeNumber > oldpmtnum) { std::cout << "Error in pmtremove: tube number out of range: " << tubeNumber << " max: " << oldpmtnum << std::endl; exit(0); // die if we get a bad tube number } int newtubenumber = pmtassoc[tubeNumber]; if (newtubenumber > 0) // keep the tube's hits { vector<float> truetime; vector<int> ppid; for (int j=0; j<peForTube; j++) { WCSimRootCherenkovHitTime *HitTime = dynamic_cast<WCSimRootCherenkovHitTime*>(timeArray->At(timeArrayIndex+j)); truetime.push_back(HitTime->GetTruetime()); ppid.push_back(HitTime->GetParentID()); } newtrigger->AddCherenkovHit(newtubenumber,truetime,ppid); } } // End of loop over Cherenkov hits // Copy digitized hits for non-removed PMT's, and recompute sumq float sumq = 0; for (int i=0;i<ncherenkovdigihits;i++) { // Loop through elements in the TClonesArray of WCSimRootCherenkovDigiHits TObject *element = (oldtrigger->GetCherenkovDigiHits())->At(i); WCSimRootCherenkovDigiHit *wcsimrootcherenkovdigihit = dynamic_cast<WCSimRootCherenkovDigiHit*>(element); int tubeNumber = wcsimrootcherenkovdigihit->GetTubeId(); if (tubeNumber < 1 || tubeNumber > oldpmtnum) { std::cout << "Error in pmtremove: tube number out of range: " << tubeNumber << " max: " << oldpmtnum << std::endl; exit(0); // die if we get a bad tube number } int newtubenumber = pmtassoc[tubeNumber]; if (newtubenumber > 0) // keep the tube's hits { newtrigger->AddCherenkovDigiHit(wcsimrootcherenkovdigihit->GetQ(), wcsimrootcherenkovdigihit->GetT(), newtubenumber); sumq += wcsimrootcherenkovdigihit->GetQ(); } //if ( i < 10 ) // Only print first XX=10 tubes //printf("q, t, tubeid: %f %f %d \n",wcsimrootcherenkovdigihit->GetQ(), // wcsimrootcherenkovdigihit->GetT(),wcsimrootcherenkovdigihit->GetTubeId()); } // End of loop over Cherenkov digihits newtrigger->SetSumQ(sumq); //if (ev<100) { std::cout << "Sum charge: " << ev << " " << itrigger << " " << oldtrigger->GetSumQ() << " " << sumq << std::endl; } } // End of loop over triggers in the event newevtree->Fill(); newevtree->Write(); // reinitialize super events between loops. oldsuperevent->ReInitialize(); newsuperevent->ReInitialize(); } // End of loop over events delete f2; delete f3; }
// Simple example of reading a generated Root file void sample_readfile(char *filename=NULL, bool verbose=false) { // Clear global scope //gROOT->Reset(); /* gStyle->SetOptStat(0); gStyle->SetCanvasColor(0); gStyle->SetTitleColor(1); gStyle->SetStatColor(0); gStyle->SetFrameFillColor(0); gStyle->SetPadColor(0); gStyle->SetPadTickX(1); gStyle->SetPadTickY(1); gStyle->SetTitleSize(0.04); gStyle->SetCanvasBorderMode(0); gStyle->SetFrameBorderMode(0); gStyle->SetFrameLineWidth(2); gStyle->SetPadBorderMode(0); gStyle->SetPalette(1); gStyle->SetTitleAlign(23); gStyle->SetTitleX(.5); gStyle->SetTitleY(0.99); gStyle->SetTitleBorderSize(0); gStyle->SetTitleFillColor(0); gStyle->SetHatchesLineWidth(2); gStyle->SetLineWidth(1.5); gStyle->SetTitleFontSize(0.07); gStyle->SetLabelSize(0.05,"X"); gStyle->SetLabelSize(0.05,"Y"); gStyle->SetTitleSize(0.04,"X"); gStyle->SetTitleSize(0.04,"Y"); gStyle->SetTitleBorderSize(0); gStyle->SetCanvasBorderMode(0); */ // Load the library with class dictionary info // (create with "gmake shared") char* wcsimdirenv; wcsimdirenv = getenv ("WCSIMDIR"); if(wcsimdirenv != NULL){ gSystem->Load("${WCSIMDIR}/libWCSimRoot.so"); }else{ gSystem->Load("../libWCSimRoot.so"); } TFile *file; // Open the file if (filename==NULL){ file = new TFile("../wcsim.root","read"); }else{ file = new TFile(filename,"read"); } if (!file->IsOpen()){ cout << "Error, could not open input file: " << filename << endl; return -1; } // Get the a pointer to the tree from the file TTree *tree = (TTree*)file->Get("wcsimT"); // Get the number of events int nevent = tree->GetEntries(); if(verbose) printf("nevent %d\n",nevent); // Create a WCSimRootEvent to put stuff from the tree in WCSimRootEvent* wcsimrootsuperevent = new WCSimRootEvent(); // Set the branch address for reading from the tree TBranch *branch = tree->GetBranch("wcsimrootevent"); branch->SetAddress(&wcsimrootsuperevent); // Force deletion to prevent memory leak tree->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); // Geometry tree - only need 1 "event" TTree *geotree = (TTree*)file->Get("wcsimGeoT"); WCSimRootGeom *geo = 0; geotree->SetBranchAddress("wcsimrootgeom", &geo); if(verbose) std::cout << "Geotree has " << geotree->GetEntries() << " entries" << std::endl; if (geotree->GetEntries() == 0) { exit(9); } geotree->GetEntry(0); // start with the main "subevent", as it contains most of the info // and always exists. WCSimRootTrigger* wcsimrootevent; TH1F *h1 = new TH1F("PMT Hits", "PMT Hits", 8000, 0, 8000); TH1F *hvtx0 = new TH1F("Event VTX0", "Event VTX0", 200, -1500, 1500); TH1F *hvtx1 = new TH1F("Event VTX1", "Event VTX1", 200, -1500, 1500); TH1F *hvtx2 = new TH1F("Event VTX2", "Event VTX2", 200, -1500, 1500); int num_trig=0; // Now loop over events for (int ev=0; ev<nevent; ev++) { // Read the event from the tree into the WCSimRootEvent instance tree->GetEntry(ev); wcsimrootevent = wcsimrootsuperevent->GetTrigger(0); if(verbose){ printf("********************************************************"); printf("Evt, date %d %d\n", wcsimrootevent->GetHeader()->GetEvtNum(), wcsimrootevent->GetHeader()->GetDate()); printf("Mode %d\n", wcsimrootevent->GetMode()); printf("Number of subevents %d\n", wcsimrootsuperevent->GetNumberOfSubEvents()); printf("Vtxvol %d\n", wcsimrootevent->GetVtxvol()); printf("Vtx %f %f %f\n", wcsimrootevent->GetVtx(0), wcsimrootevent->GetVtx(1),wcsimrootevent->GetVtx(2)); } hvtx0->Fill(wcsimrootevent->GetVtx(0)); hvtx1->Fill(wcsimrootevent->GetVtx(1)); hvtx2->Fill(wcsimrootevent->GetVtx(2)); if(verbose){ printf("Jmu %d\n", wcsimrootevent->GetJmu()); printf("Npar %d\n", wcsimrootevent->GetNpar()); printf("Ntrack %d\n", wcsimrootevent->GetNtrack()); } // Now read the tracks in the event // Get the number of tracks int ntrack = wcsimrootevent->GetNtrack(); if(verbose) printf("ntracks=%d\n",ntrack); int i; // Loop through elements in the TClonesArray of WCSimTracks for (i=0; i<ntrack; i++) { TObject *element = (wcsimrootevent->GetTracks())->At(i); WCSimRootTrack *wcsimroottrack = dynamic_cast<WCSimRootTrack*>(element); if(verbose){ printf("Track ipnu: %d\n",wcsimroottrack->GetIpnu()); printf("Track parent ID: %d\n",wcsimroottrack->GetParenttype()); for (int j=0; j<3; j++) printf("Track dir: %d %f\n",j, wcsimroottrack->GetDir(j)); } } // End of loop over tracks // Now look at the Cherenkov hits // Get the number of Cherenkov hits. // Note... this is *NOT* the number of photons that hit tubes. // It is the number of tubes hit with Cherenkov photons. // The number of digitized tubes will be smaller because of the threshold. // Each hit "raw" tube has several photon hits. The times are recorded. // See http://nwg.phy.bnl.gov/DDRD/cgi-bin/private/ShowDocument?docid=245 // for more information on the structure of the root file. // // The following code prints out the hit times for the first 10 tubes and also // adds up the total pe. // // For digitized info (one time/charge tube after a trigger) use // the digitized information. // int ncherenkovhits = wcsimrootevent->GetNcherenkovhits(); int ncherenkovdigihits = wcsimrootevent->GetNcherenkovdigihits(); h1->Fill(ncherenkovdigihits); if(verbose){ printf("node id: %i\n", ev); printf("Ncherenkovhits %d\n", ncherenkovhits); printf("Ncherenkovdigihits %d\n", ncherenkovdigihits); cout << "RAW HITS:" << endl; } // Grab the big arrays of times and parent IDs TClonesArray *timeArray = wcsimrootevent->GetCherenkovHitTimes(); int totalPe = 0; // Loop through elements in the TClonesArray of WCSimRootCherenkovHits for (i=0; i< ncherenkovhits; i++) { TObject *Hit = (wcsimrootevent->GetCherenkovHits())->At(i); WCSimRootCherenkovHit *wcsimrootcherenkovhit = dynamic_cast<WCSimRootCherenkovHit*>(Hit); int tubeNumber = wcsimrootcherenkovhit->GetTubeID(); int timeArrayIndex = wcsimrootcherenkovhit->GetTotalPe(0); int peForTube = wcsimrootcherenkovhit->GetTotalPe(1); WCSimRootPMT pmt = geo->GetPMT(tubeNumber-1); totalPe += peForTube; if ( i < 10 ) // Only print first XX=10 tubes { if(verbose) printf("Total pe: %d times( ",peForTube); for (int j = timeArrayIndex; j < timeArrayIndex + peForTube; j++) { WCSimRootCherenkovHitTime HitTime = dynamic_cast<WCSimRootCherenkovHitTime>(timeArray->At(j)); if(verbose) printf("%6.2f ", HitTime.GetTruetime() ); } if(verbose) cout << ")" << endl; } } // End of loop over Cherenkov hits if(verbose) cout << "Total Pe : " << totalPe << endl; // Look at digitized hit info // Get the number of digitized hits // Loop over sub events if(verbose) cout << "DIGITIZED HITS:" << endl; for (int index = 0 ; index < wcsimrootsuperevent->GetNumberOfEvents(); index++) { wcsimrootevent = wcsimrootsuperevent->GetTrigger(index); if(verbose) cout << "Sub event number = " << index << "\n"; int ncherenkovdigihits = wcsimrootevent->GetNcherenkovdigihits(); if(verbose) printf("Ncherenkovdigihits %d\n", ncherenkovdigihits); if(ncherenkovdigihits>0) num_trig++; //for (i=0;i<(ncherenkovdigihits>4 ? 4 : ncherenkovdigihits);i++){ for (i=0;i<ncherenkovdigihits;i++) { // Loop through elements in the TClonesArray of WCSimRootCherenkovDigHits TObject *element = (wcsimrootevent->GetCherenkovDigiHits())->At(i); WCSimRootCherenkovDigiHit *wcsimrootcherenkovdigihit = dynamic_cast<WCSimRootCherenkovDigiHit*>(element); if(verbose){ if ( i < 10 ) // Only print first XX=10 tubes printf("q, t, tubeid: %f %f %d \n",wcsimrootcherenkovdigihit->GetQ(), wcsimrootcherenkovdigihit->GetT(),wcsimrootcherenkovdigihit->GetTubeId()); } } // End of loop over Cherenkov digihits } // End of loop over trigger // reinitialize super event between loops. wcsimrootsuperevent->ReInitialize(); } // End of loop over events // TCanvas c1("c1"); float win_scale = 0.75; int n_wide(2); int n_high(2); TCanvas* c1 = new TCanvas("c1", "First canvas", 500*n_wide*win_scale, 500*n_high*win_scale); c1->Draw(); c1->Divide(2,2); c1->cd(1); hvtx0->Draw(); c1->cd(2); hvtx1->Draw(); c1->cd(3); hvtx2->Draw(); c1->cd(4); h1->Draw(); std::cout<<"num_trig "<<num_trig<<"\n"; }
void sample_readfile(const char* rootfile) { // Clear global scope gROOT->Reset(); gStyle->SetOptStat(0); gStyle->SetCanvasColor(0); gStyle->SetTitleColor(1); gStyle->SetStatColor(0); gStyle->SetFrameFillColor(0); gStyle->SetPadColor(0); gStyle->SetPadTickX(1); gStyle->SetPadTickY(1); gStyle->SetTitleSize(0.04); gStyle->SetCanvasBorderMode(0); gStyle->SetFrameBorderMode(0); gStyle->SetFrameLineWidth(2); gStyle->SetPadBorderMode(0); gStyle->SetPalette(1); gStyle->SetTitleAlign(23); gStyle->SetTitleX(.5); gStyle->SetTitleY(0.99); gStyle->SetTitleBorderSize(0); gStyle->SetTitleFillColor(0); gStyle->SetHatchesLineWidth(2); gStyle->SetLineWidth(1.5); gStyle->SetTitleFontSize(0.07); gStyle->SetLabelSize(0.05,"X"); gStyle->SetLabelSize(0.05,"Y"); gStyle->SetTitleSize(0.04,"X"); gStyle->SetTitleSize(0.04,"Y"); gStyle->SetTitleBorderSize(0); gStyle->SetCanvasBorderMode(0); // Load the library with class dictionary info gSystem.Load("libWCSimRoot.so"); // Open the file TFile file(rootfile); // Get the a pointer to the tree from the file TTree *tree = (TTree*)file->Get("wcsimT"); // Get the number of events int nevent = tree->GetEntries(); printf("nevent %d\n",nevent); // Create a WCSimRootEvent to put stuff from the tree in WCSimRootEvent* wcsimrootsuperevent = new WCSimRootEvent(); // Set the branch address for reading from the tree TBranch *branch = tree->GetBranch("wcsimrootevent"); branch->SetAddress(&wcsimrootsuperevent); // Force deletion to prevent memory leak tree->GetBranch("wcsimrootevent")->SetAutoDelete(kTRUE); // start with the main "subevent", as it contains most of the info // and always exists. WCSimRootTrigger* wcsimrootevent; TH1F *h1 = new TH1F("PMT Hits", "PMT Hits on 1.5 GeV Muon in Geant4", 100, 1000, 9000); // Now loop over events for (int ev=0; ev<nevent; ev++) { // Read the event from the tree into the WCSimRootEvent instance tree->GetEntry(ev); wcsimrootevent = wcsimrootsuperevent->GetTrigger(0); printf("********************************************************"); printf("Evt, date %d %d\n", wcsimrootevent->GetHeader()->GetEvtNum(), wcsimrootevent->GetHeader()->GetDate()); printf("Mode %d\n", wcsimrootevent->GetMode()); printf("Number of subevents %d\n", wcsimrootsuperevent->GetNumberOfSubEvents()); printf("Vtxvol %d\n", wcsimrootevent->GetVtxvol()); printf("Vtx %f %f %f\n", wcsimrootevent->GetVtx(0), wcsimrootevent->GetVtx(1),wcsimrootevent->GetVtx(2)); printf("Jmu %d\n", wcsimrootevent->GetJmu()); printf("Npar %d\n", wcsimrootevent->GetNpar()); printf("Ntrack %d\n", wcsimrootevent->GetNtrack()); // Now read the tracks in the event // Get the number of tracks int ntrack = wcsimrootevent->GetNtrack(); printf("ntracks=%d\n",ntrack); int i; // Loop through elements in the TClonesArray of WCSimTracks for (i=0; i<ntrack; i++) { TObject *element = (wcsimrootevent->GetTracks())->At(i); WCSimRootTrack *wcsimroottrack = dynamic_cast<WCSimRootTrack*>(element); printf("Track ipnu: %d\n",wcsimroottrack->GetIpnu()); printf("Track parent ID: %d\n",wcsimroottrack->GetParenttype()); for (int j=0; j<3; j++) printf("Track dir: %d %f\n",j, wcsimroottrack->GetDir(j)); } // End of loop over tracks // Now look at the Cherenkov hits // Get the number of Cherenkov hits. // Note... this is *NOT* the number of photons that hit tubes. // It is the number of tubes hit with Cherenkov photons. // The number of digitized tubes will be smaller because of the threshold. // Each hit "raw" tube has several photon hits. The times are recorded. // See http://nwg.phy.bnl.gov/DDRD/cgi-bin/private/ShowDocument?docid=245 // for more information on the structure of the root file. // // The following code prints out the hit times for the first 10 tubes and also // adds up the total pe. // // For digitized info (one time/charge tube after a trigger) use // the digitized information. // int ncherenkovhits = wcsimrootevent->GetNcherenkovhits(); int ncherenkovdigihits = wcsimrootevent->GetNcherenkovdigihits(); h1->Fill(ncherenkovdigihits); printf("node id: %i\n", ev); printf("Ncherenkovhits %d\n", ncherenkovhits); printf("Ncherenkovdigihits %d\n", ncherenkovdigihits); cout << "RAW HITS:" << endl; // Grab the big arrays of times and parent IDs TClonesArray *timeArray = wcsimrootevent->GetCherenkovHitTimes(); int totalPe = 0; // Loop through elements in the TClonesArray of WCSimRootCherenkovHits for (i=0; i< ncherenkovhits; i++) { TObject *Hit = (wcsimrootevent->GetCherenkovHits())->At(i); WCSimRootCherenkovHit *wcsimrootcherenkovhit = dynamic_cast<WCSimRootCherenkovHit*>(Hit); int tubeNumber = wcsimrootcherenkovhit->GetTubeID(); int timeArrayIndex = wcsimrootcherenkovhit->GetTotalPe(0); int peForTube = wcsimrootcherenkovhit->GetTotalPe(1); totalPe += peForTube; if ( i < 10 ) // Only print first XX=10 tubes { printf("Total pe: %d times( ",peForTube); for (int j = timeArrayIndex; j < timeArrayIndex + peForTube; j++) { WCSimRootCherenkovHitTime HitTime = dynamic_cast<WCSimRootCherenkovHitTime>(timeArray->At(j)); printf("%6.2f ", HitTime->GetTruetime() ); } cout << ")" << endl; } } // End of loop over Cherenkov hits cout << "Total Pe : " << totalPe << endl; // Look at digitized hit info // Get the number of digitized hits // Loop over sub events cout << "DIGITIZED HITS:" << endl; for (int index = 0 ; index < wcsimrootsuperevent->GetNumberOfEvents(); index++) { wcsimrootevent = wcsimrootsuperevent->GetTrigger(index); cout << "Sub event number = " << index << "\n"; int ncherenkovdigihits = wcsimrootevent->GetNcherenkovdigihits(); printf("Ncherenkovdigihits %d\n", ncherenkovdigihits); //for (i=0;i<(ncherenkovdigihits>4 ? 4 : ncherenkovdigihits);i++){ for (i=0;i<ncherenkovdigihits;i++) { // Loop through elements in the TClonesArray of WCSimRootCherenkovDigHits TObject *element = (wcsimrootevent->GetCherenkovDigiHits())->At(i); WCSimRootCherenkovDigiHit *wcsimrootcherenkovdigihit = dynamic_cast<WCSimRootCherenkovDigiHit*>(element); if ( i < 10 ) // Only print first XX=10 tubes printf("q, t, tubeid: %f %f %d \n",wcsimrootcherenkovdigihit->GetQ(), wcsimrootcherenkovdigihit->GetT(),wcsimrootcherenkovdigihit->GetTubeId()); } // End of loop over Cherenkov digihits } // End of loop over trigger // reinitialize super event between loops. wcsimrootsuperevent->ReInitialize(); } // End of loop over events h1.Draw(); }