66 const char* dimName[3] = {
"X",
"Y",
"Z"};
70 float mean =
c->getMean(dim), rms =
c->getRMS(dim);
71 if (rms <
params.minSigma[dim]) {
72 LOGP(alarm,
"Too small RMS = {} for dimension {} ({} entries), override to {}", rms, dimName[dim],
c->entries,
params.minSigma[dim]);
73 rms =
params.minSigma[dim];
75 float minD = mean -
params.histoNSigma[dim] * rms;
76 float maxD = mean +
params.histoNSigma[dim] * rms;
77 int nBins = std::max(1.f, (maxD - minD) /
params.histoBinSize[dim]);
78 float binWidth = (maxD - minD) / nBins, binWidthInv = 1. / binWidth;
80 LOGP(info,
"Histo for dim:{} with {} entries: mean:{} rms:{} -> {} bins in range {}:{} ", dimName[dim],
c->entries, mean, rms, nBins, minD, maxD, nBins);
82 vectOut.resize(nBins);
83 for (
int i = 0;
i < vectIn.size(); ++
i) {
84 if (vectIn[
i] < minD) {
87 int bin = (vectIn[
i] - minD) * binWidthInv;
93 return {nBins, binWidth, minD, maxD};
104 std::sort(
c->histoVtx.begin(),
c->histoVtx.end(), [](std::array<float, 3>
a, std::array<float, 3>
b) { return b[2] > a[2]; });
106 LOG(info) <<
"Printing ordered vertices";
107 for (
int i = 0;
i <
c->histoVtx.size(); ++
i) {
108 LOG(info) <<
"x = " <<
c->histoVtx[
i][0] <<
", y = " <<
c->histoVtx[
i][1] <<
", z = " <<
c->histoVtx[
i][2];
112 std::vector<float> htmpX;
113 std::vector<float> htmpY;
114 std::vector<float> htmpZ;
115 std::vector<std::array<double, 3>> fitResSlicesX;
116 std::vector<CovMatrix> covMatrixX;
117 std::vector<std::array<double, 3>> fitResSlicesY;
118 std::vector<CovMatrix> covMatrixY;
119 std::vector<float> binnedVect;
120 std::vector<double> meanZvect;
121 int startZ = 0, nBinsOK = 0;
122 auto minEntriesPerPoint = std::max((
unsigned long int)
params.minEntries,
c->histoVtx.size() /
params.nPointsForSlope);
124 LOGP(info,
"Beginning: startZ = {} c->histoVtx.size() = {}, will process {} Z slices with {} entries each", startZ,
c->histoVtx.size(),
params.nPointsForSlope, minEntriesPerPoint);
126 auto dumpNonEmpty = [&binnedVect](
const std::string&
msg) {
130 for (
size_t i = 0;
i < binnedVect.size();
i++) {
132 LOGP(info,
"bin:{} {}",
i, binnedVect[
i]);
139 LOG(info) <<
"Beginning of while: startZ = " << startZ <<
" c->histoVtx.size() = " <<
c->histoVtx.size();
143 for (
int ii = startZ; ii <
c->histoVtx.size(); ++ii) {
145 if (++counts < minEntriesPerPoint) {
146 htmpX.push_back(
c->histoVtx[ii][0]);
147 htmpY.push_back(
c->histoVtx[ii][1]);
148 meanZ +=
c->histoVtx[ii][2];
152 LOGP(info,
"fitting after collecting {} entries for Z slice {} of {}", htmpX.size(),
counter,
params.nPointsForSlope);
156 fitResSlicesX.push_back({});
157 covMatrixX.push_back({});
158 auto hparX =
binVector(binnedVect, htmpX,
c, 0);
160 LOG(info) <<
"Fitting X for counter " <<
counter <<
", will use " << hparX.nBins <<
" bins, from " << hparX.minRange <<
" to " << hparX.maxRange;
161 for (
int i = 0;
i < htmpX.size(); ++
i) {
162 LOG(info) <<
"vect[" <<
i <<
"] = " << htmpX[
i] <<
";";
166 LOG(info) <<
" Printing output binned vector for X:";
168 }
else if (
params.dumpNonEmptyBins) {
169 dumpNonEmpty(fmt::format(
"X{} nonEmpty bins",
counter));
171 fitres = fitGaus(hparX.nBins, binnedVect.data(), hparX.minRange, hparX.maxRange, fitResSlicesX.back(), &covMatrixX.back());
173 LOG(info) <<
"X, counter " <<
counter <<
": Fit result (z slice [" <<
c->histoVtx[startZ][2] <<
", " <<
c->histoVtx[ii][2] <<
"]) => " << fitres <<
". Mean = " << fitResSlicesX[
counter][1] <<
" Sigma = " << fitResSlicesX[
counter][2] <<
", covMatrix = " << covMatrixX[
counter](2, 2) <<
" entries = " << counts;
175 LOG(error) <<
"X, counter " <<
counter <<
": Fit failed with result = " << fitres <<
" entries = " << counts;
181 fitResSlicesY.push_back({});
182 covMatrixY.push_back({});
184 auto hparY =
binVector(binnedVect, htmpY,
c, 1);
186 LOG(info) <<
"Fitting Y for counter " <<
counter <<
", will use " << hparY.nBins <<
" bins, from " << hparY.minRange <<
" to " << hparY.maxRange;
187 for (
int i = 0;
i < htmpY.size(); ++
i) {
188 LOG(info) <<
i <<
" : " << htmpY[
i];
192 LOG(info) <<
" Printing output binned vector for Y:";
194 }
else if (
params.dumpNonEmptyBins) {
195 dumpNonEmpty(fmt::format(
"Y{} nonEmpty bins",
counter));
197 fitres = fitGaus(hparY.nBins, binnedVect.data(), hparY.minRange, hparY.maxRange, fitResSlicesY.back(), &covMatrixY.back());
199 LOG(info) <<
"Y, counter " <<
counter <<
": Fit result (z slice [" <<
c->histoVtx[startZ][2] <<
", " <<
c->histoVtx[ii][2] <<
"]) => " << fitres <<
". Mean = " << fitResSlicesY[
counter][1] <<
" Sigma = " << fitResSlicesY[
counter][2] <<
", covMatrix = " << covMatrixY[
counter](2, 2) <<
" entries = " << counts;
201 LOG(error) <<
"Y, counter " <<
counter <<
": Fit failed with result = " << fitres <<
" entries = " << counts;
208 LOGP(info,
"Z, counter {} {} ({}/{})",
counter, meanZ / counts, meanZ, counts);
212 fitResSlicesX.pop_back();
213 covMatrixX.pop_back();
214 fitResSlicesY.pop_back();
215 covMatrixY.pop_back();
217 meanZvect.push_back(meanZ / counts);
225 LOG(info) <<
"End of while: startZ = " << startZ <<
" c->histoVtx.size() = " <<
c->histoVtx.size();
230 for (
int ii = 0; ii <
c->histoVtx.size(); ++ii) {
231 htmpZ.push_back(
c->histoVtx[ii][2]);
233 auto hparZ =
binVector(binnedVect, htmpZ,
c, 2);
239 double sumX = 0, sumY = 0, weightSumX = 0, weightSumY = 0;
240 for (
int iFit = 0; iFit < nBinsOK; ++iFit) {
242 LOG(info) <<
"SigmaX = " << fitResSlicesX[iFit][2] <<
" error = " << covMatrixX[iFit](2, 2);
243 LOG(info) <<
"SigmaY = " << fitResSlicesY[iFit][2] <<
" error = " << covMatrixY[iFit](2, 2);
245 double weightSigmaX = covMatrixX[iFit](2, 2) > 0 ? 1. / covMatrixX[iFit](2, 2) : 1.;
246 sumX += (fitResSlicesX[iFit][2] * weightSigmaX);
247 weightSumX += weightSigmaX;
249 double weightSigmaY = covMatrixY[iFit](2, 2) > 0 ? 1. / covMatrixY[iFit](2, 2) : 1.;
250 sumY += (fitResSlicesY[iFit][2] * weightSigmaY);
251 weightSumY += weightSigmaY;
254 LOG(info) <<
"sumX = " << sumX;
255 LOG(info) <<
"weightSumX = " << weightSumX;
256 LOG(info) <<
"sumY = " << sumY;
257 LOG(info) <<
"weightSumY = " << weightSumY;
261 if (weightSumX != 0) {
262 sigmaX = sumX / weightSumX;
265 if (weightSumY != 0) {
266 sigmaY = sumY / weightSumY;
269 LOG(info) <<
"SigmaX for MeanVertex = " << sigmaX;
270 LOG(info) <<
"SigmaY for MeanVertex = " << sigmaY;
272 if (sigmaX == 0 || sigmaY == 0 || mvo.getSigmaZ() == 0 || nBinsOK < 2) {
273 LOGP(error,
"Fit with {} valid slices produced wrong vertex parameters: SigmaX={}, SigmaY={}, SigmaZ={}", nBinsOK, sigmaX, sigmaY, mvo.getSigmaZ());
276 mvo.setSigmaX(sigmaX);
277 mvo.setSigmaY(sigmaY);
280 TLinearFitter lf(1,
"pol1");
281 lf.StoreData(kFALSE);
282 for (
int i = 0;
i < nBinsOK; ++
i) {
284 LOG(info) <<
"Adding point " <<
i <<
": zvtx = " << meanZvect[
i] <<
" xvtx = " << fitResSlicesX[
i][2];
286 lf.AddPoint(&meanZvect[
i], fitResSlicesX[
i][1]);
289 double slopeX = lf.GetParameter(1);
291 mvo.setX(mvo.getZ() * slopeX + lf.GetParameter(0));
295 for (
int i = 0;
i < nBinsOK; ++
i) {
297 LOG(info) <<
"Adding point " <<
i <<
": zvtx = " << meanZvect[
i] <<
" yvtx = " << fitResSlicesY[
i][2];
299 lf.AddPoint(&meanZvect[
i], fitResSlicesY[
i][1]);
302 double slopeY = lf.GetParameter(1);
304 mvo.
setY(mvo.getZ() * slopeY + lf.GetParameter(0));
306 LOG(info) <<
"slope X = " << slopeX;
307 LOG(info) <<
"slope Y = " << slopeY;
309 LOG(info) <<
"Fitted meanVertex: " << mvo.
asString();
408 if (dq.size() <=
params.nSlots4SMA) {
409 sma.setX((sma.getX() * (dq.size() - 1) + dq.back().getX()) / dq.size());
410 sma.
setY((sma.getY() * (dq.size() - 1) + dq.back().getY()) / dq.size());
411 sma.
setZ((sma.getZ() * (dq.size() - 1) + dq.back().getZ()) / dq.size());
412 sma.setSigmaX((sma.getSigmaX() * (dq.size() - 1) + dq.back().getSigmaX()) / dq.size());
413 sma.setSigmaY((sma.getSigmaY() * (dq.size() - 1) + dq.back().getSigmaY()) / dq.size());
414 sma.setSigmaZ((sma.getSigmaZ() * (dq.size() - 1) + dq.back().getSigmaZ()) / dq.size());
415 sma.
setSlopeX((sma.
getSlopeX() * (dq.size() - 1) + dq.back().getSlopeX()) / dq.size());
416 sma.
setSlopeY((sma.
getSlopeY() * (dq.size() - 1) + dq.back().getSlopeY()) / dq.size());
418 LOG(info) <<
"Printing from simple moving average, when we have not collected enough objects yet:";
426 sma.setX(sma.getX() + (dq[dq.size() - 1].getX() - dq[0].getX()) /
params.nSlots4SMA);
427 sma.
setY(sma.getY() + (dq[dq.size() - 1].getY() - dq[0].getY()) /
params.nSlots4SMA);
428 sma.
setZ(sma.getZ() + (dq[dq.size() - 1].getZ() - dq[0].getZ()) /
params.nSlots4SMA);
429 sma.setSigmaX(sma.getSigmaX() + (dq[dq.size() - 1].getSigmaX() - dq[0].getSigmaX()) /
params.nSlots4SMA);
430 sma.setSigmaY(sma.getSigmaY() + (dq[dq.size() - 1].getSigmaY() - dq[0].getSigmaY()) /
params.nSlots4SMA);
431 sma.setSigmaZ(sma.getSigmaZ() + (dq[dq.size() - 1].getSigmaZ() - dq[0].getSigmaZ()) /
params.nSlots4SMA);
438 LOG(info) <<
"Printing from simple moving average:";