CMS 3D CMS Logo

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