File indexing completed on 2024-04-06 12:05:12
0001 #ifndef DataFormatsSiStripClusterSiStripClusterTools_H
0002 #define DataFormatsSiStripClusterSiStripClusterTools_H
0003
0004 #include "DataFormats/TrajectoryState/interface/LocalTrajectoryParameters.h"
0005 #include "DataFormats/SiStripDetId/interface/SiStripDetId.h"
0006
0007 #include <numeric>
0008
0009 namespace siStripClusterTools {
0010
0011
0012 inline float sensorThicknessInverse(DetId detid) {
0013 if (detid.subdetId() >= SiStripDetId::TIB) {
0014 SiStripDetId siStripDetId = detid();
0015 if (siStripDetId.subdetId() == SiStripDetId::TOB)
0016 return 1.f / 0.047f;
0017 if (siStripDetId.moduleGeometry() == SiStripModuleGeometry::W5 ||
0018 siStripDetId.moduleGeometry() == SiStripModuleGeometry::W6 ||
0019 siStripDetId.moduleGeometry() == SiStripModuleGeometry::W7)
0020 return 1.f / 0.047f;
0021 return 1.f / 0.029f;
0022 } else if (detid.subdetId() == 1)
0023 return 1.f / 0.0285f;
0024 else
0025 return 1.f / 0.027f;
0026 }
0027
0028 template <typename Iter>
0029 inline float chargePerCM(DetId detid, Iter a, Iter b) {
0030 return float(std::accumulate(a, b, int(0))) * sensorThicknessInverse(detid);
0031 }
0032
0033 template <typename Clus>
0034 inline float chargePerCM(DetId detid, Clus const& cl) {
0035 return cl.charge() * sensorThicknessInverse(detid);
0036 }
0037
0038 template <typename Clus>
0039 inline float chargePerCM(DetId detid, Clus const& cl, LocalTrajectoryParameters const& tp) {
0040 return chargePerCM(detid, cl) * tp.absdz();
0041 }
0042
0043 template <typename Clus>
0044 inline float chargePerCM(Clus const& cl, LocalTrajectoryParameters const& tp, float invThick) {
0045 return cl.charge() * invThick * tp.absdz();
0046 }
0047
0048 template <typename Clus>
0049 inline float chargePerCM(DetId detid, Clus const& cl, const LocalVector& ldir) {
0050 return chargePerCM(detid, cl) * std::abs(ldir.z()) / ldir.mag();
0051 }
0052
0053 }
0054
0055 #endif