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