272 {
273
274 int icode = 0;
276
277 CLHEP::HepVector& digits = tResult.getDigRef();
278 CLHEP::HepVector& fitAmp = tResult.getParamRef();
279 CLHEP::HepVector& fitErr = tResult.getErrRef();
280
281 double& chisqRef = tResult.getChi2Ref();
282 int& Npar = tResult.getNparRef();
283 int Namp = Npar - 1;
284 std::vector<int>& vcross = tResult.getVcrossRef();
285 int& iFitIndex = tResult.getFitIndexRef();
287
288 std::cout << " digits=";
290 std::cout << std::format(" {:>6.2g}", digits[i]);
291 }
292 std::cout << std::endl;
293 }
294
295
297 for (int iamp = 0; iamp < Namp; iamp++) {
298 tResult.addCross(iamp);
299 }
300
301
302 Namp = Npar - 1;
303 if (
m_debug) tResult.snapShot(0);
304
305
306 iFitIndex = -1;
307 chisqRef = 999.;
308
309
310
311 icode = -1;
312
313 int Npass = 0;
314 while (Npar > 1) {
315 Npass += 1;
317 std::cout <<
" FilterManager.FitDigits2, while loop. Npar=" << Npar <<
", NParamMax=" <<
m_nParamMax << std::endl;
318
320 if (
m_debug) std::cout <<
" Npar=" << Npar <<
", iFitIndex=" << iFitIndex << std::endl;
321 std::vector<TileFitter>& vFitter =
m_vNpFitter[Npar - 2];
322 TileFitter& tileFitter = vFitter[iFitIndex];
323
324 tileFitter.
fitAmp(tResult,
false);
325 if (
m_debug) tResult.snapShot(2);
326
327 if (Npar <= 2) {
328 icode = 3;
329 break;
330 }
331
332
333
334 const int Ndim = 12;
335 double chiAmp[Ndim] = {0};
336 int iAmp[Ndim] = {0};
337 int Npile = 0;
338 for (
int i = 2;
i < Npar;
i++) {
339 chiAmp[Npile] = fitAmp[
i] / fitErr[
i];
340 iAmp[Npile] = vcross[
i - 1];
342 std::cout <<
" set chiAmp: i=" <<
i <<
", iAmp=" << iAmp[Npile] <<
", chi=" << chiAmp[Npile] << std::endl;
343 Npile += 1;
344 }
345 int ndrop = 0;
346 int crdrop = 0;
347 int ndropMax = 4;
348 while (ndrop < ndropMax) {
349 if (
m_debug) std::cout <<
" top of drop loop. ndrop=" << ndrop <<
", Npass=" << Npass << std::endl;
351
352 int idrop = -1;
353 for (
int i = 0;
i < Npile;
i++) {
354 if (iAmp[i] < 0) continue;
355 if (chiAmp[i] > chiMin) continue;
359 }
361 std::cout << " end of Npile loop. idrop=" << idrop << ", crdrop=" << crdrop << ", ndrop=" << ndrop
362 << std::endl;
363 if (idrop > -1) {
364 tResult.dropCross(crdrop);
365 ndrop += 1;
366 iAmp[idrop] = -iAmp[idrop];
367 icode = 1;
369 std::cout << " ndrop=" << ndrop << ", idrop=" << idrop << ", crdrop=" << crdrop << ", chiMin=" << chiMin
370 << std::endl;
371 } else {
372 icode = 6;
373 break;
374 }
375 if (
m_debug) std::cout <<
"FitDig2: Npass=" << Npass <<
", ndrop=" << ndrop << std::endl;
376 }
377 if (
m_debug) std::cout <<
" have fallen out of drop loop. ndrop=" << ndrop <<
", Npass=" << Npass << std::endl;
378 if (ndrop == 0) {
379 icode = 0;
380 break;
381 }
382 }
383
385 std::cout << " TileFilterManager: End of pass loop. icode =" << icode << ", Npar=" << Npar << ", Npass=" << Npass
386 << std::endl;
387 tResult.snapShot(2);
388 }
389 return icode;
390}