135 G4double etotalToSetParticleProperties;
156 G4double lindhardAngleNumberHighLimit0;
161 G4double x1=0.,x2=0.,x3=0.,x4=0.,y1=0.,y2=0.,y3=0.,y4=0.;
163 G4double tx1=0.,tx2=0.,tx3=0.,tx4=0.,ty1=0.,ty2=0.,ty3=0.,ty4=0.;
165 G4double kvx1=0.,kvx2=0.,kvx3=0.,kvx4=0.,kvy1=0.,kvy2=0.,kvy3=0.,kvy4=0.;
177 fCrystalData->SetGeometryParameters(crystallogic);
184 fBaierKatkov->ResetRadIntegral();
194 lindhardAngleNumberHighLimit0 =
196 GetParticleDefinition()->GetParticleDefinitionID());
198 GetParticleDefinition()->GetParticleDefinitionID());
201 fCrystalData->SetParticleProperties(etotal, mass, charge, particleName);
208 xyz = fCrystalData->CoordinatesFromBoxToLattice(xyz0);
217 tx0 = std::atan(momentumDirection.
x()/momentumDirection.
z());
218 ty0 = std::atan(momentumDirection.
y()/momentumDirection.
z());
221 tx = fCrystalData->AngleXFromBoxToLattice(tx0,z);
224 etotalToSetParticleProperties = etotal*0.999;
230 tGlobalPreStep=tGlobal;
236 etotalPreStep = etotal;
238 dz = fCrystalData->GetSimulationStep(tx,ty);
248 kvx1=fCrystalData->Ex(x,y);
250 tx1=tx+(kvx1-fCrystalData->GetCurv(z)*fCrystalData->GetCorrectionZ())*dzd3;
251 if (fCrystalData->GetModel()==2)
253 kvy1=fCrystalData->Ey(x,y);
259 kvx2=fCrystalData->Ex(x1,y1);
261 tx2=tx-(kvx1-fCrystalData->GetCurv(z)*fCrystalData->GetCorrectionZ())*dzd3+
262 (kvx2-fCrystalData->GetCurv(z)*fCrystalData->GetCorrectionZ())*dz;
263 if (fCrystalData->GetModel()==2)
265 kvy2=fCrystalData->Ey(x1,y1);
267 ty2=ty-kvy1*dzd3+kvy2*dz;
271 kvx3=fCrystalData->Ex(x2,y2);
272 x3=x+(tx-tx1+tx2)*dz;
273 tx3=tx+(kvx1-kvx2+kvx3-fCrystalData->GetCurv(z)*fCrystalData->GetCorrectionZ())*dz;
274 if (fCrystalData->GetModel()==2)
276 kvy3=fCrystalData->Ey(x2,y2);
277 y3=y+(ty-ty1+ty2)*dz;
278 ty3=ty+(kvy1-kvy2+kvy3)*dz;
282 kvx4=fCrystalData->Ex(x3,y3);
283 x4=x+(tx+3.*tx1+3.*tx2+tx3)*dzd8;
284 tx4=tx+(kvx1+3.*kvx2+3.*kvx3+kvx4)*dzd8-
285 fCrystalData->GetCurv(z)*fCrystalData->GetCorrectionZ()*dz;
286 if (fCrystalData->GetModel()==2)
288 kvy4=fCrystalData->Ey(x3,y3);
289 y4=y+(ty+3.*ty1+3.*ty2+ty3)*dzd8;
290 ty4=ty+(kvy1+3.*kvy2+3.*kvy3+kvy4)*dzd8;
303 z+=dz*fCrystalData->GetCorrectionZ();
306 xyz = fCrystalData->ChannelChange(x,y,z);
314 xyz0=fCrystalData->CoordinatesFromLatticeToBox(xyz);
316 momentumDirectionStep=
317 dz*std::sqrt(1+std::pow(std::tan(tx),2)+std::pow(std::tan(ty),2));
318 tGlobal+=momentumDirectionStep/(fCrystalData->GetBeta())/CLHEP::c_light;
324 for (
G4int i = 0; i < fCrystalData->GetNelements(); i++)
327 effectiveStep = momentumDirectionStep*fCrystalData->NuclearDensity(x,y,i);
329 scatteringAnglesAndEnergyLoss += fCrystalData->
330 CoulombAtomicScattering(effectiveStep,momentumDirectionStep,i);
333 elossAccum += fCrystalData->IonizationLosses(momentumDirectionStep, i);
336 scatteringAnglesAndEnergyLoss += fCrystalData->CoulombElectronScattering(
337 fCrystalData->MinIonizationEnergy(x,y),
338 fCrystalData->ElectronDensity(x,y),
339 momentumDirectionStep);
340 tx += scatteringAnglesAndEnergyLoss.
x();
341 ty += scatteringAnglesAndEnergyLoss.
y();
342 elossAccum += scatteringAnglesAndEnergyLoss.
z();
346 if (etotalToSetParticleProperties>etotal)
348 fCrystalData->SetParticleProperties(etotal, mass, charge, particleName);
349 etotalToSetParticleProperties = etotal*0.999;
359 GetParticleDefinition()->
360 GetParticleDefinitionID()))
364 else if (fCrystalData->GetModel()==1)
368 std::max(lindhardAngleNumberHighLimit0*
369 fCrystalData->GetLindhardAngle(),
373 else if (fCrystalData->GetModel()==2)
376 if (std::sqrt(tx*tx+ty*ty) >=
377 std::max(lindhardAngleNumberHighLimit0*
378 fCrystalData->GetLindhardAngle(),
388 tx0 = fCrystalData->AngleXFromLatticeToBox(tx,z);
393 if(fBaierKatkov->DoRadiation(etotal,mass,
395 scatteringAnglesAndEnergyLoss.
x(),
396 scatteringAnglesAndEnergyLoss.
y(),
397 momentumDirectionStep,tGlobal,xyz0,
400 Inside(xyz0)!=
kInside&&inCrystal))
406 etotal = fBaierKatkov->GetParticleNewTotalEnergy();
407 tx0 = fBaierKatkov->GetParticleNewAngleX();
408 ty0 = fBaierKatkov->GetParticleNewAngleY();
409 tGlobal = fBaierKatkov->GetNewGlobalTime();
410 xyz0 = fBaierKatkov->GetParticleNewCoordinateXYZ();
413 fBaierKatkov->GeneratePhoton(fastStep);
416 fCrystalData->SetParticleProperties(etotal, mass, charge, particleName);
419 xyz = fCrystalData->CoordinatesFromBoxToLattice(xyz0);
425 tx = fCrystalData->AngleXFromBoxToLattice(tx0,z);
433 etotal -= elossAccum;
434 eDeposited += elossAccum;
436 ekinetic = etotal-mass;
437 if(ekinetic<1*CLHEP::keV)
439 G4cout <<
"Warning in G4ChannelingFastSimModel: " <<
440 ekinetic <<
"<" << 1*CLHEP::keV <<
" !" <<
G4endl;
441 eDeposited-=(1*CLHEP::keV-ekinetic);
442 ekinetic = 1*CLHEP::keV;
443 G4cout <<
"Setting deposited energy=" <<
444 eDeposited <<
" & ekinetic=" << ekinetic <<
G4endl;
445 etotal = mass+ekinetic;
455 tGlobal = tGlobalPreStep;
459 etotal = etotalPreStep;
460 z-=dz*fCrystalData->GetCorrectionZ();
483 tx0 = fCrystalData->AngleXFromLatticeToBox(tx,z);
492 etotal -= elossAccum;
493 eDeposited += elossAccum;
494 ekinetic = etotal-mass;
495 if(ekinetic<1*CLHEP::keV)
497 G4cout <<
"Warning in G4ChannelingFastSimModel: " <<
498 ekinetic <<
"<" << 1*CLHEP::keV <<
" !" <<
G4endl;
499 eDeposited-=(1*CLHEP::keV-ekinetic);
500 ekinetic = 1*CLHEP::keV;
501 G4cout <<
"Setting deposited energy=" <<
502 eDeposited <<
" & ekinetic=" << ekinetic <<
G4endl;
511 1./std::sqrt(1.+std::pow(std::tan(tx0),2)+std::pow(std::tan(ty0),2));
514 momentumDirectionZ*std::tan(ty0),
515 momentumDirectionZ));