File indexing completed on 2025-08-03 08:16:04
0001
0002
0003
0004
0005
0006 #define Nmodules 3
0007 float E_n;
0008
0009 float no_booster_weight[3] = {1,1,1};
0010 std::vector<float> skip_zdc_mod = {1,1,1};
0011
0012
0013 float uncorr_lo = 133.138;
0014 float uncorr_hi = 224.234;
0015
0016
0017 bool calculateWeights(float energy,
0018 std::vector< std::vector<float> >& in_data,
0019 TVectorD& out_weights,
0020 TMatrixD& out_matrix
0021 )
0022 {
0023
0024 int n_zdc = in_data.size();
0025 int dim = n_zdc+1;
0026
0027 std::cout << "Calculate weights for " << n_zdc << " modules!" << std::endl;
0028
0029 TVectorD mom1(dim);
0030
0031 size_t nevt = in_data.at(0).size();
0032 for (size_t i = 0;i<nevt;i++)
0033 {
0034 for (size_t ir=0;ir<n_zdc;ir++)
0035 {
0036 mom1(ir) += in_data.at(ir).at(i)/double(nevt);
0037 for (size_t ic=0;ic<n_zdc;ic++)
0038 {
0039 out_matrix(ir,ic) += 2*in_data.at(ir).at(i)*in_data.at(ic).at(i)/double(nevt);
0040 }
0041 }
0042 }
0043
0044
0045 for (size_t ir=0;ir<n_zdc;ir++)
0046 {
0047 out_matrix(ir,n_zdc)=mom1(ir);
0048 out_matrix(n_zdc,ir)=mom1(ir);
0049 }
0050
0051 TVectorD solution(dim);
0052 solution(n_zdc) = energy;
0053
0054 TDecompLU lu(out_matrix);
0055 lu.Decompose();
0056 bool status = lu.Solve(solution);
0057
0058 if (!status)
0059 {
0060 std::cout << "Fail!" << endl;
0061 }
0062 else
0063 {
0064 std::cout << "Success!" << endl;
0065 }
0066
0067 solution.Print();
0068
0069 out_weights = solution;
0070
0071 return status;
0072 }
0073
0074
0075
0076 void zdc_calib(TString filename = "", float e = 100)
0077
0078 {
0079
0080 TString s_zdc = "";
0081 for (int iz=0;iz<Nmodules;iz++)
0082 {
0083 s_zdc += TString::Itoa(skip_zdc_mod[iz],10);
0084 }
0085
0086 TFile fout("output"+filename+"_"+s_zdc+"_fout.root","RECREATE");
0087 TH1F h_e_uncorr("h_e_uncorr","Uncorr. energy;E_{uncorr}",3000,0,6000);
0088 TH2F h_e_uncorr2D("h_e_uncorr2D","Uncorr. energy;E_{ZDC} [GeV]};E_{EM} [GeV];",100,0,300,100,0,300);
0089 TH1F h_e_corr("h_e_corr","corr. energy;E_{corr}",3000,0,6000);
0090 TH2F h_e_corr2D("h_e_corr2D","corr. energy;E_{ZDC} [GeV];E_{EM} [GeV]",100,0,600,100,0,600);
0091
0092 int n_zdc = std::accumulate(skip_zdc_mod.begin(),skip_zdc_mod.end(),0);
0093 std::cout << "Working with " << n_zdc << " modules!" << std::endl;
0094
0095 TMatrixD* zdcMatrix = new TMatrixD(n_zdc+1,n_zdc+1);
0096 TVectorD* zdcWeights = new TVectorD(n_zdc+1);
0097
0098
0099 std::vector< std::vector<float> > data;
0100 data.resize(n_zdc);
0101 std::vector< std::vector<float> > all_data;
0102 all_data.resize(n_zdc);
0103
0104 ifstream ifs(filename);
0105
0106 int event;
0107 float x,y;
0108 std::vector<float> z(Nmodules);
0109 int Nevents;
0110
0111
0112
0113 float thissum = 0.;
0114 while (!ifs.eof())
0115 {
0116
0117 ifs >> z[0] >> z[1] >> z[2];
0118
0119 float sum = 0;
0120 float sum_had = 0;
0121 bool fail_event = false;
0122
0123 for (int iz=0;iz<Nmodules;iz++)
0124 {
0125 z[iz] = (z[iz]<4000?z[iz]:0)/no_booster_weight[iz];
0126
0127 if (!skip_zdc_mod[iz] && z[iz]>10) fail_event = true;
0128
0129 sum += z[iz]*skip_zdc_mod[iz];
0130 if (iz>0) sum_had += z[iz]*skip_zdc_mod[iz];
0131 }
0132 if (fail_event) continue;
0133
0134 int ind = 0;
0135 if (sum>uncorr_lo&&sum<uncorr_hi)
0136 {
0137 for (int iz=0;iz<Nmodules;iz++)
0138 {
0139 if (skip_zdc_mod[iz])
0140 {
0141 data.at(ind).push_back(z[iz]);
0142 ind++;
0143 }
0144 }
0145 }
0146
0147 ind = 0;
0148 for (int iz=0;iz<Nmodules;iz++)
0149 {
0150 if (skip_zdc_mod[iz])
0151 {
0152 all_data.at(ind).push_back(z[iz]);
0153 ind++;
0154 }
0155 }
0156
0157 h_e_uncorr.Fill(sum);
0158 h_e_uncorr2D.Fill(sum_had,sum-sum_had);
0159 }
0160
0161 calculateWeights(e, data, *zdcWeights, *zdcMatrix);
0162
0163 int Nevt = all_data.at(0).size();
0164 std::cout << Nevt << " events used!" << std::endl;
0165 for (int i = 0;i<Nevt;i++)
0166 {
0167
0168 float e_corr = 0;
0169 float e_corr_had = 0;
0170 int ind = 0;
0171 for (int iz=0;iz<Nmodules;iz++)
0172 {
0173 if (skip_zdc_mod[iz])
0174 {
0175 e_corr += all_data.at(ind).at(i) * (*zdcWeights)(ind);
0176 if (iz>0) e_corr_had += all_data.at(ind).at(i) * (*zdcWeights)(ind);
0177 ind++;
0178 }
0179 }
0180
0181 h_e_corr.Fill(e_corr);
0182 h_e_corr2D.Fill(e_corr_had,e_corr-e_corr_had);
0183
0184 }
0185
0186 fout.cd();
0187 zdcWeights->Write("zdcTBWeights");
0188 fout.Write();
0189 fout.Close();
0190
0191 }
0192