@@ -25,61 +25,66 @@ void ChipSimResponse::initData(int tableNumber, std::string dataPath, const bool
2525
2626void ChipSimResponse::computeCentreFromData ()
2727{
28- std::vector<float > zVec, qVec;
2928 const int npix = o2::itsmft::AlpideRespSimMat::getNPix ();
29+ std::vector<float > zVec, effVec;
30+ zVec.reserve (mNBinDpt );
31+ effVec.reserve (mNBinDpt );
3032
3133 for (int iz = 0 ; iz < mNBinDpt ; ++iz) {
32- size_t bin = iz + mNBinDpt * (0 + mNBinRow * 0 );
33- const auto & mat = mData [bin];
34- float val = mat.getValue (npix / 2 , npix / 2 );
35- float gz = mDptMin + iz / mStepInvDpt ;
36- zVec.push_back (gz);
37- qVec.push_back (val);
34+ int rev = mNBinDpt - 1 - iz;
35+ float z = mDptMin + iz / mStepInvDpt ;
36+ float sum = 0 .f ;
37+ const auto & mat = mData [rev];
38+ for (int ix = 0 ; ix < npix; ++ix) {
39+ for (int iy = 0 ; iy < npix; ++iy) {
40+ sum += mat.getValue (ix, iy);
41+ }
42+ }
43+ zVec.push_back (z);
44+ effVec.push_back (sum);
3845 }
3946
40- std::vector<std::pair<float , float >> zqPairs;
41- for (size_t i = 0 ; i < zVec.size (); ++i) {
42- zqPairs.emplace_back (zVec[i], qVec[i]);
43- }
44- std::sort (zqPairs.begin (), zqPairs.end ());
45- zVec.clear ();
46- qVec.clear ();
47- for (auto & p : zqPairs) {
48- zVec.push_back (p.first );
49- qVec.push_back (p.second );
50- }
47+ struct Bin {
48+ float z0, z1, q0, q1, dq;
49+ };
50+ std::vector<Bin> bins;
51+ bins.reserve (zVec.size () - 1 );
5152
52- struct BinInfo { float z0, z1, q0, q1, dq; };
53- std::vector<BinInfo> bins;
5453 float totQ = 0 .f ;
5554 for (size_t i = 0 ; i + 1 < zVec.size (); ++i) {
5655 float z0 = zVec[i], z1 = zVec[i + 1 ];
57- float q0 = qVec[i], q1 = qVec[i + 1 ];
58- float dz = z1 - z0;
59- float dq = 0 .5f * (q0 + q1) * dz;
56+ float q0 = effVec[i], q1 = effVec[i + 1 ];
57+ float dq = 0 .5f * (q0 + q1) * (z1 - z0);
6058 bins.push_back ({z0, z1, q0, q1, dq});
6159 totQ += dq;
6260 }
63- if (totQ <= 0 .f ) { mRespCentreDep = 0 .f ; return ; }
61+
62+ if (totQ <= 0 .f ) {
63+ mRespCentreDep = mDptMin ;
64+ return ;
65+ }
6466
6567 float halfQ = 0 .5f * totQ;
6668 float cumQ = 0 .f ;
67- for (const auto & b : bins) {
68- if (cumQ + b.dq < halfQ) { cumQ += b.dq ; continue ; }
69- float qSlope = (b.q1 - b.q0 ) / (b.z1 - b.z0 );
69+ for (auto & b : bins) {
70+ if (cumQ + b.dq < halfQ) {
71+ cumQ += b.dq ;
72+ continue ;
73+ }
7074 float dz = b.z1 - b.z0 ;
71- float A = qSlope * 0 .5f ;
72- float B = b.q0 ;
73- float C = cumQ - halfQ;
74- float disc = B * B - 4 .f * A * C;
75+ float slope = (b.q1 - b.q0 ) / dz;
76+ float disc = b.q0 * b.q0 - 2 .f * slope * (cumQ - halfQ);
77+
7578 float x;
76- if (disc >= 0 .f && std::abs (A ) > 1 . e - 12f )
77- x = (-B + std::sqrt (disc)) / ( 2 . f * A) ;
78- else
79+ if (disc >= 0 .f && std::abs (slope ) > 1e- 6f ) {
80+ x = (-b. q0 + std::sqrt (disc)) / slope ;
81+ } else {
7982 x = (halfQ - cumQ) / b.q0 ;
83+ }
8084 x = std::clamp (x, 0 .f , dz);
8185 mRespCentreDep = b.z0 + x;
8286 return ;
8387 }
88+
8489 mRespCentreDep = mDptMax ;
8590}
0 commit comments