38 constexpr float solenoidRadius = 1280.;
46 declareInterface<ITrackDepositInCaloTool>(
this);
56 if (!
m_tileDDM) {
return StatusCode::FAILURE; }
64 return StatusCode::SUCCESS;
72 const EventContext& ctx = Gaudi::Hive::currentContext();
74 std::vector<DepositInCalo>
result;
77 if (!par) {
return result; }
79 if (!caloCellCont)
return result;
82 if (!caloDetDescrMgrHandle.
isValid()) {
91 std::vector<Amg::Vector3D> extrapolations;
92 std::map<double, const CaloDetDescriptor*> caloInfo;
98 if (
getTraversedLayers(caloDDM,currentPar.get(), caloInfo, extrapolations).isFailure()) {
104 for (
const std::pair<const double, const CaloDetDescriptor*>& detDescrIt : caloInfo) {
117 currentPar.swap(parEntrance);
121 double energyLoss =
calcEnergy(parEntrance.get(), muonHypo) -
calcEnergy(parExit.get(), muonHypo);
122 double distance = (parEntrance->position() - parExit->position()).mag();
124 std::vector<const CaloCell*> cells =
128 double sumEnergy = 0;
130 for (
const CaloCell* cell : cells) {
132 sumEnergy += cell->energy();
139 ATH_MSG_DEBUG(
"Energy = " << sumEnergy <<
" for sample " << descr->getSampling() <<
" in " << cells.size() <<
" cells.");
140 if (
distance) {
result.emplace_back(descr->getSampling(), sumEnergy, energyLoss, sumEt); }
143 currentPar.swap(parEntrance);
153 ATH_MSG_DEBUG(
"In TrackDepositsInCaloTool::getDeposits() - new");
154 std::vector<DepositInCalo>
result;
159 std::unique_ptr<const Rec::ParticleCellAssociation> association =
162 if (!association)
return result;
163 ATH_MSG_VERBOSE(
" particleCellAssociation done " << association.get());
167 std::vector<std::pair<const CaloCell*, Rec::ParticleCellIntersection*>> cellIntersections = association->cellIntersections();
176 ATH_MSG_DEBUG(
" nr of cell intersections " << cellIntersections.size());
177 if (cellIntersections.size() < 3)
ATH_MSG_WARNING(
" Strange nr of calorimeter cell intersections " << cellIntersections.size());
187 std::vector<float> exp_E(nSamples, 0.0);
188 std::vector<float> meas_E(nSamples, 0.0);
189 std::vector<float> meas_Et(nSamples, 0.0);
190 std::vector<int> LayerHit(nSamples, 0);
196 for (
auto& it : cellIntersections) {
197 const CaloCell* curr_cell = it.first;
198 if (curr_cell->
badcell())
continue;
202 auto pos = entryExitLayerMap.find(sample);
203 if (pos == entryExitLayerMap.end())
continue;
204 lEntry = pos->second.first;
205 lExit = pos->second.second;
207 meas_E[cellSampling] += Float_t(curr_cell->
energy());
208 meas_Et[cellSampling] += Float_t(curr_cell->
energy() * curr_cell->
sinTh());
209 exp_E[cellSampling] = Float_t((it.second)->expectedEnergyLoss());
210 LayerHit[cellSampling]++;
212 <<
" Exp : " << (it.second)->expectedEnergyLoss());
218 for (
int i = CaloSampling::PreSamplerB; i < CaloSampling::CaloSample::Unknown; i++) {
219 if (LayerHit[i] > 0) {
221 result.emplace_back(sample, meas_E[i], exp_E[i], meas_Et[i]);
222 ATH_MSG_DEBUG(
" Layer : " << sample <<
" Energy = " << meas_E[i] <<
" nCells : " << LayerHit[i] <<
" Exp: " << exp_E[i]);
239 if (descr->is_tile()) {
249 std::vector<const CaloCell*>
result;
250 result.push_back(cellEntrance);
251 if (cellEntrance != cellExit) {
252 result.push_back(cellExit);
271 std::vector<const CaloCell*>
result{};
273 double phiPar = parEntrance->
position().phi();
274 double phiParEntrance = phiPar;
275 double zParEntrance = parEntrance->
position().z();
276 double phiParExit = parExit->
position().phi();
277 double zParExit = parExit->
position().z();
278 double diffZPar = zParExit - zParEntrance;
279 double etaPar = parEntrance->
position().eta();
281 double etaWidth = 2 * (descr->calo_eta_max() - descr->calo_eta_min()) / descr->n_eta();
282 double etaMin = etaPar - etaWidth;
283 double etaMax = etaPar + etaWidth;
284 double phiWidth = (descr->calo_phi_max() - descr->calo_phi_min()) / descr->n_phi();
286 double phiMin = phiPar - phiWidth;
287 double phiMax = phiPar + phiWidth;
291 std::vector<IdentifierHash> vecHash;
292 caloDDM->
cellsInZone(etaMin, etaMax, phiMin, phiMax, sample, vecHash);
295 std::map<double, const CaloCell*> neighbourMap0;
296 std::map<double, const CaloCell*> neighbourMap1;
304 double dPhiCell = dde->
dphi();
305 double phiCellMin = dde->
phi() - dPhiCell / 2;
306 double phiCellMax = phiCellMin + dPhiCell;
307 if (!(phiParEntrance > phiCellMin && phiParExit < phiCellMax) && !(phiParExit > phiCellMin && phiParExit < phiCellMax)) {
312 double zCellMin0{0}, zCellMax0{0}, zCellMin1{0}, zCellMax1{0};
315 ATH_MSG_WARNING(
"TileCellDim object not found for cell " << cell->ID());
320 zCellMin0 = cellDim->
getZMin(0);
321 zCellMax0 = cellDim->
getZMax(0);
322 zCellMin1 = cellDim->
getZMin(3);
323 zCellMax1 = cellDim->
getZMax(3);
325 zCellMin0 = cellDim->
getZMin(0);
326 zCellMax0 = cellDim->
getZMax(0);
327 zCellMin1 = zCellMin0;
328 zCellMax1 = zCellMax0;
333 if (zParEntrance >= zCellMin0 && zParEntrance <= zCellMax0 && phiParEntrance > phiCellMin && phiParEntrance < phiCellMax) {
338 if (zParExit >= zCellMin1 && zParExit <= zCellMax1 && phiParExit > phiCellMin && phiParExit < phiCellMax) {
344 if (zParEntrance < zCellMin0 && zParExit > zCellMax1) {
349 if (zParEntrance > zCellMax0 && zParExit < zCellMin1) {
365 std::unique_ptr<const Trk::TrackParameters> paramEntrance;
366 bool checkBoundary =
true;
369 std::unique_ptr<Trk::Surface> surfEntrance{
createSurface(descr, Entrance)};
376 if (!paramEntrance) {
377 ATH_MSG_DEBUG(
"Extrapolation to entrance failed without boundary check.");
380 const Amg::Vector3D& posVecEntrance = paramEntrance->position();
382 if (surfEntrance->isOnSurface(posVecEntrance, checkBoundary)) {
383 ATH_MSG_VERBOSE(
"Successfully extrapolated to entrance of calo for sample " << descr->getSampling());
384 return paramEntrance;
386 std::unique_ptr<Trk::Surface> surfInside{
createSurface(descr, Inside)};
388 std::unique_ptr<const Trk::TrackParameters> paramOnInside{
391 ATH_MSG_VERBOSE(
"Successfully extrapolated to inner side of calo for sample " << descr->getSampling());
392 paramEntrance.swap(paramOnInside);
398 return paramEntrance;
407 std::unique_ptr<const Trk::TrackParameters> paramExit;
408 bool checkBoundary =
true;
412 std::unique_ptr<Trk::Surface> surfExit{
createSurface(descr, Exit)};
424 std::unique_ptr<Trk::Surface> surfOutside{
createSurface(descr, Outside)};
425 if (!surfOutside) {
return nullptr; }
428 ATH_MSG_VERBOSE(
"Succesfully extrapolated to outer side of calo for sample " << descr->getSampling());
440 bool oppositeMomentum)
const {
446 constexpr double halfLengthOfCylinder = 3700;
447 bool checkBoundary =
true;
451 std::unique_ptr<const Trk::TrackParameters> parAtSolenoid{
452 m_extrapolator->extrapolate(ctx, *par, solenoid, direction, checkBoundary, muonHypo)};
453 if (!parAtSolenoid) {
455 double zTrans = par->eta() > 0 ? halfLengthOfCylinder : -halfLengthOfCylinder;
458 parAtSolenoid =
m_extrapolator->extrapolate(ctx, *par, disc, direction, checkBoundary, muonHypo);
460 if (!parAtSolenoid) {
461 ATH_MSG_VERBOSE(
"extrapolateToSolenoid(): Extrapolation to cap of solenoid failed. Trying opposite side.");
463 parAtSolenoid =
m_extrapolator->extrapolate(ctx, *par, discOpp, direction, checkBoundary, muonHypo);
466 if (parAtSolenoid) {
ATH_MSG_VERBOSE(
"extrapolateToSolenoid(): Extrapolation succeeded for disc-type surface."); }
469 ATH_MSG_VERBOSE(
"extrapolateToSolenoid(): Extrapolation succeeded for cylinder-type surface.");
472 return parAtSolenoid;
491 std::vector<DepositInCalo>
result;
492 const EventContext& ctx = Gaudi::Hive::currentContext();
495 if (!par) {
return result; }
498 if (!caloDetDescrMgrHandle.
isValid()) {
505 bool checkBoundary =
true;
508 std::vector<Amg::Vector3D> extrapolations;
509 std::map<double, const CaloDetDescriptor*> caloInfo;
512 if (
getTraversedLayers(caloDDM, parAtSolenoid.get(), caloInfo, extrapolations).isFailure()) {
521 std::vector<Amg::Vector3D>::iterator itP = extrapolations.begin();
522 for (
const std::pair<const double, const CaloDetDescriptor*>& it : caloInfo) {
524 double energyEntrance{0}, energyExit{0}, energyDeposit{0}, ETDeposit{0}, energyLoss{0};
525 bool eLossFound =
false;
528 ATH_MSG_VERBOSE(
"Analysing crossing of calo sample " << sample <<
" ");
531 std::unique_ptr<const Trk::Surface> surfEntrance{
createSurface(descr, Entrance)};
536 std::unique_ptr<const Trk::TrackParameters> paramEntrance{
538 if (!paramEntrance) {
542 const Amg::Vector3D& posVecEntrance = paramEntrance->position();
543 if (!surfEntrance->isOnSurface(posVecEntrance, checkBoundary)) {
544 std::unique_ptr<Trk::Surface> surfInside{
createSurface(descr, Inside)};
546 std::unique_ptr<const Trk::TrackParameters> paramOnInside{
549 ATH_MSG_VERBOSE(
"Succesfully extrapolated to inner side of calo for sample " << sample);
550 paramEntrance.swap(paramOnInside);
552 ATH_MSG_WARNING(
"Extrapolation failed to inner side of calo " << sample);
555 ATH_MSG_WARNING(
"Could not create surface for inside of calo for sample " << sample);
558 energyEntrance =
calcEnergy(paramEntrance.get(), muonHypo);
560 std::unique_ptr<Trk::Surface> surfMiddle{
createSurface(descr, Middle)};
562 std::unique_ptr<const Trk::TrackParameters> paramMiddle{
568 energyDeposit = cell->energy();
569 ETDeposit = cell->et();
572 std::unique_ptr<Trk::Surface> surfExit{
createSurface(descr, Exit)};
573 std::unique_ptr<const Trk::TrackParameters> paramExit;
578 energyExit =
calcEnergy(paramExit.get(), muonHypo);
582 std::unique_ptr<Trk::Surface> surfOutside{
createSurface(descr, Outside)};
587 ATH_MSG_VERBOSE(
"Succesfully extrapolated to outer side of calo for sample " << sample);
588 energyExit =
calcEnergy(paramExit.get(), muonHypo);
594 ATH_MSG_WARNING(
"Could not create surface for outside of calo for sample " << sample);
608 energyLoss = eLossFound ? -(energyExit - energyEntrance) : 0;
609 result.emplace_back(sample, energyDeposit, energyLoss, ETDeposit);
610 ATH_MSG_DEBUG(
"Sample: " << sample <<
"\tEnergyDeposit: " << energyDeposit <<
"\tEnergyLoss: " << energyLoss);
614 h.m_hParELossEta->Fill(energyLoss, itP->eta());
615 h.m_hParELossSample->Fill(energyLoss, sample);
622 ATH_MSG_VERBOSE(
"---TRACKDEPOSITINCALOTOOL---TRACKDEPOSITINCALOTOOL---TRACKDEPOSITINCALOTOOL");
632 double pX = par->momentum().x();
633 double pY = par->momentum().y();
634 double pZ = par->momentum().z();
635 return std::sqrt(mass * mass + pX * pX + pY * pY + pZ * pZ);
651 if (descr->is_lar_em_barrel()) {
653 double thickness = descr->calo_r_max() - descr->calo_r_min();
654 double r = descr->calo_r_min() + thickness / 2.0;
659 if (sample != CaloCell_ID::PreSamplerB) maps.
m_barrelLayerMap[
r].push_back(descr);
662 double thickness = descr->calo_z_max() - descr->calo_z_min();
663 double z = descr->calo_z_min() + thickness / 2.0;
668 if (sample != CaloCell_ID::PreSamplerE) { maps.
m_endCapLayerMap[
z].push_back(descr); }
677 ATH_MSG_VERBOSE(
"Detector Description element for sample " << descr->getSampling());
678 if (!descr->is_tile()) {
ATH_MSG_VERBOSE(
"This is not a isTile()==true element."); }
680 if (sample >= 15 && sample <= 17) {
685 double thickness = descr->calo_r_max() - descr->calo_r_min();
686 double r = descr->calo_r_min() + thickness / 2.0;
703 double x0 = initialPosition.x();
704 double y0 = initialPosition.y();
705 double z0 = initialPosition.z();
707 double b = 2 * x0 * std::cos(phi0) + 2 * y0 * std::sin(phi0);
708 double c = x0 * x0 + y0 * y0 -
r *
r;
709 double det = b * b - 4 * c;
714 lsin = (-b + std::sqrt(det)) / 2;
716 double xe = x0 + lsin * std::cos(phi0);
717 double ye = y0 + lsin * std::sin(phi0);
718 double ze = z0 + lsin * std::cos(theta0) / std::sin(theta0);
720 if (std::abs(xe * xe + ye * ye -
r *
r) > 10 && det > 0) {
725 return std::make_unique<Amg::Vector3D>(xe, ye, ze);
733 double x0 = initialPosition.x();
734 double y0 = initialPosition.y();
735 double z0 = initialPosition.z();
736 double cosTheta0 = std::cos(theta0);
738 double dist =
z - z0;
739 double lambda = dist / cosTheta0;
744 double xe = x0 + lambda * std::sin(theta0) * std::cos(phi0);
745 double ye = y0 + lambda * std::sin(theta0) * std::sin(phi0);
748 return std::make_unique<Amg::Vector3D>(xe, ye, ze);
760 std::map<double, const CaloDetDescriptor*>& caloInfo,
761 std::vector<Amg::Vector3D>& extrapolations)
const {
770 bool parIsAtSolenoid =
true;
771 if (parIsAtSolenoid) parAtSolenoid = par;
777 double deltaR_solLast = std::abs(parAtSolenoid->
position().perp() - par->position().perp());
778 double deltaEta_solLast = std::abs(parAtSolenoid->
position().eta() - par->position().eta());
781 h.m_hDeltaEtaLastPar->Fill(deltaEta_solLast);
782 h.m_hDeltaRadiusLastPar->Fill(deltaR_solLast);
786 double theta0 = parAtSolenoid->
momentum().theta();
787 double phi0 = parAtSolenoid->
momentum().phi();
790 for (
const std::pair<
const double, std::vector<const CaloDetDescriptor*>>& mapIt : layerMaps.
m_barrelLayerMap) {
791 const double& radius = mapIt.first;
792 std::unique_ptr<Amg::Vector3D> extrapolation =
extrapolateR(positionAtSolenoid, phi0, theta0, radius);
793 if (!extrapolation) {
continue; }
795 double zSigned = extrapolation->z() * descr->calo_sign();
796 if (zSigned >= descr->calo_z_min() && zSigned <= descr->calo_z_max()) {
797 double distance = (*extrapolation - positionAtSolenoid).
mag();
799 extrapolations.emplace_back(*extrapolation);
805 for (
const std::pair<
const double, std::vector<const CaloDetDescriptor*>>& mapIt : layerMaps.
m_endCapLayerMap) {
806 const double& zCenter = mapIt.first;
808 double z = zCenter * descr->calo_sign();
809 std::unique_ptr<Amg::Vector3D> extrapolation =
extrapolateZ(positionAtSolenoid, phi0, theta0,
z);
810 if (!extrapolation)
continue;
812 double radius = extrapolation->perp();
813 if (radius >= descr->calo_r_min() && radius <= descr->calo_r_max()) {
814 double distance = (*extrapolation - positionAtSolenoid).
mag();
816 extrapolations.emplace_back(*extrapolation);
822 return StatusCode::FAILURE;
825 return StatusCode::SUCCESS;
841 if (descr->is_tile() || descr->is_lar_em_barrel()) {
843 if (
type >= Entrance &&
type <= Exit) {
844 double thickness = descr->calo_r_max() - descr->calo_r_min();
845 double halfLength = (descr->calo_z_max() - descr->calo_z_min()) / 2;
846 double middle = descr->calo_z_min() + halfLength;
847 double radius =
type / 2.0 * thickness + descr->calo_r_min();
852 }
else if (
type == Inside ||
type == Outside) {
854 if (
type == Inside) {
855 offset = descr->calo_z_min() * descr->calo_sign();
857 offset = descr->calo_z_max() * descr->calo_sign();
862 ATH_MSG_WARNING(
"Type error in CaloTrkMuIdDetStore::createSurface().");
867 if (
type >= Entrance &&
type <= Exit) {
868 double thickness = descr->calo_z_max() - descr->calo_z_min();
869 double offset = descr->calo_sign() * (thickness *
type / 2.0 + descr->calo_z_min());
872 }
else if (
type == Inside ||
type == Outside) {
874 if (
type == Inside) {
875 radius = descr->calo_r_min();
877 radius = descr->calo_r_max();
879 double halfLength = (descr->calo_z_max() - descr->calo_z_min()) / 2.0;
880 double offset = descr->calo_sign() * (descr->calo_z_min() + halfLength);
884 ATH_MSG_WARNING(
"Type error in CaloTrkMuIdDetStore::createSurface().");
908 if (descr->is_tile()) {
946 std::map<double, const CaloCell*> neighbourMap;
949 double etaPar = par->position().eta();
950 double phiPar = par->position().phi();
951 double etaWidth = 2 * (descr->calo_eta_max() - descr->calo_eta_min()) / descr->n_eta();
952 double etaMin = etaPar - etaWidth;
953 double etaMax = etaPar + etaWidth;
954 double phiWidth = (descr->calo_phi_max() - descr->calo_phi_min()) / descr->n_phi();
956 double phiMin = phiPar - phiWidth;
957 double phiMax = phiPar + phiWidth;
963 std::vector<IdentifierHash> vecHash;
964 caloDDM->
cellsInZone(etaMin, etaMax, phiMin, phiMax, sample, vecHash);
967 double dR2Min{ 999 };
976 const double etaCell = dde->
eta();
977 const double phiCell = dde->
phi();
978 const double dEta = etaPar - etaCell;
980 const double dR2 = dEta * dEta + dPhi * dPhi;
981 neighbourMap[sqrt(dR2)] = cell;
989 if (msgLevel(MSG::VERBOSE)) {
991 for (
const std::pair<const double, const CaloCell*>& mapIt : neighbourMap) {
992 const CaloCell* cell = mapIt.second;
1010 ATH_MSG_FATAL(
"Filling histograms not supported in MT jobs.");
1011 return StatusCode::FAILURE;
1015 m_h = std::make_unique<Hists>();
1017 return StatusCode::SUCCESS;
1022 m_hDepositLayer12 =
new TH1F(
"hDepositLayer12",
"hDepositLayer12", 40, 0, 4000);
1023 m_hDepositLayer13 =
new TH1F(
"hDepositLayer13",
"hDepositLayer13", 40, 0, 4000);
1024 m_hDepositLayer14 =
new TH1F(
"hDepositLayer14",
"hDepositLayer14", 40, 0, 4000);
1025 m_hParELossEta =
new TH2F(
"hParELossEta",
"Parametrized eLoss vs eta", 40, 0, 4000, 30, -3, 3);
1026 m_hParELossSample =
new TH2F(
"hParELossSample",
"Parametrized eLoss vs sample", 40, 0, 4000, 21, 0, 21);
1029 m_hDepositsInCore =
new TH1F(
"hDepositsInCore",
"hDepositsInCore", 50, 0, 5000);
1030 m_hDepositsInCone =
new TH1F(
"hDepositsInCone",
"hDepositsInCone", 50, 0, 5000);
1031 m_hDistDepositsTile =
new TH2F(
"hDistDepositsTile",
"hDistDepositsTile", 30, 0.0, 0.3, 30, 0, 4000);
1032 m_hDistDepositsHEC =
new TH2F(
"hDistDepositsHEC",
"hDistDepositsHEC", 30, 0.0, 0.3, 30, 0, 4000);
1041#define H_CHECK(X) if((X).isFailure()) return StatusCode::FAILURE
1062 return StatusCode::SUCCESS;
1082 double halfWidth = domainWidth / 2;
1084 if (std::abs(std::abs(domainCenter) -
M_PI) < domainWidth) {
1086 domainCenter +=
M_PI;
1087 if (position >
M_PI) { position -= 2 *
M_PI; }
1088 if (domainCenter >
M_PI) { domainCenter -= 2 *
M_PI; }
1091 double boundLow = domainCenter - halfWidth;
1092 double boundHigh = domainCenter + halfWidth;
1093 if (position < boundLow)
return false;
1094 if (position > boundHigh)
return false;
1100 if (!dde)
return false;
1118 result &= std::abs(pos.eta() - cell->eta()) < cell->caloDDE()->deta() / 2;
1119 else if (cell->caloDDE()->getSampling() != CaloCell_ID::TileBar1)
1120 result &= std::abs(pos.z() - cell->z()) < cell->caloDDE()->dz() / 2;
1125 double diff_x = p1.x() - p2.x();
1126 double diff_y = p1.y() - p2.y();
1127 double diff_z = p1.z() - p2.z();
1128 return std::hypot(diff_x, diff_y, diff_z);
Scalar mag() const
mag method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Maintain a set of objects, one per slot.
Definition of CaloDetDescriptor.
DataVector< Trk::CaloExtension > CaloExtensionCollection
CaloPhiRange class declaration.
std::pair< std::vector< unsigned int >, bool > res
#define ATLAS_THREAD_SAFE
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
Header file for AthHistogramAlgorithm.
Container class for CaloCell.
const CaloCell * findCell(const IdentifierHash theHash) const
fast find method given identifier hash.
CaloSampling::CaloSample CaloSample
Data object for each calorimeter readout cell.
double energy() const
get energy (data member)
const CaloDetDescrElement * caloDDE() const
get pointer to CaloDetDescrElement (data member)
virtual double sinTh() const override final
get sin(theta) (through CaloDetDescrElement)
virtual bool badcell() const
check is cell is dead
This class groups all DetDescr information related to a CaloCell.
IdentifierHash calo_hash() const
cell calo hash
bool is_tile() const
cell belongs to Tile
float dphi() const
cell dphi
CaloCell_ID::CaloSample getSampling() const
cell sampling
float eta() const
cell eta
float phi() const
cell phi
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
void cellsInZone(double eta_min, double eta_max, double phi_min, double phi_max, std::vector< IdentifierHash > &cell_list) const
the only client is CaloCellList class
calo_descr_range calo_descriptors_range() const
Range over descriptors.
calo_descr_range tile_descriptors_range() const
Range over tile descriptors.
This class provides the client interface for accessing the detector description information common to...
This is a base class for LAr and Tile Descriptors The primary goal is to speed up loops over all the ...
static double diff(double phi1, double phi2)
simple phi1 - phi2 calculation, but result is fixed to respect range.
static constexpr unsigned int getNumberOfSamplings()
Get number of available samplings.
This is a "hash" representation of an Identifier.
double getZMax(unsigned int index) const
unsigned int getNRows() const
double getZMin(unsigned int index) const
Tracking class to hold the extrapolation through calorimeter Layers Both the caloEntryLayerIntersecti...
const TrackParameters * caloEntryLayerIntersection() const
access to intersection with the calorimeter entry layer return nullptr if the intersection failed
Class for a CylinderSurface in the ATLAS detector.
Class for a DiscSurface in the ATLAS detector.
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
Abstract Base Class for tracking surfaces.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D
void entryExitLayerMap(const Trk::CaloExtension &extension, EntryExitLayerMap &result, const LayersToSelect *selection=nullptr)
std::map< CaloSampling::CaloSample, double > ScalarLayerMap
void eLossLayerMap(const Trk::CaloExtension &extension, ScalarLayerMap &result)
std::map< CaloSampling::CaloSample, std::pair< Amg::Vector3D, Amg::Vector3D > > EntryExitLayerMap
size_t getNSlots()
Return the number of event slots.
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
PropDirection
PropDirection, enum for direction of the propagation.
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
TrackParticle_v1 TrackParticle
Reference the current persistent version: