source: trunk/source/processes/electromagnetic/xrays/src/G4SynchrotronRadiationInMat.cc @ 961

Last change on this file since 961 was 961, checked in by garnier, 15 years ago

update processes

File size: 21.0 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: G4SynchrotronRadiationInMat.cc,v 1.2 2006/06/29 19:56:17 gunter Exp $
28// GEANT4 tag $Name: geant4-09-02-ref-02 $
29//
30// --------------------------------------------------------------
31//      GEANT 4 class implementation file
32//      CERN Geneva Switzerland
33//
34//      History: first implementation,
35//      21-5-98 V.Grichine
36//      28-05-01, V.Ivanchenko minor changes to provide ANSI -wall compilation
37//      04.03.05, V.Grichine: get local field interface
38//      19-05-06, V.Ivanchenko rename from G4SynchrotronRadiation
39//
40//
41///////////////////////////////////////////////////////////////////////////
42
43#include "G4SynchrotronRadiationInMat.hh"
44#include "G4Integrator.hh"
45
46using namespace std;
47
48////////////////////////////////////////////////////////////////////
49//
50// Constant for calculation of mean free path
51//
52
53const G4double
54G4SynchrotronRadiationInMat::fLambdaConst = sqrt(3.0)*electron_mass_c2/
55                                       (2.5*fine_structure_const*eplus*c_light) ;
56
57/////////////////////////////////////////////////////////////////////
58//
59// Constant for calculation of characterictic energy
60//
61
62const G4double
63G4SynchrotronRadiationInMat::fEnergyConst = 1.5*c_light*c_light*eplus*hbar_Planck/
64                                       electron_mass_c2  ;
65
66////////////////////////////////////////////////////////////////////
67//
68// Array of integral probability of synchrotron photons:
69//
70// the corresponding energy = 0.0001*i*i*(characteristic energy)
71//
72
73const G4double
74G4SynchrotronRadiationInMat::fIntegralProbabilityOfSR[200] =
75{
76  1.000000e+00, 9.428859e-01,   9.094095e-01,   8.813971e-01,   8.565154e-01,
77  8.337008e-01, 8.124961e-01,   7.925217e-01,   7.735517e-01,   7.554561e-01,
78  7.381233e-01, 7.214521e-01,   7.053634e-01,   6.898006e-01,   6.747219e-01,
79  6.600922e-01, 6.458793e-01,   6.320533e-01,   6.185872e-01,   6.054579e-01,
80  5.926459e-01, 5.801347e-01,   5.679103e-01,   5.559604e-01,   5.442736e-01,
81  5.328395e-01, 5.216482e-01,   5.106904e-01,   4.999575e-01,   4.894415e-01,
82  4.791351e-01, 4.690316e-01,   4.591249e-01,   4.494094e-01,   4.398800e-01,
83  4.305320e-01, 4.213608e-01,   4.123623e-01,   4.035325e-01,   3.948676e-01,
84  3.863639e-01, 3.780179e-01,   3.698262e-01,   3.617858e-01,   3.538933e-01,
85  3.461460e-01, 3.385411e-01,   3.310757e-01,   3.237474e-01,   3.165536e-01,
86  3.094921e-01, 3.025605e-01,   2.957566e-01,   2.890784e-01,   2.825237e-01,
87  2.760907e-01, 2.697773e-01,   2.635817e-01,   2.575020e-01,   2.515365e-01,
88  2.456834e-01, 2.399409e-01,   2.343074e-01,   2.287812e-01,   2.233607e-01,
89  2.180442e-01, 2.128303e-01,   2.077174e-01,   2.027040e-01,   1.977885e-01,
90  1.929696e-01, 1.882457e-01,   1.836155e-01,   1.790775e-01,   1.746305e-01,
91  1.702730e-01, 1.660036e-01,   1.618212e-01,   1.577243e-01,   1.537117e-01,
92  1.497822e-01, 1.459344e-01,   1.421671e-01,   1.384791e-01,   1.348691e-01,
93  1.313360e-01, 1.278785e-01,   1.244956e-01,   1.211859e-01,   1.179483e-01,
94  1.147818e-01, 1.116850e-01,   1.086570e-01,   1.056966e-01,   1.028026e-01,
95  9.997405e-02, 9.720975e-02,   9.450865e-02,   9.186969e-02,   8.929179e-02,
96  8.677391e-02, 8.431501e-02,   8.191406e-02,   7.957003e-02,   7.728192e-02,
97  7.504872e-02, 7.286944e-02,   7.074311e-02,   6.866874e-02,   6.664538e-02,
98  6.467208e-02, 6.274790e-02,   6.087191e-02,   5.904317e-02,   5.726079e-02,
99  5.552387e-02, 5.383150e-02,   5.218282e-02,   5.057695e-02,   4.901302e-02,
100  4.749020e-02, 4.600763e-02,   4.456450e-02,   4.315997e-02,   4.179325e-02,
101  4.046353e-02, 3.917002e-02,   3.791195e-02,   3.668855e-02,   3.549906e-02,
102  3.434274e-02, 3.321884e-02,   3.212665e-02,   3.106544e-02,   3.003452e-02,
103  2.903319e-02, 2.806076e-02,   2.711656e-02,   2.619993e-02,   2.531021e-02,
104  2.444677e-02, 2.360897e-02,   2.279620e-02,   2.200783e-02,   2.124327e-02,
105  2.050194e-02, 1.978324e-02,   1.908662e-02,   1.841151e-02,   1.775735e-02,
106  1.712363e-02, 1.650979e-02,   1.591533e-02,   1.533973e-02,   1.478250e-02,
107  1.424314e-02, 1.372117e-02,   1.321613e-02,   1.272755e-02,   1.225498e-02,
108  1.179798e-02, 1.135611e-02,   1.092896e-02,   1.051609e-02,   1.011712e-02,
109  9.731635e-03, 9.359254e-03,   8.999595e-03,   8.652287e-03,   8.316967e-03,
110  7.993280e-03, 7.680879e-03,   7.379426e-03,   7.088591e-03,   6.808051e-03,
111  6.537491e-03, 6.276605e-03,   6.025092e-03,   5.782661e-03,   5.549027e-03,
112  5.323912e-03, 5.107045e-03,   4.898164e-03,   4.697011e-03,   4.503336e-03,
113  4.316896e-03, 4.137454e-03,   3.964780e-03,   3.798649e-03,   3.638843e-03,
114  3.485150e-03, 3.337364e-03,   3.195284e-03,   3.058715e-03,   2.927469e-03,
115  2.801361e-03, 2.680213e-03,   2.563852e-03,   2.452110e-03,   2.344824e-03
116};
117 
118///////////////////////////////////////////////////////////////////////   
119//
120//  Constructor
121//
122
123G4SynchrotronRadiationInMat::G4SynchrotronRadiationInMat(const G4String& processName,
124  G4ProcessType type):G4VDiscreteProcess (processName, type),
125  LowestKineticEnergy (10.*keV),
126  HighestKineticEnergy (100.*TeV),
127  TotBin(200),
128  theGamma (G4Gamma::Gamma() ),
129  theElectron ( G4Electron::Electron() ),
130  thePositron ( G4Positron::Positron() ), fAlpha(0.0), fRootNumber(80),
131  fVerboseLevel( verboseLevel )
132{
133  G4TransportationManager* transportMgr = G4TransportationManager::GetTransportationManager();
134
135  fFieldPropagator = transportMgr->GetPropagatorInField();
136
137}
138 
139/////////////////////////////////////////////////////////////////////////
140//
141// Destructor
142//
143 
144G4SynchrotronRadiationInMat::~G4SynchrotronRadiationInMat()
145{
146     ;
147}
148 
149 
150/////////////////////////////// METHODS /////////////////////////////////
151//
152//
153// Production of synchrotron X-ray photon
154// GEANT4 internal units.
155//
156
157
158G4double
159G4SynchrotronRadiationInMat::GetMeanFreePath( const G4Track& trackData,
160                                               G4double,
161                                               G4ForceCondition* condition)
162{
163  // gives the MeanFreePath in GEANT4 internal units
164  G4double MeanFreePath;
165
166  const G4DynamicParticle* aDynamicParticle = trackData.GetDynamicParticle();
167  // G4Material* aMaterial = trackData.GetMaterial();
168
169  //G4bool isOutRange ;
170 
171  *condition = NotForced ;
172
173  G4double gamma = aDynamicParticle->GetTotalEnergy()/
174                   aDynamicParticle->GetMass();
175
176  G4double particleCharge = aDynamicParticle->GetDefinition()->GetPDGCharge();
177
178  G4double KineticEnergy = aDynamicParticle->GetKineticEnergy();
179
180  if ( KineticEnergy <  LowestKineticEnergy || gamma < 1.0e3 )  MeanFreePath = DBL_MAX; 
181  else
182  {
183
184    G4ThreeVector  FieldValue;
185    const G4Field*   pField = 0;
186
187    G4FieldManager* fieldMgr=0;
188    G4bool          fieldExertsForce = false;
189
190    if( (particleCharge != 0.0) )
191    {
192      fieldMgr = fFieldPropagator->FindAndSetFieldManager( trackData.GetVolume() );
193
194      if ( fieldMgr != 0 ) 
195      {
196        // If the field manager has no field, there is no field !
197
198        fieldExertsForce = ( fieldMgr->GetDetectorField() != 0 );
199      }
200    }
201    if ( fieldExertsForce )
202    { 
203      pField = fieldMgr->GetDetectorField() ;
204      G4ThreeVector  globPosition = trackData.GetPosition();
205
206      G4double  globPosVec[3], FieldValueVec[3];
207
208      globPosVec[0] = globPosition.x();
209      globPosVec[1] = globPosition.y();
210      globPosVec[2] = globPosition.z();
211
212      pField->GetFieldValue( globPosVec, FieldValueVec );
213
214      FieldValue = G4ThreeVector( FieldValueVec[0], 
215                                   FieldValueVec[1], 
216                                   FieldValueVec[2]   );
217
218       
219
220      G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); 
221      G4ThreeVector unitMcrossB  = FieldValue.cross(unitMomentum) ;
222      G4double perpB             = unitMcrossB.mag() ;
223      G4double beta              = aDynamicParticle->GetTotalMomentum()/
224                                   (aDynamicParticle->GetTotalEnergy()    );
225
226      if( perpB > 0.0 ) MeanFreePath = fLambdaConst*beta/perpB;
227      else              MeanFreePath = DBL_MAX;       
228    }
229    else  MeanFreePath = DBL_MAX;   
230  }
231  if(fVerboseLevel > 0)
232  {
233    G4cout<<"G4SynchrotronRadiationInMat::MeanFreePath = "<<MeanFreePath/m<<" m"<<G4endl;
234  }
235  return MeanFreePath; 
236} 
237
238////////////////////////////////////////////////////////////////////////////////
239//
240//
241
242G4VParticleChange*
243G4SynchrotronRadiationInMat::PostStepDoIt(const G4Track& trackData,
244                                     const G4Step&  stepData      )
245
246{
247  aParticleChange.Initialize(trackData);
248
249  const G4DynamicParticle* aDynamicParticle=trackData.GetDynamicParticle();
250
251  G4double gamma = aDynamicParticle->GetTotalEnergy()/
252                   (aDynamicParticle->GetMass()              );
253
254  if(gamma <= 1.0e3 ) 
255  {
256    return G4VDiscreteProcess::PostStepDoIt(trackData,stepData);
257  }
258  G4double particleCharge = aDynamicParticle->GetDefinition()->GetPDGCharge();
259
260  G4ThreeVector  FieldValue;
261  const G4Field*   pField = 0 ;
262
263  G4FieldManager* fieldMgr=0;
264  G4bool          fieldExertsForce = false;
265
266  if( (particleCharge != 0.0) )
267  {
268    fieldMgr = fFieldPropagator->FindAndSetFieldManager( trackData.GetVolume() );
269    if ( fieldMgr != 0 ) 
270    {
271      // If the field manager has no field, there is no field !
272
273      fieldExertsForce = ( fieldMgr->GetDetectorField() != 0 );
274    }
275  }
276  if ( fieldExertsForce )
277  {
278    pField = fieldMgr->GetDetectorField() ;
279    G4ThreeVector  globPosition = trackData.GetPosition() ;
280    G4double  globPosVec[3], FieldValueVec[3] ;
281    globPosVec[0] = globPosition.x() ;
282    globPosVec[1] = globPosition.y() ;
283    globPosVec[2] = globPosition.z() ;
284
285    pField->GetFieldValue( globPosVec, FieldValueVec ) ;
286    FieldValue = G4ThreeVector( FieldValueVec[0], 
287                                   FieldValueVec[1], 
288                                   FieldValueVec[2]   );
289       
290    G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); 
291    G4ThreeVector unitMcrossB = FieldValue.cross(unitMomentum);
292    G4double perpB = unitMcrossB.mag() ;
293    if(perpB > 0.0)
294    {
295      // M-C of synchrotron photon energy
296
297      G4double energyOfSR = GetRandomEnergySR(gamma,perpB);
298
299      if(fVerboseLevel > 0)
300      {
301        G4cout<<"SR photon energy = "<<energyOfSR/keV<<" keV"<<G4endl;
302      }
303      // check against insufficient energy
304
305      if( energyOfSR <= 0.0 )
306      {
307        return G4VDiscreteProcess::PostStepDoIt(trackData,stepData);
308      }
309      G4double kineticEnergy = aDynamicParticle->GetKineticEnergy();
310      G4ParticleMomentum
311      particleDirection = aDynamicParticle->GetMomentumDirection();
312
313      // M-C of its direction
314     
315      G4double Teta = G4UniformRand()/gamma ;    // Very roughly
316
317      G4double Phi  = twopi * G4UniformRand() ;
318
319      G4double dirx = sin(Teta)*cos(Phi) , 
320               diry = sin(Teta)*sin(Phi) , 
321               dirz = cos(Teta) ;
322
323      G4ThreeVector gammaDirection ( dirx, diry, dirz);
324      gammaDirection.rotateUz(particleDirection);   
325 
326      // polarization of new gamma
327
328      // G4double sx =  cos(Teta)*cos(Phi);
329      // G4double sy =  cos(Teta)*sin(Phi);
330      // G4double sz = -sin(Teta);
331
332      G4ThreeVector gammaPolarization = FieldValue.cross(gammaDirection);
333      gammaPolarization = gammaPolarization.unit();
334
335      // (sx, sy, sz);
336      // gammaPolarization.rotateUz(particleDirection);
337
338      // create G4DynamicParticle object for the SR photon
339 
340      G4DynamicParticle* aGamma= new G4DynamicParticle ( G4Gamma::Gamma(),
341                                                         gammaDirection, 
342                                                         energyOfSR      );
343      aGamma->SetPolarization( gammaPolarization.x(),
344                               gammaPolarization.y(),
345                               gammaPolarization.z() );
346
347
348      aParticleChange.SetNumberOfSecondaries(1);
349      aParticleChange.AddSecondary(aGamma); 
350
351      // Update the incident particle
352   
353      G4double newKinEnergy = kineticEnergy - energyOfSR ;
354     
355      if (newKinEnergy > 0.)
356      {
357        aParticleChange.ProposeMomentumDirection( particleDirection );
358        aParticleChange.ProposeEnergy( newKinEnergy );
359        aParticleChange.ProposeLocalEnergyDeposit (0.); 
360      } 
361      else
362      { 
363        aParticleChange.ProposeEnergy( 0. );
364        aParticleChange.ProposeLocalEnergyDeposit (0.);
365        G4double charge = aDynamicParticle->GetDefinition()->GetPDGCharge();   
366        if (charge<0.)
367        {
368           aParticleChange.ProposeTrackStatus(fStopAndKill) ;
369        }
370        else     
371        {
372          aParticleChange.ProposeTrackStatus(fStopButAlive) ;
373        }
374      } 
375    }       
376    else
377    {
378      return G4VDiscreteProcess::PostStepDoIt(trackData,stepData);
379    }
380  }     
381  return G4VDiscreteProcess::PostStepDoIt(trackData,stepData);
382}
383
384
385G4double
386G4SynchrotronRadiationInMat::GetPhotonEnergy( const G4Track& trackData,
387                                         const G4Step&  )
388
389{
390  G4int i ;
391  G4double energyOfSR = -1.0 ;
392  //G4Material* aMaterial=trackData.GetMaterial() ;
393
394  const G4DynamicParticle* aDynamicParticle=trackData.GetDynamicParticle();
395
396  G4double gamma = aDynamicParticle->GetTotalEnergy()/
397                   (aDynamicParticle->GetMass()              ) ;
398
399  G4double particleCharge = aDynamicParticle->GetDefinition()->GetPDGCharge();
400
401  G4ThreeVector  FieldValue;
402  const G4Field*   pField = 0 ;
403
404  G4FieldManager* fieldMgr=0;
405  G4bool          fieldExertsForce = false;
406
407  if( (particleCharge != 0.0) )
408  {
409    fieldMgr = fFieldPropagator->FindAndSetFieldManager( trackData.GetVolume() );
410    if ( fieldMgr != 0 ) 
411    {
412      // If the field manager has no field, there is no field !
413
414      fieldExertsForce = ( fieldMgr->GetDetectorField() != 0 );
415    }
416  }
417  if ( fieldExertsForce )
418  { 
419    pField = fieldMgr->GetDetectorField();
420    G4ThreeVector  globPosition = trackData.GetPosition();
421    G4double  globPosVec[3], FieldValueVec[3];
422
423    globPosVec[0] = globPosition.x();
424    globPosVec[1] = globPosition.y();
425    globPosVec[2] = globPosition.z();
426
427    pField->GetFieldValue( globPosVec, FieldValueVec );
428    FieldValue = G4ThreeVector( FieldValueVec[0], 
429                                   FieldValueVec[1], 
430                                   FieldValueVec[2]   );
431       
432    G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); 
433    G4ThreeVector unitMcrossB  = FieldValue.cross(unitMomentum) ;
434    G4double perpB             = unitMcrossB.mag();
435    if( perpB > 0.0 )
436    {
437      // M-C of synchrotron photon energy
438
439      G4double random = G4UniformRand() ;
440      for(i=0;i<200;i++)
441      {
442        if(random >= fIntegralProbabilityOfSR[i]) break ;
443      }
444      energyOfSR = 0.0001*i*i*fEnergyConst*gamma*gamma*perpB ;
445
446      // check against insufficient energy
447
448      if(energyOfSR <= 0.0)
449      {
450        return -1.0 ;
451      }
452      //G4double kineticEnergy = aDynamicParticle->GetKineticEnergy();
453      //G4ParticleMomentum
454      //particleDirection = aDynamicParticle->GetMomentumDirection();
455
456      // Gamma production cut in this material
457      //G4double
458      //gammaEnergyCut = (G4Gamma::GetCutsInEnergy())[aMaterial->GetIndex()];
459
460      // SR photon has energy more than the current material cut
461      // M-C of its direction
462     
463      //G4double Teta = G4UniformRand()/gamma ;    // Very roughly
464
465      //G4double Phi  = twopi * G4UniformRand() ;
466    }       
467    else
468    {
469      return -1.0 ;
470    }
471  }     
472  return energyOfSR ;
473}
474
475/////////////////////////////////////////////////////////////////////////////////
476//
477//
478
479G4double G4SynchrotronRadiationInMat::GetRandomEnergySR(G4double gamma, G4double perpB)
480{
481  G4int i, iMax;
482  G4double energySR, random, position;
483
484  iMax = 200;
485  random = G4UniformRand();
486
487  for( i = 0; i < iMax; i++ )
488  {
489    if( random >= fIntegralProbabilityOfSR[i] ) break;
490  }
491  if(i <= 0 )        position = G4UniformRand(); // 0.
492  else if( i>= iMax) position = G4double(iMax);
493  else position = i + G4UniformRand(); // -1
494  //
495  // it was in initial implementation:
496  //       energyOfSR = 0.0001*i*i*fEnergyConst*gamma*gamma*perpB ;
497
498  energySR = 0.0001*position*position*fEnergyConst*gamma*gamma*perpB;
499
500  if( energySR  < 0. ) energySR = 0.;
501
502  return energySR;
503}
504
505/////////////////////////////////////////////////////////////////////////
506//
507// return
508
509G4double G4SynchrotronRadiationInMat::GetProbSpectrumSRforInt( G4double t)
510{
511  G4double result, hypCos2, hypCos=std::cosh(t);
512
513  hypCos2 = hypCos*hypCos; 
514  result = std::cosh(5.*t/3.)*std::exp(t-fKsi*hypCos); // fKsi > 0. !
515  result /= hypCos2;
516  return result;
517}
518
519///////////////////////////////////////////////////////////////////////////
520//
521// return the probability to emit SR photon with relative energy
522// energy/energy_c >= ksi
523// for ksi <= 0. P = 1., however the method works for ksi > 0 only!
524
525G4double G4SynchrotronRadiationInMat::GetIntProbSR( G4double ksi)
526{
527  if (ksi <= 0.) return 1.0;
528  fKsi = ksi; // should be > 0. !
529  G4int n;
530  G4double result, a;
531
532  a = fAlpha;        // always = 0.
533  n = fRootNumber;   // around default = 80
534
535  G4Integrator<G4SynchrotronRadiationInMat, G4double(G4SynchrotronRadiationInMat::*)(G4double)> integral;
536
537  result = integral.Laguerre(this, 
538           &G4SynchrotronRadiationInMat::GetProbSpectrumSRforInt, a, n);
539
540  result *= 3./5./pi;
541
542  return result;
543}
544
545/////////////////////////////////////////////////////////////////////////
546//
547// return an auxiliary function for K_5/3 integral representation
548
549G4double G4SynchrotronRadiationInMat::GetProbSpectrumSRforEnergy( G4double t)
550{
551  G4double result, hypCos=std::cosh(t);
552 
553  result = std::cosh(5.*t/3.)*std::exp(t - fKsi*hypCos); // fKsi > 0. !
554  result /= hypCos;
555  return result;
556}
557
558///////////////////////////////////////////////////////////////////////////
559//
560// return the probability to emit SR photon energy with relative energy
561// energy/energy_c >= ksi
562// for ksi <= 0. P = 1., however the method works for ksi > 0 only!
563
564G4double G4SynchrotronRadiationInMat::GetEnergyProbSR( G4double ksi)
565{
566  if (ksi <= 0.) return 1.0;
567  fKsi = ksi; // should be > 0. !
568  G4int n;
569  G4double result, a;
570
571  a = fAlpha;        // always = 0.
572  n = fRootNumber;   // around default = 80
573
574  G4Integrator<G4SynchrotronRadiationInMat, G4double(G4SynchrotronRadiationInMat::*)(G4double)> integral;
575
576  result = integral.Laguerre(this, 
577           &G4SynchrotronRadiationInMat::GetProbSpectrumSRforEnergy, a, n);
578
579  result *= 9.*std::sqrt(3.)*ksi/8./pi;
580
581  return result;
582}
583
584/////////////////////////////////////////////////////////////////////////////
585//
586//
587
588G4double G4SynchrotronRadiationInMat::GetIntegrandForAngleK( G4double t)
589{
590  G4double result, hypCos=std::cosh(t);
591 
592  result  = std::cosh(fOrderAngleK*t)*std::exp(t - fEta*hypCos); // fEta > 0. !
593  result /= hypCos;
594  return result;
595}
596
597//////////////////////////////////////////////////////////////////////////
598//
599// Return K 1/3 or 2/3 for angular distribution
600
601G4double G4SynchrotronRadiationInMat::GetAngleK( G4double eta)
602{
603  fEta = eta; // should be > 0. !
604  G4int n;
605  G4double result, a;
606
607  a = fAlpha;        // always = 0.
608  n = fRootNumber;   // around default = 80
609
610  G4Integrator<G4SynchrotronRadiationInMat, G4double(G4SynchrotronRadiationInMat::*)(G4double)> integral;
611
612  result = integral.Laguerre(this, 
613           &G4SynchrotronRadiationInMat::GetIntegrandForAngleK, a, n);
614
615  return result;
616}
617
618/////////////////////////////////////////////////////////////////////////
619//
620// Relative angle diff distribution for given fKsi, which is set externally
621
622G4double G4SynchrotronRadiationInMat::GetAngleNumberAtGammaKsi( G4double gpsi)
623{
624  G4double result, funK, funK2, gpsi2 = gpsi*gpsi;
625
626  fPsiGamma    = gpsi;
627  fEta         = 0.5*fKsi*(1 + gpsi2)*std::sqrt(1 + gpsi2);
628 
629  fOrderAngleK = 1./3.;
630  funK         = GetAngleK(fEta); 
631  funK2        = funK*funK;
632
633  result       = gpsi2*funK2/(1 + gpsi2);
634
635  fOrderAngleK = 2./3.;
636  funK         = GetAngleK(fEta); 
637  funK2        = funK*funK;
638
639  result      += funK2;
640  result      *= (1 + gpsi2)*fKsi;
641     
642  return result;
643}
644
645
646///////////////////// end of G4SynchrotronRadiationInMat.cc
647
Note: See TracBrowser for help on using the repository browser.