14 #include "G4NavigationHistory.hh" 17 #include "G4VSolid.hh" 18 #include "Randomize.hh" 19 #include "CLHEP/Units/GlobalPhysicalConstants.h" 20 #include "CLHEP/Units/GlobalSystemOfUnits.h" 46 std::vector<HFShower::Hit>
hits;
49 double edep = weight * (aStep->GetTotalEnergyDeposit());
51 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: energy " << aStep->GetTotalEnergyDeposit() <<
" weight " << weight
56 if (aStep->GetTrack()->GetDefinition()->GetPDGCharge() != 0.)
57 stepl = aStep->GetStepLength();
58 if ((edep == 0.) || (stepl == 0.)) {
60 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: Number of Hits " << nHit;
64 const G4Track *aTrack = aStep->GetTrack();
65 const G4DynamicParticle *aParticle = aTrack->GetDynamicParticle();
68 double energy = aParticle->GetTotalEnergy();
69 double momentum = aParticle->GetTotalMomentum();
70 double pBeta = momentum / energy;
74 const G4ThreeVector &momentumDir = aParticle->GetMomentumDirection();
75 const G4ParticleDefinition *particleDef = aTrack->GetDefinition();
77 const G4StepPoint *preStepPoint = aStep->GetPreStepPoint();
78 const G4ThreeVector &globalPos = preStepPoint->GetPosition();
79 G4String
name = preStepPoint->GetTouchable()->GetSolid(0)->GetName();
82 G4ThreeVector localPos = G4ThreeVector(globalPos.x(), globalPos.y(), zv);
83 G4ThreeVector localMom = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformAxis(momentumDir);
88 if (zv < 0. || zv >
gpar[1]) {
95 }
else if (npmt > 24) {
104 <<
":" << zv <<
":" << gpar[0] <<
" ok " << ok <<
" depth " << depth;
107 depth = (preStepPoint->GetTouchable()->GetReplicaNumber(0)) % 10;
109 G4ThreeVector translation = preStepPoint->GetTouchable()->GetVolume(1)->GetObjectTranslation();
111 double u = localMom.x();
112 double v = localMom.y();
113 double w = localMom.z();
114 double zCoor = localPos.z();
115 double zFibre = (0.5 * gpar[1] - zCoor - translation.z());
116 double tSlice = (aStep->GetPostStepPoint()->GetGlobalTime());
120 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: in " << name <<
" Z " << zCoor <<
"(" << globalPos.z() <<
") " 121 << zFibre <<
" Trans " << translation <<
" Time " << tSlice <<
" " << time
122 <<
"\n Direction " << momentumDir <<
" Local " << localMom;
126 std::vector<double> wavelength;
127 std::vector<double> momz;
130 npe =
cherenkov->
computeNPE(aStep, particleDef, pBeta, u, v, w, stepl, zFibre, dose, npeDose);
135 for (
int i = 0;
i < npe; ++
i) {
139 double r1 = G4UniformRand();
140 double r2 = G4UniformRand();
142 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: " << i <<
" attenuation " << r1 <<
":" <<
exp(-p * zFibre)
143 <<
" r2 " << r2 <<
":" <<
probMax 144 <<
" Survive: " << (r1 <=
exp(-p * zFibre) && r2 <=
probMax);
164 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: Number of Hits " << nHit;
165 for (
int i = 0;
i < nHit; ++
i)
166 edm::LogVerbatim(
"HFShower") <<
"HFShower::Hit " <<
i <<
" WaveLength " << hits[
i].wavelength <<
" Time " 167 << hits[
i].time <<
" Momentum " << hits[
i].momentum <<
" Position " 173 std::vector<HFShower::Hit>
HFShower::getHits(
const G4Step *aStep,
bool forLibraryProducer,
double zoffset) {
174 std::vector<HFShower::Hit>
hits;
177 double edep = aStep->GetTotalEnergyDeposit();
180 if (aStep->GetTrack()->GetDefinition()->GetPDGCharge() != 0.)
181 stepl = aStep->GetStepLength();
182 if ((edep == 0.) || (stepl == 0.)) {
184 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: Number of Hits " << nHit;
188 const G4Track *aTrack = aStep->GetTrack();
189 const G4DynamicParticle *aParticle = aTrack->GetDynamicParticle();
192 double energy = aParticle->GetTotalEnergy();
193 double momentum = aParticle->GetTotalMomentum();
194 double pBeta = momentum / energy;
198 const G4ThreeVector &momentumDir = aParticle->GetMomentumDirection();
199 G4ParticleDefinition *particleDef = aTrack->GetDefinition();
201 G4StepPoint *preStepPoint = aStep->GetPreStepPoint();
202 const G4ThreeVector &globalPos = preStepPoint->GetPosition();
203 G4String
name = preStepPoint->GetTouchable()->GetSolid(0)->GetName();
206 double zv =
gpar[1] - (
std::abs(globalPos.z()) - zoffset);
207 G4ThreeVector localPos = G4ThreeVector(globalPos.x(), globalPos.y(), zv);
208 G4ThreeVector localMom = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformAxis(momentumDir);
213 if (zv < 0. || zv >
gpar[1]) {
220 }
else if (npmt > 24) {
229 <<
":" << zv <<
":" << gpar[0] <<
" ok " << ok <<
" depth " << depth;
232 depth = (preStepPoint->GetTouchable()->GetReplicaNumber(0)) % 10;
234 G4ThreeVector translation = preStepPoint->GetTouchable()->GetVolume(1)->GetObjectTranslation();
236 double u = localMom.x();
237 double v = localMom.y();
238 double w = localMom.z();
239 double zCoor = localPos.z();
240 double zFibre = (0.5 * gpar[1] - zCoor - translation.z());
241 double tSlice = (aStep->GetPostStepPoint()->GetGlobalTime());
245 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: in " << name <<
" Z " << zCoor <<
"(" << globalPos.z() <<
") " 246 << zFibre <<
" Trans " << translation <<
" Time " << tSlice <<
" " << time
247 <<
"\n Direction " << momentumDir <<
" Local " << localMom;
251 std::vector<double> wavelength;
252 std::vector<double> momz;
255 npe =
cherenkov->
computeNPE(aStep, particleDef, pBeta, u, v, w, stepl, zFibre, dose, npeDose);
260 for (
int i = 0;
i < npe; ++
i) {
264 double r1 = G4UniformRand();
265 double r2 = G4UniformRand();
267 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: " << i <<
" attenuation " << r1 <<
":" <<
exp(-p * zFibre)
268 <<
" r2 " << r2 <<
":" <<
probMax 269 <<
" Survive: " << (r1 <=
exp(-p * zFibre) && r2 <=
probMax);
289 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: Number of Hits " << nHit;
290 for (
int i = 0;
i < nHit; ++
i)
291 edm::LogVerbatim(
"HFShower") <<
"HFShower::Hit " <<
i <<
" WaveLength " << hits[
i].wavelength <<
" Time " 292 << hits[
i].time <<
" Momentum " << hits[
i].momentum <<
" Position " 299 std::vector<HFShower::Hit>
hits;
302 double edep = aStep->GetTotalEnergyDeposit();
305 if (aStep->GetTrack()->GetDefinition()->GetPDGCharge() != 0.)
306 stepl = aStep->GetStepLength();
307 if ((edep == 0.) || (stepl == 0.)) {
309 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits: Number of Hits " << nHit;
314 const G4Track *aTrack = aStep->GetTrack();
315 const G4DynamicParticle *aParticle = aTrack->GetDynamicParticle();
318 double energy = aParticle->GetTotalEnergy();
319 double momentum = aParticle->GetTotalMomentum();
320 double pBeta = momentum / energy;
324 const G4ThreeVector &momentumDir = aParticle->GetMomentumDirection();
325 G4ParticleDefinition *particleDef = aTrack->GetDefinition();
327 const G4StepPoint *preStepPoint = aStep->GetPreStepPoint();
328 const G4ThreeVector &globalPos = preStepPoint->GetPosition();
329 G4String
name = preStepPoint->GetTouchable()->GetSolid(0)->GetName();
331 G4ThreeVector localPos = G4ThreeVector(globalPos.x(), globalPos.y(), zv);
332 G4ThreeVector localMom = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformAxis(momentumDir);
337 if (zv < 0 || zv >
gpar[1]) {
344 }
else if (npmt > 24) {
353 << gpar[4] <<
":" << zv <<
":" << gpar[0] <<
" ok " << ok <<
" depth " << depth;
356 depth = (preStepPoint->GetTouchable()->GetReplicaNumber(0)) % 10;
358 G4ThreeVector translation = preStepPoint->GetTouchable()->GetVolume(1)->GetObjectTranslation();
360 double u = localMom.x();
361 double v = localMom.y();
362 double w = localMom.z();
363 double zCoor = localPos.z();
364 double zFibre = (0.5 * gpar[1] - zCoor - translation.z());
365 double tSlice = (aStep->GetPostStepPoint()->GetGlobalTime());
369 edm::LogVerbatim(
"HFShower") <<
"HFShower::getHits(SL): in " << name <<
" Z " << zCoor <<
"(" << globalPos.z() <<
") " 370 << zFibre <<
" Trans " << translation <<
" Time " << tSlice <<
" " << time
371 <<
"\n Direction " << momentumDir <<
" Local " << localMom;
376 npe =
cherenkov->
computeNPE(aStep, particleDef, pBeta, u, v, w, stepl, zFibre, dose, npeDose);
380 for (
int i = 0;
i < npe; ++
i) {
394 edm::LogVerbatim(
"HFShower") <<
"HFShower:getDDDArray called for " << str <<
" with nMin " << nmin;
401 const std::vector<double> &fvec = value.
doubles();
402 int nval = fvec.size();
405 edm::LogError(
"HFShower") <<
"HFShower : # of " << str <<
" bins " << nval <<
" < " << nmin <<
" ==> illegal";
406 throw cms::Exception(
"Unknown",
"HFShower") <<
"nval < nmin for array " << str <<
"\n";
410 edm::LogError(
"HFShower") <<
"HFShower : # of " << str <<
" bins " << nval <<
" < 2 ==> illegal" 411 <<
" (nmin=" << nmin <<
")";
420 throw cms::Exception(
"Unknown",
"HFShower") <<
"cannot get array " << str <<
"\n";
double tShift(const G4ThreeVector &point, int depth, int fromEndAbs=0)
T getParameter(std::string const &) const
const std::vector< double > & doubles() const
a reference to the double-valued values stored in the given instance of DDValue
void initRun(const HcalDDDSimConstants *)
double attLength(double lambda)
Compact representation of the geometrical detector hierarchy.
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
std::vector< Hit > getHits(const G4Step *aStep, double weight)
std::vector< double > getWL()
Abs< T >::type abs(const T &t)
std::vector< double > getMom()
std::vector< double > gpar
const std::vector< double > & getGparHF() const
HFShower(const RandomEngineAndDistribution *engine, HDShowerParametrization *myParam, EcalHitMaker *myGrid, HcalHitMaker *myHcalHitMaker, int onECAL, double epart)
void initRun(const HcalDDDSimConstants *)
int PMTNumber(const G4ThreeVector &pe_effect)
std::vector< double > getDDDArray(const std::string &, const DDsvalues_type &, int &)
std::vector< std::pair< unsigned int, DDValue > > DDsvalues_type
int computeNPE(const G4Step *step, const G4ParticleDefinition *pDef, double pBeta, double u, double v, double w, double step_length, double zFiber, double Dose, int Npe_Dose)