Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/cross_sections/src/G4UPiNuclearCrossSection.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 // Calculation of the total, elastic and inelastic cross-sections
 28 // based on Barashenkov parametrisations of pion data
 29 //
 30 // 16.08.06 V.Ivanchenko - first implementation on base of 
 31 //                         J.P Wellisch class G4PiNuclearCrossSection
 32 // 22.01.07 V.Ivanchenko - add cross section interfaces with Z and A
 33 // 05.03.07 V.Ivanchenko - fix weight for interpolation
 34 // 13.03.07 V.Ivanchenko - cleanup at low energies
 35 // 11.09.09 V.Ivanchenko - fixed bug in interpolation
 36 //
 37 
 38 #include "G4UPiNuclearCrossSection.hh"
 39 #include "G4SystemOfUnits.hh"
 40 #include "G4PhysicsFreeVector.hh"
 41 #include "G4PionMinus.hh"
 42 #include "G4PionPlus.hh"
 43 #include "G4PhysicsTable.hh"
 44 #include "G4NistManager.hh"
 45 #include "G4HadronXSDataTable.hh"
 46 
 47 G4int G4UPiNuclearCrossSection::theZ[NZ] = 
 48 {2,4,6,7,8,11,13,20,26,29,42,48,50,74,82,92};
 49 G4int G4UPiNuclearCrossSection::idxZ[93] = {0}; 
 50 G4double G4UPiNuclearCrossSection::theA[NZ]   = {0.0};
 51 G4double G4UPiNuclearCrossSection::APower[93] = {0.0};
 52 
 53 G4PhysicsTable* G4UPiNuclearCrossSection::piPlusElastic = nullptr;
 54 G4PhysicsTable* G4UPiNuclearCrossSection::piPlusInelastic = nullptr;
 55 G4PhysicsTable* G4UPiNuclearCrossSection::piMinusElastic = nullptr;
 56 G4PhysicsTable* G4UPiNuclearCrossSection::piMinusInelastic = nullptr;
 57 
 58 G4UPiNuclearCrossSection::G4UPiNuclearCrossSection()
 59  : G4VCrossSectionDataSet("G4UPiNuclearCrossSection")
 60 {
 61   piPlus = G4PionPlus::PionPlus();
 62   piMinus = G4PionMinus::PionMinus();
 63   elow = 20.0*CLHEP::MeV;
 64 
 65   if (idxZ[0] == 0) { LoadData(); }
 66 }
 67 
 68 G4bool 
 69 G4UPiNuclearCrossSection::IsElementApplicable(const G4DynamicParticle*, 
 70                 G4int Z, const G4Material*)
 71 {
 72   return (1 < Z);
 73 }
 74 
 75 G4double G4UPiNuclearCrossSection::Interpolate(
 76          G4int Z, G4int A, G4double e, const G4PhysicsTable* table) const
 77 {
 78   G4double res = 0.0;
 79   G4double ekin = std::max(e, elow);
 80   G4int iz  = std::min(Z, 92);
 81   G4int idx = idxZ[iz];
 82   std::size_t jdx = (std::size_t)(std::max(ekin - elow, 0.0)*0.06);
 83   //G4cout << "Interpolate: Z= " << iz << " A= " << A << " idx= " << idx 
 84   // << " jdx= " << jdx << " Ekin= " << ekin << G4endl;
 85   if(idx < 0 || 2 == iz) {
 86     res = ((*table)[std::abs(idx)])->Value(ekin, jdx);
 87     //G4cout << "1: jdx= " << jdx << G4endl; 
 88   } else {
 89     G4int iz2 = theZ[idx];
 90     G4double x2 = (((*table)[idx])->Value(ekin, jdx))*APower[iz]/APower[iz2];
 91     //G4cout << "2: jdx= " << jdx << G4endl; 
 92     G4int iz1 = theZ[idx-1];
 93     G4double x1 = (((*table)[idx-1])->Value(ekin, jdx))*APower[iz]/APower[iz1];
 94     G4double w1 = ((G4double)A - theA[idx-1])/(theA[idx] - theA[idx-1]);
 95     res = w1*x2 + (1.0 - w1)*x1;
 96   }
 97   //G4cout << " res(nb)= " << res/CLHEP::barn << G4endl;
 98   return res;
 99 }
100 
101 void G4UPiNuclearCrossSection::AddDataSet(const G4String& p, 
102             const G4double* tot, 
103             const G4double* in, 
104             const G4double* e, 
105             G4int n)
106 {
107   G4PhysicsFreeVector* pvin = new G4PhysicsFreeVector(n,e[0]*GeV,e[n-1]*GeV,spline);
108   G4PhysicsFreeVector* pvel = new G4PhysicsFreeVector(n,e[0]*GeV,e[n-1]*GeV,spline);
109   for (G4int i=0; i<n; ++i) { 
110     pvin->PutValues(i, e[i]*CLHEP::GeV, in[i]*CLHEP::millibarn); 
111     pvel->PutValues(i, e[i]*CLHEP::GeV, std::max(0.0,(tot[i]-in[i])*CLHEP::millibarn)); 
112   }
113   if (spline) {
114     pvin->FillSecondDerivatives();
115     pvel->FillSecondDerivatives();
116   }
117   if (p == "pi+") {
118     piPlusInelastic->push_back(pvin);
119     piPlusElastic->push_back(pvel);
120   } else {
121     piMinusInelastic->push_back(pvin);
122     piMinusElastic->push_back(pvel);
123   }
124 } 
125 
126 void G4UPiNuclearCrossSection::DumpPhysicsTable(const G4ParticleDefinition& p)
127 {
128   if(&p == piPlus) {
129     G4cout << "### G4UPiNuclearCrossSection Elastic data for pi+" << G4endl;
130     G4cout << *piPlusElastic << G4endl;
131     G4cout << "### G4UPiNuclearCrossSection Inelastic data for pi+" << G4endl;
132     G4cout << *piPlusInelastic << G4endl;
133   } else if(&p == piMinus) {
134     G4cout << "### G4UPiNuclearCrossSection Elastic data for pi-" << G4endl;
135     G4cout << *piMinusElastic << G4endl;
136     G4cout << "### G4UPiNuclearCrossSection Inelastic data for pi-" << G4endl;
137     G4cout << *piMinusInelastic << G4endl;
138   }
139 }
140 
141 void G4UPiNuclearCrossSection::BuildPhysicsTable(const G4ParticleDefinition& p)
142 {
143   if(&p != piPlus && &p != piMinus) { 
144     G4ExceptionDescription ed;
145     ed << "This cross section is applicable only to pions and not to " 
146        << p.GetParticleName() << G4endl; 
147     G4Exception("G4UPiNuclearCrossSection::BuildPhysicsTable", "had001", 
148     FatalException, ed);
149   }
150 }
151 
152 void G4UPiNuclearCrossSection::LoadData()
153 {
154   idxZ[0] = 1;
155   idxZ[1] = idxZ[2] = 0; 
156   G4NistManager* nist = G4NistManager::Instance();
157   G4Pow* g4pow = G4Pow::GetInstance();
158   for(G4int i=0; i<NZ; ++i) {
159     theA[i] = nist->GetAtomicMassAmu(theZ[i]);
160   }
161   for(G4int i=1; i<93; ++i) {
162     APower[i] = g4pow->powA(nist->GetAtomicMassAmu(i), aPower);
163   }
164   G4int idx = 1;
165   for(G4int i=3; i<93; ++i) {
166     if(theZ[idx] == i) {
167       idxZ[i] = -idx;
168       ++idx;
169     } else {
170       idxZ[i] = idx;
171     }
172   }
173 
174   piPlusElastic    = new G4PhysicsTable();
175   piPlusInelastic  = new G4PhysicsTable();
176   piMinusElastic   = new G4PhysicsTable();
177   piMinusInelastic = new G4PhysicsTable();
178   auto ptr = G4HadronXSDataTable::Instance();
179   ptr->AddTable(piPlusElastic);
180   ptr->AddTable(piPlusInelastic);
181   ptr->AddTable(piMinusElastic);
182   ptr->AddTable(piMinusInelastic);
183 
184   static const G4double e1[38] = {
185     0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.13, 0.14, 0.15, 0.16, 
186     0.17, 0.18, 0.19, 0.2,  0.22,0.24, 0.26, 0.28, 0.3,  0.35, 
187     0.4,  0.45, 0.5,  0.55, 0.6, 0.7,  0.8,  0.9,  1,    2, 
188     3,    5,    10,   20,   50,  100,  500, 1000};
189   static const G4double e2[39] = {
190     0.02, 0.04, 0.06, 0.08, 0.1,  0.11, 0.12, 0.13, 0.14, 0.15, 
191     0.16, 0.17, 0.18, 0.2,  0.22, 0.24, 0.26, 0.28, 0.3,  0.35, 
192     0.4,  0.45, 0.5,  0.55, 0.575,0.6,  0.7,  0.8,  0.9,  1, 
193     2,    3,    5,   10,   20,    50,   100,  500,  1000};
194   static const G4double e3[31] = {
195     0.02, 0.04, 0.06, 0.08, 0.1,  0.12, 0.14, 0.16, 0.18, 0.2, 
196     0.22, 0.25, 0.3,  0.35, 0.4,  0.45, 0.5,  0.6,  0.7,  0.8, 
197     0.9,  1,    2,    3,    5,    10,    20,   50,   100, 500, 1000};
198   static const G4double e4[32] = {
199     0.02, 0.04, 0.06, 0.08, 0.1,  0.12, 0.14, 0.16, 0.18,  0.2, 
200     0.22, 0.25, 0.3,  0.35, 0.4,  0.45, 0.5, 0.55,  0.6,   0.7,  
201     0.8,  0.9,    1,    2,    3,    5,   10,   20,   50,  100,  500,  1000};
202   static const G4double e5[34] = {
203    0.02,  0.04, 0.05, 0.06, 0.07, 0.08, 0.09,  0.1, 0.12, 0.14, 
204    0.16, 0.18,  0.2,  0.22, 0.25, 0.3,  0.35,  0.4, 0.45,  0.5,  
205    0.6,  0.7,   0.8,  0.9,    1,    2,    3,   5,   10,    20, 50, 100, 500, 1000};
206   static const G4double e6[35] = {
207    0.02,  0.04, 0.05, 0.06, 0.07, 0.08, 0.09,  0.1, 0.12, 0.14, 
208    0.16, 0.18,  0.2,  0.22, 0.25,  0.3, 0.35,  0.4, 0.45,  0.5, 
209    0.55,  0.6,  0.7,  0.8,  0.9,  1,    2,    3,    5,   10, 20, 50, 100, 500, 1000};
210 
211   static const G4double he_t[38] = {
212    40,  70, 108,   152, 208,   276, 300, 320,   329, 333, 
213   332, 328, 322,   310, 288,   260, 240, 216,   196, 144, 
214   125, 112, 108.5, 109, 110.5, 117, 123, 128.5, 135, 110, 
215    96,  87,  85,  83.5, 83.5, 83.5, 83.5, 83.5};
216   static const G4double he_in[38] = {
217    18,  38,  62,    98, 136,   176, 190, 200,   209, 212, 
218   212, 208, 204,   196, 176,   164, 150, 134,   124, 97.5, 
219    90,  85,82.5,  83.5, 86.5,   93, 97.5,100,   102, 83, 
220    77,  75,  74,  72.5, 72.5, 72.5, 72.5, 72.5};
221   static const G4double be_m_t[38] = {
222   150, 210, 294,   396, 520,   600, 623, 635,   642, 640, 
223   630, 615, 600,   576, 540,   504, 470, 435,   400, 340, 
224   294, 258, 236,   230, 233,   244, 257, 270,   276, 250, 
225   230, 215, 205,   194, 188,   186, 186, 186};
226   static const G4double be_m_in[38] = {
227    90, 126, 177,   240, 320,   380, 400, 410,   414, 410, 
228   400, 387, 371,   360, 333,   312, 285, 260,   237, 216, 
229   198, 187, 182,   180, 182,   187, 193, 203,   207, 179, 
230   172, 165, 159,   155, 144,   144, 144, 144};
231   static const G4double be_p_t[38] = {
232    96, 150, 222,   320, 430,   514, 545, 565,   574, 574, 
233   564, 552, 535,   522, 490,   462, 432, 398,   367, 314, 
234    276, 248, 232,  230, 233,   244, 257, 270,   276, 250, 
235   230, 215, 205,   194, 188,   186, 186, 186};
236   static const G4double be_p_in[38] = {
237    60,  95, 142,   194, 262,   319, 345, 361,   364, 364, 
238   354, 350, 330,   319, 298,   280, 258, 237,   216, 200, 
239   189, 183, 182,   180, 182,   187, 193, 203,   207, 179, 
240   172, 165, 159,   155, 144,   144, 144, 144};
241 
242   static const G4double c_m_t[39] = {
243   204, 260, 366,   517, 630,   673, 694, 704, 710, 711, 
244   706, 694, 676,   648, 616,   584, 548, 518, 489, 426, 
245   376, 342, 323,   310, 312,   313, 319, 333, 342, 348, 
246   310, 290, 268,   250, 245,   237, 234, 234, 234};
247   static const G4double c_m_in[39] = {
248   128, 160, 224,   315, 388,   416, 430, 438, 444, 445, 
249   440, 432, 416,   400, 380,   354, 320, 304, 288, 264, 
250   246, 240, 233,   232, 233,   234, 238, 246, 252, 256, 
251   220, 210, 198,   187, 183,   176, 174, 174, 174};
252   static const G4double c_p_t[39] = {
253   140, 192, 294,   428, 594,   642, 662, 687, 685, 688, 
254   684, 672, 656,   630, 598,   567, 533, 504, 474, 416, 
255   369, 336, 319,   310, 312,   313, 319, 333, 342, 348, 
256   310, 290, 268,   250, 245,   237, 234, 234, 234};
257   static const G4double c_p_in[39] = {
258    94, 132, 184,   260, 370,   398, 408, 420, 426, 428, 
259   424, 416, 400,   386, 366,   340, 308, 294, 280, 257, 
260   241, 236, 231,   232, 233,   234, 238, 246, 252, 256, 
261   220, 210, 198,   187, 183,   176, 174, 174, 174};
262   static const G4double n_m_t[39] = {
263   246, 308, 424,   590, 729,   776, 800, 821, 822, 817, 
264   800, 778, 768,   728, 690,   654, 615, 584, 556, 480, 
265   430, 393, 373,   367, 368,   370, 375, 388, 390, 397, 
266   364, 337, 310,   291, 275,   268, 268, 268, 268};
267   static const G4double n_m_in[39] = {
268   155, 188, 256,   360, 456,   492, 512, 526, 526, 520, 
269   504, 491, 475,   450, 425,   396, 376, 360, 340, 300, 
270   282, 270, 265,   265, 266,   268, 273, 280, 288, 288, 
271   256, 237, 226,   218, 208,   202, 202, 202, 202};
272   static const G4double n_p_t[39] = {
273   150, 212, 328,   500, 680,   735, 762, 781, 782, 779, 
274   770, 748, 740,   706, 672,   633, 600, 569, 541, 467, 
275   419, 385, 368,   364, 366,   368, 375, 388, 390, 397, 
276   364, 337, 310,   291, 275,   268, 268, 268, 268};
277   static const G4double n_p_in[39] = {
278    90, 140, 208,   300, 426,   467, 490, 504, 504, 500, 
279   484, 474, 460,   437, 413,   381, 365, 350, 330, 292, 
280   276, 267, 263,   264, 265,   267, 273, 280, 288, 288, 
281   256, 237, 226,   218, 208,   202, 202, 202, 202};
282 
283   static const G4double o_m_t[31] = {
284   280, 360, 500,   685, 812,   861, 870, 865, 835, 800, 
285   755, 700, 600,   537, 493,   468, 441, 436, 443, 449, 
286   460, 463, 432,   385, 350,   325, 312, 307, 303, 303, 303};
287   static const G4double o_m_in[31] = {
288   190, 207, 300,   420, 500,   540, 550, 542, 520, 490, 
289   460, 423, 360,   339, 321,   314, 312, 314, 319, 324, 
290   328, 330, 300,   275, 250,   240, 229, 225, 222, 222, 222};
291   static const G4double o_p_t[31] = {
292   170, 240, 390,   570, 740,   818, 830, 822, 800, 765, 
293   725, 675, 585,   525, 483,   458, 444, 447, 453, 449,
294   460, 463, 432,   385, 350,   325, 312, 307, 303, 303, 303};
295   static const G4double o_p_in[31] = {
296   100, 145, 240,   340, 470,   518, 530, 522, 505, 477, 
297   448, 412, 350,   330, 316,   310, 308, 311, 317, 324,
298   328, 330, 300,   275, 250,   240, 229, 225, 222, 222, 222};
299   static const G4double na_m_t[31] = {
300   450, 545, 705,   910, 1020, 1075, 1087, 1080, 1042, 987, 
301   943, 885, 790,   700,  650,  610,  585,  575,  585, 595, 
302   600, 610, 556,   524,  494,  458,  445,  429,  427, 427, 427};
303   static const G4double na_m_in[31] = {
304   275, 315, 413,   545,  620,  660,  670,  662,  630, 593, 
305   570, 520, 465,   420,  410,  395,  390,  400,  410, 418, 
306   420, 422, 372,   348,  330,  320,  310,  294,  292, 292, 292};
307   static const G4double na_p_t[31] = {
308   210, 320, 530,   795,  960, 1035, 1050, 1040, 1007, 957, 
309   918, 865, 773,   685,  636,  598,  575,  565,  578, 590, 
310   598, 610, 556,   524,  494,  458,  445,  429,  427, 427, 427};
311   static const G4double na_p_in[31] = {
312   115, 210, 340,   495,  585,  630,  645,  637,  605, 572, 
313   550, 505, 455,   410,  401,  388,  383,  393,  405, 414, 
314   418, 422, 372,   348,  330,  320,  310,  294,  292, 292, 292};
315   static const G4double al_m_t[31] = {
316   532, 637, 832,  1057, 1207, 1230, 1210, 1174, 1133, 1095, 
317  1038, 970, 890,   807,  750,  710,  675,  665,  670,  673, 
318   678, 682, 618,   574,  546,  520,  507,  495,  488,  488, 488};
319   static const G4double al_m_in[31] = {
320   300, 360, 495,   665,  750,  765,  750,  730,  700,  660, 
321   615, 570, 520,   490,  470,  450,  448,  450,  450,  452, 
322   456, 460, 408,   392,  376,  356,  347,  338,  332,  332, 332};
323   static const G4double al_p_t[31] = {
324   225, 350, 616,   945, 1122, 1175, 1157, 1128, 1088, 1045, 
325   988, 935, 870,   787,  730,  690,  660,  652,  660,  668, 
326   678, 682, 618,   574,  546,  520,  507,  495,  488,  488, 488};
327   static const G4double al_p_in[31] = {
328   120, 238, 390,   610,  712,  735,  720,  703,  655,  635, 
329   590, 550, 505,   475,  455,  438,  440,  445,  445,  450, 
330   456, 460, 408,   392,  376,  356,  347,  338,  332,  332, 332};
331 
332   static const G4double ca_m_t[31] = {
333   800, 980, 1240, 1460, 1570, 1600, 1580, 1535, 1475, 1425, 
334  1375,1295, 1200, 1083, 1000,  948,  915,  895,  900,  908, 
335   915, 922, 856,   795,  740,  705,  682,  660,  660,  660, 660};
336   static const G4double ca_m_in[31] = {
337   470, 550, 620,   860,  955,  960,  920,  860,  820,  780, 
338   740, 665, 637,   615,  600,  590,  580,  580,  600,  608,  
339   610, 615, 550,   525,  510,  488,  470,  450,  450,  450,  450};
340   static const G4double ca_p_t[31] = {
341   275, 445, 790,  1195, 1440, 1485, 1475, 1435, 1385, 1335, 
342  1295,1245,1160,  1050,  970,  923,  895,  877,  887,  897, 
343   904, 913, 855,   795,  740,  705,  682,  660,  660,  660, 660};
344   static const G4double ca_p_in[31] = {
345   160, 315, 500,   745,  870,  905,  900,  860,  810,  770, 
346   740, 710, 640,   617,  595,  585,  575,  575,  590,  600, 
347   602, 608, 550,   525,  510,  488,  470,  450,  450,  450,  450};
348   // ca data may have typo
349 
350   static const G4double fe_m_t[32] = {
351  1175, 1363, 1670, 1950, 2050, 2040, 1975, 1886, 1834, 1773, 
352  1720, 1635, 1474, 1380, 1269, 1225, 1182, 1162, 1159, 1162, 
353  1178, 1190, 1197, 1102, 1135,  975,  945,  925,  905,  905,  
354   905,  905};
355   static const G4double fe_m_in[32] = {
356   625,  725,  910, 1180, 1275, 1250, 1200, 1150, 1100, 1040,  
357   995,  925,  825,  810,  780,  760,  745,  740,  740,  740,  
358   750,  760,  765,  690,  660,  635,  615,  600,  585,  585,  
359   585,  585};
360   static const G4double fe_p_t[32] =  {
361   330,  575, 1010, 1500, 1837, 1875, 1820, 1751, 1691, 1636, 
362  1690, 1450, 1396, 1305, 1219, 1190, 1148, 1138, 1134, 1144, 
363   1163, 1175, 1183, 1198, 1135, 975,  945,  925,  905,  905,  
364   905,  905};
365   static const G4double fe_p_in[32] = {
366   210,  410,  707, 1010, 1125, 1150, 1100, 1070, 1010,  960,  
367   920,  776,  780,  760,  750,  740,  720,  725,  725,  730,  
368   740,  750,  755,  690,  660,  635,  615,  600,  585,  585,  
369   585,  585};
370   static const G4double cu_m_t[32] = {
371  1400, 1600, 1875, 2088, 2200, 2220, 2175, 2125, 2075, 2012, 
372  1950, 1855, 1670, 1530, 1430, 1370, 1315, 1315, 1315, 1330, 
373  1345, 1360, 1365, 1250, 1185, 1128, 1070, 1035, 1010, 1010, 
374  1010, 1010};
375   static const G4double cu_m_in[32] = {
376   725,  840, 1020, 1200, 1295, 1300, 1267, 1240, 1213, 1175, 
377  1125, 1042,  950,  900,  860,  840,  830,  832,  835,  840,  
378   850,  860,  865,  785,  735,  705,  680,  650,  630,  630,  
379   630,  630};
380   static const G4double cu_p_t[32] = {
381   355,  605, 1120, 1630, 1940, 2010, 2010, 1980, 1925, 1895, 
382  1830, 1730, 1585, 1490, 1400, 1340, 1290, 1290, 1290, 1310, 
383  1330, 1345, 1350, 1240, 1185, 1128, 1070, 1035, 1010, 1010, 
384  1010, 1010};
385   static const G4double cu_p_in[32] = {
386   230,  425,  780,  1025, 1155, 1190, 1190, 1180, 1125, 1100, 
387  1050, 1000,  900,   870,  835,  815,  810,  812,  815,  825,  
388   840,  850,  855,   780,  735,  705,  680,  650,  630,  630,  
389   630,  630};
390 
391   static const G4double mo_m_t[34] = {
392   2430, 2610, 2710, 2790, 2880, 2940, 2965, 2970, 2970, 2920, 
393   2840, 2720, 2570, 2500, 2365, 2200, 2050, 1926, 1825, 1768, 
394   1749, 1750, 1778, 1789, 1808, 1690, 1645, 1530, 1492, 1450, 
395   1425, 1425, 1425, 1425};
396   static const G4double mo_m_in[34] = {
397    925, 1125, 1250, 1375, 1500, 1600, 1680, 1750, 1770, 1730, 
398   1660, 1580, 1500, 1450, 1330, 1250, 1190, 1140, 1100, 1075, 
399   1075, 1070, 1088, 1095, 1110, 1035, 1005,  940,  917,  880, 
400    860,  860,  860, 860};
401   static const G4double mo_p_t[34] = {
402    410,  730, 1110, 1530, 1920, 2200, 2385, 2520, 2600, 2630, 
403   2575, 2470, 2320, 2285, 2185, 2053, 1945, 1852, 1776, 1719, 
404   1710, 1716, 1746, 1759, 1778, 1675, 1645, 1530, 1492, 1450, 
405   1425, 1425, 1425, 1425};
406   static const G4double mo_p_in[34] = {
407    270,  540,  825,  975, 1140, 1285, 1400, 1480, 1555, 1580, 
408   1525, 1470, 1360, 1340, 1255, 1160, 1120, 1085, 1060, 1045, 
409   1045, 1045, 1065, 1075, 1090, 1025, 1005,  940,  917,  880, 
410    860,  860,  860, 860};
411   static const G4double cd_m_t[34] = {
412   3060, 3125, 3170, 3220, 3255, 3280, 3290, 3260, 3270, 3200, 
413   3120, 3080, 3090, 2920, 2810, 2640, 2362, 2230, 2115, 2050, 
414   2020, 2025, 2040, 2070, 2100, 1900, 1795, 1740, 1675, 1645, 
415   1625, 1620, 1620, 1620};
416   static const G4double cd_m_in[34]= {
417   1025, 1275, 1440, 1625, 1740, 1800, 1880, 1920, 1980, 1920, 
418   1850, 1810, 1720, 1650, 1560, 1450, 1330, 1290, 1245, 1210, 
419   1200, 1200, 1205, 1205, 1230, 1130, 1085, 1060, 1000,  985, 
420    975,  970,  970, 970};
421   static const G4double cd_p_t[34] = {
422    455,  780, 1170, 1700, 2120, 2400, 2600, 2720, 2820, 2840, 
423   2800, 2760, 2720, 2640, 2560, 2450, 2252, 2130, 2035, 1985, 
424   1970, 1975, 2005, 2035, 2070, 1880, 1795, 1740, 1675, 1645, 
425   1625, 1620, 1620, 1620};
426   static const G4double cd_p_in[34] = {
427    310,  580,  880, 1060, 1270, 1400, 1530, 1610, 1660, 1680, 
428   1640, 1600, 1560, 1500, 1430, 1330, 1280, 1230, 1200, 1180, 
429   1170, 1175, 1180, 1180, 1210, 1120, 1085, 1060, 1000,  985, 
430    975,  970,  970, 970};
431 
432   static const G4double sn_m_t[35] = {
433   3000, 3180, 3250, 3300, 3300, 3410, 3470, 3450, 3410, 3350, 
434   3280, 3200, 3120, 3050, 2900, 2630, 2500, 2325, 2190, 2100, 
435   2060, 2055, 2055, 2055, 2067, 2085, 2000, 1900, 1835, 1770, 
436   1720, 1700, 1695, 1695, 1695};
437   static const G4double sn_m_in[35] = {
438   1050, 1350, 1520, 1650, 1800, 1980, 2070, 2120, 2090, 2050, 
439   1980, 1920, 1830, 1770, 1670, 1500, 1435, 1350, 1300, 1230, 
440   1220, 1235, 1235, 1235, 1237, 1240, 1160, 1120, 1090, 1065, 
441   1040, 1020, 1015, 1015, 1015};
442   static const G4double sn_p_t[35] =  { 
443    465,  800, 1200, 1760, 2170, 2480, 2730, 2885, 2970, 2980, 
444   2970, 2890, 2840, 2790, 2620, 2450, 2335, 2205, 2080, 2020, 
445   2010, 1990, 1990, 2015, 2030, 2045, 1980, 1890, 1835, 1770, 
446   1720, 1700, 1695, 1695, 1695};
447   static const G4double sn_p_in[35] = { 
448    315,  590,  880, 1220, 1460, 1580, 1700, 1770, 1810, 1810, 
449   1800, 1730, 1680, 1630, 1530, 1400, 1335, 1270, 1210, 1180, 
450   1190, 1190, 1190, 1205, 1210, 1210, 1150, 1115, 1090, 1065, 
451   1040, 1020, 1015, 1015, 1015};
452   static const G4double w_m_t[35] = {
453   5200, 5115, 5025, 4975, 4900, 4850, 4780, 4725, 4600, 4490, 
454   4355, 4255, 4125, 4040, 3830, 3580, 3330, 3110, 2955, 2860, 
455   2852, 2845, 2885, 2900, 2915, 2940, 2800, 2660, 2570, 2490, 
456   2460, 2425, 2420, 2420, 2420};
457   static const G4double w_m_in[35] = {
458   1450, 1850, 2100, 2350, 2550, 2700, 2825, 2900, 2850, 2750, 
459   2630, 2525, 2400, 2300, 2200, 2070, 1880, 1770, 1715, 1680, 
460   1680, 1680, 1685, 1690, 1700, 1720, 1635, 1560, 1530, 1460, 
461   1440, 1410, 1410, 1410, 1410};
462   static const G4double w_p_t[35] = { 
463    480,  900, 1500, 2350, 3020, 3420, 3650, 3775, 3875, 3830, 
464   3750, 3700, 3630, 3550, 3550, 3290, 3070, 2890, 2840, 2730, 
465   2725, 2720, 2770, 2805, 2828, 2865, 2770, 2640, 2570, 2490,
466   2460, 2425, 2420, 2420, 2420};
467   static const G4double w_p_in[35] = { 
468    325,  680,  990, 1500, 1850, 2150, 2250, 2300, 2350, 2330, 
469   2280, 2230, 2200, 2120, 2130, 1900, 1780, 1670, 1635, 1600, 
470   1602, 1605, 1610, 1615, 1630, 1660, 1620, 1550, 1530, 1460,
471   1440, 1410, 1410, 1410, 1410};
472 
473   static const G4double pb_m_t[35] = {
474   5890, 5700, 5610, 5580, 5550, 5480, 5400, 5300, 5100, 4930, 
475   4750, 4600, 4400, 4280, 4170, 3915, 3650, 3470, 3260, 3150, 
476   3120, 3070, 3085, 3100, 3120, 3160, 3070, 2930, 2820, 2750, 
477   2710, 2655, 2640, 2640, 2640};
478   static const G4double pb_m_in[35] = {
479   1575, 2025, 2300, 2575, 2850, 3000, 3115, 3180, 3080, 2940, 
480   2800, 2670, 2550, 2450, 2370, 2220, 2110, 2000, 1920, 1880, 
481   1850, 1800, 1805, 1810, 1820, 1840, 1800, 1720, 1640, 1620, 
482   1570, 1530, 1530, 1530, 1530};
483   static const G4double pb_p_t[35] = { 
484    515,  940, 1500, 2400, 3270, 3750, 4050, 4140, 4260, 4200, 
485   4080, 3990, 3990, 3810, 3730, 3520, 3370, 3186, 3110, 3010, 
486   2990, 2985, 3005, 3020, 3040, 3080, 3020, 2905, 2790, 2750,
487   2710, 2655, 2640, 2640, 2640};
488   static const G4double pb_p_in[35] = { 
489    348,  707, 1040, 1650, 2100, 2400, 2580, 2640, 2650, 2520, 
490   2410, 2300, 2250, 2190, 2130, 2000, 1930, 1870, 1830, 1790, 
491   1770, 1765, 1775, 1780, 1790, 1800, 1775, 1710, 1620, 1620,
492   1570, 1530, 1530, 1530, 1530};
493   static const G4double u_m_t[35] = {
494   7080, 6830, 6650, 6530, 6400, 6280, 6100, 5840, 5660, 5520, 
495   5330, 5160, 4990, 4810, 4630, 4323, 4130, 3870, 3700, 3550, 
496   3490, 3465, 3467, 3475, 3495, 3515, 3440, 3360, 3150, 3040, 
497   2985, 2955, 2940, 2940, 2940};
498   static const G4double u_m_in[35] = {
499   1740, 2220, 2500, 2820, 3080, 3300, 3420, 3500, 3420, 3330, 
500   3200, 3060, 2940, 2850, 2710, 2470, 2380, 2250, 2160, 2080, 
501   2040, 2045, 2047, 2050, 2055, 2060, 2010, 1980, 1830, 1780, 
502   1735, 1710, 1700, 1700, 1700};
503   static const G4double u_p_t[35] = { 
504    485,  960, 1580, 2700, 3550, 4050, 4320, 4420, 4620, 4660, 
505   4580, 4470, 4350, 4295, 4187, 3938, 3755, 3573, 3450, 3342, 
506   3310, 3295, 3310, 3330, 3375, 3405, 3350, 3338, 3135, 3040,
507   2985, 2955, 2940, 2940, 2940};
508   static const G4double u_p_in[35] = { 
509    334,  720, 1020, 1560, 2100, 2300, 2550, 2700, 2880, 2880, 
510   2760, 2660, 2550, 2510, 2430, 2270, 2130, 2060, 2000, 1970, 
511   1950, 1950, 1960, 1960, 1970, 1980, 1950, 1978, 1830, 1780,
512   1735, 1710, 1700, 1700, 1700};
513 
514   AddDataSet("pi-",he_t,   he_in,  e1, 38);
515   AddDataSet("pi+",he_t,   he_in,  e1, 38);
516   AddDataSet("pi-",be_m_t, be_m_in, e1, 38);
517   AddDataSet("pi+",be_p_t, be_p_in, e1, 38);
518   AddDataSet("pi-",c_m_t,  c_m_in,  e2, 39);
519   AddDataSet("pi+",c_p_t,  c_p_in,  e2, 39);
520   AddDataSet("pi-",n_m_t,  n_m_in,  e2, 39);
521   AddDataSet("pi+",n_p_t,  n_p_in,  e2, 39);
522   AddDataSet("pi-",o_m_t,  o_m_in,  e3, 31);
523   AddDataSet("pi+",o_p_t,  o_p_in,  e3, 31);
524   AddDataSet("pi-",na_m_t, na_m_in, e3, 31);
525   AddDataSet("pi+",na_p_t, na_p_in, e3, 31);
526   AddDataSet("pi-",al_m_t, al_m_in, e3, 31);
527   AddDataSet("pi+",al_p_t, al_p_in, e3, 31);
528   AddDataSet("pi-",ca_m_t, ca_m_in, e3, 31);
529   AddDataSet("pi+",ca_p_t, ca_p_in, e3, 31);
530   AddDataSet("pi-",fe_m_t, fe_m_in, e4, 32);
531   AddDataSet("pi+",fe_p_t, fe_p_in, e4, 32);
532   AddDataSet("pi-",cu_m_t, cu_m_in, e4, 32);
533   AddDataSet("pi+",cu_p_t, cu_p_in, e4, 32);
534   AddDataSet("pi-",mo_m_t, mo_m_in, e5, 34);
535   AddDataSet("pi+",mo_p_t, mo_p_in, e5, 34);
536   AddDataSet("pi-",cd_m_t, cd_m_in, e5, 34);
537   AddDataSet("pi+",cd_p_t, cd_p_in, e5, 34);
538   AddDataSet("pi-",sn_m_t, sn_m_in, e6, 35);
539   AddDataSet("pi+",sn_p_t, sn_p_in, e6, 35);
540   AddDataSet("pi-",w_m_t,  w_m_in,  e6, 35);
541   AddDataSet("pi+",w_p_t,  w_p_in,  e6, 35);
542   AddDataSet("pi-",pb_m_t, pb_m_in, e6, 35);
543   AddDataSet("pi+",pb_p_t, pb_p_in, e6, 35);
544   AddDataSet("pi-",u_m_t,  u_m_in,  e6, 35);
545   AddDataSet("pi+",u_p_t,  u_p_in,  e6, 35);
546 }
547 
548 void G4UPiNuclearCrossSection::CrossSectionDescription(std::ostream& outFile) const
549 {
550   outFile << "G4UPiNuclearCrossSection calculates the total, elastic and\n"
551           << "inelastic cross sections for pion scattering from nuclei\n"
552           << "heavier than hydrogen.  It is based on the Barashenkov\n"
553           << "parameterization and is valid for all incident energies.\n";
554 }
555 
556