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 DebugLog
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 
46 
47 double HGCalTB16SD01::getEnergyDeposit(G4Step* aStep) {
48 
49  G4StepPoint* point = aStep->GetPreStepPoint();
50  if (initialize_) initialize(point);
51  double destep = aStep->GetTotalEnergyDeposit();
52  double weight = 1;
53  if (useBirk_ && matScin_ == point->GetMaterial()) {
54  weight *= getAttenuation(aStep, birk1_, birk2_, birk3_);
55  }
56 #ifdef DebugLog
57  std::cout << "HGCalTB16SD01: Detector "
58  << point->GetTouchable()->GetVolume()->GetName() << " with "
59  << point->GetMaterial()->GetName() << " weight " << weight
60  << std::endl;
61 #endif
62  return weight*destep;
63 }
64 
65 uint32_t HGCalTB16SD01::setDetUnitId(G4Step * aStep) {
66 
67  G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
68  const G4VTouchable* touch = preStepPoint->GetTouchable();
69  G4String name = preStepPoint->GetPhysicalVolume()->GetName();
70 
71  int det(1), x(0), y(0);
72  int lay = (touch->GetReplicaNumber(0));
73 
74  return packIndex (det, lay, x, y);
75 }
76 
77 uint32_t HGCalTB16SD01::packIndex(int det, int lay, int x, int y) {
78 
79  int ix = 0, ixx = x;
80  if (x < 0) { ix = 1; ixx =-x;}
81  int iy = 0, iyy = y;
82  if (y < 0) { iy = 1; iyy =-y;}
83  uint32_t idx = (det&15)<<28; //bits 28-31
84  idx += (lay&127)<<21; //bits 21-27
85  idx += (iy&1)<<19; //bit 19
86  idx += (iyy&511)<<10; //bits 10-18
87  idx += (ix&1)<<9; //bit 9
88  idx += (ixx&511); //bits 0-8
89 
90 #ifdef DebugLog
91  std::cout << "HGCalTB16SD01: Detector " << det << " Layer " << lay << " x "
92  << x << " " << ix << " " << ixx << " y " << y << " " << iy << " "
93  << iyy << " ID " << std::hex << idx << std::dec << std::endl;
94 #endif
95  return idx;
96 }
97 
98 void HGCalTB16SD01::unpackIndex(const uint32_t & idx, int& det, int& lay,
99  int& x, int& y) {
100 
101  det = (idx>>28)&15;
102  lay = (idx>>21)&127;
103  y = (idx>>10)&511; if (((idx>>19)&1) == 1) y = -y;
104  x = (idx)&511; if (((idx>>9)&1) == 1) x = -x;
105 
106 }
107 
108 void HGCalTB16SD01::initialize(G4StepPoint* point) {
109  if (matName_ == point->GetMaterial()->GetName()) {
110  matScin_ = point->GetMaterial();
111  initialize_ = false;
112  }
113 #ifdef DebugLog
114  std::cout << "HGCalTB16SD01: Material pointer for " << matName_
115  << " is initialized to : " << matScin_ << std::endl;
116 #endif
117 }
T getParameter(std::string const &) const
HGCalTB16SD01(G4String, const DDCompactView &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
Definition: CaloSD.h:42
int iyy[18][41][3]
Definition: weight.py:1
int ixx[18][41][3]
type of data representation of DDCompactView
Definition: DDCompactView.h:90
void initialize(G4StepPoint *point)
static void unpackIndex(const uint32_t &idx, int &det, int &lay, int &x, int &y)
virtual ~HGCalTB16SD01()
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:36
const double MeV
double getAttenuation(G4Step *aStep, double birk1, double birk2, double birk3)
Definition: CaloSD.cc:465
G4StepPoint * preStepPoint
Definition: CaloSD.h:120
virtual double getEnergyDeposit(G4Step *)
G4Material * matScin_
Definition: HGCalTB16SD01.h:40
virtual uint32_t setDetUnitId(G4Step *step)
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