diff --git a/CALIBRATION/shms_dc_calib/scripts/DC_calib.C b/CALIBRATION/shms_dc_calib/scripts/DC_calib.C index aa0f9a00f17df2a6b2a131da5932e53576eb5fe7..33de7e7743b777421272dca6503951992ac83146 100644 --- a/CALIBRATION/shms_dc_calib/scripts/DC_calib.C +++ b/CALIBRATION/shms_dc_calib/scripts/DC_calib.C @@ -29,6 +29,7 @@ DC_calib::DC_calib(TString a, TString b, const int c, Long64_t d, TString e) entries = NULL; t_zero = NULL; t_zero_err = NULL; + t_zero_final = NULL; bin_max = NULL; bin_maxContent = NULL; time_max = NULL; @@ -67,6 +68,7 @@ DC_calib::~DC_calib() delete [] entries[ip]; delete [] t_zero[ip]; delete [] t_zero_err[ip]; + delete [] t_zero_final[ip]; delete [] cell_dt[ip]; delete [] cell_dt_corr[ip]; delete [] fitted_cell_dt[ip]; @@ -80,6 +82,7 @@ DC_calib::~DC_calib() delete [] entries; entries = NULL; delete [] t_zero; t_zero = NULL; delete [] t_zero_err; t_zero_err = NULL; + delete [] t_zero_final; t_zero_final = NULL; delete [] cell_dt; cell_dt = NULL; delete [] cell_dt_corr; cell_dt_corr = NULL; delete [] fitted_cell_dt; fitted_cell_dt = NULL; @@ -175,10 +178,10 @@ void DC_calib::GetDCLeafs() if (num_evts > nentries) { - cout << "Number of entries exceeds: " << nentries << endl; - cout << "Please input a value that is <= " << nentries << " entries" << endl; - cout << "Exiting NOW! " << endl; - exit(EXIT_SUCCESS); + cout << "Number of entries entered: " << num_evts << " exeeds MAX number of entries: " << nentries << endl; + cout << "Setting the number of entries to: " << nentries << endl; + + num_evts = nentries; } @@ -200,25 +203,90 @@ void DC_calib::GetDCLeafs() } + if (spec=="SHMS") { - cer_npe_name = "P.ngcer.npeSum"; - EL_CLEAN_name = "T.shms.pEL_CLEAN_tdcTime"; - //EL_CLEAN_name = "T.coin.pEL_CLEAN_ROC2_tdcTime"; + cal_etotnorm_leaf = "P.cal.etotnorm"; + cer_npe_leaf = "P.ngcer.npeSum"; + EL_CLEAN_leaf = "T.shms.pEL_CLEAN_tdcTime"; + //EL_CLEAN_leaf = "T.coin.pEL_CLEAN_ROC2_tdcTime"; + + //Check Branch Status + status_cal = tree->GetBranchStatus(cal_etotnorm_leaf); + status_cer = tree->GetBranchStatus(cer_npe_leaf); + status_EL_clean = tree->GetBranchStatus(EL_CLEAN_leaf); - tree->SetBranchAddress(cer_npe_name, &cer_npe); - tree->SetBranchAddress(EL_CLEAN_name, &EL_CLEAN); + + if ((!status_cal || !status_cer || !status_EL_clean) && (pid=="pid_elec" || pid=="pid_prot" || pid=="bkg_cut")) + { + cout << "*************ATTENTION!**************" << endl; + cout << "" << endl; + cout << " One or more of the following leafs " << endl; + cout << " is *NOT* present in current ROOTfile. " << endl; + cout << "1) " << cal_etotnorm_leaf<< endl; + cout << "2) " << cer_npe_leaf << endl; + cout << "3) " << EL_CLEAN_leaf << endl; + cout << "" << endl; + cout << "Please add them if you want to make " << endl; + cout << "any cuts during calibration." << endl; + cout << "" << endl; + cout << "OR, set the pid flag in main_calib.C " << endl; + cout << "to pid_kFALSE" << endl; + cout << " Exiting NOW! " << endl; + cout << "*************************************" << endl; + + exit (EXIT_SUCCESS); + } + + else + { + tree->SetBranchAddress(cal_etotnorm_leaf, &cal_etot_norm); + tree->SetBranchAddress(cer_npe_leaf, &cer_npe); + tree->SetBranchAddress(EL_CLEAN_leaf, &EL_CLEAN); + } + } else if (spec=="HMS") { - cer_npe_name = "H.cer.npeSum"; - EL_CLEAN_name = "T.hms.hEL_CLEAN_tdcTime"; - //EL_CLEAN_name = "T.coin.hEL_CLEAN_ROC2_tdcTime"; + cal_etotnorm_leaf = "H.cal.etotnorm"; + cer_npe_leaf = "H.cer.npeSum"; + EL_CLEAN_leaf = "T.hms.hEL_CLEAN_tdcTime"; + //EL_CLEAN_leaf = "T.coin.hEL_CLEAN_ROC2_tdcTime"; + + //Check Branch Status with Boolean + status_cal = tree->GetBranchStatus(cal_etotnorm_leaf); + status_cer = tree->GetBranchStatus(cer_npe_leaf); + status_EL_clean = tree->GetBranchStatus(EL_CLEAN_leaf); + + if ((!status_cal || !status_cer || !status_EL_clean) && (pid=="pid_elec" || pid=="pid_prot" || pid=="bkg_cut")) + { + cout << "*************ATTENTION!**************" << endl; + cout << "" << endl; + cout << " One or more of the following leafs " << endl; + cout << " is *NOT* present in current ROOTfile. " << endl; + cout << "1) " << cal_etotnorm_leaf<< endl; + cout << "2) " << cer_npe_leaf << endl; + cout << "3) " << EL_CLEAN_leaf << endl; + cout << "" << endl; + cout << "Please add them if you want to make " << endl; + cout << "any cuts during calibration." << endl; + cout << "" << endl; + cout << "OR, set the pid flag in main_calib.C "<< endl; + cout << "to: pid_kFALSE" << endl; + cout << " Exiting NOW! " << endl; + cout << "*************************************" << endl; + exit (EXIT_SUCCESS); + } - tree->SetBranchAddress(cer_npe_name, &cer_npe); - tree->SetBranchAddress(EL_CLEAN_name, &EL_CLEAN); - + else + { + tree->SetBranchAddress(cal_etotnorm_leaf, &cal_etot_norm); + tree->SetBranchAddress(cer_npe_leaf, &cer_npe); + tree->SetBranchAddress(EL_CLEAN_leaf, &EL_CLEAN); + } + + } @@ -238,6 +306,7 @@ void DC_calib::AllocateDynamicArrays() entries = new Int_t*[NPLANES]; t_zero = new Double_t*[NPLANES]; t_zero_err = new Double_t*[NPLANES]; + t_zero_final = new Double_t*[NPLANES]; cell_dt = new TH1F*[NPLANES]; /*create array to store cell drift times*/ cell_dt_corr = new TH1F*[NPLANES]; fitted_cell_dt = new TH1F*[NPLANES]; /*create array to store cell drift times*/ @@ -253,6 +322,7 @@ void DC_calib::AllocateDynamicArrays() entries[ip] = new Int_t[nwires[ip]]; t_zero[ip] = new Double_t[nwires[ip]]; t_zero_err[ip] = new Double_t[nwires[ip]]; + t_zero_final[ip] = new Double_t[nwires[ip]]; cell_dt[ip] = new TH1F[nwires[ip]]; cell_dt_corr[ip] = new TH1F[nwires[ip]]; fitted_cell_dt[ip] = new TH1F[nwires[ip]]; @@ -360,32 +430,46 @@ void DC_calib::EventLoop() //------READ USER 'pid' input to determine particle type to calibrate---------- - //NO PID Cut, Set Bool_t to always kTRUE + //NO PID Cut, if(pid=="pid_kFALSE") { + //cal_elec = 1; cer_elec = 1; elec_clean = 1; } - //PID Cut, Set Bool_t to actual value, and see if it passes cut + //PID Cut, Set Bool_t to actual leaf value, and see if it passes cut else if (pid=="pid_elec") { - cer_elec = cer_npe>1.0; - elec_clean = EL_CLEAN>0; //tdcTime>0 + //cal_elec = cal_etot_norm>0.1; //normalize energy > 0.1 (bkg cleanup) + cer_elec = cer_npe>1.0; //number of photoelec. > 1 (electrons) + elec_clean = EL_CLEAN>0; //tdcTime>0 (reduce bkg events) } //PID Cut, hadron, Set Bool_t to actual value, and see if it passes cut else if (pid=="pid_hadron") { - cer_elec = cer_npe<1.0; - elec_clean = EL_CLEAN==0; //tdcTime==0 + //cal_elec = cal_etot_norm>0.1; //normalize energy > 0.1 (bkg cleanup) + cer_elec = cer_npe<1.0; //number of photoelec. < 1 (hadrons) + elec_clean = EL_CLEAN>0; //tdcTime>0 (reduce bkg events) } + //PID Cut, BACKGROUND, Set Bool_t to actual value, and see if it passes cut + else if (pid=="pid_bkg") + { + //cal_elec = cal_etot_norm>0.1; //normalize energy > 0.1 (bkg cleanup) + cer_elec = 1; //Set to always true + elec_clean = EL_CLEAN>0; //tdcTime>0 (reduce bkg events) + } + + + else { cout << "Enter which particle to calibrate: " << endl; cout << "For electrons: 'pid_elec' " << endl; cout << "For hadrons: 'pid_hadron' " << endl; + cout << "For background cut (Only EL-CLEAN trigger): 'pid_bkg' " << endl; cout << "NO PID Cuts: 'pid_KFALSE' " << endl; } @@ -399,95 +483,96 @@ void DC_calib::EventLoop() // cout << "PLANE: " << ip << endl; //----------------------------------------------------------------------------------------- - - //Loop over number of hits for each trigger in each DC plane - for(Int_t j = 0, k = 0; j < ndata_time[ip], k < ndata_wirenum[ip]; j++, k++) - { - - - //get wire hit for ith event in 'ip' plane - wire = int(wire_num[ip][k]); - //cout << "event: " << i << " ::pEL-Clean: " << pEL_CLEAN << endl; - - - - //Fill uncorrected plane drift times (from: get_pdc_time_histo.C ) - if (ip== 0 && wire > 80) - { - plane_dt[ip].Fill(drift_time[ip][j] - offset); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset); - cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); - } - - else if (ip== 6 && wire > 80) - { - plane_dt[ip].Fill(drift_time[ip][j] - offset); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset); - cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); - } - - else if (ip == 0 && wire <= 80) - { - plane_dt[ip].Fill(drift_time[ip][j]); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); - cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - } - else if (ip == 6 && wire <= 80) - { - plane_dt[ip].Fill(drift_time[ip][j]); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); - cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - } - - - - else if ((ip == 4 || ip == 10) && wire > 48 && wire <65) - { - plane_dt[ip].Fill(drift_time[ip][j] - offset); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset); - cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); - } - else if (ip == 4 && (wire <=48 || wire >= 65)) - { - plane_dt[ip].Fill(drift_time[ip][j]); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); - cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - } - else if (ip == 10 && (wire <= 48 || wire >= 65)) - { - plane_dt[ip].Fill(drift_time[ip][j]); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); - cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - } - - else if (ip!=4 || ip!=0 || ip!=6 || ip!=10) - { - plane_dt[ip].Fill(drift_time[ip][j]); - dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); - cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); - } - - } // end TRG Cut + + //Require number of chamber hits per event per plane to be UNITY. + if (ndata_time[ip]==1 && ndata_wirenum[ip]==1) + { + //Loop over number of hits for each trigger in each DC plane + for(Int_t j = 0, k = 0; j < ndata_time[ip], k < ndata_wirenum[ip]; j++, k++) + { + + + //get wire hit for ith event in 'ip' plane + wire = int(wire_num[ip][k]); + //cout << "event: " << i << " ::pEL-Clean: " << pEL_CLEAN << endl; + + + + //Fill uncorrected plane drift times (from: get_pdc_time_histo.C ) + if (ip== 0 && wire > 80) + { + plane_dt[ip].Fill(drift_time[ip][j] - offset); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset); + cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); + } + + else if (ip== 6 && wire > 80) + { + plane_dt[ip].Fill(drift_time[ip][j] - offset); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset); + cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); + } + + else if (ip == 0 && wire <= 80) + { + plane_dt[ip].Fill(drift_time[ip][j]); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); + cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + } + else if (ip == 6 && wire <= 80) + { + plane_dt[ip].Fill(drift_time[ip][j]); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); + cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + } + + + + else if ((ip == 4 || ip == 10) && wire > 48 && wire <65) + { + plane_dt[ip].Fill(drift_time[ip][j] - offset); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset); + cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j] - offset); + } + else if (ip == 4 && (wire <=48 || wire >= 65)) + { + plane_dt[ip].Fill(drift_time[ip][j]); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); + cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + } + else if (ip == 10 && (wire <= 48 || wire >= 65)) + { + plane_dt[ip].Fill(drift_time[ip][j]); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); + cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + } + + else if (ip!=4 || ip!=0 || ip!=6 || ip!=10) + { + plane_dt[ip].Fill(drift_time[ip][j]); + dt_vs_wire[ip].Fill(wire_num[ip][k], drift_time[ip][j]); + cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + fitted_cell_dt[ip][wire-1].Fill(drift_time[ip][j]); + } + } //end loop over hits + + } // end if statement (require ONLY 1 hits per event) //----------------------------------------------------------------------------------------- - } //END loop over hits - - - + } //END loop over planes - } //end loop over planes + } //end loop over pid cuts } //end loop over events -} // end event loop +} // end event loop method //_________________________________________________________________________ @@ -903,18 +988,18 @@ void DC_calib::WriteTZeroParam() //cout << "Plane: " << ip << endl; for (wire=0; wire<nwires[ip]; wire++) { - // cout << "wire: " << wire+1 << " :: " << "tzero: "<< t_zero[ip][wire] << endl; + //cout << "Plane: " << ip << " :: wire: " << wire+1 << " :: " << "tzero_final: "<< t_zero_final[ip][wire] << endl; if (wire <= 10) { - out_txtFILE << setprecision(6) << t_zero[ip][wire] << fixed << ","; + out_txtFILE << setprecision(6) << t_zero_final[ip][wire] << fixed << ","; } else if (wire>10 && wire <(nwires[ip]-1)) { - out_txtFILE << setprecision(6) << t_zero[ip][wire] << ((wire+1) % 16 ? ", " : "\n") << fixed; + out_txtFILE << setprecision(6) << t_zero_final[ip][wire] << ((wire+1) % 16 ? ", " : "\n") << fixed; } else if (wire==nwires[ip]-1) { - out_txtFILE << setprecision(6) << t_zero[ip][wire] << fixed << endl; + out_txtFILE << setprecision(6) << t_zero_final[ip][wire] << fixed << endl; } } //END LOOP OVER WIRES @@ -945,7 +1030,7 @@ void DC_calib::ApplyTZeroCorrection() //PID Cut, Set Bool_t to always kTRUE if(pid=="pid_kFALSE") { - + //cal_elec = 1; cer_elec = 1; elec_clean = 1; @@ -954,26 +1039,37 @@ void DC_calib::ApplyTZeroCorrection() //PID Cut, Set Bool_t to actual value, and see if it passes cut else if (pid=="pid_elec") { - - cer_elec = cer_npe>1.0; - elec_clean = EL_CLEAN>0; //tdcTime>0 + //cal_elec = cal_etot_norm>0.1; //normalize energy > 0.1 (reduce bkg events) + cer_elec = cer_npe>1.0; //number of photoelec. > 1 (electrons) + elec_clean = EL_CLEAN>0.; //tdcTime>0 (reduce bkg events) } //PID Cut, hadron, Set Bool_t to actual value, and see if it passes cut else if (pid=="pid_hadron") { - - cer_elec = cer_npe<1.0; - elec_clean = EL_CLEAN==0; //tdcTime==0 + //cal_elec = cal_etot_norm>0.1; //normalize energy > 0.1 (reduce bkg events) + cer_elec = cer_npe<1.0; //number of photoelec. < 1 (hadrons) + elec_clean = EL_CLEAN>0.; //tdcTime>0 (reduce bkg events) } + //PID Cut, hadron, Set Bool_t to actual value, and see if it passes cut + else if (pid=="pid_bkg") + { + //cal_elec = cal_etot_norm>0.1; //normalize energy > 0.1 (reduce bkg events) + cer_elec = 1; //set to always true + elec_clean = EL_CLEAN>0.; //tdcTime>0 (reduce bkg events) + + } + + else { cout << "Enter which particle to calibrate: " << endl; cout << "For electrons: 'pid_elec' " << endl; cout << "For hadrons: 'pid_hadron' " << endl; + cout << "For background cut (Only EL-CLEAN trigger): 'pid_bkg' " << endl; cout << "NO PID Cuts: 'pid_KFALSE' " << endl; } @@ -987,195 +1083,227 @@ void DC_calib::ApplyTZeroCorrection() { //cout << "ApplyTZeroCorr: " << weighted_avg[ip] << endl; //Loop over number of hits for each trigger in each DC plane - - for(Int_t j = 0, k = 0; j < ndata_time[ip], k < ndata_wirenum[ip]; j++, k++) + + //Require number of chamber hits per event per plane to be UNITY. + if (ndata_time[ip]==1 && ndata_wirenum[ip]==1) { - //get wire hit for ith event in 'ip' plane - wire = int(wire_num[ip][j]); - - //Apply general offsets to account for TDC shift - if (ip== 0 && wire > 80) + for(Int_t j = 0, k = 0; j < ndata_time[ip], k < ndata_wirenum[ip]; j++, k++) { - //apply weighted average corr to low stats wires - if ( t_zero[ip][wire-1] == weighted_avg[ip]) - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - weighted_avg[ip]); - } + //get wire hit for ith event in 'ip' plane + wire = int(wire_num[ip][j]); - else + //Apply general offsets to account for TDC shift + if (ip== 0 && wire > 80) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - t_zero[ip][wire-1]); + //apply weighted average corr to low stats wires + if ( t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - weighted_avg[ip]); + t_zero_final[ip][wire-1] = offset + weighted_avg[ip]; + //cout << "offset: " << offset << endl; + //cout << "weighted avg: " << weighted_avg[ip] << endl; + //cout << "t_zero_final: " << t_zero_final[ip][wire-1] << endl; + } + + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = offset + t_zero[ip][wire-1]; + + } } - } - - else if ( ip == 0 && wire <=80) - { - if (t_zero[ip][wire-1] == weighted_avg[ip]) - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); - } - else - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); - } - - } - - //apply tdc offset to plane 6 - else if (ip== 6 && wire > 80) - { - if ( t_zero[ip][wire-1] == weighted_avg[ip]) + else if ( ip == 0 && wire <=80) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - weighted_avg[ip]); + if (t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); + t_zero_final[ip][wire-1] = weighted_avg[ip]; + + } + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = t_zero[ip][wire-1]; + } + } - else + //apply tdc offset to plane 6 + else if (ip== 6 && wire > 80) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - t_zero[ip][wire-1]); + if ( t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - weighted_avg[ip]); + t_zero_final[ip][wire-1] = offset + weighted_avg[ip]; + + } + + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = offset + t_zero[ip][wire-1]; + } } - } - - else if (ip == 6 && wire <= 80) - { - if ( t_zero[ip][wire-1] == weighted_avg[ip]) + else if (ip == 6 && wire <= 80) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); + + if ( t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); + t_zero_final[ip][wire-1] = weighted_avg[ip]; + + } + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = t_zero[ip][wire-1]; + } + } - else - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); - } - } - - else if ((ip == 4 || ip == 10) && wire > 48 && wire <65) - { - if (t_zero[ip][wire-1] == weighted_avg[ip]) + else if ((ip == 4 || ip == 10) && wire > 48 && wire <65) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - weighted_avg[ip]); - } - else - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] -offset - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - t_zero[ip][wire-1]); + if (t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - weighted_avg[ip]); + t_zero_final[ip][wire-1] = offset + weighted_avg[ip]; + + } + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] -offset - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - offset - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - offset - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = offset + t_zero[ip][wire-1]; + } + } - } - - else if (ip == 4 && (wire <=48 || wire >= 65 )) - { - if (t_zero[ip][wire-1] == weighted_avg[ip]) - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); - } - else + else if (ip == 4 && (wire <=48 || wire >= 65 )) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + if (t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); + t_zero_final[ip][wire-1] = weighted_avg[ip]; + + } + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = t_zero[ip][wire-1]; + } + } - } - - - else if (ip == 10 && (wire <= 48 || wire >= 65)) - { - if (t_zero[ip][wire-1] == weighted_avg[ip]) - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); - } - else + else if (ip == 10 && (wire <= 48 || wire >= 65)) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + if (t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); + t_zero_final[ip][wire-1] = weighted_avg[ip]; + + } + + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = t_zero[ip][wire-1]; + } + } - } - - else if (ip!=4 || ip!=0 || ip!=6 || ip!=10) - { - - if (t_zero[ip][wire-1] == weighted_avg[ip]) + else if (ip!=4 || ip!=0 || ip!=6 || ip!=10) { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); - } - else - { - //Fill corrected plane drift times - plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); - dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + + if (t_zero[ip][wire-1] == weighted_avg[ip]) + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - weighted_avg[ip]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - weighted_avg[ip]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - weighted_avg[ip]); + t_zero_final[ip][wire-1] = weighted_avg[ip]; + + } + else + { + //Fill corrected plane drift times + plane_dt_corr[ip].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + cell_dt_corr[ip][wire-1].Fill(drift_time[ip][j] - t_zero[ip][wire-1]); + dt_vs_wire_corr[ip].Fill(wire_num[ip][k], drift_time[ip][j] - t_zero[ip][wire-1]); + t_zero_final[ip][wire-1] = t_zero[ip][wire-1]; + } + } - } + } // end LOOP over number of hits - } // end EL-CLEAN TRG Cut - - } //end loop over hits + } //end if statement(require #of hits to be UNITY) - } //end loop over planes - + } //end loop over planes + + } //end loop over PID cuts + } //end loop over events -} + +} // end loop over method //_________________________________________________________________________________ void DC_calib::WriteLookUpTable() { otxtfile_name = "./"+spectre+"dc_calib_"+std::to_string(run_NUM)+".param"; out_txtFILE.open(otxtfile_name); - Double_t t_offset_firstbin = -19.; + Double_t t_offset_firstbin = 0.0; //Set headers for subsequent columns of data out_txtFILE << Form("; Lookup Table: RUN %d", run_NUM) << "\n"; out_txtFILE << "; number of bins in time to distance lookup table" << "\n"; out_txtFILE << Form(spectre+"driftbins = %d", TOTAL_BINS+1) << "\n"; out_txtFILE << "; number of 1st bin in table in ns" << "\n"; - out_txtFILE << spectre+Form("drift1stbin=%f", t_offset_firstbin) << "\n"; + out_txtFILE << spectre+Form("drift1stbin=%f", t_offset_firstbin + 1.) << "\n"; out_txtFILE << "; bin size in ns" << "\n"; out_txtFILE << spectre+"driftbinsz=1" << "\n"; @@ -1183,9 +1311,9 @@ void DC_calib::WriteLookUpTable() for (int ip=0; ip<NPLANES; ip++){ - + //Get bin corresponding to t0 = 0 ns - bin_t0[ip] = plane_dt_corr[ip].GetXaxis()->FindBin(t_offset_firstbin -1.); + bin_t0[ip] = plane_dt_corr[ip].GetXaxis()->FindBin(t_offset_firstbin); //Get final bin bin_final[ip] = bin_t0[ip] + TOTAL_BINS; diff --git a/CALIBRATION/shms_dc_calib/scripts/DC_calib.h b/CALIBRATION/shms_dc_calib/scripts/DC_calib.h index 153d9b022bb881aa96f9b2e8c3485f6c11d0db6c..2ed5e01a211c812896213ef8238901255de30e9d 100644 --- a/CALIBRATION/shms_dc_calib/scripts/DC_calib.h +++ b/CALIBRATION/shms_dc_calib/scripts/DC_calib.h @@ -4,9 +4,9 @@ #define NPLANES 12 #define NBINS 400 -#define MINBIN -50.5 -#define MAXBIN 349.5 -#define TOTAL_BINS 274 +#define MINBIN -50.0 +#define MAXBIN 350.0 +#define TOTAL_BINS 189 class DC_calib { public: @@ -56,19 +56,28 @@ class DC_calib TString drifttime; TString wirenum; - TString cer_npe_name; - TString EL_CLEAN_name; + TString cal_etotnorm_leaf; + TString cer_npe_leaf; + TString EL_CLEAN_leaf; - Double_t cer_npe; - Double_t EL_CLEAN; + Double_t cal_etot_norm; //calorimeter normalized energy + Double_t cer_npe; //cerenkon photoelectron Sum + Double_t EL_CLEAN; //electron clean trigger Double_t hcer_npe; + //Boolean for checking if TBranch exists + Bool_t status_cal; + Bool_t status_cer; + Bool_t status_EL_clean; //Boolean for PID cuts - Bool_t cer_elec; //hms cerenkov cut + Bool_t cal_elec; //calorimeter normalized energy cut + Bool_t cer_elec; //cerenkov cut Bool_t elec_clean; //e- clean trigger tdctime cut + + Int_t wire; @@ -155,7 +164,11 @@ class DC_calib Double_t std_dev; Double_t **t_zero; Double_t **t_zero_err; - + + //tzero with tdc offsets taken into account, + //to be written into tzero param file + Double_t **t_zero_final; + //declare variables to make plot of tzero v. wire number Double_t weighted_avg[NPLANES]; diff --git a/CALIBRATION/shms_dc_calib/scripts/main_calib.C b/CALIBRATION/shms_dc_calib/scripts/main_calib.C index baa58aa954a19df573d689c95daf88474386487a..47d3ced161696575292c63a5ce41201ba93fc43b 100644 --- a/CALIBRATION/shms_dc_calib/scripts/main_calib.C +++ b/CALIBRATION/shms_dc_calib/scripts/main_calib.C @@ -16,11 +16,12 @@ int main_calib() clock_t cl; cl = clock(); - //pid_elec, pid_hadron, pid_kFALSE (no PID cuts) + //pid_elec, pid_hadron, pid_bkg pid_kFALSE (no PID cuts) // | // v - DC_calib obj("HMS", "../../../ROOTfiles/coin_replay_production_1866_-1_dcuncalib.root", 1866,1400000, "pid_hadron"); - + DC_calib obj("HMS", "../../../ROOTfiles/hms_replay_production_all_1856_dcuncal.root", 1856,2000000, "pid_kFALSE"); +// DC_calib obj("SHMS", "../../../ROOTfiles/shms_replay_production_all_2071_-1_dcuncalib.root", 2071, 3000000, "pid_bkg"); + obj.printInitVar(); obj.SetPlaneNames(); @@ -29,12 +30,11 @@ int main_calib() obj.CreateHistoNames(); obj.EventLoop(); obj.Calculate_tZero(); - obj.WriteTZeroParam(); obj.ApplyTZeroCorrection(); + obj.WriteTZeroParam(); obj.WriteLookUpTable(); obj.WriteToFile(1); //set argument to (1) for debugging - - + //stop clock cl = clock() - cl;