ATLAS Offline Software
Loading...
Searching...
No Matches
MuonExperimental::Gx2Fitter< propagator_t, traj_t > Class Template Reference

Global Chi Square fitter (GX2F) implementation. More...

#include <Chi2Fitter.h>

Collaboration diagram for MuonExperimental::Gx2Fitter< propagator_t, traj_t >:

Classes

class  GX2FActor
 Propagator Actor plugin for the GX2F. More...

Public Member Functions

 Gx2Fitter (const propagator_t &pPropagator, std::unique_ptr< const Logger > log=getDefaultLogger("Gx2Fitter", Logging::INFO))
 Constructor for the Global Chi-Square Fitter.
template<typename source_link_iterator_t, TrackContainerFrontend track_container_t>
requires (!std::is_same_v<Gx2fNavigator, DirectNavigator>)
Result< typename track_container_t::TrackProxy > fit (source_link_iterator_t it, source_link_iterator_t end, const BoundTrackParameters &sParameters, const Gx2FitterOptions< traj_t > &gx2fOptions, track_container_t &trackContainer) const
 Fit implementation.

Private Types

using Gx2fNavigator = typename propagator_t::Navigator
 The navigator type.

Private Member Functions

const Logger & logger () const

Private Attributes

propagator_t m_propagator
 The propagator for the transport and material update.
std::unique_ptr< const Logger > m_logger
 The logger instance.
std::unique_ptr< const Logger > m_actorLogger
std::unique_ptr< const Logger > m_addToSumLogger

Static Private Attributes

static constexpr auto kInvalid = kTrackIndexInvalid

Detailed Description

template<typename propagator_t, typename traj_t>
class MuonExperimental::Gx2Fitter< propagator_t, traj_t >

Global Chi Square fitter (GX2F) implementation.

Template Parameters
propagator_tType of the propagation class

TODO Write description

Definition at line 713 of file Chi2Fitter.h.

Member Typedef Documentation

◆ Gx2fNavigator

template<typename propagator_t, typename traj_t>
using MuonExperimental::Gx2Fitter< propagator_t, traj_t >::Gx2fNavigator = typename propagator_t::Navigator
private

The navigator type.

Definition at line 715 of file Chi2Fitter.h.

Constructor & Destructor Documentation

◆ Gx2Fitter()

template<typename propagator_t, typename traj_t>
MuonExperimental::Gx2Fitter< propagator_t, traj_t >::Gx2Fitter ( const propagator_t & pPropagator,
std::unique_ptr< const Logger > log = getDefaultLogger("Gx2Fitter< propagator_t, traj_t >", Logging::INFO) )
inlineexplicit

Constructor for the Global Chi-Square Fitter.

Initializes the fitter with a propagator and optional logger. The fitter uses iterative fitting with a linear equation system to minimize chi-squared including multiple scattering effects.

Parameters
pPropagatorThe propagator instance for track propagation
_loggerLogger instance for debugging output (optional)

Definition at line 728 of file Chi2Fitter.h.

Global Chi Square fitter (GX2F) implementation.
Definition Chi2Fitter.h:713
propagator_t m_propagator
The propagator for the transport and material update.
Definition Chi2Fitter.h:735
std::unique_ptr< const Logger > m_logger
The logger instance.
Definition Chi2Fitter.h:738

Member Function Documentation

◆ fit()

template<typename propagator_t, typename traj_t>
template<typename source_link_iterator_t, TrackContainerFrontend track_container_t>
requires (!std::is_same_v<Gx2fNavigator, DirectNavigator>)
Result< typename track_container_t::TrackProxy > MuonExperimental::Gx2Fitter< propagator_t, traj_t >::fit ( source_link_iterator_t it,
source_link_iterator_t end,
const BoundTrackParameters & sParameters,
const Gx2FitterOptions< traj_t > & gx2fOptions,
track_container_t & trackContainer ) const
inline

Fit implementation.

Template Parameters
source_link_iterator_tIterator type used to pass source links
track_container_tType of the track container backend
holder_tType defining track container backend ownership
Parameters
itBegin iterator for the fittable uncalibrated measurements
endEnd iterator for the fittable uncalibrated measurements
sParametersThe initial track parameters
gx2fOptionsGx2FitterOptions steering the fit
trackContainerInput track container storage to append into
Note
The input measurements are given in the form of SourceLink s. It's the calibrators job to turn them into calibrated measurements used in the fit.
Returns
the output as an output track

Actual Fitting /////////////////////////////////////////////////////////

Move back the material map

Finish Fitting /////////////////////////////////////////////////////////

Actual MATERIAL Fitting ////////////////////////////////////////////////

Finish MATERIAL Fitting ////////////////////////////////////////////////

Definition at line 1158 of file Chi2Fitter.h.

1164 {
1165 // Preprocess Measurements (SourceLinks -> map)
1166 // To be able to find measurements later, we put them into a map.
1167 // We need to copy input SourceLinks anyway, so the map can own them.
1168 ACTS_VERBOSE("Preparing " << std::distance(it, end)
1169 << " input measurements");
1171
1172 for (; it != end; ++it) {
1173 inputMeasurements.try_emplace(gx2fOptions.extensions.surfaceAccessor(*it),
1174 *it);
1175 }
1176
1177 using GX2FResult = typename GX2FActor::result_type;
1179
1181
1183 params.covariance() = BoundMatrix::Identity();
1184 // params.
1185 double chi2sum = 0;
1187
1188 // We need to create a temporary track container. We create several times a
1189 // new track and delete it after updating the parameters. However, if we
1190 // would work on the externally provided track container, it would be
1191 // difficult to remove the correct track, if it contains more than one.
1196
1197 // Create an index of the 'tip' of the track stored in multitrajectory. It
1198 // is needed outside the update loop. It will be updated with each iteration
1199 // and used for the final track
1201
1202 // The materialMap stores for each visited surface their scattering
1203 // properties
1205
1206 // This will be filled during the updates with the final covariance of the
1207 // track parameters.
1209
1210 ACTS_VERBOSE("Initial parameters: " << params.parameters().transpose());
1211
1213 ACTS_DEBUG("Start to iterate");
1214
1215 // Iterate the fit and improve result. Abort after n steps or after
1216 // convergence.
1217 // nUpdate is initialized outside to save its state for the track.
1218 std::size_t nUpdate = 0;
1219 for (nUpdate = 0; nUpdate < gx2fOptions.nUpdateMax; ++nUpdate) {
1220 ACTS_DEBUG("nUpdate = " << nUpdate + 1 << "/" << gx2fOptions.nUpdateMax);
1221
1222 // set up propagator and co
1223 PropagatorOptions propagatorOptions{gx2fOptions.propagatorPlainOptions};
1224
1225 // Add the measurement surface as external surface to the navigator.
1226 // We will try to hit those surface by ignoring boundary checks.
1227 for (const auto& [surface, _] : inputMeasurements) {
1228 propagatorOptions.navigation.registerMeasurementSurface(*surface);
1229 }
1230
1231 auto& gx2fActor = propagatorOptions.actorList.template get<GX2FActor>();
1232 gx2fActor.inputMeasurements = &inputMeasurements;
1233 if (gx2fOptions.includeMaterialInIter) {
1234 gx2fActor.doMultipleScattering = gx2fOptions.doMultipleScattering;
1235 gx2fActor.doEnergyLoss = gx2fOptions.doEnergyLoss;
1236 gx2fActor.scatteringCutOff = gx2fOptions.scatteringCutOff;
1237 gx2fActor.elossCutOff = gx2fOptions.elossCutOff;
1238 }
1239 gx2fActor.extensions = gx2fOptions.extensions;
1240 gx2fActor.calibrationContext = &gx2fOptions.calibrationContext.get();
1241 gx2fActor.actorLogger = m_actorLogger.get();
1242 gx2fActor.startParameters = &params;
1243
1245
1247 m_propagator.initialize(propagatorState, params, nullptr);
1248 if (!propagatorInitResult.ok()) {
1249 ACTS_DEBUG("Propagation initialization failed: "
1250 << propagatorInitResult.error());
1251 return propagatorInitResult.error();
1252 }
1253
1254 auto& r = propagatorState.template get<Gx2FitterResult<traj_t>>();
1255 r.fittedStates = &trajectoryTempBackend;
1256 r.materialMap = std::move(materialMap);
1257
1258 // Clear the track container. It could be more performant to update the
1259 // existing states, but this needs some more thinking.
1260 trackContainerTemp.clear();
1261
1262 // Run the fitter
1264
1265 auto result =
1267 propagatorOptions, false);
1268
1269 if (!result.ok()) {
1270 ACTS_DEBUG("Propagation failed: " << result.error());
1271 return result.error();
1272 }
1273
1274 // TODO Improve Propagator + Actor [allocate before loop], rewrite
1275 // makeMeasurements
1276 auto& propRes = *result;
1279 materialMap = std::move(gx2fResult.materialMap);
1280
1281 auto track = trackContainerTemp.makeTrack();
1282 tipIndex = gx2fResult.lastMeasurementIndex;
1283
1284 // It could happen, that no measurements were found. Then the track would
1285 // be empty and the following operations would be invalid. Usually, this
1286 // only happens during the first iteration, due to bad initial parameters.
1287 if (tipIndex == kInvalid) {
1288 ACTS_INFO("Did not find any measurements in nUpdate "
1289 << nUpdate + 1 << "/" << gx2fOptions.nUpdateMax);
1291 }
1292
1293 track.tipIndex() = tipIndex;
1294 track.linkForward();
1295
1296 // System that we fill with the information gathered by the actor and
1297 // evaluate later
1298 Gx2fSystem extendedSystem{gx2fResult.materialParamIndices.back()};
1299
1300 // This vector stores the IDs for each visited material in order. We use
1301 // it later for updating the scattering angles. We cannot use
1302 // materialMap directly, since we cannot guarantee, that we will visit
1303 // all stored material in each propagation.
1305
1307 gx2fResult.materialParamIndices, geoIdVector,
1309
1310 chi2sum = extendedSystem.chi2();
1311
1312 // This check takes into account the evaluated dimensions of the
1313 // measurements. To fit, we need at least NDF+1 measurements. However, we
1314 // count n-dimensional measurements for n measurements, reducing the
1315 // effective number of needed measurements. We might encounter the case,
1316 // where we cannot use some (parts of a) measurements, maybe if we do not
1317 // support that kind of measurement. This is also taken into account here.
1318 // We skip the check during the first iteration, since we cannot guarantee
1319 // to hit all/enough measurement surfaces with the initial parameter
1320 // guess.
1321 // We skip the check during the first iteration, since we cannot guarantee
1322 // to hit all/enough measurement surfaces with the initial parameter
1323 // guess.
1324 if ((nUpdate > 0) && !extendedSystem.isWellDefined()) {
1325 ACTS_INFO("Not enough measurements. Require "
1326 << extendedSystem.findRequiredNdf() + 1 << ", but only "
1327 << extendedSystem.ndf() << " could be used.");
1329 }
1330
1333
1334 ACTS_VERBOSE("aMatrix:\n"
1335 << extendedSystem.aMatrix() << "\n"
1336 << "bVector:\n"
1337 << extendedSystem.bVector() << "\n"
1338 << "deltaParamsExtended:\n"
1339 << deltaParamsExtended << "\n"
1340 << "oldChi2sum = " << oldChi2sum << "\n"
1341 << "chi2sum = " << extendedSystem.chi2());
1342
1343 if ((gx2fOptions.relChi2changeCutOff != 0) && (nUpdate > 0) &&
1344 (std::abs(extendedSystem.chi2() / oldChi2sum - 1) <
1345 gx2fOptions.relChi2changeCutOff)) {
1346 ACTS_DEBUG("Abort with relChi2changeCutOff after "
1347 << nUpdate + 1 << "/" << gx2fOptions.nUpdateMax
1348 << " iterations.");
1350 break;
1351 }
1352
1353 if (extendedSystem.chi2() > oldChi2sum + 1e-5) {
1354 ACTS_DEBUG("chi2 not converging monotonically in update " << nUpdate);
1355 }
1356
1357 // If this is the final iteration, update the covariance and break.
1358 // Otherwise, we would update the scattering angles too much.
1359 if (nUpdate == gx2fOptions.nUpdateMax - 1) {
1360 // Since currently most of our tracks converge in 4-5 updates, we want
1361 // to set nUpdateMax higher than that to guarantee convergence for most
1362 // tracks. In cases, where we set a smaller nUpdateMax, it's because we
1363 // want to investigate the behaviour of the fitter before it converges,
1364 // like in some unit-tests.
1365 if (gx2fOptions.nUpdateMax > 5) {
1366 ACTS_INFO("Did not converge in " << gx2fOptions.nUpdateMax
1367 << " updates.");
1369 }
1370
1372 break;
1373 }
1374
1376 ACTS_VERBOSE("Updated parameters: " << params.parameters().transpose());
1377
1378 oldChi2sum = extendedSystem.chi2();
1379 }
1380 ACTS_DEBUG("Iterations finished");
1381 ACTS_VERBOSE("Final parameters: " << params.parameters().transpose());
1382 ACTS_VERBOSE("Final scattering angles and energy loss:");
1383 for (const auto& [key, value] : materialMap) {
1384 if (!value.materialIsValid()) {
1385 continue;
1386 }
1387 ACTS_VERBOSE(" ( " << value.deltaTheta() << " | " << value.deltaPhi()
1388 << "|" << value.lostEnergy() << " )");
1389 }
1391
1393 if (!gx2fOptions.includeMaterialInIter &&
1394 (gx2fOptions.doEnergyLoss || gx2fOptions.doMultipleScattering)) {
1395 ACTS_DEBUG("Start to evaluate material");
1396
1397 // Set up the propagator
1398 PropagatorOptions propagatorOptions{gx2fOptions.propagatorPlainOptions};
1399
1400 // Add the measurement surface as external surface to the navigator.
1401 // We will try to hit those surface by ignoring boundary checks.
1402 for (const auto& [surface, _] : inputMeasurements) {
1403 propagatorOptions.navigation.registerMeasurementSurface(*surface);
1404 }
1405
1406 auto& gx2fActor = propagatorOptions.actorList.template get<GX2FActor>();
1407 gx2fActor.inputMeasurements = &inputMeasurements;
1408 gx2fActor.doMultipleScattering = gx2fOptions.doMultipleScattering;
1409 gx2fActor.doEnergyLoss = gx2fOptions.doEnergyLoss;
1410 gx2fActor.extensions = gx2fOptions.extensions;
1411 gx2fActor.calibrationContext = &gx2fOptions.calibrationContext.get();
1412 gx2fActor.actorLogger = m_actorLogger.get();
1413 gx2fActor.startParameters = &params;
1414 gx2fActor.scatteringCutOff = gx2fOptions.scatteringCutOff;
1415 gx2fActor.elossCutOff = gx2fOptions.elossCutOff;
1416
1418
1420 m_propagator.initialize(propagatorState, params, nullptr);
1421 if (!propagatorInitResult.ok()) {
1422 ACTS_DEBUG("Propagation initialization failed: "
1423 << propagatorInitResult.error());
1424 return propagatorInitResult.error();
1425 }
1426
1427 auto& r = propagatorState.template get<Gx2FitterResult<traj_t>>();
1428 r.fittedStates = &trajectoryTempBackend;
1429 r.materialMap = std::move(materialMap);
1430
1431 // Clear the track container. It could be more performant to update the
1432 // existing states, but this needs some more thinking.
1433 trackContainerTemp.clear();
1434
1435 // Run the fitter
1437
1438 auto result =
1440 propagatorOptions, false);
1441
1442 if (!result.ok()) {
1443 ACTS_DEBUG("Propagation failed: " << result.error());
1444 return result.error();
1445 }
1446
1447 // TODO Improve Propagator + Actor [allocate before loop], rewrite
1448 // makeMeasurements
1449 auto& propRes = *result;
1451 materialMap = std::move(gx2fResult.materialMap);
1452 auto track = trackContainerTemp.makeTrack();
1453 tipIndex = gx2fResult.lastMeasurementIndex;
1454
1455 // It could happen, that no measurements were found. Then the track would
1456 // be empty and the following operations would be invalid. Usually, this
1457 // only happens during the first iteration, due to bad initial parameters.
1458 if (tipIndex == kInvalid) {
1459 ACTS_INFO("Did not find any measurements in material fit.");
1461 }
1462
1463 track.tipIndex() = tipIndex;
1464 track.linkForward();
1465
1466 // System that we fill with the information gathered by the actor and
1467 // evaluate later
1468 Gx2fSystem extendedSystem{gx2fResult.materialParamIndices.back()};
1469
1470 // This vector stores the IDs for each visited material in order. We use
1471 // it later for updating the scattering angles. We cannot use
1472 // materialMap directly, since we cannot guarantee, that we will visit
1473 // all stored material in each propagation.
1475
1477 gx2fResult.materialParamIndices, geoIdVector,
1479
1480 chi2sum = extendedSystem.chi2();
1481
1482 // This check takes into account the evaluated dimensions of the
1483 // measurements. To fit, we need at least NDF+1 measurements. However, we
1484 // count n-dimensional measurements for n measurements, reducing the
1485 // effective number of needed measurements. We might encounter the case,
1486 // where we cannot use some (parts of a) measurements, maybe if we do not
1487 // support that kind of measurement. This is also taken into account here.
1488 // We skip the check during the first iteration, since we cannot guarantee
1489 // to hit all/enough measurement surfaces with the initial parameter
1490 // guess.
1491 if ((nUpdate > 0) && !extendedSystem.isWellDefined()) {
1492 ACTS_INFO("Not enough measurements. Require "
1493 << extendedSystem.findRequiredNdf() + 1 << ", but only "
1494 << extendedSystem.ndf() << " could be used.");
1496 }
1497
1500
1501 ACTS_VERBOSE("aMatrix:\n"
1502 << extendedSystem.aMatrix() << "\n"
1503 << "bVector:\n"
1504 << extendedSystem.bVector() << "\n"
1505 << "deltaParamsExtended:\n"
1506 << deltaParamsExtended << "\n"
1507 << "oldChi2sum = " << oldChi2sum << "\n"
1508 << "chi2sum = " << extendedSystem.chi2());
1509
1510 chi2sum = extendedSystem.chi2();
1511
1513 ACTS_VERBOSE("Updated parameters: " << params.parameters().transpose());
1514
1516
1517 ACTS_DEBUG("Finished to evaluate material");
1518 ACTS_VERBOSE("Final parameters after material: "
1519 << params.parameters().transpose());
1522
1523 ACTS_VERBOSE("Final scattering angles and energy loss:");
1524 for (const auto& [key, value] : materialMap) {
1525 if (!value.materialIsValid()) {
1526 continue;
1527 }
1528 ACTS_VERBOSE(" ( " << value.deltaTheta() << " | " << value.deltaPhi()
1529 << "|" << value.lostEnergy() << " )");
1530 }
1531 }
1532 ACTS_VERBOSE("Final covariance:\n" << fullCovariancePredicted);
1533
1534 // Propagate again with the final covariance matrix. This is necessary to
1535 // obtain the propagated covariance for each state.
1536 // We also need to recheck the result and find the tipIndex, because at this
1537 // step, we will not ignore the boundary checks for measurement surfaces. We
1538 // want to create trackstates only on surfaces, that we actually hit.
1539 if (false && gx2fOptions.nUpdateMax > 0) {
1540 ACTS_VERBOSE("Propagate with the final covariance.");
1541 // update covariance
1542 params.covariance() = fullCovariancePredicted;
1543
1544 // set up the propagator
1545 PropagatorOptions propagatorOptions{gx2fOptions.propagatorPlainOptions};
1546 auto& gx2fActor = propagatorOptions.actorList.template get<GX2FActor>();
1547 gx2fActor.inputMeasurements = &inputMeasurements;
1548 gx2fActor.doMultipleScattering = gx2fOptions.doMultipleScattering;
1549 gx2fActor.doEnergyLoss = gx2fOptions.doEnergyLoss;
1550 gx2fActor.extensions = gx2fOptions.extensions;
1551 gx2fActor.calibrationContext = &gx2fOptions.calibrationContext.get();
1552 gx2fActor.actorLogger = m_actorLogger.get();
1553 gx2fActor.startParameters = &params;
1554
1556
1558 m_propagator.initialize(propagatorState, params, nullptr);
1559 if (!propagatorInitResult.ok()) {
1560 ACTS_DEBUG("Propagation initialization failed: "
1561 << propagatorInitResult.error());
1562 return propagatorInitResult.error();
1563 }
1564
1565 auto& r = propagatorState.template get<Gx2FitterResult<traj_t>>();
1566 r.fittedStates = &trackContainer.trackStateContainer();
1567 r.materialMap = std::move(materialMap);
1568
1569 // Run the fitter
1571
1572 auto result =
1574 propagatorOptions, false);
1575
1576 if (!result.ok()) {
1577 ACTS_DEBUG("Propagation failed: " << result.error());
1578 return result.error();
1579 }
1580
1581 auto& propRes = *result;
1583 materialMap = std::move(gx2fResult.materialMap);
1584
1585 if (tipIndex != gx2fResult.lastMeasurementIndex) {
1586 ACTS_INFO("Final fit used unreachable measurements.");
1587 tipIndex = gx2fResult.lastMeasurementIndex;
1588
1589 // It could happen, that no measurements were found. Then the track
1590 // would be empty and the following operations would be invalid.
1591 if (tipIndex == kInvalid) {
1592 ACTS_INFO("Did not find any measurements in final propagation.");
1595 }
1596 }
1597 }
1598
1599 if (!trackContainer.hasColumn(
1601 trackContainer.template addColumn<std::uint32_t>("Gx2fnUpdateColumn");
1602 }
1603
1604 // Prepare track for return
1605 auto track = trackContainer.makeTrack();
1606 track.tipIndex() = tipIndex;
1607 track.parameters() = params.parameters();
1608 track.covariance() = fullCovariancePredicted;
1609 track.setReferenceSurface(params.referenceSurface().getSharedPtr());
1610
1611 if (trackContainer.hasColumn(
1613 ACTS_DEBUG("Add nUpdate to track");
1614 track.template component<std::uint32_t>("Gx2fnUpdateColumn") =
1615 static_cast<std::uint32_t>(nUpdate);
1616 }
1617
1618 // TODO write test for calculateTrackQuantities
1620
1621 // Set the chi2sum for the track summary manually, since we don't calculate
1622 // it for each state
1623 track.chi2() = chi2sum;
1624
1625 track.linkForward();
1626
1627 // Return the converted Track
1628 return track;
1629 }
Gx2FitterResult< traj_t > result_type
Broadcast the result_type.
Definition Chi2Fitter.h:757
std::unique_ptr< const Logger > m_actorLogger
Definition Chi2Fitter.h:739
std::unique_ptr< const Logger > m_addToSumLogger
Definition Chi2Fitter.h:741
static constexpr auto kInvalid
Definition Chi2Fitter.h:717
void updateGx2fParams(BoundTrackParameters &params, const Eigen::VectorXd &deltaParamsExtended, std::unordered_map< GeometryIdentifier, Gx2fMaterialProperties > &materialMap, const std::vector< GeometryIdentifier > &geoIdVector)
Update parameters (and scattering angles if applicable).
Eigen::VectorXd computeGx2fDeltaParams(const Gx2fSystem &extendedSystem)
Solve the gx2f system to get the delta parameters for the update.
void updateGx2fCovarianceParams(BoundMatrix &fullCovariancePredicted, Gx2fSystem &extendedSystem)
Calculate and update the covariance of the fitted parameters.
void fillGx2fSystem(const track_proxy_t track, Gx2fSystem &extendedSystem, const std::unordered_map< GeometryIdentifier, Gx2fMaterialProperties > &materialMap, const std::vector< std::size_t > &materialParamIndices, std::vector< GeometryIdentifier > &geoIdVector, const Logger &logger)
Fill the GX2F system with data from a track.
Definition Chi2Fitter.h:582
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:132

◆ logger()

template<typename propagator_t, typename traj_t>
const Logger & MuonExperimental::Gx2Fitter< propagator_t, traj_t >::logger ( ) const
inlineprivate

Definition at line 744 of file Chi2Fitter.h.

744{ return *m_logger; }

Member Data Documentation

◆ kInvalid

template<typename propagator_t, typename traj_t>
auto MuonExperimental::Gx2Fitter< propagator_t, traj_t >::kInvalid = kTrackIndexInvalid
staticconstexprprivate

Definition at line 717 of file Chi2Fitter.h.

◆ m_actorLogger

template<typename propagator_t, typename traj_t>
std::unique_ptr<const Logger> MuonExperimental::Gx2Fitter< propagator_t, traj_t >::m_actorLogger
private
Initial value:
{
m_logger->cloneWithSuffix("Actor")}

Definition at line 739 of file Chi2Fitter.h.

739 {
740 m_logger->cloneWithSuffix("Actor")};

◆ m_addToSumLogger

template<typename propagator_t, typename traj_t>
std::unique_ptr<const Logger> MuonExperimental::Gx2Fitter< propagator_t, traj_t >::m_addToSumLogger
private
Initial value:
{
m_logger->cloneWithSuffix("AddToSum")}

Definition at line 741 of file Chi2Fitter.h.

741 {
742 m_logger->cloneWithSuffix("AddToSum")};

◆ m_logger

template<typename propagator_t, typename traj_t>
std::unique_ptr<const Logger> MuonExperimental::Gx2Fitter< propagator_t, traj_t >::m_logger
private

The logger instance.

Definition at line 738 of file Chi2Fitter.h.

◆ m_propagator

template<typename propagator_t, typename traj_t>
propagator_t MuonExperimental::Gx2Fitter< propagator_t, traj_t >::m_propagator
private

The propagator for the transport and material update.

Definition at line 735 of file Chi2Fitter.h.


The documentation for this class was generated from the following file: