CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 const double radLength = 8.9; // mm
20 const double rMoliere = 21.9; // mm
21 // constructors and destructor
22 //
24 
25  edm::ParameterSet myP = p.getParameter<edm::ParameterSet>("GflashG4Watcher");
26  histFileName_ = myP.getParameter<std::string>("histFileName");
27  recoEnergyScaleEB_ = myP.getParameter<double>("recoEnergyScaleEB");
28  recoEnergyScaleEE_ = myP.getParameter<double>("recoEnergyScaleEE");
29 
30 
31  histFile_ = new TFile(histFileName_.c_str(),"RECREATE");
32 
33  TH1::AddDirectory(kTRUE);
34 
35 
36  em_incE = new TH1F("em_incE","Incoming energy at Ecal;E (GeV);Number of Events",500,0.0,500.0);
37  em_vtx_rho = new TH1F("em_vtx_rho","vertex position;#rho (cm);Number of Events",100,0.0,10.0);
38  em_vtx_z = new TH1F("em_vtx_z","vertex position;z (cm);Number of Events",100,-10.0,10.0);
39 
40  eb_ssp_rho = new TH1F("eb_ssp_rho","Shower starting position;#rho (cm);Number of Events",200,0.0,200.0);
41  eb_hit_long = new TH1F("eb_hit_long","longitudinal hit position;shower depth (cm);Number of energy weighted hits",400,0.0,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("eb_hit_rz","hit position along the shower direction;shower depth (cm);arm (cm)",400,0.0,200.0,100,0.0,5.0);
44  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);
45  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);
46  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);
47 
48  ee_ssp_z = new TH1F("ee_ssp_z","Shower starting position;z (cm);Number of Events",800,-400.0,400.0);
49  ee_hit_long = new TH1F("ee_hit_long","longitudinal hit position;shower depth (cm);Number of energy weighted hits",800,0.0,400.0);
50  ee_hit_lat = new TH1F("ee_hit_lat","lateral hit position;arm (cm);Number of energy weighted hits",100,0.0,5.0);
51  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);
52  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);
53  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);
54  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);
55 
56 }
57 
58 
60  histFile_->cd();
61  histFile_->Write();
62  histFile_->Close();
63 }
64 
65 
67 
68  inc_flag = false;
69 
70  const G4Event* evt = (*g4Event)();
71  inc_vertex = evt->GetPrimaryVertex(0)->GetPosition();
72  inc_position = inc_vertex;
73  inc_direction = evt->GetPrimaryVertex(0)->GetPrimary(0)->GetMomentum().unit();
74  inc_energy = evt->GetPrimaryVertex(0)->GetPrimary(0)->GetMomentum().mag();
75  out_energy = 0;
76 
77  em_incE->Fill(inc_energy/GeV);
78  em_vtx_rho->Fill(inc_vertex.rho()/cm);
79  em_vtx_z->Fill(inc_vertex.z()/cm);
80 
81  if(std::abs(inc_direction.eta()) < 1.5) eb_ssp_rho->Fill(inc_position.rho()/cm);
82  else ee_ssp_z->Fill(inc_position.z()/cm);
83 
84 }
85 
86 
87 void GflashG4Watcher::update(const EndOfEvent* g4Event){ }
88 
89 
90 void GflashG4Watcher::update(const G4Step* aStep){
91 
92  if(aStep == NULL) return;
93 
94  double hitEnergy = aStep->GetTotalEnergyDeposit();
95 
96  if(hitEnergy < 1.0e-6) return;
97 
98  bool inEB = std::abs(inc_direction.eta()) < 1.5;
99 
100  out_energy += hitEnergy; // to check outgoing energy
101 
102  // This is to calculate shower depth and arm of hits from the shower direction
103  G4ThreeVector hitPosition = aStep->GetPreStepPoint()->GetPosition();
104  G4ThreeVector diff = hitPosition - inc_position;
105  double angle = diff.angle(inc_direction);
106  double diff_z = std::abs(diff.mag() * std::cos(angle));
107  double diff_r = std::abs(diff.mag() * std::sin(angle));
108 
109  G4VSensitiveDetector* aSensitive = aStep->GetPreStepPoint()->GetSensitiveDetector();
110 
111  if(inEB){ // showers in barrel crystals
112  hitEnergy *= recoEnergyScaleEB_;
113  eb_hit_long->Fill(diff_z/cm,hitEnergy/GeV);
114  eb_hit_lat->Fill(diff_r/cm,hitEnergy/GeV);
115  eb_hit_rz->Fill(diff_z/cm,diff_r/cm,hitEnergy/GeV);
116  if(aSensitive){
117  eb_hit_long_sd->Fill(diff_z/cm,hitEnergy/GeV);
118  eb_hit_lat_sd->Fill(diff_r/cm,hitEnergy/GeV);
119  eb_hit_rz_sd->Fill(diff_z/cm,diff_r/cm,hitEnergy/GeV);
120  }
121  }
122  else{ // showers in endcap crystals
123  hitEnergy *= recoEnergyScaleEE_;
124  ee_hit_long->Fill(diff_z/cm,hitEnergy/GeV);
125  ee_hit_lat->Fill(diff_r/cm,hitEnergy/GeV);
126  ee_hit_rz->Fill(diff_z/cm,diff_r/cm,hitEnergy/GeV);
127  if(aSensitive){
128  ee_hit_long_sd->Fill(diff_z/cm,hitEnergy/GeV);
129  ee_hit_lat_sd->Fill(diff_r/cm,hitEnergy/GeV);
130  ee_hit_rz_sd->Fill(diff_z/cm,diff_r/cm,hitEnergy/GeV);
131  }
132  }
133 
134 
135 }
136 
137 
138 //define this as a plug-in
141 
142 
144 
T getParameter(std::string const &) const
#define DEFINE_SIMWATCHER(type)
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
const double radLength
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
const double rMoliere
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11