131 G4StepPoint * preStepPoint = aStep->GetPreStepPoint();
132 G4Track *
track = aStep->GetTrack();
133 G4ThreeVector hitPoint = preStepPoint->GetPosition();
134 G4int particleCode = track->GetDefinition()->GetPDGEncoding();
136 G4ThreeVector localPoint = G4ThreeVector(hitPoint.x(),hitPoint.y(),zv);
138 double pin = (preStepPoint->GetTotalEnergy())/GeV;
139 double zint = hitPoint.z();
144 << track->GetDefinition()->GetParticleName()
145 <<
" of energy " << pin <<
" GeV"
146 <<
" Pos x,y,z = " << hitPoint.x() <<
","
147 << hitPoint.y() <<
"," << zint <<
" (" << zz <<
","
148 << localPoint.z() <<
", "
149 << (localPoint.z()+0.5*
gpar[1]) <<
") Local "
152 std::vector<HFShowerParam::Hit> hits;
158 double pBeta = track->GetDynamicParticle()->GetTotalMomentum() / track->GetDynamicParticle()->GetTotalEnergy();
160 if (track->GetDefinition()->GetPDGCharge() != 0 && pBeta > (1/
ref_index) &&
161 aStep->GetTotalEnergyDeposit() > 0) other =
true;
165 if (particleCode ==
emPDG || particleCode ==
epPDG ||
166 particleCode ==
gammaPDG || other) {
173 }
else if (track->GetDefinition()->GetPDGCharge() != 0 &&
175 edep = (aStep->GetTotalEnergyDeposit())/GeV;
177 std::string
path =
"ShowerLibrary";
179 edm::LogInfo(
"HFShower") <<
"HFShowerParam: getHits edep = " << edep
180 <<
", Kill = " << kill <<
", pin = " << pin
181 <<
", edMin = " <<
edMin <<
" Other " << other;
187 for (
unsigned int i=0;
i<hitSL.size();
i++) {
191 if (npmt <= 0) ok =
false;
195 hit.
depth = hitSL[
i].depth;
196 hit.
time = hitSL[
i].time;
203 if (hit.
depth == 1) {
207 }
else if (hit.
depth == 2) {
214 edm::LogInfo(
"HFShower") <<
"HFShowerParam: Hit at depth "
215 << hit.
depth <<
" with edep " << hit.
edep
216 <<
" Time " << hit.
time;
222 for (
unsigned int i=0;
i<hitSL.size();
i++) {
224 G4ThreeVector pe_effect(hitSL[
i].
position.x(), hitSL[
i].position.y(), hitSL[
i].position.z());
229 if (zv < 0 ) ok =
false;
230 if (zv >
gpar[1]) ok =
false;
233 if (npmt <= 0) ok =
false;
234 else if (npmt > 24) {
235 if (zv >
gpar[0]) depth = 2;
239 edm::LogInfo(
"HFShower") <<
"HFShowerParam: npmt " << npmt
240 <<
" zv " <<
std::abs(pe_effect.z())
241 <<
":" <<
gpar[4] <<
":" << zv <<
":"
242 <<
gpar[0] <<
" ok " << ok <<
" depth "
246 if (G4UniformRand() > 0.5) depth = 2;
247 if (depth == 2 && zv <
gpar[0]) ok =
false;
251 double r1 = G4UniformRand();
253 edm::LogInfo(
"HFShower") <<
"HFShowerParam:Distance to PMT (" <<npmt
254 <<
") " << dist <<
", exclusion flag "
263 hit.
time = time + hitSL[
i].time;
270 if (hit.
depth == 1) {
274 }
else if (hit.
depth == 2) {
281 edm::LogInfo(
"HFShower") <<
"HFShowerParam: Hit at depth "
282 << hit.
depth <<
" with edep "
283 << hit.
edep <<
" Time " << hit.
time;
291 double tSlice = (aStep->GetPostStepPoint()->GetGlobalTime());
298 edm::LogInfo(
"HFShower") <<
"HFShowerParam: Hit at depth 1 with edep "
299 << edep <<
" Time " << tSlice <<
":" << time
308 edm::LogInfo(
"HFShower") <<
"HFShowerParam: Hit at depth 2 with edep "
309 << edep <<
" Time " << tSlice <<
":" << time
315 for (
unsigned int ii=0; ii<hits.size(); ii++) {
318 edm::LogInfo(
"HFShower") <<
"HFShowerParam: Abnormal hit along "
320 << preStepPoint->GetPhysicalVolume()->GetLogicalVolume()->GetName()
321 <<
" at " << hits[ii].position <<
" zz "
322 << zv <<
" Edep " << edep <<
" due to "
323 << track->GetDefinition()->GetParticleName()
324 <<
" time " << hit.
time;
328 track->SetTrackStatus(fStopAndKill);
329 G4TrackVector tv = *(aStep->GetSecondary());
330 for (
unsigned int kk=0; kk<tv.size(); kk++) {
331 if (tv[kk]->
GetVolume() == preStepPoint->GetPhysicalVolume())
332 tv[kk]->SetTrackStatus(fStopAndKill);
336 edm::LogInfo(
"HFShower") <<
"HFShowerParam: getHits kill (" << kill
337 <<
") track " << track->GetTrackID()
338 <<
" at " << hitPoint
339 <<
" and deposit " << edep <<
" " << hits.size()
340 <<
" times" <<
" ZZ " << zz <<
" " <<
gpar[0];
std::vector< Hit > gfParameterization(G4Step *aStep, bool &ok, bool onlyLong=false)
std::vector< Hit > getHits(G4Step *aStep, bool &ok, bool onlyLong=false)
static int PMTNumber(G4ThreeVector pe_effect)
std::vector< double > gpar
Exp< T >::type exp(const T &t)
HFShowerLibrary * showerLibrary
static int position[TOTALCHAMBERS][3]
double zShift(G4ThreeVector point, int depth, int fromEndAbs=0)
double tShift(G4ThreeVector point, int depth, int fromEndAbs=0)
static const G4LogicalVolume * GetVolume(const std::string &name)
Power< A, B >::type pow(const A &a, const B &b)