21 #include <framework/utilities/FileSystem.h>
22 #include <ecl/digitization/WrapArray2D.h>
23 #include <Eigen/Dense>
28 using namespace Eigen;
30 void matrix_cal(
int cortyp,
const char* inputRootFilename,
31 const char* corrDirSuffix,
const char* cutFilename)
34 TChain fChain(
"m_tree");
37 cout <<
"file for calibration:" << inputRootFilename << endl;
38 fChain.Add(inputRootFilename);
45 fChain.SetBranchAddress(
"nhits", &nhits, &b_nhits);
46 fChain.SetBranchAddress(
"hitA", hitA, &b_hitA);
59 constexpr
int mapmax = 217;
64 std::vector<double >>> W(mapmax, std::vector<std::vector<double>>(16, std::vector<double>(1, 0.0)));
68 std::vector<double >>> WW(mapmax, std::vector<std::vector<double>>(16, std::vector<double>(16, 0.0)));
71 vector<double> Mean(8736, 0);
74 Eigen::MatrixXd m(16, 16);
75 Eigen::MatrixXd
u(16, 16);
76 Eigen::MatrixXd y(16, 16);
81 vector<double> sr(8736, 0);
82 vector<double> sl(8736, 0);
84 vector<double> dt(mapmax, 0);
85 vector<double> dtn(mapmax, 0);
88 vector<double> inmt(mapmax, 0);
100 vector<int> DS(8736, 0);
102 string crystalGroupsFilename = FileSystem::findFile(
"/data/ecl/CIdToEclData.txt");
103 assert(! crystalGroupsFilename.empty());
104 ifstream ctoecldatafile(crystalGroupsFilename);
107 bool readerr =
false;
109 while (! ctoecldatafile.eof()) {
110 ctoecldatafile >> cid >> group;
112 if (ctoecldatafile.eof())
break;
113 if (group <= -1 || group >= 217 || cid <= -1 || cid >= 8736) {
114 cout <<
"Error cid=" << cid <<
" group=" << group << endl;
131 ifstream cutFile(cutFilename);
141 cutFile >> jk >> mn >> rs >> el >> er >> ch2;
142 if (cutFile.eof())
break;
151 for (icn = 0; icn < mapmax; icn++) {
155 for (it = 0; it < 16; it++) {
159 for (
id = 0;
id < 16;
id++) {
160 WW[icn][it][id] = 0.;
167 Int_t nevent = fChain.GetEntries();
168 std::cout <<
"! nevent=" << nevent << std::endl;
170 for (Int_t i = 0; i < nevent; i++) {
172 if (i % 100 == 0) { cout <<
" nevent=" << i << endl; }
173 for (icn = 0; icn < max; icn++) {
175 for (
id = 0;
id < 16;
id++) {
180 for (j = 0; j < 31; j++) {
182 A0 = A0 + (double)hitA[icn][j] / 16.;
183 if ((
double)hitA[icn][j] - Mean[icn] < -Nsigcut * sl[icn]) {index = 0;}
184 if ((
double)hitA[icn][j] - Mean[icn] > Nsigcut * sr[icn]) {index = 0;}
186 if ((
double)hitA[icn][j] - Mean[icn] > Nsigcut * sr[icn] || (double)hitA[icn][j] - Mean[icn] < -Nsigcut * sl[icn]) {index = 0;}
194 inmt[DS[icn]] = inmt[DS[icn]] + 1.;
197 for (j = 0; j < 31; j++) {
199 if (j < 16) {A0 = A0 + (double)hitA[icn][j] / 16.;}
202 W[DS[icn]][0][0] = W[DS[icn]][0][0] + A0;
203 Q[DS[icn]][0] = Q[DS[icn]][0] + A0;
210 Y[trun] = (double)hitA[icn][j];
211 W[DS[icn]][trun][0] = W[DS[icn]][trun][0] + (double)hitA[icn][j];
212 Q[DS[icn]][trun] = Q[DS[icn]][trun] + (double)hitA[icn][j];
220 for (it = 0; it < 16; it++) {
221 for (
id = 0;
id < 16;
id++) {
222 WW[DS[icn]][it][id] = WW[DS[icn]][it][id] + Y[it] * Y[id];
239 for (icn = 0; icn < mapmax; icn++) {
245 cout <<
"icn= " << icn <<
" imnt= " << inmt[icn] << endl;
249 if (inmt[icn] == 0) {
250 cout <<
"bad icn= " << icn << endl;
255 for (ia = 0; ia < 16; ia++) {
256 for (ib = 0; ib < 16; ib++) {
257 if (ib < 16 && ia < 16) {
258 m(ia, ib) = (WW[icn][ia][ib] - W[icn][ia][0] * W[icn][ib][0] / inmt[icn]) / inmt[icn];
259 UU[ia][ib] = (WW[icn][ia][ib] - W[icn][ia][0] * W[icn][ib][0] / inmt[icn]) / inmt[icn];
285 for (ia = 0; ia < 16; ia++) {
286 for (ib = 0; ib < 16; ib++) {
287 IM[ia][ib] =
u(ia, ib);
289 for (ic = 0; ic < 16; ic++) {
290 FF[ia][ib] = FF[ia][ib] + UU[ia][ic] *
u(ic, ib);
292 if (ia == ib && fabs(FF[ia][ib] - 1.) > delta) {delta = fabs(FF[ia][ib] - 1.);}
293 if (ia != ib && fabs(FF[ia][ib]) > delta) {delta = fabs(FF[ia][ib]);}
295 if (ia == ib && fabs(FF[ia][ib] - 1.) > dt[icn]) {dt[icn] = fabs(FF[ia][ib] - 1.);}
296 if (ia != ib && fabs(FF[ia][ib]) > dt[icn]) {dt[icn] = fabs(FF[ia][ib]);}
299 if (dt[icn] < 1.e-33 || dt[icn] > 1.e-9) {
300 cout <<
"icn=" << icn <<
" inmt=" << inmt[icn] <<
" cut=??" <<
"delta=" << dt[icn] << endl;
315 string mcorFilename(corrDirSuffix);
316 mcorFilename += to_string(cortyp) +
"/mcor" + to_string(icn) +
"_L.dat";
318 ofstream mcorFile(mcorFilename);
320 for (poq = 0; poq < 16; poq++) {
321 mcorFile << setprecision(5)
322 << m(0, poq) <<
"\t" << m(1, poq) <<
"\t" << m(2, poq) <<
"\t"
323 << m(3, poq) <<
"\t" << m(4, poq) <<
"\t" << m(5, poq) <<
"\t"
324 << m(6, poq) <<
"\t" << m(7, poq) <<
"\t" << m(8, poq) <<
"\t"
325 << m(9, poq) <<
"\t" << m(10, poq)
326 << m(11, poq) <<
"\t" << m(12, poq) <<
"\t"
327 << m(13, poq) <<
"\t" << m(14, poq) <<
"\t" << m(15, poq) << endl;
338 string inmcorFilename(corrDirSuffix);
339 inmcorFilename += to_string(cortyp) +
"/inmcor" + to_string(icn) +
"_L.dat";
342 ofstream inmcorFile(inmcorFilename);
343 for (poq = 0; poq < 16; poq++) {
344 inmcorFile << setprecision(3)
345 <<
u(0, poq) <<
"\t" <<
u(1, poq) <<
"\t" <<
u(2, poq) <<
"\t"
346 <<
u(3, poq) <<
"\t" <<
u(4, poq) <<
"\t" <<
u(5, poq) <<
"\t"
347 <<
u(6, poq) <<
"\t" <<
u(7, poq) <<
"\t" <<
u(8, poq) <<
"\t"
348 <<
u(9, poq) <<
"\t" <<
u(10, poq)
349 <<
u(11, poq) <<
"\t" <<
u(12, poq) <<
"\t"
350 <<
u(13, poq) <<
"\t" <<
u(14, poq) <<
"\t" <<
u(15, poq) << endl;
359 string binmcorFilename(corrDirSuffix);
360 binmcorFilename += to_string(cortyp) +
"/Binmcor" + to_string(icn) +
"_L.dat";
362 ofstream binmcorFile(binmcorFilename, ofstream::binary);
363 binmcorFile.write(
reinterpret_cast<char*
>(IM),
sizeof(
double) * 16 * 16);
372 cout <<
" delta= " << delta << endl;
379 int main(
int argc,
char** argv)
386 matrix_cal(atoi(argv[1]), argv[2], argv[3], argv[4]);