2 #include "G4VPhysicalVolume.hh"
3 #include "G4SystemOfUnits.hh"
4 #include "HGCal/TBStandaloneSimulator/interface/SamplingSection.hh"
8 int SamplingSection::sens_layer_count = 0;
10 SamplingSection::SamplingSection(std::vector<TBGeometry::Element>&
14 G4cout <<
" -- BEGIN(sampling section)" << G4endl;
24 hasScintillator =
false;
25 n_elements = elements.size();
27 for(
size_t c = 0; c < elements.size(); c++) {
30 string theunits = e.
smap[
"units"];
31 if ( theunits ==
"m" )
33 else if ( theunits ==
"cm" )
36 bool isSensitive =
static_cast<bool>(e.
imap[
"sensitive"]);
37 string material = e.
smap[
"material"];
38 double thickness = e.
dmap[
"thickness"] * units;
39 double zpos = e.
dmap[
"z"] * units;
41 if ( material ==
"Scintillator" ) hasScintillator =
true;
43 ele_name.push_back(material);
44 ele_thick.push_back(thickness);
46 ele_dEdx.push_back(0);
50 Total_thick += thickness;
54 sens_HitVec.push_back(lVec);
55 sens_layer.push_back(sens_layer_count);
59 cout <<
"\tmaterial: " << material
60 <<
"\tthickness: " << thickness << theunits
62 if ( isSensitive ) cout <<
" <=== sensitive";
65 n_sens_elements = sens_HitVec.size();
67 sens_HitVec_size_max = 0;
70 cout <<
" number of elements: " << n_elements << endl
71 <<
" number of sensitive elements: " << n_sens_elements << endl
72 <<
" -- END(sampling section)" << endl
77 void SamplingSection::add(G4double den, G4double dl,
78 G4double globalTime, G4int pdgId,
79 G4VPhysicalVolume* vol,
80 const G4ThreeVector & position,
81 G4int trackID, G4int parentID,
84 std::string lstr = vol->GetName();
85 for (
size_t ie(0); ie < n_elements; ++ie) {
86 if(ele_vol[ie] && lstr == ele_vol[ie]->GetName()) {
88 ele_den[eleidx] += den;
90 if (isSensitiveElement(eleidx)) {
91 size_t idx = getSensitiveLayerIndex(lstr);
92 sens_time[idx] += den * globalTime;
95 if(abs(pdgId) == 22) sens_gFlux[idx] += den;
96 else if(abs(pdgId) == 11) sens_eFlux[idx] += den;
97 else if(abs(pdgId) == 13) sens_muFlux[idx] += den;
98 else if (abs(pdgId) == 2112) sens_neutronFlux[idx] += den;
100 sens_hadFlux[idx] += den;
106 lHit.time = globalTime;
108 lHit.layer = layerId;
109 lHit.hit_x = position.x();
110 lHit.hit_y = position.y();
111 lHit.hit_z = position.z();
112 lHit.trackId = trackID;
113 lHit.parentId = parentID;
114 sens_HitVec[idx].push_back(lHit);
122 void SamplingSection::report(
bool header)
124 if(header) G4cout <<
"E/[MeV]\t Si\tAbsorber\tTotal\tSi g frac\tSi e frac\tSi mu frac\tSi had frac\tSi <t> \t nG4SiHits" << G4endl;
125 G4cout << std::setprecision(3) <<
"\t " << getMeasuredEnergy(
false) <<
"\t" << getAbsorbedEnergy() <<
"\t\t" << getTotalEnergy() <<
"\t"
126 << getPhotonFraction() <<
"\t" << getElectronFraction() <<
"\t" << getMuonFraction() <<
"\t" << getHadronicFraction() <<
"\t"
127 << getAverageTime() <<
"\t"
128 << getTotalSensHits() <<
"\t"
132 G4int SamplingSection::getTotalSensHits()
135 for (
unsigned ie(0); ie < n_sens_elements; ++ie) {
136 tot += sens_HitVec[ie].size();
141 G4double SamplingSection::getTotalSensE()
144 for (
unsigned ie(0); ie < n_elements; ++ie) {
145 if (isSensitiveElement(ie)) etot += ele_den[ie];
150 G4double SamplingSection::getAverageTime()
152 double etot = getTotalSensE();
154 for (
unsigned ie(0); ie < n_sens_elements; ++ie) {
155 time += sens_time[ie];
157 return etot > 0 ? time / etot : 0 ;
161 G4double SamplingSection::getPhotonFraction()
163 double etot = getTotalSensE();
165 for (
unsigned ie(0); ie < n_sens_elements; ++ie) {
166 val += sens_gFlux[ie];
168 return etot > 0 ? val / etot : 0 ;
172 G4double SamplingSection::getElectronFraction()
174 double etot = getTotalSensE();
176 for (
unsigned ie(0); ie < n_sens_elements; ++ie) {
177 val += sens_eFlux[ie];
179 return etot > 0 ? val / etot : 0 ;
183 G4double SamplingSection::getMuonFraction()
185 double etot = getTotalSensE();
187 for (
unsigned ie(0); ie < n_sens_elements; ++ie) {
188 val += sens_muFlux[ie];
190 return etot > 0 ? val / etot : 0 ;
194 G4double SamplingSection::getNeutronFraction()
196 double etot = getTotalSensE();
198 for (
unsigned ie(0); ie < n_sens_elements; ++ie) {
199 val += sens_neutronFlux[ie];
201 return etot > 0 ? val / etot : 0 ;
205 G4double SamplingSection::getHadronicFraction()
207 double etot = getTotalSensE();
209 for (
unsigned ie(0); ie < n_sens_elements; ++ie) {
210 val += sens_hadFlux[ie];
212 return etot > 0 ? val / etot : 0 ;
216 G4double SamplingSection::getMeasuredEnergy(
bool weighted)
218 G4double weight = (weighted ? getAbsorberX0() : 1.0);
219 return weight * getTotalSensE();
223 G4double SamplingSection::getAbsorberX0()
226 for (
unsigned ie(0); ie < n_elements; ++ie) {
227 if (isAbsorberElement(ie))
228 if (ele_X0[ie] > 0) val += ele_thick[ie] / ele_X0[ie];
233 G4double SamplingSection::getAbsorberdEdx()
236 for (
unsigned ie(0); ie < n_elements; ++ie) {
237 if (isAbsorberElement(ie))
238 val += ele_thick[ie] * ele_dEdx[ie];
244 G4double SamplingSection::getAbsorberLambda()
247 for (
unsigned ie(0); ie < n_elements; ++ie) {
248 if (isAbsorberElement(ie) && ele_L0[ie] > 0)
249 val += ele_thick[ie] / ele_L0[ie];
255 G4double SamplingSection::getAbsorbedEnergy()
258 for (
unsigned ie(0); ie < n_elements; ++ie) {
259 if (isAbsorberElement(ie)) val += ele_den[ie];
265 G4double SamplingSection::getTotalEnergy()
268 for (
unsigned ie(0); ie < n_elements; ++ie) {
274 const G4SiHitVec & SamplingSection::getSiHitVec(
const unsigned & idx)
const
276 assert(sens_HitVec.size() > 0);
277 return sens_HitVec[idx];
280 void SamplingSection::trackParticleHistory(
const unsigned & idx,
281 const G4SiHitVec & incoming)
283 for (
unsigned iP(0); iP < sens_HitVec[idx].size(); ++iP) {
284 G4int parId = sens_HitVec[idx][iP].parentId;
285 for (
unsigned iI(0); iI < incoming.size(); ++iI) {
286 G4int trId = incoming[iI].trackId;
288 sens_HitVec[idx][iP].parentId = incoming[iI].parentId;
std::map< std::string, double > dmap
std::map< std::string, int > imap
std::map< std::string, std::string > smap