CMS 3D CMS Logo

HGCalTB16SD01.cc
Go to the documentation of this file.
1 // File: HGCalTB16SD01.cc
3 // Description: Sensitive Detector class for beam counters in TB06 setup
5 
15 
16 #include "G4Step.hh"
17 #include "G4Track.hh"
18 #include "G4Material.hh"
19 #include "G4LogicalVolumeStore.hh"
20 #include "CLHEP/Units/GlobalSystemOfUnits.h"
21 
22 //#define EDM_ML_DEBUG
23 
25  const SensitiveDetectorCatalog & clg,
26  edm::ParameterSet const & p,
27  const SimTrackManager* manager) :
28  CaloSD(name, cpv, clg, p, manager), initialize_(true) {
29 
30  // Values from NIM 80 (1970) 239-244: as implemented in Geant3
31  edm::ParameterSet m_HC = p.getParameter<edm::ParameterSet>("HGCalTestBeamSD");
32  matName_ = m_HC.getParameter<std::string>("Material");
33  useBirk_ = m_HC.getParameter<bool>("UseBirkLaw");
34  birk1_ = m_HC.getParameter<double>("BirkC1")*(g/(MeV*cm2));
35  birk2_ = m_HC.getParameter<double>("BirkC2");
36  birk3_ = m_HC.getParameter<double>("BirkC3");
37  matScin_ = nullptr;
38 
39  edm::LogInfo("HGCSim") << "HGCalTB16SD01:: Use of Birks law is set to "
40  << useBirk_ << " for " << matName_
41  << " with three constants kB = " << birk1_
42  << ", C1 = " << birk2_ << ", C2 = " << birk3_;
43 }
44 
45 double HGCalTB16SD01::getEnergyDeposit(const G4Step* aStep) {
46 
47  auto const point = aStep->GetPreStepPoint();
49  double destep = aStep->GetTotalEnergyDeposit();
50  double wt2 = aStep->GetTrack()->GetWeight();
51  double weight = (wt2 > 0.0) ? wt2 : 1.0;
52  if (useBirk_ && matScin_ == point->GetMaterial()) {
53  weight *= getAttenuation(aStep, birk1_, birk2_, birk3_);
54  }
55 #ifdef EDM_ML_DEBUG
56  std::cout << "HGCalTB16SD01: Detector "
57  << point->GetTouchable()->GetVolume()->GetName() << " with "
58  << point->GetMaterial()->GetName() << " weight " << weight
59  << ":" << wt2 << std::endl;
60 #endif
61  return weight*destep;
62 }
63 
64 uint32_t HGCalTB16SD01::setDetUnitId(const G4Step * aStep) {
65 
66  const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
67  const G4VTouchable* touch = preStepPoint->GetTouchable();
68 
69  int det(1), x(0), y(0);
70  int lay = (touch->GetReplicaNumber(0));
71 
72  return packIndex (det, lay, x, y);
73 }
74 
75 uint32_t HGCalTB16SD01::packIndex(int det, int lay, int x, int y) {
76 
77  int ix = 0, ixx = x;
78  if (x < 0) { ix = 1; ixx =-x;}
79  int iy = 0, iyy = y;
80  if (y < 0) { iy = 1; iyy =-y;}
81  uint32_t idx = (det&15)<<28; //bits 28-31
82  idx += (lay&127)<<21; //bits 21-27
83  idx += (iy&1)<<19; //bit 19
84  idx += (iyy&511)<<10; //bits 10-18
85  idx += (ix&1)<<9; //bit 9
86  idx += (ixx&511); //bits 0-8
87 
88 #ifdef EDM_ML_DEBUG
89  std::cout << "HGCalTB16SD01: Detector " << det << " Layer " << lay << " x "
90  << x << " " << ix << " " << ixx << " y " << y << " " << iy << " "
91  << iyy << " ID " << std::hex << idx << std::dec << std::endl;
92 #endif
93  return idx;
94 }
95 
96 void HGCalTB16SD01::unpackIndex(const uint32_t & idx, int& det, int& lay,
97  int& x, int& y) {
98 
99  det = (idx>>28)&15;
100  lay = (idx>>21)&127;
101  y = (idx>>10)&511; if (((idx>>19)&1) == 1) y = -y;
102  x = (idx)&511; if (((idx>>9)&1) == 1) x = -x;
103 
104 }
105 
106 void HGCalTB16SD01::initialize(const G4StepPoint* point) {
107  if (matName_ == point->GetMaterial()->GetName()) {
108  matScin_ = point->GetMaterial();
109  initialize_ = false;
110  }
111 #ifdef EDM_ML_DEBUG
112  std::cout << "HGCalTB16SD01: Material pointer for " << matName_
113  << " is initialized to : " << matScin_ << std::endl;
114 #endif
115 }
T getParameter(std::string const &) const
double getEnergyDeposit(const G4Step *) override
Definition: CaloSD.h:37
int iyy[18][41][3]
Definition: weight.py:1
int ixx[18][41][3]
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:80
static void unpackIndex(const uint32_t &idx, int &det, int &lay, int &x, int &y)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
std::string matName_
Definition: HGCalTB16SD01.h:37
const double MeV
uint32_t setDetUnitId(const G4Step *step) override
HGCalTB16SD01(const std::string &, const DDCompactView &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
G4Material * matScin_
Definition: HGCalTB16SD01.h:41
void initialize(const G4StepPoint *point)
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
Definition: CaloSD.cc:462
static uint32_t packIndex(int det, int lay, int x, int y)
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5