File indexing completed on 2023-03-17 11:00:40
0001 #include "FastSimulation/CaloHitMakers/interface/CaloHitMaker.h"
0002 #include "FastSimulation/CaloGeometryTools/interface/CaloGeometryHelper.h"
0003 #include "FastSimulation/CalorimeterProperties/interface/CalorimeterProperties.h"
0004 #include "FastSimulation/CalorimeterProperties/interface/PreshowerProperties.h"
0005 #include "FastSimulation/CalorimeterProperties/interface/PreshowerLayer1Properties.h"
0006 #include "FastSimulation/CalorimeterProperties/interface/ECALProperties.h"
0007 #include "FastSimulation/CalorimeterProperties/interface/HCALProperties.h"
0008 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
0009
0010 typedef ROOT::Math::Plane3D::Point Point;
0011
0012 CaloHitMaker::CaloHitMaker(
0013 const CaloGeometryHelper* theCalo, DetId::Detector basedet, int subdetn, int cal, unsigned sht)
0014 : myCalorimeter(theCalo),
0015 theCaloProperties(nullptr),
0016 base_(basedet),
0017 subdetn_(subdetn),
0018 onCal_(cal),
0019 showerType_(sht) {
0020
0021 EMSHOWER = (sht == 0);
0022 HADSHOWER = (sht == 1);
0023 MIP = (sht == 2);
0024 if (base_ == DetId::Ecal && (subdetn_ == EcalBarrel || subdetn == EcalEndcap) && onCal_)
0025 theCaloProperties = myCalorimeter->ecalProperties(onCal_);
0026
0027 if (base_ == DetId::Ecal && subdetn_ == EcalPreshower && onCal_)
0028 theCaloProperties = myCalorimeter->layer1Properties(onCal_);
0029 if (base_ == DetId::Hcal && cal)
0030 theCaloProperties = myCalorimeter->hcalProperties(onCal_);
0031
0032 if (theCaloProperties) {
0033 moliereRadius = theCaloProperties->moliereRadius();
0034 interactionLength = theCaloProperties->interactionLength();
0035 } else {
0036 moliereRadius = 999;
0037 interactionLength = 999;
0038 }
0039 }
0040
0041 CaloHitMaker::XYZPoint CaloHitMaker::intersect(
0042 const Plane3D& p, const XYZPoint& a, const XYZPoint& b, double& t, bool segment, bool debug) {
0043 t = -9999.;
0044
0045 XYZVector normal = p.Normal();
0046 double AAA = normal.X();
0047 double BBB = normal.Y();
0048 double CCC = normal.Z();
0049
0050 double DDD = p.HesseDistance();
0051
0052 double denom = AAA * (b.X() - a.X()) + BBB * (b.Y() - a.Y()) + CCC * (b.Z() - a.Z());
0053 if (denom != 0.) {
0054
0055 t = -(AAA * a.X() + BBB * a.Y() + CCC * a.Z() + DDD);
0056 t /= denom;
0057 if (debug)
0058 std::cout << " T = " << t << std::endl;
0059 if (segment) {
0060 if (t >= 0 && t <= 1)
0061 return XYZPoint(a.X() + (b.X() - a.X()) * t, a.Y() + (b.Y() - a.Y()) * t, a.Z() + (b.Z() - a.Z()) * t);
0062 } else {
0063 return XYZPoint(a.X() + (b.X() - a.X()) * t, a.Y() + (b.Y() - a.Y()) * t, a.Z() + (b.Z() - a.Z()) * t);
0064 }
0065 }
0066
0067 return XYZPoint(0., 0., 0.);
0068 }