298 {
299
301
302
304
305
311 m_residuals = std::vector<double>(2 * measurements.size(), 0.);
313 bool haveMeasurement = false;
314 bool haveVertex = false;
315 int numberAlignments = 0;
316 int numberEnergyDeposits = 0;
317 int numberParameters = 5;
318 int numberScatterers = 0;
320
321
323 std::vector<FitMeasurement*>::iterator
m = measurements.begin();
324 if ((**m).isVertex()) {
325 haveVertex = true;
327
328
332 if ((**m).is2Dimensional()) {
334 (**m).derivative2(&
m_fitMatrix.derivative[row][0]);
336 }
338 }
339
340
341 for (;
m != measurements.end(); ++
m) {
342 if (!(**m).numberDoF())
343 continue;
344
345
346 if ((**m).isAlignment())
347 continue;
348
349
350 if (!haveMeasurement) {
351 if ((**m).isPositionMeasurement()) {
352 haveMeasurement = true;
353 for (
int i = 0;
i < numberParameters; ++
i)
356 } else if (!haveVertex && (**m).isScatterer()) {
357 (**m).numberDoF(0);
358 continue;
359 } else {
360
361 }
362 }
363
364
365
366 if ((**m).isDrift())
368
369
370 if ((**m).isEnergyDeposit()) {
371
372
374 (**m).numberDoF(0);
375 continue;
376 } else {
379
380
382 m_parameters->fitEnergyDeposit((**m).minEnergyDeposit());
383 ++numberEnergyDeposits;
384 ++numberParameters;
385 }
386 }
387 if ((**m).isScatterer())
388 ++numberScatterers;
389
390
394 if ((**m).is2Dimensional()) {
395 (**m).derivative2(&
m_fitMatrix.derivative[row][0]);
397 }
398 }
399
400
401 for (m = measurements.begin(); m != measurements.end(); ++m) {
402 if (!(**m).isAlignment())
403 continue;
404 ++numberAlignments;
405
406
410 if ((**m).is2Dimensional()) {
411 (**m).derivative2(&
m_fitMatrix.derivative[row][0]);
413 }
414 }
415
416
417 parameters->numberAlignments(numberAlignments);
418 parameters->numberScatterers(numberScatterers);
419 bool afterCalo = false;
420 int lastRow = 0;
422 for (m = measurements.begin(); m != measurements.end(); ++m) {
423 if ((**m).numberDoF()) {
424 if ((**m).isEnergyDeposit()) {
425 afterCalo = true;
426
427 } else if ((**m).isScatterer()) {
431 parameters->addScatterer((**m).scattererPhi(), (**m).scattererTheta());
433 continue;
434 } else if ((**m).isAlignment()) {
435
436 continue;
437 }
440 }
442 }
443
446 if (afterCalo) {
447
449 }
450
451
452 if (numberAlignments) {
454 unsigned alignmentParameter = 0;
455 int firstAlignmentRow = 0;
456 int firstAlignment2Row = 0;
457 for (m = measurements.begin(); m != measurements.end(); ++m) {
458 if ((**m).alignmentParameter()) {
459 if ((**m).alignmentParameter() > alignmentParameter) {
460 if (!firstAlignmentRow)
461 firstAlignmentRow =
row;
462 }
463 if ((**m).alignmentParameter2()) {
464 if (!firstAlignment2Row)
465 firstAlignment2Row =
row;
466 }
467 }
468 if (!(**m).numberDoF())
469 continue;
470 if (!(**m).isAlignment()) {
471 row += (**m).numberDoF();
472 continue;
473 }
474
476 (**m).alignmentAngle(), (**m).alignmentOffset());
481 (**m).firstParameter(numberParameters);
482 numberParameters += 2;
483 alignmentParameter =
parameters->numberAlignments();
484 (**m).alignmentParameter(alignmentParameter);
485 (**m).lastParameter(numberParameters, afterCalo);
486
487
488
489
490
491 }
492 }
493
494
496 parameters->numberParameters(numberParameters);
497
498
500
501
502 int fitCode = 0;
503
504
505 if (2 * measurements.size() >
mxmeas)
506 fitCode = 2;
507 if (numberParameters >
mxparam)
508 fitCode = 3;
510 fitCode = 4;
511 if (numberEnergyDeposits > 1)
512 fitCode = 12;
513 if (fitCode)
514 return fitCode;
515
516
518 for (m = measurements.begin(); m != measurements.end(); ++m) {
519 if (!(**m).isPositionMeasurement() || (**m).numberDoF() > 1)
520 continue;
521 if (!(**m).numberDoF()) {
522 for (
int i = 0;
i != numberParameters; ++
i)
527 }
528 for (
int i = 0;
i != numberParameters; ++
i)
530 (**m).derivative2(&
m_fitMatrix.derivative[row][0]);
532 }
533
534
536 for (int param = 0; param < numberParameters; ++param) {
538 }
539 }
540
541
544
545
548
549
555
556
557
558
561 }
562
563
565 fitCode = 13;
566
567 return fitCode;
568}
std::vector< double > m_residuals
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.