#define Analyzer_cxx #include "Analyzer.h" #include #include #include #include #include #include #include //############################################ User setting int rawEnergyRange[2] = {0, 6000}; // in ch int energyRange[3] = {1, 50, 2000}; // keV {resol, min, max} double BGO_threshold = 0; // in ch TString e_corr = "correction_e.dat"; bool save_ev2 = true; //############################################ end of user setting //############################################ histogram declaration TH2F * heVID; TH1F * he[NCRYSTAL]; TH2F * hgg[NCRYSTAL][NCRYSTAL]; TH2F * hcoin; TH2F * hcrystalBGO; TH1F * hTDiff; TH2F * hPID; TH2F * hPID209; TH2F * hPID219; ///----- after calibration and BGO veto TH2F * heCalVID; TH1F * heCal[NCRYSTAL]; TH2F * hcoinBGO; TH2F * hcrystalBGO_G; //############################################ BEGIN void Analyzer::Begin(TTree * tree){ TString option = GetOption(); totnumEntry = tree->GetEntries(); printf( "=========================================================================== \n"); printf( "========================== Analysis.C/h ================================ \n"); printf( "====== total Entry : %lld \n", totnumEntry); printf( "=========================================================================== \n"); printf("======================== Histograms declaration\n"); heVID = new TH2F("heVID", "e vs ID; det ID; e [ch]", NCRYSTAL, 0, NCRYSTAL, rawEnergyRange[1] - rawEnergyRange[0], rawEnergyRange[0], rawEnergyRange[1]); heCalVID = new TH2F("heCalVID", Form("eCal vs ID (BGO veto > %.1f); det ID; Energy [keV]", BGO_threshold), NCRYSTAL, 0, NCRYSTAL, (energyRange[2] - energyRange[1])/energyRange[0], energyRange[1], energyRange[2]); hTDiff = new TH1F("hTDiff", "data time different within an event; tick [10 ns]", 110, 0, 110); heVID->SetNdivisions(-409, "X"); heCalVID->SetNdivisions(-409, "X"); for( int i = 0; i < NCRYSTAL; i ++){ he[i] = new TH1F( Form("he%02d", i), Form("e -%02d", i), rawEnergyRange[1] - rawEnergyRange[0], rawEnergyRange[0], rawEnergyRange[1]); heCal[i] = new TH1F(Form("heCal%02d", i), Form("eCal -%02d (BGO veto > %.1f); Energy [keV]; count / %d keV", i, BGO_threshold, energyRange[0]), (energyRange[2] - energyRange[1])/energyRange[0], energyRange[1], energyRange[2]); } hPID = new TH2F("hPID", "PID; tail; peak ", 400, -20, 300, 400, -50, 800); hPID209 = new TH2F("hPID209", "PID detID = 209; tail; peak ", 400, -20, 300, 400, -50, 800); hPID219 = new TH2F("hPID219", "PID detID = 219; tail; peak ", 400, -20, 300, 400, -50, 800); for( int i = 0; i < NCRYSTAL; i++){ for( int j = i+1; j < NCRYSTAL; j++){ //hgg[i][j] = new TH2F(Form("hgg%02d%02d", i, j), Form("e%02d vs e%02d; e%02d; e%02d", i, j, i, j), // (rawEnergyRange[1] - rawEnergyRange[0])/2, rawEnergyRange[0], rawEnergyRange[1], // (rawEnergyRange[1] - rawEnergyRange[0])/2, rawEnergyRange[0], rawEnergyRange[1]); } } hcoin = new TH2F("hcoin", "detector coin.; det ID; det ID", NCRYSTAL, 0, NCRYSTAL, NCRYSTAL, 0 , NCRYSTAL); hcoinBGO = new TH2F("hcoinBGO", Form("detector coin. (BGO veto > %.1f); det ID; det ID", BGO_threshold), NCRYSTAL, 0, NCRYSTAL, NCRYSTAL, 0 , NCRYSTAL); hcrystalBGO = new TH2F("hcrystalBGO", Form("crystal vs BGO ; det ID; BGO ID"), NCRYSTAL, 0, NCRYSTAL, NBGO, 0 , NBGO); hcrystalBGO_G = new TH2F("hcrystalBGO_G", Form("crystal vs BGO (BGO veto); det ID; BGO ID"), NCRYSTAL, 0, NCRYSTAL, NBGO, 0 , NBGO); printf("======================== Load parameters.\n"); eCorr = LoadCorrectionParameters(e_corr); saveEV2 = save_ev2; } //############################################ PROCESS Bool_t Analyzer::Process(Long64_t entry){ ProcessedEntries++; /*********** Progress Bar ******************************************/ if (ProcessedEntries>totnumEntry*Frac-1) { TString msg; msg.Form("%llu", totnumEntry/1000); int len = msg.Sizeof(); printf(" %3.0f%% (%*llu/%llu k) processed in %6.1f sec | expect %6.1f sec\n", Frac*100, len, ProcessedEntries/1000,totnumEntry/1000,StpWatch.RealTime(), StpWatch.RealTime()/Frac); StpWatch.Start(kFALSE); Frac+=0.1; } b_energy->GetEntry(entry); b_time->GetEntry(entry); b_multi->GetEntry(entry); b_multiCry->GetEntry(entry); b_detID->GetEntry(entry); b_qdc->GetEntry(entry); if( multi == 0 ) return kTRUE; for( int i = 0; i < NCRYSTAL; i++) eCal[i] = TMath::QuietNaN(); ///printf("---------------------------- %d \n", multi); double bgC[2]={0}, peakC[2]={0}, tailC[2] = {0}; int count = 0 ; ///=========== Looping data for the event for( int i = 0; i < multi ; i ++){ int id = detID[i]; ///printf("%d %f %llu\n", id, e[i], e_t[i]); //======== Fill raw data if( 0 <= id && id < NCRYSTAL ){ /// gamma data heVID->Fill( id, e[i]); he[id]->Fill(e[i]); for ( int j = i + 1; j < multi; j++){ if( 100 <= detID[j] && detID[j] < 200 ) hcrystalBGO->Fill(id, detID[j]-100); /// crystal - BGO coincident if( detID[j] < 100 ) hcoin->Fill(id, detID[j]); /// crystal-crystal coincident } } if ( 100 < id && id < 200 ){ /// BGO data } if( 200 < id && id < 300){ /// GAGG } if( id == 209 ) { double bg = (qdc[i][0] + qdc[i][1])/60.; double peak = qdc[i][3]/20. - bg; double tail = qdc[i][5]/55. - bg; hPID209->Fill( tail, peak); } if( id == 219 ) { double bg = (qdc[i][0] + qdc[i][1])/60.; double peak = qdc[i][3]/20. - bg; double tail = qdc[i][5]/55. - bg; hPID219->Fill( tail, peak); } if( count < 2 && (id == 209 || id == 219 )){ bgC[count] = (qdc[i][0] + qdc[i][1])/60.; peakC[count] = qdc[i][3]/20. - bgC[count]; tailC[count] = qdc[i][5]/55. - bgC[count]; count++; } if ( i > 0 ) hTDiff->Fill( e_t[i] - e_t[0]); //======== BGO veto bool dropflag = false; if( id < NCRYSTAL && multi > 1) { for( int j = i + 1; j < multi; j++){ if( detID[j] >= 100 && (detID[j]-100)*4 <= id && id < (detID[j]-100 +1)*4) { dropflag = true; break; } } } if( dropflag ) return kTRUE; if( 0<= id && id < NCRYSTAL ) { if( e_corr == "" ){ eCal[id] = e[i]; }else{ ///========= apply correction int order = (int) eCorr[id].size(); eCal[id] = 0; for( int k = 0; k < order ; k++){ eCal[id] += eCorr[id][k] * TMath::Power(e[i], k); } } heCalVID->Fill( id, eCal[id]); heCal[id]->Fill(eCal[id]); for ( int j = i + 1; j < multi; j++){ if( 100 <= detID[j] && detID[j] < 200 ) hcrystalBGO_G->Fill(id, detID[j]-100); /// crystal - BGO coincident } } } hPID->Fill( (tailC[0]+tailC[1])/2., ( peakC[0] + peakC[1])/2.); if ( saveEV2) Save2ev2(); return kTRUE; } //############################################ TERMINATE void Analyzer::Terminate(){ if(saveEV2) fclose(outEV2); printf("============================== finishing.\n"); gROOT->cd(); int canvasXY[2] = {1200 , 1200} ;// x, y int canvasDiv[2] = {2,2}; TCanvas *cCanvas = new TCanvas("cCanvas", "" ,canvasXY[0],canvasXY[1]); cCanvas->Modified(); cCanvas->Update(); cCanvas->cd(); cCanvas->Divide(canvasDiv[0],canvasDiv[1]); gStyle->SetOptStat("neiou"); cCanvas->cd(1); cCanvas->cd(1)->SetLogz(1); hPID209->Draw("colz"); cCanvas->cd(2); cCanvas->cd(2)->SetLogz(1); hPID219->Draw("colz"); cCanvas->cd(3); cCanvas->cd(3)->SetLogz(1); hPID->Draw("colz"); cCanvas->cd(4); cCanvas->cd(4)->SetLogz(1); //gROOT->ProcessLine(".x script.C"); //hcrystalBGO_G->Draw("colz"); //he[0]->SetLineColor(2); //he[0]->Draw(); //heCal[0]->Draw("same"); //hcoinBGO->Draw("colz"); printf("=============== loaded AutoFit.C, try showFitMethos()\n"); gROOT->ProcessLine(".L armory/AutoFit.C"); printf("=============== Analyzer Utility\n"); gROOT->ProcessLine(".L armory/Analyzer_Utili.c"); gROOT->ProcessLine("listDraws()"); }