Function to modify TSOS doing repositioning, aggregation and corrections.
1313{
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1332 << " with X0, Eloss scales " << scaleX0 << " " << scaleEloss
1333 << " rep agg upd " << reposition << " " << aggregate << " " << updateEloss
1334 << " caloE " << caloEnergy << " +- " << caloEnergyError
1335 << " fsrCaloEnergy "<< fsrCaloEnergy
1336 << " p " << pCaloEntry << " dp " << momentumError);
1337
1338
1340
1341
1342
1343
1344 Eloss_tot = 0.;
1345
1346 double X0_tot = 0.;
1347
1348 double sigmaDeltaPhi2_tot = 0.;
1349 double sigmaDeltaTheta2_tot = 0.;
1350 double deltaE_tot = 0.;
1351 double sigmaDeltaE_tot = 0.;
1352 double sigmaPlusDeltaE_tot = 0.;
1353 double sigmaMinusDeltaE_tot = 0.;
1354 double deltaE_ioni_tot = 0.;
1355 double sigmaDeltaE_ioni_tot=0.;
1356 double deltaE_rad_tot = 0.;
1357 double sigmaDeltaE_rad_tot =0.;
1358
1359 const Trk::TrackStateOnSurface* mprevious = nullptr;
1360 const Trk::TrackStateOnSurface* mfirst = nullptr;
1361 const Trk::TrackStateOnSurface* mlast = nullptr;
1363 double deltaEFirst = 0.;
1364
1366 double deltaTheta = 0.;
1367
1369
1370 double w_tot = 0.;
1371 double wdist2 = 0.;
1374
1375 std::bitset<Trk::MaterialEffectsBase::NumberOfMaterialEffectsTypes> meotPattern(0);
1378
1379 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern(0);
1382
1383 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePatternScat(0);
1385
1386 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePatternDeposit(0);
1388 const auto sqrt12=std::sqrt(12.);
1389 for(const auto *m : *matvec) {
1390
1391 if(!
m->trackParameters()) {
1393 continue;
1394 }
1395 if(
m->materialEffectsOnTrack()) {
1396 double X0 =
m->materialEffectsOnTrack()->thicknessInX0();
1397 const Trk::MaterialEffectsOnTrack* meot =
dynamic_cast<const Trk::MaterialEffectsOnTrack*
>(
m->materialEffectsOnTrack());
1398 const Trk::EnergyLoss* energyLoss = nullptr;
1399 const Trk::ScatteringAngles* scat = nullptr;
1400 if(meot) {
1402 if (!energyLoss) {
1404 continue;
1405 }
1407 if(!scat) {
1409 continue;
1410 }
1411 } else {
1413 continue;
1414 }
1415
1417 X0_tot += std::abs(scaleX0 * X0);
1418
1421
1422
1423 deltaE_tot += std::abs(scaleEloss*energyLoss->
deltaE());
1424 sigmaDeltaE_tot += std::abs(scaleEloss*energyLoss->
sigmaDeltaE());
1425 sigmaPlusDeltaE_tot += std::abs(scaleEloss*energyLoss->
sigmaPlusDeltaE());
1426 sigmaMinusDeltaE_tot += std::abs(scaleEloss*energyLoss->
sigmaMinusDeltaE());
1427 deltaE_ioni_tot += std::abs(scaleEloss*energyLoss->
meanIoni());
1428 sigmaDeltaE_ioni_tot += std::abs(scaleEloss*energyLoss->
sigmaIoni());
1429 deltaE_rad_tot += std::abs(scaleEloss*energyLoss->
meanRad());
1430 sigmaDeltaE_rad_tot += std::abs(scaleEloss*energyLoss->
sigmaRad());
1431
1433
1436 if(mprevious) {
1438 }
1439
1443 if(!mfirst) {
1445 posFirst = pos0;
1446 deltaEFirst = energyLoss->
deltaE();
1447 }
1449
1451
1454 wpos +=
w*posNew/2.;
1456
1457 wdist2 +=
w*(pos0-posFirst).
mag2()/2.;
1458 wdist2 +=
w*(posNew-posFirst).
mag2()/2.;
1459
1460 if (!aggregate&&!reposition) {
1461
1462 auto scatNew = ScatteringAngles(
deltaPhi,
1463 deltaTheta,
1464 std::sqrt(sigmaDeltaPhi2_tot),
1465 std::sqrt(sigmaDeltaTheta2_tot));
1466 auto energyLossNew = Trk::EnergyLoss(deltaE_tot,
1467 sigmaDeltaE_tot,
1468 sigmaMinusDeltaE_tot,
1469 sigmaPlusDeltaE_tot,
1470 deltaE_ioni_tot,
1471 sigmaDeltaE_ioni_tot,
1472 deltaE_rad_tot,
1473 sigmaDeltaE_rad_tot,
1475 auto caloEnergyNew = std::make_unique<CaloEnergy>(energyLossNew);
1476 Eloss_tot += caloEnergyNew->deltaE();
1478 auto meotLast =
1479 std::make_unique<Trk::MaterialEffectsOnTrack>(
1480 X0_tot, scatNew, std::move(caloEnergyNew), surf, meotPattern);
1481 auto pars =
m->trackParameters()->uniqueClone();
1482
1483
1484 const Trk::TrackStateOnSurface* newTSOS = new Trk::TrackStateOnSurface(
1485 nullptr, std::move(pars), std::move(meotLast), typePattern);
1486
1488
1489 X0_tot = 0.;
1490 sigmaDeltaTheta2_tot = 0.;
1491 sigmaDeltaPhi2_tot = 0.;
1492 deltaE_tot = 0.;
1493 sigmaDeltaE_tot = 0;
1494 sigmaPlusDeltaE_tot = 0.;
1495 sigmaMinusDeltaE_tot = 0.;
1496 deltaE_ioni_tot = 0.;
1497 sigmaDeltaE_ioni_tot = 0.;
1498 deltaE_rad_tot = 0.;
1499 sigmaDeltaE_rad_tot = 0.;
1500
1501
1502 } else if(!aggregate&&reposition) {
1503
1504 if(std::abs(
depth)<10.) {
1505
1506
1507
1508 auto scatNew =
1510 deltaTheta,
1511 sqrt(sigmaDeltaPhi2_tot),
1512 sqrt(sigmaDeltaTheta2_tot));
1513 auto energyLossNew = Trk::EnergyLoss(deltaE_tot,
1514 sigmaDeltaE_tot,
1515 sigmaMinusDeltaE_tot,
1516 sigmaPlusDeltaE_tot,
1517 deltaE_ioni_tot,
1518 sigmaDeltaE_ioni_tot,
1519 deltaE_rad_tot,
1520 sigmaDeltaE_rad_tot,
1522 auto caloEnergyNew = std::make_unique<CaloEnergy>(energyLossNew);
1523 Eloss_tot += caloEnergyNew->deltaE();
1525 auto meotLast =
1526 std::make_unique<Trk::MaterialEffectsOnTrack>(
1527 X0_tot, scatNew, std::move(caloEnergyNew), surf, meotPattern);
1528 auto pars =
m->trackParameters()->uniqueClone();
1529
1530 const Trk::TrackStateOnSurface* newTSOS =
1531 new Trk::TrackStateOnSurface(
1532 nullptr, std::move(pars), std::move(meotLast), typePattern);
1534
1535 X0_tot = 0.;
1536 sigmaDeltaTheta2_tot = 0.;
1537 sigmaDeltaPhi2_tot = 0.;
1538 deltaE_tot = 0.;
1539 sigmaDeltaE_tot = 0;
1540 sigmaPlusDeltaE_tot = 0.;
1541 sigmaMinusDeltaE_tot = 0.;
1542 deltaE_ioni_tot = 0.;
1543 sigmaDeltaE_ioni_tot = 0.;
1544 deltaE_rad_tot = 0.;
1545 sigmaDeltaE_rad_tot = 0.;
1546
1547 } else {
1548
1549
1550
1551
1552 auto energyLoss0 = std::make_unique<Trk::EnergyLoss>(0.,0.,0.,0.);
1553 auto scatFirst = ScatteringAngles(
deltaPhi,
1554 deltaTheta,
1555 std::sqrt(sigmaDeltaPhi2_tot / 2.),
1556 std::sqrt(sigmaDeltaTheta2_tot / 2.));
1557
1558
1559 auto scatNew =
1561 deltaTheta,
1562 std::sqrt(sigmaDeltaPhi2_tot / 2.),
1563 std::sqrt(sigmaDeltaTheta2_tot / 2.));
1564 auto energyLossNew = Trk::EnergyLoss(deltaE_tot,
1565 sigmaDeltaE_tot,
1566 sigmaMinusDeltaE_tot,
1567 sigmaPlusDeltaE_tot,
1568 deltaE_ioni_tot,
1569 sigmaDeltaE_ioni_tot,
1570 deltaE_rad_tot,
1571 sigmaDeltaE_rad_tot,
1572 0.);
1573 auto caloEnergyNew = std::make_unique<CaloEnergy>(energyLossNew);
1574 Eloss_tot += caloEnergyNew->deltaE();
1576
1579 -
dir.x() *
dir.z() / norm, -
dir.y() *
dir.z() / norm, norm);
1581
1584 auto surfFirst =
1585 Trk::PlaneSurface(surfaceTransformFirst);
1586 auto surfLast =
1587 Trk::PlaneSurface(surfaceTransformLast);
1588
1589 auto meotFirst =
1590 std::make_unique<Trk::MaterialEffectsOnTrack>(
1591 X0_tot / 2., scatFirst, std::move(energyLoss0), surfFirst, meotPattern);
1592 auto meotLast =
1593 std::make_unique<Trk::MaterialEffectsOnTrack>(
1594 X0_tot / 2., scatNew, std::move(caloEnergyNew), surfLast, meotPattern);
1595
1596
1597
1598 double qOverP0 =
m->trackParameters()->charge()/ (
m->trackParameters()->
momentum().
mag()-std::abs(energyLoss->
deltaE()));
1600
1601 std::unique_ptr<Trk::TrackParameters> parsFirst =
1602 surfFirst.createUniqueParameters<5, Trk::Charged>(
1603 0., 0.,
dir.phi(),
dir.theta(), qOverP0);
1604
1605 double qOverPNew =
m->trackParameters()->charge() /
1606 m->trackParameters()->momentum().mag();
1607 std::unique_ptr<Trk::TrackParameters> parsLast =
1608 surfLast.createUniqueParameters<5, Trk::Charged>(
1609 0., 0.,
dir.phi(),
dir.theta(), qOverPNew);
1610
1611
1612 const Trk::TrackStateOnSurface* newTSOSFirst =
1613 new Trk::TrackStateOnSurface(
1614 nullptr, std::move(parsFirst), std::move(meotFirst), typePattern);
1615 const Trk::TrackStateOnSurface* newTSOS =
1616 new Trk::TrackStateOnSurface(
1617 nullptr, std::move(parsLast), std::move(meotLast), typePattern);
1618
1619
1622
1623 X0_tot = 0.;
1624 sigmaDeltaTheta2_tot = 0.;
1625 sigmaDeltaPhi2_tot = 0.;
1626 deltaE_tot = 0.;
1627 sigmaDeltaE_tot = 0;
1628 sigmaPlusDeltaE_tot = 0.;
1629 sigmaMinusDeltaE_tot = 0.;
1630 deltaE_ioni_tot = 0.;
1631 sigmaDeltaE_ioni_tot = 0.;
1632 deltaE_rad_tot = 0.;
1633 sigmaDeltaE_rad_tot = 0.;
1634 }
1635 }
1636
1638
1639
1640 }
1641 }
1642 if (aggregate&&reposition) {
1643
1644 if (n_tot>0) {
1645
1646
1647
1649 bool threePlanes = false;
1650 if (std::abs(
pos.z()) < 6700 &&
pos.perp() < 4200)
1651 threePlanes = true;
1652
1653 auto scatFirst =
1655 deltaTheta,
1656 std::sqrt(sigmaDeltaPhi2_tot / 2.),
1657 std::sqrt(sigmaDeltaTheta2_tot / 2.));
1658 auto scatNew =
1660 deltaTheta,
1661 std::sqrt(sigmaDeltaPhi2_tot / 2.),
1662 std::sqrt(sigmaDeltaTheta2_tot / 2.));
1663 Trk::EnergyLoss energyLoss2 = EnergyLoss(deltaE_tot,
1664 sigmaDeltaE_tot,
1665 sigmaMinusDeltaE_tot,
1666 sigmaPlusDeltaE_tot,
1667 deltaE_ioni_tot,
1668 sigmaDeltaE_ioni_tot,
1669 deltaE_rad_tot,
1670 sigmaDeltaE_rad_tot,
1671 0.);
1672 if (threePlanes)
1674 << energyLoss2.
deltaE() <<
" meanIoni "
1675 << energyLoss2.
meanIoni() <<
" sigmaIoni "
1676 << energyLoss2.
sigmaIoni() <<
" X0_tot " << X0_tot);
1677
1678 int elossFlag =
1679 0;
1680
1681 double calE = caloEnergy;
1682 double calEr = caloEnergyError;
1683
1684
1685 if (!useMeasuredEnergy)
1686 calEr = 0.;
1687
1688 Trk::EnergyLoss energyLossNew =
1689 (updateEloss
1691 energyLoss2, calE, calEr, pCaloEntry, momentumError, elossFlag)
1692 : EnergyLoss(deltaE_tot,
1693 sigmaDeltaE_tot,
1694 sigmaMinusDeltaE_tot,
1695 sigmaPlusDeltaE_tot,
1696 deltaE_ioni_tot,
1697 sigmaDeltaE_ioni_tot,
1698 deltaE_rad_tot,
1699 sigmaDeltaE_rad_tot,
1700 0.));
1701 auto caloEnergyNew = std::make_unique<CaloEnergy>(energyLossNew);
1702 if (threePlanes)
1704 << energyLossNew.
deltaE() <<
" meanIoni "
1705 << energyLossNew.
meanIoni() <<
" sigmaIoni "
1707
1708 caloEnergyNew->set_measEnergyLoss(caloEnergy, caloEnergyError);
1709
1710 caloEnergyNew->set_fsrCandidateEnergy(fsrCaloEnergy);
1711
1712 if(elossFlag!=0) {
1714 } else {
1716 }
1717
1718 int eLossFlagTmp = 0;
1719 Trk::EnergyLoss energyLossParam =
m_elossupdator->updateEnergyLoss(energyLoss2, 0.0, 0.0, pCaloEntry, 0., eLossFlagTmp);
1720
1723 ATH_MSG_DEBUG(
" modifyTSOSvector energyLossParam Eloss " << energyLossParam.
deltaE() <<
" on TSOS " << energyLossNew.
deltaE() <<
" calE " << calE);
1724 Eloss_tot += caloEnergyNew->deltaE();
1725
1726
1730
1734
1735 double halflength2 = wdist2/w_tot - (
pos-posFirst).
mag()*(
pos-posFirst).
mag();
1736 double halflength = 0.;
1737 if(halflength2>0) halflength = sqrt(halflength2);
1740
1741
1742
1743 double scaleCalo = 1.;
1744 double scaleCaloNew = std::abs(pos0.z())/6700;
1745 if(scaleCaloNew>scaleCalo) scaleCalo = scaleCaloNew;
1746 scaleCaloNew = std::abs(posNew.z())/6700;
1747 if(scaleCaloNew>scaleCalo) scaleCalo = scaleCaloNew;
1748 scaleCaloNew = std::abs(pos0.perp())/4200;
1749 if(scaleCaloNew>scaleCalo) scaleCalo = scaleCaloNew;
1750 scaleCaloNew = std::abs(posNew.perp())/4200;
1751 if(scaleCaloNew>scaleCalo) scaleCalo = scaleCaloNew;
1752
1753 if(scaleCalo>1.) {
1754 pos0 = pos0/scaleCalo;
1756 posNew = posNew/scaleCalo;
1757 halflength = halflength/scaleCalo;
1758 ATH_MSG_VERBOSE(
" position scattering planes inside calo scale factor " << scaleCalo);
1759 }
1760
1764 auto surfFirst = Trk::PlaneSurface( surfaceTransformFirst );
1765 auto surfLast= Trk::PlaneSurface( surfaceTransformLast );
1766
1768
1770 std::unique_ptr<Trk::TrackParameters> parsFirst =
1771 surfFirst.createUniqueParameters<5, Trk::Charged>(
1772 0., 0.,
dir.phi(),
dir.theta(), qOverP0);
1773 std::unique_ptr<Trk::TrackParameters> parsLast =
1774 surfLast.createUniqueParameters<5, Trk::Charged>(
1775 0., 0.,
dir.phi(),
dir.theta(), qOverPNew);
1776
1777 if(!threePlanes) {
1778
1779
1780
1781
1782
1783 auto meotFirst =
1784 std::make_unique<Trk::MaterialEffectsOnTrack>(X0_tot / 2.,
1785 scatFirst,
1786 nullptr,
1787 surfFirst,
1788 meotPattern);
1789
1790
1791 auto meotLast =
1792 std::make_unique<Trk::MaterialEffectsOnTrack>(X0_tot / 2.,
1793 scatNew,
1794 std::move(caloEnergyNew),
1795 surfLast,
1796 meotPattern);
1797
1798
1799 const Trk::TrackStateOnSurface* newTSOSFirst =
1800 new Trk::TrackStateOnSurface(
1801 nullptr, std::move(parsFirst), std::move(meotFirst), typePattern);
1802 auto whichPattern = (elossFlag != 0) ? typePatternDeposit : typePattern;
1803 const Trk::TrackStateOnSurface* newTSOS = new Trk::TrackStateOnSurface( nullptr,
1804 std::move(parsLast), std::move(meotLast), whichPattern);
1807 } else {
1808
1809
1810
1812 auto surf = Trk::PlaneSurface(surfaceTransform);
1813 std::unique_ptr<Trk::TrackParameters>
pars =
1814 surf.createUniqueParameters<5, Trk::Charged>(
1815 0., 0.,
dir.phi(),
dir.theta(), qOverPNew);
1816
1817
1818
1819 auto meotFirst =
1820 std::make_unique<Trk::MaterialEffectsOnTrack>(
1821 X0_tot / 2., scatFirst, nullptr, surfFirst, meotPattern);
1822
1823
1824
1825 auto meot =
1826 std::make_unique<Trk::MaterialEffectsOnTrack>(
1827 0.,std::nullopt, std::move(caloEnergyNew), surf, meotPattern);
1828
1829
1830
1831 auto meotLast =
1832 std::make_unique<Trk::MaterialEffectsOnTrack>(
1833 X0_tot / 2., scatNew, nullptr, surfLast, meotPattern);
1834
1835
1836 const Trk::TrackStateOnSurface* newTSOSFirst =
1837 new Trk::TrackStateOnSurface(
1838 nullptr, std::move(parsFirst), std::move(meotFirst), typePatternScat);
1839 const Trk::TrackStateOnSurface* newTSOS = new Trk::TrackStateOnSurface(
1840 nullptr, std::move(pars), std::move(meot), typePatternDeposit);
1841 const Trk::TrackStateOnSurface* newTSOSLast =
1842 new Trk::TrackStateOnSurface(
1843 nullptr, std::move(parsLast), std::move(meotLast), typePatternScat);
1844
1848 }
1849
1850
1851 }
1852
1853 }
1854
1855 return newTSOSvector;
1856}
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
Scalar mag() const
mag method
Scalar mag2() const
mag2 method - forward to squaredNorm()
value_type push_back(value_type pElem)
Add an element to the end of the collection.
@ ScatteringEffects
contains material effects due to multiple scattering
@ EnergyLossEffects
contains energy loss corrections
const Surface & associatedSurface() const
returns the surface to which these m.eff. are associated.
const ScatteringAngles * scatteringAngles() const
returns the MCS-angles object.
double charge() const
Returns the charge.
double sigmaDeltaPhi() const
returns the
double sigmaDeltaTheta() const
returns the
@ InertMaterial
This represents inert material, and so will contain MaterialEffectsBase.
@ Scatterer
This represents a scattering point on the track, and so will contain TrackParameters and MaterialEffe...
@ CaloDeposit
This TSOS contains a CaloEnergy object.
std::string depth
tag string for intendation
Eigen::Affine3d Transform3D