ATLAS Offline Software
Loading...
Searching...
No Matches
CaloCellHelpers.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef REC_CALOCELLHELPERS_H
6#define REC_CALOCELLHELPERS_H
7
8#include <cmath>
9
10#include "CaloEvent/CaloCell.h"
12
13inline double phiMean(double a, double b) { return 0.5 * (a + b) + (a * b < 0) * M_PI; }
14
16inline bool crossedPhi(const CaloCell& cell, double phi_entrance, double phi_exit) {
17 double mean_phi = phiMean(phi_entrance, phi_exit);
18 double dphi = fabs(CaloPhiRange::diff(phi_entrance, phi_exit));
19 double phi_min = mean_phi - dphi, phi_max = mean_phi + dphi;
20
21 return (CaloPhiRange::diff(cell.phi() + cell.caloDDE()->dphi() / 2., phi_min) > 0 &&
22 CaloPhiRange::diff(phi_max, cell.phi() - cell.caloDDE()->dphi() / 2.) > 0);
23}
24
26inline double getPathLengthInEta(const CaloCell& cell, double eta_entrance, double eta_exit) {
27 double etaMin = cell.eta() - 0.5 * cell.caloDDE()->deta();
28 double etaMax = cell.eta() + 0.5 * cell.caloDDE()->deta();
29 if (fabs(eta_entrance - eta_exit) < 1e-6) // to avoid FPE
30 return eta_entrance > etaMin && eta_entrance < etaMax;
31
32 double etaMinTrack = std::min(eta_entrance, eta_exit);
33 double etaMaxTrack = std::max(eta_entrance, eta_exit);
34 return (std::min(etaMax, etaMaxTrack) - std::max(etaMin, etaMinTrack)) / (etaMaxTrack - etaMinTrack);
35}
36
38inline double getPathLengthInZ(double zMin, double zMax, double z_entrance, double z_exit) {
39 if (fabs(z_entrance - z_exit) < 1e-6) // to avoid FPE
40 return z_entrance > zMin && z_entrance < zMax;
41
42 double zMinTrack = std::min(z_entrance, z_exit);
43 double zMaxTrack = std::max(z_entrance, z_exit);
44 return (std::min(zMax, zMaxTrack) - std::max(zMin, zMinTrack)) / (zMaxTrack - zMinTrack);
45}
46
48inline double getPathLengthInZ(const CaloCell& cell, double z_entrance, double z_exit) {
49 return getPathLengthInZ(cell.z() - 0.5 * cell.caloDDE()->dz(), cell.z() + 0.5 * cell.caloDDE()->dz(), z_entrance, z_exit);
50}
51
52// /** Return the % of path length crossed by the track inside a cell in Z for a ladder shaped cell **/
53// inline double getPathLengthInZTileBar1(const CaloCell& cell, double z_entrance, double z_exit) {
54// // Divide the problem in 2 rectangles: the cell contains 6 tile rows, 3 in the bottom part, 3 in the top
55// // Calculate the point where the track crossed the boundary between the bottom and top parts
56// // and determine the path lenght inside each part
57// TileCellDim *cell_dim = m_tileDDM->get_cell_dim(cell.caloDDE()->identify());
58// if (!cell_dim || cell_dim->getNRows() != 6) // should always be the case for this sampling
59// return 0;
60
61// // Get the percentage in depth covered by the bottom part of the cell
62// double R = (cell_dim->getRMax(2) - cell_dim->getRMin(0))/(cell_dim->getRMax(5) - cell_dim->getRMin(0));
63
64// // The point where the track crossed the boundary
65// double z_middle = z_entrance + R*(z_exit - z_entrance);
66
67// // Get the boundaries of the 2 half-cells
68// double zBottom_min = cell_dim->getZMin(0), zBottom_max = cell_dim->getZMax(0);
69// double zTop_min = cell_dim->getZMin(3), zTop_max = cell_dim->getZMax(3);
70// double pathBottom = getPathLengthInZ(zBottom_min, zBottom_max, z_entrance, z_middle);
71
72// // Calculate the path traversed in the bottom and top parts
73// if (zTop_min == zTop_max) { // top part of B9 cell has 0 width. Don't take the mean in this case
74// if ( fabs(z_middle) > fabs(zBottom_max) && pathBottom > 0)
75// pathBottom = 1;
76// return pathBottom;
77// }
78// double pathTop = getPathLengthInZ(zTop_min, zTop_max, z_middle, z_exit);
79// // Take the weighted mean using the depth ratio since the method gives the %
80// return R*pathBottom + (1.-R)*pathTop;
81// }
82
84inline double pathInsideCell(const CaloCell& cell, const Amg::Vector3D& entry, const Amg::Vector3D& exit) {
85 if (!crossedPhi(cell, entry.phi(), exit.phi())) return 0;
86 double pathCrossed = 0;
87 if (cell.caloDDE()->getSubCalo() != CaloCell_ID::TILE)
88 pathCrossed = getPathLengthInEta(cell, entry.eta(), exit.eta());
89 else if (cell.caloDDE()->getSampling() == CaloCell_ID::TileBar1) // ladder shape cells, divide the problem in 2
90 pathCrossed = 0; // getPathLengthInZTileBar1(cell, entry.z(), exit.z());
91 else
92 pathCrossed = getPathLengthInZ(cell, entry.z(), exit.z());
93 if (pathCrossed <= 0) return 0;
94 return pathCrossed;
95}
96
97#endif
#define M_PI
double getPathLengthInEta(const CaloCell &cell, double eta_entrance, double eta_exit)
Return the % of path length crossed by the track inside a cell in eta.
double pathInsideCell(const CaloCell &cell, const Amg::Vector3D &entry, const Amg::Vector3D &exit)
Return the % of path length crossed by the track inside a cell in Z for a ladder shaped cell.
bool crossedPhi(const CaloCell &cell, double phi_entrance, double phi_exit)
Return true if the cell crossed was crossed by the track in phi.
double phiMean(double a, double b)
double getPathLengthInZ(double zMin, double zMax, double z_entrance, double z_exit)
Return the % of path length crossed by the track inside a cell in Z.
CaloPhiRange class declaration.
static Double_t a
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
static double diff(double phi1, double phi2)
simple phi1 - phi2 calculation, but result is fixed to respect range.
Eigen::Matrix< double, 3, 1 > Vector3D