12#ifndef ZDCNLCalibration_h
13#define ZDCNLCalibration_h
36 std::array<std::vector<float>, 4>
weights;
42 std::vector<float> unity(1, 1);
43 weights = {unity, unity, unity, unity};
48CalibData(
int inLBStart,
int inLBEnd,
const std::array<std::vector<float>, 4>& inWeights) :
107 typedef std::multimap<unsigned int, std::pair<unsigned int, unsigned int> >
LBEvtMap;
124 std::array<float, 4>
FindSNPeaks(
size_t LBLow,
size_t LBHigh,
size_t side);
126 std::pair<float, float>
FindSNRange(
size_t LBLow,
size_t LBHigh,
size_t side);
128 std::pair<std::pair<float, float>,std::pair<float, float> >
FindSNTwoNRanges(
size_t LBLow,
size_t LBHigh,
size_t side);
134 void Calibrate(
size_t side,
const std::string & calibInput,
const std::string & calibOutput,
135 size_t LBLow,
size_t LBHigh, std::array<int, 4> maxPowerModule,
136 const std::vector<std::pair<double, double> >& nNeutERange,
137 bool excludeHE,
float heSumThresh,
float HEDeweight);
151 std::array<int, 4> maxPowerModule,
float HEDeweight,
152 const std::vector<std::vector<double> >& sums1DVec,
const std::vector<double>& sumsHE,
153 const std::vector<std::vector<double> >& sums2DVec,
const std::vector<double>& sumsHE2D);
161 void AddToSums(std::vector<double>& sums1D, std::vector<double>& sums2D,
float* amps)
166 for (
size_t module1 : {0, 1, 2, 3}) {
167 double amp1 = amps[module1];
168 double amp1Pow = amp1;
170 for (
size_t power1 = 0; power1 <
m_maxNLPower; power1++) {
171 for (
size_t module2 : {0, 1, 2, 3}) {
172 double amp2 = amps[module2];
173 double amp2Pow = amp2;
175 for (
size_t power2 = 0; power2 <
m_maxNLPower; power2++) {
176 sums2D.at(index2D++) += amp1Pow*amp2Pow;
181 sums1D.at(index1D++) += amp1Pow;
191 for (
size_t module : {0, 1, 2, 3}) {
192 float amp = moduleAmps[module];
195 for (
size_t power = 0; power < calib.weights[module].size(); power++) {
196 energy += calib.weights[module][power]*ampPow;
208#ifdef ZDCNLCalibration_cxx
210 m_TFile(0), m_tree(0), m_maxNLPower(maxNLPower),
212 m_SNEnergy(2510), m_HEFraction({0.31, 0.27, 0.21, 0.21}),
215 std::cout <<
"Initializing ZDCNLCalibration with debug level " << m_debugLevel << std::endl;
217 TFile* temp_p =
new TFile(
file.c_str());
218 if (!temp_p->IsOpen()) {
219 std::cout <<
"Error opening input file " <<
file << std::endl;
224 m_tree =
static_cast<TTree*
>(m_TFile->GetObjectChecked(
"zdcTree",
"TTree"));
226 std::cout <<
"Error reading tree from input file " <<
file << std::endl;
230 m_tree->SetBranchAddress(
"runNumber", &runNumber, &b_runNumber);
231 m_tree->SetBranchAddress(
"eventNumber", &eventNumber, &b_eventNumber);
232 m_tree->SetBranchAddress(
"lumiBlock", &lumiBlock, &b_lumiBlock);
233 m_tree->SetBranchAddress(
"bcid", &bcid, &b_bcid);
234 m_tree->SetBranchAddress(
"passBits", &passBits, &b_passBits);
236 if (m_tree->FindBranch(
"zdc_ZdcModuleMask")) {
237 m_tree->SetBranchAddress(
"zdc_ZdcAmp", zdc_ZdcAmp, &b_zdc_ZdcAmp);
238 m_tree->SetBranchAddress(
"zdc_ZdcModuleMask", &zdc_ZdcModuleMask, &b_zdc_ZdcModuleMask);
239 m_tree->SetBranchAddress(
"zdc_ZdcModuleAmp", zdc_ZdcModuleAmp, &b_zdc_ZdcModuleAmp);
241 else if (m_tree->FindBranch(
"zdc_ModuleMask")) {
242 m_tree->SetBranchAddress(
"zdc_OptSumAmp", zdc_ZdcAmp, &b_zdc_ZdcAmp);
243 m_tree->SetBranchAddress(
"zdc_ModuleMask", (
int*) &zdc_ZdcModuleMask, &b_zdc_ZdcModuleMask);
244 m_tree->SetBranchAddress(
"zdc_OptAmp", zdc_ZdcModuleAmp, &b_zdc_ZdcModuleAmp);
246 else throw std::runtime_error(
"ZDCNLCalibration::ZDCNLCalibration valid branch not found");
248 m_tree->SetBranchAddress(
"L1_ZDC_A", &L1_ZDC_A, &b_L1_ZDC_A);
249 m_tree->SetBranchAddress(
"L1_ZDC_C", &L1_ZDC_C, &b_L1_ZDC_C);
250 m_tree->SetBranchAddress(
"L1_ZDC_AND", &L1_ZDC_AND, &b_L1_ZDC_AND);
251 m_tree->SetBranchAddress(
"L1_ZDC_A_C", &L1_ZDC_A_C, &b_L1_ZDC_A_C);
253 if (m_debugLevel > 0) {
254 std::cout <<
"Filling LumiBlock-event map" << std::endl;
257 FillLumiBlockEvtMap();
261 AddCalibration(0,
"default",
CalibData());
262 AddCalibration(1,
"default",
CalibData());
void TestCalibration(int side, const std::string &calibName)
TBranch * b_zdc_ZdcModuleAmp
virtual ~ZDCNLCalibration()
const std::vector< float > m_HEFraction
std::array< TH1D *, 4 > m_testCalibHEFracHist
void AddCalibration(size_t side, const std::string &tag, const CalibData &calib)
CalibData GetCalibration(size_t side, const std::string &tag)
LBEvtMap m_LumiBlockEvtMap
std::array< std::map< std::string, CalibData >, 2 > m_calibrations
void FillLumiBlockEvtMap()
ZDCNLCalibration(const std::string &file, int maxNLPower=3, bool useGRL=true, int debugLevel=0)
void FillMinimizationData(TMatrixD &minimMatrix, TVectorD &minimVector, std::array< int, 4 > maxPowerModule, float HEDeweight, const std::vector< std::vector< double > > &sums1DVec, const std::vector< double > &sumsHE, const std::vector< std::vector< double > > &sums2DVec, const std::vector< double > &sumsHE2D)
TBranch * b_zdc_ZdcModuleMask
static double CalculateEnergy(const float *moduleAmps, const CalibData &calib)
TH1 * GetTestFracHist(size_t module)
std::array< TH1D *, 4 > m_testCalibEnergyHist
std::multimap< unsigned int, std::pair< unsigned int, unsigned int > > LBEvtMap
std::array< float, 4 > FindSNPeaks(size_t LBLow, size_t LBHigh, size_t side)
Float_t zdc_ZdcModuleAmp[2][4]
void SetDefaultCalibration(size_t side, const CalibData &calib)
void AddToSums(std::vector< double > &sums1D, std::vector< double > &sums2D, float *amps)
std::pair< float, float > FindSNRange(size_t LBLow, size_t LBHigh, size_t side)
void Calibrate(size_t side, const std::string &calibInput, const std::string &calibOutput, size_t LBLow, size_t LBHigh, std::array< int, 4 > maxPowerModule, const std::vector< std::pair< double, double > > &nNeutERange, bool excludeHE, float heSumThresh, float HEDeweight)
std::pair< std::pair< float, float >, std::pair< float, float > > FindSNTwoNRanges(size_t LBLow, size_t LBHigh, size_t side)
CalibData(int inLBStart, int inLBEnd, const std::array< std::vector< float >, 4 > &inWeights)
std::array< std::vector< float >, 4 > weights