Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Static Public Member Functions
G4ChipsPionPlusElasticXS Class Reference

#include <G4ChipsPionPlusElasticXS.hh>

Inheritance diagram for G4ChipsPionPlusElasticXS:
G4VCrossSectionDataSet

Public Member Functions

 G4ChipsPionPlusElasticXS ()
 
 ~G4ChipsPionPlusElasticXS ()
 
virtual G4bool IsIsoApplicable (const G4DynamicParticle *Pt, G4int Z, G4int A, const G4Element *elm, const G4Material *mat)
 
virtual G4double GetIsoCrossSection (const G4DynamicParticle *, G4int tgZ, G4int A, const G4Isotope *iso=0, const G4Element *elm=0, const G4Material *mat=0)
 
virtual G4double GetChipsCrossSection (G4double momentum, G4int Z, G4int N, G4int pdg)
 
G4double GetExchangeT (G4int tZ, G4int tN, G4int pPDG)
 
- Public Member Functions inherited from G4VCrossSectionDataSet
 G4VCrossSectionDataSet (const G4String &nam="")
 
virtual ~G4VCrossSectionDataSet ()
 
virtual G4bool IsElementApplicable (const G4DynamicParticle *, G4int Z, const G4Material *mat=0)
 
G4double GetCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
G4double ComputeCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
virtual G4double GetElementCrossSection (const G4DynamicParticle *, G4int Z, const G4Material *mat=0)
 
virtual G4IsotopeSelectIsotope (const G4Element *, G4double kinEnergy)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
virtual void DumpPhysicsTable (const G4ParticleDefinition &)
 
virtual void CrossSectionDescription (std::ostream &) const
 
virtual G4int GetVerboseLevel () const
 
virtual void SetVerboseLevel (G4int value)
 
G4double GetMinKinEnergy () const
 
void SetMinKinEnergy (G4double value)
 
G4double GetMaxKinEnergy () const
 
void SetMaxKinEnergy (G4double value)
 
const G4StringGetName () const
 

Static Public Member Functions

static const char * Default_Name ()
 

Additional Inherited Members

- Protected Member Functions inherited from G4VCrossSectionDataSet
void SetName (const G4String &)
 
- Protected Attributes inherited from G4VCrossSectionDataSet
G4int verboseLevel
 

Detailed Description

Definition at line 46 of file G4ChipsPionPlusElasticXS.hh.

Constructor & Destructor Documentation

G4ChipsPionPlusElasticXS::G4ChipsPionPlusElasticXS ( )

Definition at line 55 of file G4ChipsPionPlusElasticXS.cc.

55  :G4VCrossSectionDataSet(Default_Name()), nPoints(128), nLast(nPoints-1)
56 {
57  lPMin=-8.; // Min tabulated logarithmMomentum(D)
58  lPMax= 8.; // Max tabulated logarithmMomentum(D)
59  dlnP=(lPMax-lPMin)/nLast;// LogStep inTheTable(D)
60  onlyCS=true;// Flag toCalcul OnlyCS(not Si/Bi)(L)
61  lastSIG=0.; // Last calculated cross section (L)
62  lastLP=-10.;// Last log(mom_of IncidentHadron)(L)
63  lastTM=0.; // Last t_maximum (L)
64  theSS=0.; // TheLastSqSlope of 1st difr.Max(L)
65  theS1=0.; // TheLastMantissa of 1st difr.Max(L)
66  theB1=0.; // TheLastSlope of 1st difruct.Max(L)
67  theS2=0.; // TheLastMantissa of 2nd difr.Max(L)
68  theB2=0.; // TheLastSlope of 2nd difruct.Max(L)
69  theS3=0.; // TheLastMantissa of 3d difr. Max(L)
70  theB3=0.; // TheLastSlope of 3d difruct. Max(L)
71  theS4=0.; // TheLastMantissa of 4th difr.Max(L)
72  theB4=0.; // TheLastSlope of 4th difruct.Max(L)
73  lastTZ=0; // Last atomic number of the target
74  lastTN=0; // Last # of neutrons in the target
75  lastPIN=0.; // Last initialized max momentum
76  lastCST=0; // Elastic cross-section table
77  lastPAR=0; // ParametersForFunctionalCalculation
78  lastSST=0; // E-dep of SqaredSlope of 1st difMax
79  lastS1T=0; // E-dep of mantissa of 1st dif.Max
80  lastB1T=0; // E-dep of the slope of 1st difMax
81  lastS2T=0; // E-dep of mantissa of 2nd difrMax
82  lastB2T=0; // E-dep of the slope of 2nd difMax
83  lastS3T=0; // E-dep of mantissa of 3d difr.Max
84  lastB3T=0; // E-dep of the slope of 3d difrMax
85  lastS4T=0; // E-dep of mantissa of 4th difrMax
86  lastB4T=0; // E-dep of the slope of 4th difMax
87  lastN=0; // The last N of calculated nucleus
88  lastZ=0; // The last Z of calculated nucleus
89  lastP=0.; // LastUsed in cross section Momentum
90  lastTH=0.; // Last threshold momentum
91  lastCS=0.; // Last value of the Cross Section
92  lastI=0; // The last position in the DAMDB
93 }
G4VCrossSectionDataSet(const G4String &nam="")
static const char * Default_Name()
G4ChipsPionPlusElasticXS::~G4ChipsPionPlusElasticXS ( )

Definition at line 95 of file G4ChipsPionPlusElasticXS.cc.

96 {
97  std::vector<G4double*>::iterator pos;
98  for (pos=CST.begin(); pos<CST.end(); pos++)
99  { delete [] *pos; }
100  CST.clear();
101  for (pos=PAR.begin(); pos<PAR.end(); pos++)
102  { delete [] *pos; }
103  PAR.clear();
104  for (pos=SST.begin(); pos<SST.end(); pos++)
105  { delete [] *pos; }
106  SST.clear();
107  for (pos=S1T.begin(); pos<S1T.end(); pos++)
108  { delete [] *pos; }
109  S1T.clear();
110  for (pos=B1T.begin(); pos<B1T.end(); pos++)
111  { delete [] *pos; }
112  B1T.clear();
113  for (pos=S2T.begin(); pos<S2T.end(); pos++)
114  { delete [] *pos; }
115  S2T.clear();
116  for (pos=B2T.begin(); pos<B2T.end(); pos++)
117  { delete [] *pos; }
118  B2T.clear();
119  for (pos=S3T.begin(); pos<S3T.end(); pos++)
120  { delete [] *pos; }
121  S3T.clear();
122  for (pos=B3T.begin(); pos<B3T.end(); pos++)
123  { delete [] *pos; }
124  B3T.clear();
125  for (pos=S4T.begin(); pos<S4T.end(); pos++)
126  { delete [] *pos; }
127  S4T.clear();
128  for (pos=B4T.begin(); pos<B4T.end(); pos++)
129  { delete [] *pos; }
130  B4T.clear();
131 }

Member Function Documentation

static const char* G4ChipsPionPlusElasticXS::Default_Name ( )
inlinestatic

Definition at line 54 of file G4ChipsPionPlusElasticXS.hh.

Referenced by G4ChipsComponentXS::G4ChipsComponentXS(), and G4ChipsElasticModel::G4ChipsElasticModel().

54 {return "ChipsPionPlusElasticXS";}
G4double G4ChipsPionPlusElasticXS::GetChipsCrossSection ( G4double  momentum,
G4int  Z,
G4int  N,
G4int  pdg 
)
virtual

!The slave functions must provide cross-sections in millibarns (mb) !! (not in IU)

Definition at line 156 of file G4ChipsPionPlusElasticXS.cc.

References G4ThreadLocal, and python.hepunit::millibarn.

Referenced by GetIsoCrossSection(), and G4ChipsElasticModel::SampleInvariantT().

157 {
158  static G4ThreadLocal std::vector <G4int> *colN_G4MT_TLS_ = 0 ; if (!colN_G4MT_TLS_) colN_G4MT_TLS_ = new std::vector <G4int> ; std::vector <G4int> &colN = *colN_G4MT_TLS_; // Vector of N for calculated nuclei (isotops)
159  static G4ThreadLocal std::vector <G4int> *colZ_G4MT_TLS_ = 0 ; if (!colZ_G4MT_TLS_) colZ_G4MT_TLS_ = new std::vector <G4int> ; std::vector <G4int> &colZ = *colZ_G4MT_TLS_; // Vector of Z for calculated nuclei (isotops)
160  static G4ThreadLocal std::vector <G4double> *colP_G4MT_TLS_ = 0 ; if (!colP_G4MT_TLS_) colP_G4MT_TLS_ = new std::vector <G4double> ; std::vector <G4double> &colP = *colP_G4MT_TLS_; // Vector of last momenta for the reaction
161  static G4ThreadLocal std::vector <G4double> *colTH_G4MT_TLS_ = 0 ; if (!colTH_G4MT_TLS_) colTH_G4MT_TLS_ = new std::vector <G4double> ; std::vector <G4double> &colTH = *colTH_G4MT_TLS_; // Vector of energy thresholds for the reaction
162  static G4ThreadLocal std::vector <G4double> *colCS_G4MT_TLS_ = 0 ; if (!colCS_G4MT_TLS_) colCS_G4MT_TLS_ = new std::vector <G4double> ; std::vector <G4double> &colCS = *colCS_G4MT_TLS_; // Vector of last cross sections for the reaction
163  // ***---*** End of the mandatory Static Definitions of the Associative Memory ***---***
164 
165  G4double pEn=pMom;
166  G4bool fCS = false;
167  onlyCS=fCS;
168 
169  G4bool in=false; // By default the isotope must be found in the AMDB
170  lastP = 0.; // New momentum history (nothing to compare with)
171  lastN = tgN; // The last N of the calculated nucleus
172  lastZ = tgZ; // The last Z of the calculated nucleus
173  lastI = colN.size(); // Size of the Associative Memory DB in the heap
174  if(lastI) for(G4int i=0; i<lastI; i++) // Loop over proj/tgZ/tgN lines of DB
175  { // The nucleus with projPDG is found in AMDB
176  if(colN[i]==tgN && colZ[i]==tgZ) // Isotope is foind in AMDB
177  {
178  lastI=i;
179  lastTH =colTH[i]; // Last THreshold (A-dependent)
180  if(pEn<=lastTH)
181  {
182  return 0.; // Energy is below the Threshold value
183  }
184  lastP =colP [i]; // Last Momentum (A-dependent)
185  lastCS =colCS[i]; // Last CrossSect (A-dependent)
186  // if(std::fabs(lastP/pMom-1.)<tolerance) //VI (do not use tolerance)
187  if(lastP == pMom) // Do not recalculate
188  {
189  CalculateCrossSection(fCS,-1,i,211,lastZ,lastN,pMom); // Update param's only
190  return lastCS*millibarn; // Use theLastCS
191  }
192  in = true; // This is the case when the isotop is found in DB
193  // Momentum pMom is in IU ! @@ Units
194  lastCS=CalculateCrossSection(fCS,-1,i,211,lastZ,lastN,pMom); // read & update
195  if(lastCS<=0. && pEn>lastTH) // Correct the threshold
196  {
197  lastTH=pEn;
198  }
199  break; // Go out of the LOOP with found lastI
200  }
201  } // End of attampt to find the nucleus in DB
202  if(!in) // This nucleus has not been calculated previously
203  {
204  //!!The slave functions must provide cross-sections in millibarns (mb) !! (not in IU)
205  lastCS=CalculateCrossSection(fCS,0,lastI,211,lastZ,lastN,pMom);//calculate&create
206  if(lastCS<=0.)
207  {
208  lastTH = 0; //ThresholdEnergy(tgZ, tgN); // The Threshold Energy which is now the last
209  if(pEn>lastTH)
210  {
211  lastTH=pEn;
212  }
213  }
214  colN.push_back(tgN);
215  colZ.push_back(tgZ);
216  colP.push_back(pMom);
217  colTH.push_back(lastTH);
218  colCS.push_back(lastCS);
219  return lastCS*millibarn;
220  } // End of creation of the new set of parameters
221  else
222  {
223  colP[lastI]=pMom;
224  colCS[lastI]=lastCS;
225  }
226  return lastCS*millibarn;
227 }
#define G4ThreadLocal
Definition: tls.hh:52
int G4int
Definition: G4Types.hh:78
int millibarn
Definition: hepunit.py:40
bool G4bool
Definition: G4Types.hh:79
double G4double
Definition: G4Types.hh:76
G4double G4ChipsPionPlusElasticXS::GetExchangeT ( G4int  tZ,
G4int  tN,
G4int  pPDG 
)

Definition at line 602 of file G4ChipsPionPlusElasticXS.cc.

References G4cout, G4endl, G4UniformRand, and python.hepunit::gigaelectronvolt.

Referenced by G4ChipsElasticModel::SampleInvariantT().

603 {
604  static const G4double GeVSQ=gigaelectronvolt*gigaelectronvolt;
605  static const G4double third=1./3.;
606  static const G4double fifth=1./5.;
607  static const G4double sevth=1./7.;
608  if(PDG!= 211)G4cout<<"*Warning*G4ChipsPionPlusElasticXS::GetExT:PDG="<<PDG<<G4endl;
609  if(onlyCS)G4cout<<"*Warning*G4ChipsPionPlusElasticXS::GetExchanT:onlyCS=1"<<G4endl;
610  if(lastLP<-4.3) return lastTM*GeVSQ*G4UniformRand();// S-wave for p<14 MeV/c (kinE<.1MeV)
611  G4double q2=0.;
612  if(tgZ==1 && tgN==0) // ===> p+p=p+p
613  {
614  G4double E1=lastTM*theB1;
615  G4double R1=(1.-std::exp(-E1));
616  G4double E2=lastTM*theB2;
617  G4double R2=(1.-std::exp(-E2*E2*E2));
618  G4double E3=lastTM*theB3;
619  G4double R3=(1.-std::exp(-E3));
620  G4double I1=R1*theS1/theB1;
621  G4double I2=R2*theS2;
622  G4double I3=R3*theS3;
623  G4double I12=I1+I2;
624  G4double rand=(I12+I3)*G4UniformRand();
625  if (rand<I1 )
626  {
627  G4double ran=R1*G4UniformRand();
628  if(ran>1.) ran=1.;
629  q2=-std::log(1.-ran)/theB1;
630  }
631  else if(rand<I12)
632  {
633  G4double ran=R2*G4UniformRand();
634  if(ran>1.) ran=1.;
635  q2=-std::log(1.-ran);
636  if(q2<0.) q2=0.;
637  q2=std::pow(q2,third)/theB2;
638  }
639  else
640  {
641  G4double ran=R3*G4UniformRand();
642  if(ran>1.) ran=1.;
643  q2=-std::log(1.-ran)/theB3;
644  }
645  }
646  else
647  {
648  G4double a=tgZ+tgN;
649  G4double E1=lastTM*(theB1+lastTM*theSS);
650  G4double R1=(1.-std::exp(-E1));
651  G4double tss=theSS+theSS; // for future solution of quadratic equation (imediate check)
652  G4double tm2=lastTM*lastTM;
653  G4double E2=lastTM*tm2*theB2; // power 3 for lowA, 5 for HighA (1st)
654  if(a>6.5)E2*=tm2; // for heavy nuclei
655  G4double R2=(1.-std::exp(-E2));
656  G4double E3=lastTM*theB3;
657  if(a>6.5)E3*=tm2*tm2*tm2; // power 1 for lowA, 7 (2nd) for HighA
658  G4double R3=(1.-std::exp(-E3));
659  G4double E4=lastTM*theB4;
660  G4double R4=(1.-std::exp(-E4));
661  G4double I1=R1*theS1;
662  G4double I2=R2*theS2;
663  G4double I3=R3*theS3;
664  G4double I4=R4*theS4;
665  G4double I12=I1+I2;
666  G4double I13=I12+I3;
667  G4double rand=(I13+I4)*G4UniformRand();
668  if(rand<I1)
669  {
670  G4double ran=R1*G4UniformRand();
671  if(ran>1.) ran=1.;
672  q2=-std::log(1.-ran)/theB1;
673  if(std::fabs(tss)>1.e-7) q2=(std::sqrt(theB1*(theB1+(tss+tss)*q2))-theB1)/tss;
674  }
675  else if(rand<I12)
676  {
677  G4double ran=R2*G4UniformRand();
678  if(ran>1.) ran=1.;
679  q2=-std::log(1.-ran)/theB2;
680  if(q2<0.) q2=0.;
681  if(a<6.5) q2=std::pow(q2,third);
682  else q2=std::pow(q2,fifth);
683  }
684  else if(rand<I13)
685  {
686  G4double ran=R3*G4UniformRand();
687  if(ran>1.) ran=1.;
688  q2=-std::log(1.-ran)/theB3;
689  if(q2<0.) q2=0.;
690  if(a>6.5) q2=std::pow(q2,sevth);
691  }
692  else
693  {
694  G4double ran=R4*G4UniformRand();
695  if(ran>1.) ran=1.;
696  q2=-std::log(1.-ran)/theB4;
697  if(a<6.5) q2=lastTM-q2; // u reduced for lightA (starts from 0)
698  }
699  }
700  if(q2<0.) q2=0.;
701  if(!(q2>=-1.||q2<=1.)) G4cout<<"*NAN*G4QElasticCrossSect::GetExchangeT: -t="<<q2<<G4endl;
702  if(q2>lastTM)
703  {
704  q2=lastTM;
705  }
706  return q2*GeVSQ;
707 }
int gigaelectronvolt
Definition: hepunit.py:110
#define G4UniformRand()
Definition: Randomize.hh:87
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
G4double G4ChipsPionPlusElasticXS::GetIsoCrossSection ( const G4DynamicParticle Pt,
G4int  tgZ,
G4int  A,
const G4Isotope iso = 0,
const G4Element elm = 0,
const G4Material mat = 0 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 144 of file G4ChipsPionPlusElasticXS.cc.

References GetChipsCrossSection(), and G4DynamicParticle::GetTotalMomentum().

149 {
150  G4double pMom=Pt->GetTotalMomentum();
151  G4int tgN = A - tgZ;
152 
153  return GetChipsCrossSection(pMom, tgZ, tgN, 211);
154 }
virtual G4double GetChipsCrossSection(G4double momentum, G4int Z, G4int N, G4int pdg)
int G4int
Definition: G4Types.hh:78
G4double GetTotalMomentum() const
double G4double
Definition: G4Types.hh:76
G4bool G4ChipsPionPlusElasticXS::IsIsoApplicable ( const G4DynamicParticle Pt,
G4int  Z,
G4int  A,
const G4Element elm,
const G4Material mat 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 133 of file G4ChipsPionPlusElasticXS.cc.

References G4DynamicParticle::GetDefinition(), and G4PionPlus::PionPlus().

136 {
137  G4ParticleDefinition* particle = Pt->GetDefinition();
138  if (particle == G4PionPlus::PionPlus() ) return true;
139  return false;
140 }
G4ParticleDefinition * GetDefinition() const
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:98

The documentation for this class was generated from the following files: