CMS 3D CMS Logo

GflashG4Watcher.cc
Go to the documentation of this file.
1 #include "G4Electron.hh"
2 #include "G4Positron.hh"
3 #include "G4PrimaryParticle.hh"
4 #include "G4PrimaryVertex.hh"
5 #include "G4SDManager.hh"
6 #include "G4Step.hh"
7 #include "G4VProcess.hh"
8 
12 
14 
15 #include <TVector2.h>
16 
17 using namespace CLHEP;
18 
19 // constructors and destructor
20 //
22  edm::ParameterSet myP = p.getParameter<edm::ParameterSet>("GflashG4Watcher");
23  histFileName_ = myP.getParameter<std::string>("histFileName");
24  recoEnergyScaleEB_ = myP.getParameter<double>("recoEnergyScaleEB");
25  recoEnergyScaleEE_ = myP.getParameter<double>("recoEnergyScaleEE");
26 
27  histFile_ = new TFile(histFileName_.c_str(), "RECREATE");
28 
29  TH1::AddDirectory(kTRUE);
30 
31  em_incE = new TH1F("em_incE", "Incoming energy at Ecal;E (GeV);Number of Events", 500, 0.0, 500.0);
32  em_vtx_rho = new TH1F("em_vtx_rho", "vertex position;#rho (cm);Number of Events", 100, 0.0, 10.0);
33  em_vtx_z = new TH1F("em_vtx_z", "vertex position;z (cm);Number of Events", 100, -10.0, 10.0);
34 
35  eb_ssp_rho = new TH1F("eb_ssp_rho", "Shower starting position;#rho (cm);Number of Events", 200, 0.0, 200.0);
36  eb_hit_long = new TH1F("eb_hit_long",
37  "longitudinal hit position;shower depth (cm);Number "
38  "of energy weighted hits",
39  400,
40  0.0,
41  200.0);
42  eb_hit_lat = new TH1F("eb_hit_lat", "lateral hit position;arm (cm);Number of energy weighted hits", 100, 0.0, 5.0);
43  eb_hit_rz = new TH2F(
44  "eb_hit_rz", "hit position along the shower direction;shower depth (cm);arm (cm)", 400, 0.0, 200.0, 100, 0.0, 5.0);
45  eb_hit_long_sd = new TH1F("eb_hit_long_sd",
46  "longitudinal hit position in Sensitive Detector;shower depth "
47  "(cm);Number of energy weighted hits",
48  400,
49  0.0,
50  200.0);
51  eb_hit_lat_sd = new TH1F("eb_hit_lat_sd",
52  "lateral hit position in Sensitive Detector;arm "
53  "(cm);Number of energy weighted hits",
54  100,
55  0.0,
56  5.0);
57  eb_hit_rz_sd = new TH2F("eb_hit_rz_sd",
58  "hit position along the shower direction in "
59  "Sensitive Detector;shower depth (cm);arm (cm)",
60  400,
61  0.0,
62  200.0,
63  100,
64  0.0,
65  5.0);
66 
67  ee_ssp_z = new TH1F("ee_ssp_z", "Shower starting position;z (cm);Number of Events", 800, -400.0, 400.0);
68  ee_hit_long = new TH1F("ee_hit_long",
69  "longitudinal hit position;shower depth (cm);Number "
70  "of energy weighted hits",
71  800,
72  0.0,
73  400.0);
74  ee_hit_lat = new TH1F("ee_hit_lat", "lateral hit position;arm (cm);Number of energy weighted hits", 100, 0.0, 5.0);
75  ee_hit_rz = new TH2F(
76  "ee_hit_rz", "hit position along the shower direction;shower depth (cm);arm (cm)", 800, 0.0, 400.0, 100, 0.0, 5.0);
77  ee_hit_long_sd = new TH1F("ee_hit_long_sd",
78  "longitudinal hit position in Sensitive Detector;shower depth "
79  "(cm);Number of energy weighted hits",
80  800,
81  0.0,
82  400.0);
83  ee_hit_lat_sd = new TH1F("ee_hit_lat_sd",
84  "lateral hit position in Sensitive Detector;arm "
85  "(cm);Number of energy weighted hits",
86  100,
87  0.0,
88  5.0);
89  ee_hit_rz_sd = new TH2F("ee_hit_rz_sd",
90  "hit position along the shower direction in "
91  "Sensitive Detector;shower depth (cm);arm (cm)",
92  800,
93  0.0,
94  400.0,
95  100,
96  0.0,
97  5.0);
98 }
99 
101  histFile_->cd();
102  histFile_->Write();
103  histFile_->Close();
104 }
105 
106 void GflashG4Watcher::update(const BeginOfEvent *g4Event) {
107  inc_flag = false;
108 
109  const G4Event *evt = (*g4Event)();
110  inc_vertex = evt->GetPrimaryVertex(0)->GetPosition();
111  inc_position = inc_vertex;
112  inc_direction = evt->GetPrimaryVertex(0)->GetPrimary(0)->GetMomentum().unit();
113  inc_energy = evt->GetPrimaryVertex(0)->GetPrimary(0)->GetMomentum().mag();
114  out_energy = 0;
115 
116  em_incE->Fill(inc_energy / GeV);
117  em_vtx_rho->Fill(inc_vertex.rho() / cm);
118  em_vtx_z->Fill(inc_vertex.z() / cm);
119 
120  if (std::abs(inc_direction.eta()) < 1.5)
121  eb_ssp_rho->Fill(inc_position.rho() / cm);
122  else
123  ee_ssp_z->Fill(inc_position.z() / cm);
124 }
125 
126 void GflashG4Watcher::update(const EndOfEvent *g4Event) {}
127 
128 void GflashG4Watcher::update(const G4Step *aStep) {
129  if (aStep == nullptr)
130  return;
131 
132  double hitEnergy = aStep->GetTotalEnergyDeposit();
133 
134  if (hitEnergy < 1.0e-6)
135  return;
136 
137  bool inEB = std::abs(inc_direction.eta()) < 1.5;
138 
139  out_energy += hitEnergy; // to check outgoing energy
140 
141  // This is to calculate shower depth and arm of hits from the shower direction
142  G4ThreeVector hitPosition = aStep->GetPreStepPoint()->GetPosition();
143  G4ThreeVector diff = hitPosition - inc_position;
144  double angle = diff.angle(inc_direction);
145  double diff_z = std::abs(diff.mag() * std::cos(angle));
146  double diff_r = std::abs(diff.mag() * std::sin(angle));
147 
148  G4VSensitiveDetector *aSensitive = aStep->GetPreStepPoint()->GetSensitiveDetector();
149 
150  if (inEB) { // showers in barrel crystals
151  hitEnergy *= recoEnergyScaleEB_;
152  eb_hit_long->Fill(diff_z / cm, hitEnergy / GeV);
153  eb_hit_lat->Fill(diff_r / cm, hitEnergy / GeV);
154  eb_hit_rz->Fill(diff_z / cm, diff_r / cm, hitEnergy / GeV);
155  if (aSensitive) {
156  eb_hit_long_sd->Fill(diff_z / cm, hitEnergy / GeV);
157  eb_hit_lat_sd->Fill(diff_r / cm, hitEnergy / GeV);
158  eb_hit_rz_sd->Fill(diff_z / cm, diff_r / cm, hitEnergy / GeV);
159  }
160  } else { // showers in endcap crystals
161  hitEnergy *= recoEnergyScaleEE_;
162  ee_hit_long->Fill(diff_z / cm, hitEnergy / GeV);
163  ee_hit_lat->Fill(diff_r / cm, hitEnergy / GeV);
164  ee_hit_rz->Fill(diff_z / cm, diff_r / cm, hitEnergy / GeV);
165  if (aSensitive) {
166  ee_hit_long_sd->Fill(diff_z / cm, hitEnergy / GeV);
167  ee_hit_lat_sd->Fill(diff_r / cm, hitEnergy / GeV);
168  ee_hit_rz_sd->Fill(diff_z / cm, diff_r / cm, hitEnergy / GeV);
169  }
170  }
171 }
172 
173 // define this as a plug-in
176 
T getParameter(std::string const &) const
#define DEFINE_SIMWATCHER(type)
const double GeV
Definition: MathUtil.h:16
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
GflashG4Watcher(const edm::ParameterSet &p)
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
~GflashG4Watcher() override
void update(const BeginOfEvent *) override
This routine will be called when the appropriate signal arrives.
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11