38 double* xInf = pads.x;
39 double* yInf = pads.y;
40 double* xSup = pads.dx;
41 double* ySup = pads.dy;
42 for (
int i = 0;
i < nPads;
i++) {
43 dx[
i] = 0.5 * (xSup[
i] - xInf[
i]);
44 dy[
i] = 0.5 * (ySup[
i] - yInf[
i]);
45 x[
i] = xInf[
i] + dx[
i];
46 y[
i] = yInf[
i] + dy[
i];
59 for (
int i = 0;
i < nPads;
i++) {
60 xInf[
i] = pads.x[
i] - pads.dx[
i];
61 xSup[
i] = pads.x[
i] + pads.dx[
i];
62 yInf[
i] = pads.y[
i] - pads.dy[
i];
63 ySup[
i] = pads.y[
i] + pads.dy[
i];
77 for (
int i = 0;
i < nPads;
i++) {
97 for (
int i = 0;
i < nPads;
i++) {
98 dx[
i] = 0.5 * (xSup[
i] - xInf[
i]);
99 dy[
i] = 0.5 * (ySup[
i] - yInf[
i]);
100 x[
i] = xInf[
i] + dx[
i];
101 y[
i] = yInf[
i] + dy[
i];
106PadIdx_t* Pads::buildFirstNeighbors(
double* X,
double* Y,
double* DX,
112 PadIdx_t* i_neigh = getNeighborListOf(neighbors,
i);
116 int xMask0 = (std::fabs(X[
i] - X[
j]) < (DX[
i] + DX[
j]) + eps);
117 int yMask0 = (std::fabs(Y[
i] - Y[
j]) < (DY[
i] + eps));
118 int xMask1 = (std::fabs(X[
i] - X[
j]) < (DX[
i] + eps));
119 int yMask1 = (std::fabs(Y[
i] - Y[
j]) < (DY[
i] + DY[
j] + eps));
120 if ((xMask0 && yMask0) || (xMask1 && yMask1)) {
130 (std::fabs(i_neigh - getNeighborListOf(neighbors,
i)) > MaxNeighbors)) {
131 printf(
"Pad %d : nbr of neighbours %ld greater than the limit %d \n",
i,
132 i_neigh - getNeighborListOf(neighbors,
i), MaxNeighbors);
133 throw std::out_of_range(
"Not enough allocation");
145 const double* DX = dx;
146 const double* DY = dy;
148 if ((kernelSize < 0) || (kernelSize > 2)) {
150 printf(
"Warning in getNeighbors : kerneSize overwritten by the default\n");
154 double factor = (2 * kernelSize - 1);
156 PadIdx_t* i_neigh = getNeighborListOf(neighbors_,
i);
157 double xTerm = factor * DX[
i] + eps;
158 double yTerm = factor * DY[
i] + eps;
162 (fabs(X[
i] - X[
j]) < (xTerm + DX[
j]));
165 yMask0 = (fabs(Y[
i] - Y[
j]) < (yTerm + DY[
j]));
167 if (xMask0 && yMask0) {
179 (fabs(i_neigh - getNeighborListOf(neighbors_,
i)) > MaxNeighbors)) {
180 printf(
"Pad %d : nbr of neighbours %ld greater than the limit %d \n",
i,
181 i_neigh - getNeighborListOf(neighbors_,
i), MaxNeighbors);
182 throw std::overflow_error(
"Not enough allocation");
197 std::vector<double> bX;
198 std::vector<double> bY;
199 std::vector<double> bdX;
200 std::vector<double> bdY;
204 for (
int i = 0;
i < N;
i++) {
205 bool east =
true, west =
true, north =
true, south =
true;
206 for (
const PadIdx_t* neigh_ptr = getTheFirtsNeighborOf(neigh,
i);
207 *neigh_ptr != -1; neigh_ptr++) {
210 double xDelta = (
x[
v] -
x[
i]);
211 if (fabs(xDelta) > eps) {
218 double yDelta = (
y[
v] -
y[
i]);
219 if (fabs(yDelta) > eps) {
229 bX.push_back(
x[
i] + 2 * dx[
i]);
231 bdX.push_back(dx[
i]);
232 bdY.push_back(dy[
i]);
235 bX.push_back(
x[
i] - 2 * dx[
i]);
237 bdX.push_back(dx[
i]);
238 bdY.push_back(dy[
i]);
242 bY.push_back(
y[
i] + 2 * dy[
i]);
243 bdX.push_back(dx[
i]);
244 bdY.push_back(dy[
i]);
248 bY.push_back(
y[
i] - 2 * dy[
i]);
249 bdX.push_back(dx[
i]);
250 bdY.push_back(dy[
i]);
254 int nPadToAdd = bX.size();
258 vectorSetShort(toKeep, 1, K);
259 double xInf[K], xSup[K], yInf[K], ySup[K];
260 double maxInf[K], minSup[K];
261 double xOverlap[K], yOverlap[K];
264 for (
int k = 0; k < K; k++) {
265 xInf[k] = bX[k] - bdX[k];
266 xSup[k] = bX[k] + bdX[k];
267 yInf[k] = bY[k] - bdY[k];
268 ySup[k] = bY[k] + bdY[k];
272 for (
int k = 0; k < (K - 1); k++) {
275 vectorMaxScalar(&xInf[k + 1], xInf[k], K - k - 1, &maxInf[k + 1]);
276 vectorMinScalar(&xSup[k + 1], xSup[k], K - k - 1, &minSup[k + 1]);
277 vectorAddVector(&minSup[k + 1], -1.0, &maxInf[k + 1], K - k - 1, &xOverlap[k + 1]);
279 vectorMaxScalar(&yInf[k + 1], yInf[k], K - k - 1, &maxInf[k + 1]);
280 vectorMinScalar(&ySup[k + 1], ySup[k], K - k - 1, &minSup[k + 1]);
281 vectorAddVector(&minSup[k + 1], -1.0, &maxInf[k + 1], K - k - 1, &yOverlap[k + 1]);
283 for (
int l = k + 1; l < K; l++) {
285 overlap = (xOverlap[l] < error) ? 0.0 : 1.0;
286 overlap = (yOverlap[l] < error) ? 0.0 * overlap : overlap * 1;
287 if (toKeep[l] && (overlap > 0.0)) {
295 double infxy_ = bX[k] - bdX[k];
296 double supxy_ = bX[k] + bdX[k];
297 infxy_ = std::fmax(infxy_, xInf[l]);
298 supxy_ = std::fmin(supxy_, xSup[l]);
299 double dxy_ = 0.5 * (supxy_ - infxy_);
301 bX[k] = infxy_ + dxy_;
305 infxy_ = bY[k] - bdY[k];
306 supxy_ = bY[k] + bdY[k];
307 infxy_ = std::fmax(infxy_, yInf[l]);
308 supxy_ = std::fmin(supxy_, ySup[l]);
309 dxy_ = 0.5 * (supxy_ - infxy_);
310 bY[k] = infxy_ + dxy_;
318 printf(
"[addBoundary] n=%d final boundary pads added, %d removed overlapping pads\n", nPadToAdd, K - nPadToAdd);
321 int nTotalPads = N + nPadToAdd;
323 printf(
"nTotalPads=%d, nPads=%d, nPadToAdd=%d\n", nTotalPads, N,
326 Pads* padsWithBoundaries =
new Pads(nTotalPads, chamberId);
327 Pads* newPads = padsWithBoundaries;
328 for (
int i = 0;
i < N;
i++) {
329 newPads->x[
i] =
x[
i];
330 newPads->y[
i] =
y[
i];
331 newPads->dx[
i] = dx[
i];
332 newPads->dy[
i] = dy[
i];
333 newPads->q[
i] = q[
i];
334 newPads->saturate[
i] = saturate[
i];
336 newPads->nObsPads = N;
337 for (
int i = N, k = 0;
i < nTotalPads; k++) {
339 newPads->x[
i] = bX[k];
340 newPads->y[
i] = bY[k];
341 newPads->dx[
i] = bdX[k];
342 newPads->dy[
i] = bdY[k];
344 newPads->saturate[
i] = 0;
348 newPads->totalCharge = totalCharge;
351 return padsWithBoundaries;
413 nObsPads = pads->nObsPads;
415 chamberId = pads->chamberId;
416 totalCharge = pads->totalCharge;
417 int size_ = (
size < nPads) ? nPads :
size;
419 memcpy(
x, pads->x,
sizeof(
double) * nPads);
420 memcpy(
y, pads->y,
sizeof(
double) * nPads);
421 memcpy(dx, pads->dx,
sizeof(
double) * nPads);
422 memcpy(dy, pads->dy,
sizeof(
double) * nPads);
423 memcpy(q, pads->q,
sizeof(
double) * nPads);
424 if (pads->saturate !=
nullptr) {
425 memcpy(saturate, pads->saturate,
sizeof(
Mask_t) * nPads);
427 if (pads->cath !=
nullptr) {
428 memcpy(cath, pads->cath,
sizeof(
Mask_t) * nPads);
435 nObsPads = pads.nObsPads;
437 chamberId = pads.chamberId;
438 totalCharge = pads.totalCharge;
441 memcpy(
x, pads.x,
sizeof(
double) * nPads);
442 memcpy(
y, pads.y,
sizeof(
double) * nPads);
443 memcpy(dx, pads.dx,
sizeof(
double) * nPads);
444 memcpy(dy, pads.dy,
sizeof(
double) * nPads);
445 memcpy(q, pads.q,
sizeof(
double) * nPads);
449 memcpy(q, pads.q,
sizeof(
double) * nPads);
453 memcpy(q, pads.q,
sizeof(
double) * nPads);
456 memcpy(saturate, pads.saturate,
sizeof(
Mask_t) * nPads);
459 memcpy(cath, pads.cath,
sizeof(
Mask_t) * nPads);
465 nPads = vectorSumShort(
mask, pads.nPads);
467 chamberId = pads.chamberId;
470 vectorGather(pads.x,
mask, pads.nPads,
x);
471 vectorGather(pads.y,
mask, pads.nPads,
y);
472 vectorGather(pads.dx,
mask, pads.nPads, dx);
473 vectorGather(pads.dy,
mask, pads.nPads, dy);
474 vectorGather(pads.q,
mask, pads.nPads, q);
476 vectorGatherShort(pads.saturate,
mask, pads.nPads, saturate);
479 vectorGatherShort(pads.cath,
mask, pads.nPads, cath);
481 totalCharge = vectorSum(q, nPads);
502Pads::Pads(
double* x_,
double* y_,
double* dx_,
double* dy_,
int chId,
513 q =
new double[nPads];
515 vectorSetZero(q, nPads);
523Pads::Pads(
const double* x_,
const double* y_,
const double* dx_,
524 const double* dy_,
const double* q_,
const short* cathode,
525 const Mask_t* saturate_,
short selectedCath,
int chId,
526 PadIdx_t* mapCathPadIdxToPadIdx,
int nAllPads)
529 int nCathode1 = vectorSumShort(cathode, nAllPads);
531 if (selectedCath == 0) {
532 nPads = nAllPads - nCathode1;
540 for (
int i = 0;
i < nAllPads;
i++) {
541 if (cathode[
i] == selectedCath) {
548 saturate[k] = saturate_[
i];
549 mapCathPadIdxToPadIdx[k] =
i;
556Pads::Pads(
const double* x_,
const double* y_,
const double* dx_,
557 const double* dy_,
const double* q_,
const short* cathode,
558 const Mask_t* saturate_,
int chId,
int nAllPads)
573 vectorCopy(x_, nPads,
x);
574 vectorCopy(y_, nPads,
y);
575 vectorCopy(dx_, nPads, dx);
576 vectorCopy(dy_, nPads, dy);
577 vectorCopy(q_, nPads, q);
578 vectorCopyShort(cathode, nPads, cath);
579 vectorCopyShort(saturate_, nPads, saturate);
580 totalCharge = vectorSum(q, nPads);
591 throw std::out_of_range(
"Pads:: bad mode (xydxdyMode required) for pad merging");
594 int N0 = (pads0 ==
nullptr) ? 0 : pads0->nPads;
595 int N1 = (pads1 ==
nullptr) ? 0 : pads1->nPads;
596 int nObs0 = (pads0 ==
nullptr) ? 0 : pads0->nObsPads;
597 int nObs1 = (pads1 ==
nullptr) ? 0 : pads1->nObsPads;
599 chamberId = (N0) ? pads0->chamberId : pads1->chamberId;
603 copyPads(pads0, 0, destIdx, nObs0, 0);
606 copyPads(pads1, 0, destIdx, nObs1, 1);
611 copyPads(pads0, nObs0, destIdx,
n, 0);
614 copyPads(pads1, nObs1, destIdx,
n, 1);
642 totalCharge = vectorSum(q, nPads);
643 nObsPads = nObs0 + nObs1;
662 for (
int k = 0; k < K; k++) {
664 sPads->x[k0] =
x[idx];
665 sPads->y[k0] =
y[idx];
666 sPads->dx[k0] = dx[idx];
667 sPads->dy[k0] = dy[idx];
668 sPads->q[k0] = q[idx];
669 sPads->saturate[k0] = saturate[idx];
678void Pads::removePad(
int index)
680 if (nObsPads != nPads) {
681 throw std::out_of_range(
"Pads::removePad: bad usage");
686 int nItems = nPads -
index;
687 if (
index == nPads - 1) {
693 vectorCopy(&dx[
index + 1], nItems, &dx[
index]);
694 vectorCopy(&dy[
index + 1], nItems, &dy[
index]);
697 vectorCopyShort(&saturate[
index + 1], nItems, &saturate[
index]);
700 nObsPads = nObsPads - 1;
724void Pads::allocate(
int size)
737 x =
new double[
size];
738 y =
new double[
size];
739 dx =
new double[
size];
740 dy =
new double[
size];
743 q =
new double[
size];
746void Pads::copyPads(
const Pads* srcPads,
int srcIdx,
int dstIdx,
int N,
Mask_t cathValue)
749 memcpy(&
x[dstIdx], &srcPads->x[srcIdx],
sizeof(
double) * N);
750 memcpy(&
y[dstIdx], &srcPads->y[srcIdx],
sizeof(
double) * N);
751 memcpy(&dx[dstIdx], &srcPads->dx[srcIdx],
sizeof(
double) * N);
752 memcpy(&dy[dstIdx], &srcPads->dy[srcIdx],
sizeof(
double) * N);
753 memcpy(&q[dstIdx], &srcPads->q[srcIdx],
sizeof(
double) * N);
754 memcpy(&saturate[dstIdx], &srcPads->saturate[srcIdx],
sizeof(
Mask_t) * N);
755 vectorSetShort(&cath[dstIdx], cathValue, N);
760 totalCharge = vectorSum(q, nPads);
767 if (cath !=
nullptr) {
768 int nCath1 = vectorSumShort(cath, nPads);
769 int nCath0 = nPads - nCath1;
770 int nCath = (nCath0 > 0) + (nCath1 > 0);
771 meanCharge = totalCharge / nCath;
773 meanCharge = totalCharge;
780 vectorSet(q,
c, nPads);
781 totalCharge =
c * nPads;
786 vectorCopy(q_,
n, q);
787 totalCharge = vectorSum(q_,
n);
794void Pads::setToZero()
796 for (
int i = 0;
i < nPads;
i++) {
807 if (nObsPads != nPads) {
808 throw std::out_of_range(
"Pads::removePad: bad usage");
812 for (
int i = 0;
i < nPads;
i++) {
832 for (
int i = 0;
i < nPads;
i++) {
833 q[
i] = q[
i] / totalCharge;
841 if (neighbors ==
nullptr) {
842 neighbors = buildFirstNeighbors(
x,
y, dx, dy, N);
856 printf(
"[addIsolatedPadInGroups] nGroups=%d\n", nGroups);
861 for (
int p = 0; p < nPads; p++) {
862 if (cathToGrp[p] == 0) {
866 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh, p); *neigh_ptr != -1;
870 if (cathToGrp[q] != 0) {
871 if (cathToGrp[p] == 0) {
873 cathToGrp[p] = cathToGrp[q];
876 }
else if (cathToGrp[p] != cathToGrp[q]) {
879 Mask_t minGrp = cathToGrp[p];
880 Mask_t maxGrp = cathToGrp[q];
881 if (cathToGrp[p] > cathToGrp[q]) {
882 minGrp = cathToGrp[q];
883 maxGrp = cathToGrp[p];
885 grpToGrp[maxGrp] = minGrp;
888 cathToGrp[p] = minGrp;
892 if (cathToGrp[p] == 0) {
896 cathToGrp[p] = nGroups;
903 for (
int g = 0;
g < (nGroups + 1);
g++) {
905 while (gBar != grpToGrp[gBar]) {
906 gBar = grpToGrp[gBar];
913 printf(
" grpToGrp\n");
914 for (
int g = 0;
g < (nGroups + 1);
g++) {
915 printf(
" %d -> %d\n",
g, grpToGrp[
g]);
919 for (
int p = 0; p < nPads; p++) {
920 cathToGrp[p] = grpToGrp[cathToGrp[p]];
923 vectorCopyShort(grpToGrp, (nGroups + 1), grpToGrp);
951 if (cath !=
nullptr) {
955 if (saturate !=
nullptr) {
966 std::vector<PadIdx_t>& pixToRefineIdx,
double Cij[])
975 const double* xInf = pads.
getXInf();
976 const double* yInf = pads.
getYInf();
977 const double* xSup = pads.
getXSup();
978 const double* ySup = pads.
getYSup();
986 printf(
"Pads::refinePads count(new nPads)=%d\n",
count);
989 double* xWestIntegrals =
new double[N];
990 double* xEastIntegrals =
new double[N];
991 double* yNorthIntegrals =
new double[N];
992 double* ySouthIntegrals =
new double[N];
994 double totalChargeInc = 0.0;
996 for (
int i = 0;
i < pixToRefineIdx.size();
i++) {
997 int pixelMaxIdx = pixToRefineIdx[
i];
1001 if (saturate[pixelMaxIdx] == 0) {
1003 saturate[pixelMaxIdx] = 1;
1004 double xOld =
x[pixelMaxIdx];
1005 double yOld =
y[pixelMaxIdx];
1006 double dxOld = dx[pixelMaxIdx];
1007 double dyOld = dy[pixelMaxIdx];
1008 double qOld = q[pixelMaxIdx];
1009 totalChargeInc += (3 * qOld);
1012 x[pixelMaxIdx] = xOld - 0.5 * dxOld;
1013 y[pixelMaxIdx] = yOld + 0.5 * dyOld;
1014 dx[pixelMaxIdx] = 0.5 * dxOld;
1015 dy[pixelMaxIdx] = 0.5 * dyOld;
1017 q[pixelMaxIdx] = qOld;
1024 vectorMultVector(xWestIntegrals, yNorthIntegrals, N, &Cij[N * pixelMaxIdx]);
1028 x[k] = xOld + 0.5 * dxOld;
1029 y[k] = yOld + 0.5 * dyOld;
1030 dx[k] = 0.5 * dxOld;
1031 dy[k] = 0.5 * dyOld;
1038 vectorMultVector(xEastIntegrals, yNorthIntegrals, N, &Cij[N * k]);
1042 x[k] = xOld - 0.5 * dxOld;
1043 y[k] = yOld - 0.5 * dyOld;
1044 dx[k] = 0.5 * dxOld;
1045 dy[k] = 0.5 * dyOld;
1052 vectorMultVector(xWestIntegrals, ySouthIntegrals, N, &Cij[N * k]);
1056 x[k] = xOld + 0.5 * dxOld;
1057 y[k] = yOld - 0.5 * dyOld;
1058 dx[k] = 0.5 * dxOld;
1059 dy[k] = 0.5 * dyOld;
1064 vectorMultVector(xEastIntegrals, ySouthIntegrals, N, &Cij[N * k]);
1069 totalCharge += totalChargeInc;
1071 delete[] xWestIntegrals;
1072 delete[] xEastIntegrals;
1073 delete[] yNorthIntegrals;
1074 delete[] ySouthIntegrals;
1104 printf(
"Pads::refinePads count(new nPads)=%d\n",
count);
1107 double totalChargeInc = 0.0;
1109 for (
int i = 0;
i < localMaxIdx.size();
i++) {
1110 int pixelMaxIdx = localMaxIdx[
i];
1112 printf(
"Refinement i=%d, localMax.q[i]=%f saturate[pixelMaxIdx]=%d\n",
i, localMax.q[
i], saturate[pixelMaxIdx]);
1113 if ((localMax.q[
i] > cut) && (saturate[pixelMaxIdx] == 0)) {
1114 saturate[pixelMaxIdx] = 1;
1115 double xOld =
x[pixelMaxIdx];
1116 double yOld =
y[pixelMaxIdx];
1117 double dxOld = dx[pixelMaxIdx];
1118 double dyOld = dy[pixelMaxIdx];
1119 double qOld = q[pixelMaxIdx];
1120 printf(
"refine on pixel %d\n", pixelMaxIdx);
1121 totalChargeInc += (3 * qOld);
1124 x[pixelMaxIdx] = xOld - 0.5 * dxOld;
1125 y[pixelMaxIdx] = yOld + 0.5 * dyOld;
1126 dx[pixelMaxIdx] = 0.5 * dxOld;
1127 dy[pixelMaxIdx] = 0.5 * dyOld;
1129 q[pixelMaxIdx] = qOld;
1133 x[k] = xOld + 0.5 * dxOld;
1134 y[k] = yOld + 0.5 * dyOld;
1135 dx[k] = 0.5 * dxOld;
1136 dy[k] = 0.5 * dyOld;
1143 x[k] = xOld - 0.5 * dxOld;
1144 y[k] = yOld - 0.5 * dyOld;
1145 dx[k] = 0.5 * dxOld;
1146 dy[k] = 0.5 * dyOld;
1153 x[k] = xOld + 0.5 * dxOld;
1154 y[k] = yOld - 0.5 * dyOld;
1155 dx[k] = 0.5 * dxOld;
1156 dy[k] = 0.5 * dyOld;
1164 totalCharge += totalChargeInc;
1188 printf(
"Pads::refinePads count(new nPads)=%d\n",
count);
1192 for (
int i = 0;
i < N;
i++) {
1195 rPads->x[k] =
x[
i] - 0.5 * dx[
i];
1196 rPads->y[k] =
y[
i] + 0.5 * dy[
i];
1197 rPads->dx[k] = 0.5 * dx[
i];
1198 rPads->dy[k] = 0.5 * dy[
i];
1204 rPads->x[k] =
x[
i] + 0.5 * dx[
i];
1205 rPads->y[k] =
y[
i] + 0.5 * dy[
i];
1206 rPads->dx[k] = 0.5 * dx[
i];
1207 rPads->dy[k] = 0.5 * dy[
i];
1213 rPads->x[k] =
x[
i] - 0.5 * dx[
i];
1214 rPads->y[k] =
y[
i] - 0.5 * dy[
i];
1215 rPads->dx[k] = 0.5 * dx[
i];
1216 rPads->dy[k] = 0.5 * dy[
i];
1222 rPads->x[k] =
x[
i] + 0.5 * dx[
i];
1223 rPads->y[k] =
y[
i] - 0.5 * dy[
i];
1224 rPads->dx[k] = 0.5 * dx[
i];
1225 rPads->dy[k] = 0.5 * dy[
i];
1231 rPads->totalCharge = 4 * totalCharge;
1238 printf(
" - Pads::extractLocalMax on Coarse Pads(extractLocalMax nPads=%d)\n", nPads);
1240 double qMax = vectorMax(q, nPads);
1244 if (neighbors !=
nullptr) {
1254 double morphLaplacian[nPads];
1255 double laplacian[nPads];
1257 vectorSet(morphLaplacian, -1.0, nPads);
1259 Mask_t alreadyDone[nPads];
1260 vectorSetZeroShort(alreadyDone, nPads);
1261 std::vector<PadIdx_t> newPixelIdx;
1263 for (
int i = 0;
i < nPads;
i++) {
1264 if (alreadyDone[
i] == 0) {
1269 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i); *neigh_ptr != -1;
1274 less = (q[
v] <= q[
i]);
1280 cst = (
i ==
v) ? 1.0 : -0.25;
1281 laplacian[
i] += cst * q[
v];
1286 morphLaplacian[
i] = double(nLess) /
count;
1290 " Laplacian i=%d, x=%6.3f, y=%6.3f, dx=%6.3f,dy=%6.3f, q=%6.3f, "
1291 "count=%d, morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight=%6.3f",
1292 i,
x[
i],
y[
i], dx[
i], dy[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
1295 if (morphLaplacian[
i] >= 1.0) {
1299 if (q[
i] > 0.015 * qMax) {
1300 newPixelIdx.push_back(
i);
1304 " Laplacian i=%d, x=%6.3f, y=%6.3f, dx=%6.3f,dy=%6.3f, q=%6.3f, "
1305 "count=%d, morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight=%6.3f",
1306 i,
x[
i],
y[
i], dx[
i], dy[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
1308 printf(
" Selected %d\n",
i);
1313 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i); *neigh_ptr != -1;
1316 alreadyDone[
v] += 1;
1332 int nNewPixels = newPixelIdx.size();
1334 Pads* newPixels =
new Pads(nNewPixels, chamberId);
1335 for (
int i = 0;
i < nNewPixels;
i++) {
1336 newPixels->x[
i] =
x[newPixelIdx[
i]];
1337 newPixels->y[
i] =
y[newPixelIdx[
i]];
1338 newPixels->dx[
i] = dx[newPixelIdx[
i]];
1339 newPixels->dy[
i] = dy[newPixelIdx[
i]];
1340 newPixels->q[
i] = q[newPixelIdx[
i]];
1342 Pads* localMax =
nullptr;
1345 double cutRatio = 0.01;
1346 double qCut = cutRatio * vectorMax(newPixels->q, newPixels->nPads);
1348 localMax =
new Pads(nNewPixels, chamberId);
1349 localMax->setToZero();
1352 printf(
" q Cut-Off %f\n", qCut);
1353 for (
int k = 0; k < nNewPixels; k++) {
1354 if (newPixels->q[k] > qCut) {
1355 localMax->q[k0] = newPixels->q[k];
1356 localMax->x[k0] = newPixels->x[k];
1357 localMax->y[k0] = newPixels->y[k];
1358 localMax->dx[k0] = newPixels->dx[k];
1359 localMax->dy[k0] = newPixels->dy[k];
1360 printf(
" seed selected q=%8.2f, (x,y) = (%8.3f, %8.3f)\n",
1361 localMax->q[k0], localMax->x[k0], localMax->y[k0]);
1365 localMax->nPads = k0;
1366 localMax->nObsPads = k0;
1376 vectorSetShort(
mask, 1, nNewPixels);
1381 for (
int k = 0; k < nNewPixels; k++) {
1384 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh, k);
1385 *neigh_ptr != -1; neigh_ptr++) {
1387 localMax->q[k] += newPixels->q[
v] *
mask[
v];
1388 localMax->x[k] += newPixels->x[
v] * newPixels->q[
v] *
mask[
v];
1389 localMax->y[k] += newPixels->y[
v] * newPixels->q[
v] *
mask[
v];
1393 if (localMax->q[k] > qCut) {
1394 localMax->q[kSelected] = localMax->q[k];
1395 localMax->x[kSelected] = localMax->x[k] / localMax->q[k];
1396 localMax->y[kSelected] = localMax->y[k] / localMax->q[k];
1397 localMax->dx[kSelected] = newPixels->dx[k];
1398 localMax->dy[kSelected] = newPixels->dy[k];
1400 printf(
" seed selected q=%8.2f, (x,y) = (%8.3f, %8.3f)\n",
1401 localMax->q[k], localMax->x[k], localMax->y[k]);
1403 localMaxIdx.push_back(newPixelIdx[k]);
1409 for (
int k = 0; k < nNewPixels; k++) {
1410 localMax->q[k] = newPixels->q[k];
1411 localMax->x[k] = newPixels->x[k];
1412 localMax->y[k] = newPixels->y[k];
1413 localMax->dx[k] = newPixels->dx[k];
1414 localMax->dy[k] = newPixels->dy[k];
1415 printf(
" seed selected q=%8.2f, (x,y) = (%8.3f, %8.3f)\n",
1416 localMax->q[k], localMax->x[k], localMax->y[k]);
1418 kSelected = nNewPixels;
1419 localMax->nPads = kSelected;
1420 localMax->nObsPads = kSelected;
1424 neighbors =
nullptr;
1432bool Pads::assessRemanent(
double xyCheck,
double* xy,
double precision,
int N)
1437 vectorAddScalar(xy, -xyCheck, N, xyDiff);
1440 vectorAbs(xyDiff, N, xyDiff);
1442 int nRemanents = vectorSumShort(
mask, N);
1444 bool remanent = (nRemanents > 1) ?
true : false;
1452 printf(
" - Pads::extractLocalMax on Coarse Pads(extractLocalMax nPads=%d)\n", nPads);
1454 double qMax = vectorMax(q, nPads);
1458 if (neighbors !=
nullptr) {
1468 double morphLaplacian[nPads];
1469 double laplacian[nPads];
1471 vectorSet(morphLaplacian, -1.0, nPads);
1473 Mask_t alreadyDone[nPads];
1474 vectorSetZeroShort(alreadyDone, nPads);
1475 std::vector<PadIdx_t> newPixelIdx;
1477 for (
int i = 0;
i < nPads;
i++) {
1478 if (alreadyDone[
i] == 0) {
1483 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i); *neigh_ptr != -1;
1488 less = (q[
v] <= q[
i]);
1494 cst = (
i ==
v) ? 1.0 : -0.25;
1495 laplacian[
i] += cst * q[
v];
1500 morphLaplacian[
i] = double(nLess) /
count;
1504 " Laplacian i=%d, x=%6.3f, y=%6.3f, dx=%6.3f,dy=%6.3f, q=%6.3f, "
1505 "count=%d, morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight=%6.3f",
1506 i,
x[
i],
y[
i], dx[
i], dy[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
1509 if (morphLaplacian[
i] >= 1.0) {
1513 if (q[
i] > 0.015 * qMax) {
1514 newPixelIdx.push_back(
i);
1518 " Laplacian i=%d, x=%6.3f, y=%6.3f, dx=%6.3f,dy=%6.3f, q=%6.3f, "
1519 "count=%d, morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight=%6.3f",
1520 i,
x[
i],
y[
i], dx[
i], dy[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
1522 printf(
" Selected %d\n",
i);
1527 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i); *neigh_ptr != -1;
1530 alreadyDone[
v] += 1;
1546 int nNewPixels = newPixelIdx.size();
1548 Pads* newPixels =
new Pads(nNewPixels, chamberId);
1549 for (
int i = 0;
i < nNewPixels;
i++) {
1550 newPixels->x[
i] =
x[newPixelIdx[
i]];
1551 newPixels->y[
i] =
y[newPixelIdx[
i]];
1552 newPixels->dx[
i] = dx[newPixelIdx[
i]];
1553 newPixels->dy[
i] = dy[newPixelIdx[
i]];
1554 newPixels->q[
i] = q[newPixelIdx[
i]];
1556 Pads* localMax =
nullptr;
1559 double cutRatio = 0.01;
1560 double qCut = cutRatio * vectorMax(newPixels->q, newPixels->nPads);
1577 printf(
" [extractLocalMaxOnCoarsePads] Start suppressing remanent localMax: nbr Local Max [nNewPixels]=%d\n", nNewPixels);
1580 if (nNewPixels > 3) {
1582 localMax =
new Pads(nNewPixels, chamberId);
1583 localMax->setToZero();
1586 int index[nNewPixels];
1587 for (
int k = 0; k < nNewPixels; k++) {
1590 std::sort(
index, &
index[nNewPixels], [=](
int a,
int b) {
1591 return (newPixels->q[
a] > newPixels->q[
b]);
1596 for (
int k = 0; k < nNewPixels; k++) {
1597 if (
index[k] > -1) {
1600 int idx0 =
index[k0];
1603 double x0 = newPixels->x[idx0];
1604 double y0 = newPixels->y[idx0];
1606 printf(
" Check remanent from loc.max k=%d, (x,y,q)= %f %f %f\n", k,
x0,
y0, newPixels->q[idx0]);
1608 for (
int l = k + 1; l < nNewPixels; l++) {
1609 if (
index[l] > -1) {
1611 printf(
" Case l=%d, (x,y,q)= %f %f %f\n", l, newPixels->x[
index[l]], newPixels->y[
index[l]], newPixels->q[
index[l]]);
1614 bool sameX = (std::abs(newPixels->x[
index[l]] -
x0) < dxMinPadSize);
1615 bool sameY = (std::abs(newPixels->y[
index[l]] -
y0) < dyMinPadSize);
1621 bool realRemanent = assessRemanent(newPixels->y[
index[l]], newPixels->y, dyMinPadSize, nNewPixels);
1627 printf(
" XY-Remanent: remove l=%d, (x,y,q)= %f %f %f\n", l, newPixels->x[
index[l]], newPixels->y[
index[l]], newPixels->q[
index[l]]);
1637 bool realRemanent = assessRemanent(newPixels->x[
index[l]], newPixels->x, dyMinPadSize, nNewPixels);
1641 newPixels->q[idx0] += newPixels->q[
index[l]];
1644 printf(
" YX-Remanent: remove l=%d, (x,y,q)= %f %f %f\n", l, newPixels->x[
index[l]], newPixels->y[
index[l]], newPixels->q[
index[l]]);
1649 printf(
" Keep l=%d, (x,y,q)= %f %f %f\n", l, newPixels->x[
index[l]], newPixels->y[
index[l]], newPixels->q[
index[l]]);
1658 for (
int l = 0; l < k0; l++) {
1667 if (localMax !=
nullptr) {
1675 localMax =
new Pads(nNewPixels, chamberId);
1676 localMax->setToZero();
1687 vectorSetShort(
mask, 1, nNewPixels);
1692 for (
int k = 0; k < nNewPixels; k++) {
1695 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh, k);
1696 *neigh_ptr != -1; neigh_ptr++) {
1698 localMax->q[k] += newPixels->q[
v] *
mask[
v];
1699 localMax->x[k] += newPixels->x[
v] * newPixels->q[
v] *
mask[
v];
1700 localMax->y[k] += newPixels->y[
v] * newPixels->q[
v] *
mask[
v];
1704 if (localMax->q[k] > qCut) {
1705 localMax->q[kSelected] = localMax->q[k];
1706 localMax->x[kSelected] = localMax->x[k] / localMax->q[k];
1707 localMax->y[kSelected] = localMax->y[k] / localMax->q[k];
1708 localMax->dx[kSelected] = newPixels->dx[k];
1709 localMax->dy[kSelected] = newPixels->dy[k];
1711 printf(
" seed selected q=%8.2f, (x,y) = (%8.3f, %8.3f)\n",
1712 localMax->q[k], localMax->x[k], localMax->y[k]);
1714 localMaxIdx.push_back(newPixelIdx[k]);
1720 for (
int k = 0; k < nNewPixels; k++) {
1721 localMax->q[k] = newPixels->q[k];
1722 localMax->x[k] = newPixels->x[k];
1723 localMax->y[k] = newPixels->y[k];
1724 localMax->dx[k] = newPixels->dx[k];
1725 localMax->dy[k] = newPixels->dy[k];
1726 printf(
" seed selected q=%8.2f, (x,y) = (%8.3f, %8.3f)\n",
1727 localMax->q[k], localMax->x[k], localMax->y[k]);
1729 kSelected = nNewPixels;
1730 localMax->nPads = kSelected;
1731 localMax->nObsPads = kSelected;
1735 neighbors =
nullptr;
1745 printf(
" - Pads::extractLocalMax (extractLocalMax nPads=%d)\n", nPads);
1747 double qMax = vectorMax(q, nPads);
1751 if (neighbors !=
nullptr) {
1760 double morphLaplacian[nPads];
1761 double laplacian[nPads];
1763 vectorSet(morphLaplacian, -1.0, nPads);
1764 Mask_t alreadyDone[nPads];
1765 vectorSetZeroShort(alreadyDone, nPads);
1766 std::vector<PadIdx_t> newPixelIdx;
1768 for (
int i = 0;
i < nPads;
i++) {
1769 if (alreadyDone[
i] == 0) {
1774 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i); *neigh_ptr != -1;
1779 less = (q[
v] <= q[
i]);
1785 cst = (
i ==
v) ? 1.0 : -0.125;
1786 laplacian[
i] += cst * q[
v];
1791 morphLaplacian[
i] = double(nLess) /
count;
1795 " Laplacian i=%d, x=%6.3f, y=%6.3f, dx=%6.3f,dy=%6.3f, q=%6.3f, "
1796 "count=%d, morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight=%6.3f",
1797 i,
x[
i],
y[
i], dx[
i], dy[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
1800 if (morphLaplacian[
i] >= 1.0) {
1804 if (q[
i] > 0.015 * qMax) {
1805 newPixelIdx.push_back(
i);
1809 " Laplacian i=%d, x=%6.3f, y=%6.3f, dx=%6.3f,dy=%6.3f, q=%6.3f, "
1810 "count=%d, morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight=%6.3f",
1811 i,
x[
i],
y[
i], dx[
i], dy[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
1813 printf(
" Selected %d\n",
i);
1818 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i); *neigh_ptr != -1;
1821 alreadyDone[
v] += 1;
1835 int nNewPixels = newPixelIdx.size();
1837 Pads* newPixels =
new Pads(nNewPixels, chamberId);
1838 for (
int i = 0;
i < nNewPixels;
i++) {
1839 newPixels->x[
i] =
x[newPixelIdx[
i]];
1840 newPixels->y[
i] =
y[newPixelIdx[
i]];
1841 newPixels->dx[
i] = dx[newPixelIdx[
i]];
1842 newPixels->dy[
i] = dy[newPixelIdx[
i]];
1843 newPixels->q[
i] = q[newPixelIdx[
i]];
1844 localMaxIdx.push_back(newPixelIdx[
i]);
1846 Pads* localMax =
nullptr;
1849 double cutRatio = 0.01;
1850 double qCut = cutRatio * vectorMax(newPixels->q, newPixels->nPads);
1867 printf(
" [extractLocalMax] (medium pads) Starting suppressing remanent Loc. Max nNewPixels=%d\n", nNewPixels);
1870 std::vector<int> newPixelIdx2;
1873 if ((nNewPixels > 3) && ((dxMinPadSize > 2.4) || (dyMinPadSize > 2.4))) {
1875 localMax =
new Pads(nNewPixels, chamberId);
1876 localMax->setToZero();
1879 int index[nNewPixels];
1880 for (
int k = 0; k < nNewPixels; k++) {
1883 std::sort(
index, &
index[nNewPixels], [=](
int a,
int b) {
1884 return (newPixels->q[
a] > newPixels->q[
b]);
1892 for (
int k = 0; k < nNewPixels; k++) {
1893 if (
index[k] > -1) {
1896 int idx0 =
index[k0];
1899 double x0 = newPixels->x[idx0];
1900 double y0 = newPixels->y[idx0];
1901 double dx0 = newPixels->dx[idx0];
1902 double dy0 = newPixels->dy[idx0];
1904 printf(
" Remanent from loc max k=%d, (x,y,q)= %f %f %f (dx, dy)= (%f, %f)\n", k,
x0,
y0, newPixels->q[idx0], dx0, dy0);
1906 for (
int l = k + 1; l < nNewPixels; l++) {
1907 if (
index[l] > -1) {
1908 double dx_ = 0.5 * (dx0 + newPixels->dx[
index[l]]);
1909 double dy_ = 0.5 * (dy0 + newPixels->dy[
index[l]]);
1910 bool sameX = (std::abs(newPixels->x[
index[l]] -
x0) < dx_);
1911 bool sameY = (std::abs(newPixels->y[
index[l]] -
y0) < dy_);
1918 bool realRemanent = assessRemanent(newPixels->y[
index[l]], newPixels->y, dy_, nNewPixels);
1924 printf(
" XY-Remanent: remove l=%d, (x,y,q)= %f %f %f\n", l, newPixels->x[
index[l]], newPixels->y[
index[l]], newPixels->q[
index[l]]);
1934 bool realRemanent = assessRemanent(newPixels->x[
index[l]], newPixels->x, dx_, nNewPixels);
1938 newPixels->q[idx0] += newPixels->q[
index[l]];
1941 printf(
" YX-Remanent: remove l=%d, (x,y,q)= %f %f %f\n", l, newPixels->x[
index[l]], newPixels->y[
index[l]], newPixels->q[
index[l]]);
1952 printf(
" Local. max status before to suppress remanents\n");
1953 for (
int l = 0; l < k0; l++) {
1959 if (localMax !=
nullptr) {
1965 for (
int l = 0; l < k0; l++) {
1967 newPixelIdx2.push_back(newPixelIdx[idx]);
1977 newPixelIdx2 = newPixelIdx;
2006 for (
int l = 0; l < nNewPixels; l++) {
2007 PadIdx_t pixelIdx = newPixelIdx2[l];
2011 localMax->q[l] = 0.0;
2012 localMax->x[l] = 0.0;
2013 localMax->y[l] = 0.0;
2015 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh, pixelIdx);
2016 *neigh_ptr != -1; neigh_ptr++) {
2018 localMax->q[l] += q[
v];
2019 localMax->x[l] +=
x[
v] * q[
v];
2020 localMax->y[l] +=
y[
v] * q[
v];
2026 if (localMax->q[l] > qCut) {
2028 localMax->x[kSelected] = localMax->x[l] / localMax->q[l];
2029 localMax->y[kSelected] = localMax->y[l] / localMax->q[l];
2030 localMax->q[kSelected] = localMax->q[l] / nNeigh;
2031 localMax->dx[kSelected] = dx[pixelIdx];
2032 localMax->dy[kSelected] = dy[pixelIdx];
2034 printf(
" [extractLocalMax] final seed selected (x,y) = (%8.3f, %8.3f), q=%8.2f\n",
2035 localMax->x[l], localMax->y[l], localMax->q[l]);
2042 localMax->nPads = kSelected;
2043 localMax->nObsPads = kSelected;
2047 for (
int k = 0; k < nNewPixels; k++) {
2050 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neighbors, idxMax);
2051 *neigh_ptr != -1; neigh_ptr++) {
2055 localMaxIdx.push_back(
v);
2056 printf(
"??? neigbors of idMax=%d: %d to be refined (charge %f/%f)\n", idxMax,
v, q[
v], q[idxMax]);
2064 neighbors =
nullptr;
2076 printf(
" - ClipOnLocalMax (extractLocalMax Flag=%d, nPads=%d)\n",
2081 double relativeNoise = 0.00;
2082 double qMax = vectorMax(q, nPads);
2088 }
else if (neighbors ==
nullptr) {
2094 double morphLaplacian[nPads];
2095 double laplacian[nPads];
2097 vectorSet(morphLaplacian, -1.0, nPads);
2098 Mask_t alreadySelect[nPads];
2099 vectorSetZeroShort(alreadySelect, nPads);
2100 std::vector<PadIdx_t> newPixelIdx;
2101 for (
int i = 0;
i < nPads;
i++) {
2106 cutoff = relativeNoise * q[
i];
2107 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i); *neigh_ptr != -1;
2111 nLess += (q[
v] < (q[
i] - cutoff));
2115 cst = (
i ==
v) ? 1.0 : -0.125;
2116 laplacian[
i] += cst * q[
v];
2119 morphLaplacian[
i] = double(nLess) / (
count - 1);
2123 " Laplacian i=%d, x[i]=%6.3f, y[i]=%6.3f, z[i]=%6.3f, count=%d, "
2124 "morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight[i]=%6.3f\n",
2125 i,
x[
i],
y[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
2128 if (morphLaplacian[
i] >= 1.0) {
2132 if ((q[
i] > 0.015 * qMax) || (fabs(laplacian[
i]) > (0.5 * q[
i]))) {
2133 newPixelIdx.push_back(
i);
2136 " Laplacian i=%d, x[i]=%6.3f, y[i]=%6.3f, z[i]=%6.3f, "
2137 "count=%d, morphLapl[i]=%6.3f, lapl[i]=%6.3f, weight[i]=%6.3f",
2138 i,
x[
i],
y[
i], q[
i],
count, morphLaplacian[
i], laplacian[
i],
2140 printf(
" Selected %d\n",
i);
2146 printf(
" Selected neighbors of i=%d: ",
i);
2148 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i);
2149 *neigh_ptr != -1; neigh_ptr++) {
2151 if (alreadySelect[
v] == 0) {
2152 alreadySelect[
v] = 1;
2153 newPixelIdx.push_back(
v);
2166 int nNewPixels = newPixelIdx.size();
2167 Pads* newPixels =
new Pads(nNewPixels, chamberId);
2168 for (
int i = 0;
i < nNewPixels;
i++) {
2169 newPixels->x[
i] =
x[newPixelIdx[
i]];
2170 newPixels->y[
i] =
y[newPixelIdx[
i]];
2171 newPixels->dx[
i] = dx[newPixelIdx[
i]];
2172 newPixels->dy[
i] = dy[newPixelIdx[
i]];
2173 newPixels->q[
i] = q[newPixelIdx[
i]];
2175 Pads* localMax =
nullptr;
2179 double cutRatio = 0.01;
2180 double qCut = cutRatio * vectorMax(newPixels->q, newPixels->nPads);
2185 localMax =
new Pads(nNewPixels, chamberId);
2186 localMax->setToZero();
2188 int index[nNewPixels];
2189 for (
int k = 0; k < nNewPixels; k++) {
2192 std::sort(
index, &
index[nNewPixels], [=](
int a,
int b) {
2193 return (newPixels->q[
a] > newPixels->q[
b]);
2199 vectorSetShort(
mask, 1, nNewPixels);
2201 for (
int k = 0; k < nNewPixels; k++) {
2203 for (
PadIdx_t* neigh_ptr = getNeighborListOf(neigh, k);
2204 *neigh_ptr != -1; neigh_ptr++) {
2206 localMax->q[k] += newPixels->q[
v] *
mask[
v];
2207 localMax->x[k] += newPixels->x[
v] * newPixels->q[
v] *
mask[
v];
2208 localMax->y[k] += newPixels->y[
v] * newPixels->q[
v] *
mask[
v];
2211 if (localMax->q[k] > qCut) {
2212 localMax->q[kSelected] = localMax->q[k];
2213 localMax->x[kSelected] = localMax->x[k] / localMax->q[k];
2214 localMax->y[kSelected] = localMax->y[k] / localMax->q[k];
2215 localMax->dx[kSelected] = newPixels->dx[k];
2216 localMax->dy[kSelected] = newPixels->dy[k];
2218 printf(
" add a seed q=%9.4f, (x,y) = (%9.4f, %9.4f)\n",
2219 localMax->q[k], localMax->x[k], localMax->q[k]);
2225 localMax->nPads = kSelected;
2226 localMax->nObsPads = kSelected;
2239 printf(
"Neighbors %d\n", N);
2240 for (
int i = 0;
i < N;
i++) {
2241 printf(
" neigh of i=%2d: ",
i);
2242 for (
const PadIdx_t* neigh_ptr = getNeighborListOf(neigh,
i);
2243 *neigh_ptr != -1; neigh_ptr++) {
2253 printf(
"%s\n", title);
2254 printf(
"print pads nPads=%4d nObsPads=%4d mode=%1d\n", pads.nPads, pads.nObsPads, (
int)pads.
mode);
2256 printf(
" i x y dx dy q\n");
2257 for (
int i = 0;
i < pads.nPads;
i++) {
2258 printf(
" %3d %7.3f %7.3f %7.3f %7.3f %9.2f\n",
i,
2259 pads.x[
i], pads.dx[
i], pads.y[
i], pads.dy[
i], pads.q[
i]);
2262 printf(
" i xInf xSup yInf ySup q\n");
2263 for (
int i = 0;
i < pads.nPads;
i++) {
2264 printf(
" %3d %7.3f %7.3f %7.3f %7.3f %9.2f\n",
2265 i, pads.x[
i], pads.dx[
i], pads.y[
i], pads.dy[
i], pads.q[
i]);
const double * getX() const
double getMeanTotalCharge()
static void printNeighbors(const PadIdx_t *neigh, int N)
const double * getXSup() const
Pads(int N, int chId, PadMode mode=PadMode::xydxdyMode)
void refineLocalMaxAndUpdateCij(const Pads &pads, std::vector< PadIdx_t > &localMaxIdx, double Cij[])
@ xydxdyMode
x, y, dx, dy pad coordinates
@ xyInfSupMode
xInf=x, xSup=dx, yInf=y, ySup=dy pad coordinates
void setCathodes(Mask_t cath_)
Pads * extractLocalMax(std::vector< PadIdx_t > &localMaxIdx, double dxMinPadSize, double dyMinPadSize)
static int getNbrOfPads(const Pads *pads)
void setSaturate(Mask_t val)
void setCharges(double c)
int addIsolatedPadInGroups(Mask_t *cathToGrp, Mask_t *grpToGrp, int nGroups)
const double * getCharges() const
Pads * selectPads(int *index, int k)
Pads * extractLocalMaxOnCoarsePads(std::vector< PadIdx_t > &localMaxIdx)
void refineLocalMax(Pads &localMax, std::vector< PadIdx_t > &localMaxIdx)
const double * getYInf() const
const double * getY() const
Pads * extractLocalMaxOnCoarsePads_Remanent(std::vector< PadIdx_t > &localMaxIdx, double dxMinPadSize, double dyMinPadSize)
const double * getXInf() const
PadIdx_t * getFirstNeighbors()
PadIdx_t * buildKFirstsNeighbors(int kernelSize)
Pads * clipOnLocalMax(bool extractLocalMax)
double updateTotalCharge()
static constexpr double epsilonGeometry
int removePads(double qCut)
const double * getYSup() const
static void printPads(const char *title, const Pads &pads)
GLuint GLuint GLfloat weight
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
GLenum GLint GLint * precision
GLuint GLfloat GLfloat y0
void vectorPrintShort(const char *str, const short *x, int K)
void compute1DPadIntegrals(const double *xyInf, const double *xySup, int N, double xy0, int axe, int chamberId, double *integrals)
void vectorPrint(const char *str, const double *x, int K)
ClusterConfig clusterConfig
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
double minChargeOfClusterPerCathode
VerboseMode EMLocalMaxLog
@ info
Describes main steps and high level behaviors.
@ detail
Describes in detail.
VerboseMode processingLog
VerboseMode padMappingLog