diff --git a/CALIBRATION/dc_calib/scripts/DC_calib.C b/CALIBRATION/dc_calib/scripts/DC_calib.C index abf9b035000fdc1418443a9761294718624677ef..981d5f0815f7ed6c1941102ef208460a001b5b4e 100644 --- a/CALIBRATION/dc_calib/scripts/DC_calib.C +++ b/CALIBRATION/dc_calib/scripts/DC_calib.C @@ -263,7 +263,7 @@ void DC_calib::SetPlaneNames() //per wire ONLY percent = 0.20; ///set 20% of max drit time content to fit around - t0_err_thrs = 0; + t0_err_thrs = 15; max_wire_entry = 1000; tdc_offset = 115.; @@ -645,7 +645,7 @@ void DC_calib::CreateHistoNames() fitted_card_hist[ip][card].SetName(fitted_card_hist_name); fitted_card_hist[ip][card].SetTitle(fitted_card_hist_title); - fitted_card_hist[ip][card].SetBins(200, MINBIN, MAXBIN); + fitted_card_hist[ip][card].SetBins(NBINS, MINBIN, MAXBIN); fitted_card_hist[ip][card].SetXTitle("Drift Time (ns)"); fitted_card_hist[ip][card].SetYTitle("Number of Entries / 1 ns"); @@ -970,8 +970,8 @@ void DC_calib::EventLoop(string option="") good_event=kFALSE; - //***good event definition***: cal_energy > 100 MeV, cer_npeSum > 1.0, 5/6 plane hits - good_event = cal_elec && cer_elec && cnts_ch1>4 && cnts_ch2>4; + //***good event definition***: cal_energy > 100 MeV, cer_npeSum > 1.0 + good_event = cal_elec && cer_elec; //&& cnts_ch1>4 && cnts_ch2>4; // cout << "passed cut: " << i << endl; @@ -1078,8 +1078,9 @@ void DC_calib::EventLoop(string option="") //Fill Corrected Card Drift Times dt_vs_wire_corr[ip].Fill(wire_num[ip][j], drift_time[ip][j] - t_zero_card[ip][card]); corr_card_hist[ip][card].Fill(drift_time[ip][j]-t_zero_card[ip][card]); - t_zero_final[ip][wire-1] = t_zero[ip][wire-1]; - + //t_zero_final[ip][wire-1] = t_zero_card[ip][card]; + + } } //loop over cards @@ -1247,7 +1248,7 @@ void DC_calib::FitWireDriftTime() //Loop over planes for (Int_t ip = 0; ip < NPLANES; ip++) { - cout << "pLANE: " << ip << endl; + //Loop over DC sense wires for (wire = 0; wire < nwires[ip]; wire++) { @@ -1348,9 +1349,19 @@ void DC_calib::GetTwentyPercent_Card() binSearchHigh = fitted_card_hist[ip][card].GetMaximumBin(); //returns bin value of maximum content wireBinContentMax[ip][card] = fitted_card_hist[ip][card].GetMaximum(); // return maximum histo bin content - wireBinContentLow[ip][card] = wireBinContentMax[ip][card]*0.20; // Get content with 20% of max bin content - wireBinContentHigh[ip][card] = wireBinContentMax[ip][card]*0.60; // Get content with 60% of max bin content - + entries_card[ip][card] = fitted_card_hist[ip][card].GetEntries(); // return entries of card histograms + + //if (entries_card[ip][card] < 2000) + //{ + // wireBinContentLow[ip][card] = wireBinContentMax[ip][card]*0.20; // Get content with 10% of max bin content + // wireBinContentHigh[ip][card] = wireBinContentMax[ip][card]*0.40; // Get content with 30% of max bin content + // } + + //else if (entries_card[ip][card] >= 2000) + //{ + wireBinContentLow[ip][card] = wireBinContentMax[ip][card]*0.20; // Get content with 20% of max bin content + wireBinContentHigh[ip][card] = wireBinContentMax[ip][card]*0.60; // Get content with 60% of max bin content + //} // | content_of_desired_bin - (binSearch_HighContent-binSearchLowContent) | <= binDiffTherhold fitted_card_hist[ip][card].GetBinWithContent(wireBinContentLow[ip][card], binValLow, binSearchLow, binSearchHigh, binDiffThreshLow); @@ -1384,17 +1395,86 @@ void DC_calib::GetTwentyPercent_Card() } //end GetTwentyPercent_Card() method +//___________________________________________________________________ +Double_t DC_calib::GetCardT0_alternative(Int_t ip, Int_t card) +{ + + //NOTE**: This method must be called within FitCardDriftTime() method + // if the fit t0 error/card entries exceed a threshold + + // cout << "Inside GetCardT0 Method . . ." << endl; + + cout << "Calling GetCardT0_alternative ( " << ip << " , " << card << " ) " << endl; + + + binSearchHigh = fitted_card_hist[ip][card].GetMaximumBin(); + maxContent_frac = fitted_card_hist[ip][card].GetBinContent(binSearchHigh) * 0.20; + + //cout << "Maximum Bin Number: " << binSearchHigh << endl; + //cout << "Maximum Bin Content: " << fitted_card_hist[ip][card].GetBinContent(binSearchHigh) << endl; + //cout << "20% of Max Content: " << maxContent_frac << endl; + + //cout << "****About to loop over bins**** ... " << endl; + //Loop over card drift time bins + for (Int_t bin=1; bin <= binSearchHigh; bin++) + { + content_bin = fitted_card_hist[ip][card].GetBinContent(bin); + + content.push_back(content_bin); + bin_num.push_back(bin); + + // cout << "bin: " << bin << endl; + // cout << "content size: " << content.size() << endl; + // cout << "About to check content size " << endl; + if (content.size() == 10) + { + counts = 0; + + // cout << "About to loop over 5 bins " << endl; + for (Int_t j=0; j<10; j++) + { + //cout << "content["<<j<<"]: " << content[j] << endl; + //cout << "max_Content frac: " << maxContent_frac << endl; + //cout << "counts: " << counts << endl; + if(content[j] > 0) + { + counts = counts + 1; + if(counts >=8) {goto stop;} + } //end 'if' statement + + content.clear(); + bin_num.clear(); + + } //end loop over 5 bin sample + + } //end 'if' stmnt checking content size + + } //end loop over bins + + stop: + // cout << "bin_num[0]: " << bin_num[0] << endl; + card_T0 = fitted_card_hist[ip][card].GetXaxis()->GetBinCenter(bin_num[0]); + //cout << "card_T0 = " << card_T0 << endl; + return card_T0; + + +} + //___________________________________________________________________ void DC_calib::FitCardDriftTime() { + cout << "Entering FitCardDriftTime Method . . ." << endl; for (Int_t ip = 0; ip < NPLANES; ip++) { + + cout << "Plane : " << ip << endl; //Loop over DC cards for (card = 0; card < plane_cards[ip]; card++) { + cout << "card: " << card << endl; tZero_fit = new TF1("tZero_fit", "[0]*x + [1]", wireFitRangeLow[ip][card], wireFitRangeHigh[ip][card]); //Set Parameter Names and Values @@ -1404,7 +1484,9 @@ void DC_calib::FitCardDriftTime() tZero_fit->SetParameter(1, 1.0); entries_card[ip][card] = fitted_card_hist[ip][card].GetEntries(); - + + cout << "entries: " << entries_card[ip][card] << endl; + //Fit Function in specified range fitted_card_hist[ip][card].Fit("tZero_fit", "QR"); @@ -1418,31 +1500,56 @@ void DC_calib::FitCardDriftTime() std_dev = fitted_card_hist[ip][card].GetStdDev(); //Require sufficient events and NOT CRAZY! tzero values, otherwis, set t0 to ZERO - if (abs(-y_int/m) < std_dev*5.0 && m > 0.0 && entries_card[ip][card]>max_wire_entry) + if ((abs(-y_int/m) < std_dev*5.0 && m > 0.0 ) || entries_card[ip][card]>2000) { t_zero_card[ip][card] = - y_int/m ; t_zero_card_err[ip][card] = sqrt(y_int_err*y_int_err/(m*m) + y_int*y_int*m_err*m_err/(m*m*m*m) ); + //if error of t0 is bad (15), then set t0 = 0, since it is liekly that #evts is very low and insignificant to be corrected + if(t_zero_card_err[ip][card] > t0_err_thrs || entries_card[ip][card] <= 2000 || m < 0.0) + { + t_zero_card[ip][card] = GetCardT0_alternative(ip, card); + t_zero_card_err[ip][card] = 0.0; + //cout << "About to execute GetCardT0_alternative() " << endl; + cout << "plane: " << ip << " :: card: " << card << "t_zero_card: " << GetCardT0_alternative(ip, card) << endl; + + } + + } + + //ensure to assign card tzero values to zero, if card entries are not sufficient + else if (abs(-y_int/m)>=5.0*std_dev || m <= 0.0 || entries_card[ip][card] <= 2000) + { + t_zero_card[ip][card] = GetCardT0_alternative(ip, card); + t_zero_card_err[ip][card] = 0.0; + //cout << "About to execute GetCardT0_alternative() " << endl; + cout << "plane: " << ip << " :: card: " << card << "t_zero_card: " << GetCardT0_alternative(ip, card) << endl; + } + + for(wire=1; wire<=nwires[ip]; wire++) { - if (wire >= wire_min[ip][card] && wire <=wire_max[ip][card]) + if (wire >= wire_min[ip][card] && wire <=wire_max[ip][card]) //entries_card[ip][card]>max_wire_entry) { t_zero[ip][wire-1] = t_zero_card[ip][card]; t_zero_err[ip][wire-1] = t_zero_card_err[ip][card]; - - } - + t_zero_final[ip][wire-1] = t_zero_card[ip][card]; + + } //end 'if' statement for wire group selection + + + //ensure to assign wire tzero values to zero, if card entries are not sufficient + //else if (wire >= wire_min[ip][card] && wire <=wire_max[ip][card] && t_zero_card_err[ip][card] > t0_err_thrs)//entries_card[ip][card] <= max_wire_entry) + //{ + // t_zero[ip][wire-1] = 0; + // t_zero_final[ip][wire-1] = 0; + + //} + } //end wire loop - - } //end 'if' statement - - else if (abs(-y_int/m)>=5.0*std_dev || m <= 0.0 || entries_card[ip][card] <= max_wire_entry) - { - t_zero[ip][card] = 0.0; - } } //end loop over cards diff --git a/CALIBRATION/dc_calib/scripts/DC_calib.h b/CALIBRATION/dc_calib/scripts/DC_calib.h index 90cf5ce5839f4c3872cf4e2e713ad4e1c8391502..c73a8ba72d5f0ca55305eec082685038805eae49 100644 --- a/CALIBRATION/dc_calib/scripts/DC_calib.h +++ b/CALIBRATION/dc_calib/scripts/DC_calib.h @@ -24,6 +24,7 @@ class DC_calib void GetTwentyPercent_Card(); void FitCardDriftTime(); void ApplyTZeroCorrectionPerCard(); + Double_t GetCardT0_alternative(Int_t ith_plane, Int_t ith_card); //---Per Global/Per Wire methods void setup_Directory(); @@ -216,7 +217,11 @@ class DC_calib Int_t plane_cards[NPLANES]; //number of disc. cards / plane Int_t card; - + + //GetCardT0_alternative() method variables + Double_t maxContent_frac; + Double_t card_T0; + //GetTwentyPercent_Card()/Fit Card methods variables Int_t binValLow; Int_t binValHigh; diff --git a/CALIBRATION/dc_calib/scripts/main_calib.C b/CALIBRATION/dc_calib/scripts/main_calib.C index 42ca5066601e65ad15f8fd6802e062d3be65d40c..fe427401f9adf9dea2e8ed3a68de985977092967 100644 --- a/CALIBRATION/dc_calib/scripts/main_calib.C +++ b/CALIBRATION/dc_calib/scripts/main_calib.C @@ -19,9 +19,10 @@ int main_calib() //pid_elec, pid_kFALSE (no PID cuts) // | // v - //DC_calib obj("HMS", "../../../ROOTfiles/hms_replay_production_all_1856_hodtrefcut1000_-1.root", 1856,-1, "pid_elec"); + // DC_calib obj("HMS", "../../../ROOTfiles/hms_replay_production_all_1856_hodtrefcut1000_-1.root", 1856,-1, "pid_elec", "card"); //DC_calib obj("SHMS", "../../../ROOTfiles/shms_replay_production_all_2774_-1.root", 2774, -1, "pid_elec"); - DC_calib obj("SHMS", "~/abishek/hallc_replay/ROOTfiles/shms_replay_production_all_1791_-1.root", 1791, 10000000, "pid_elec", "card"); + // DC_calib obj("SHMS", "~/abishek/hallc_replay/ROOTfiles/shms_replay_production_all_1791_-1.root", 1791, 10000000, "pid_elec", "card"); + DC_calib obj("SHMS", "../../../ROOTfiles/shms_replay_production_all_1791dcuncal_-1.root", 1791, 10000000, "pid_elec", "card"); // DC_calib obj("HMS", "../../../ROOTfiles/hms_coin_replay_production_1866_1000000.root", 1866, 1000, "pid_kFALSE"); obj.setup_Directory();