Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/lowenergy/src/G4LivermoreComptonModel.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 ]

Diff markup

Differences between /processes/electromagnetic/lowenergy/src/G4LivermoreComptonModel.cc (Version 11.3.0) and /processes/electromagnetic/lowenergy/src/G4LivermoreComptonModel.cc (Version 10.0.p3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
                                                   >>  26 // $Id: G4LivermoreComptonModel.cc 84806 2014-10-21 09:16:33Z gcosmo $
                                                   >>  27 // GEANT4 tag $Name: not supported by cvs2svn $
 26 //                                                 28 //
 27 //                                                 29 //
 28 // Author: Alexander Bagulya                       30 // Author: Alexander Bagulya
 29 //         11 March 2012                           31 //         11 March 2012
 30 //         on the base of G4LivermoreComptonMo     32 //         on the base of G4LivermoreComptonModel
 31 //                                                 33 //
 32 // History:                                        34 // History:
 33 // --------                                        35 // --------
 34 // 18 Apr 2009   V Ivanchenko Cleanup initiali     36 // 18 Apr 2009   V Ivanchenko Cleanup initialisation and generation of secondaries:
 35 //                  - apply internal high-ener <<  37 //                  - apply internal high-energy limit only in constructor 
 36 //                  - do not apply low-energy      38 //                  - do not apply low-energy limit (default is 0)
 37 //                  - remove GetMeanFreePath m     39 //                  - remove GetMeanFreePath method and table
 38 //                  - added protection against <<  40 //                  - added protection against numerical problem in energy sampling 
 39 //                  - use G4ElementSelector        41 //                  - use G4ElementSelector
 40 // 26 Dec 2010   V Ivanchenko Load data tables     42 // 26 Dec 2010   V Ivanchenko Load data tables only once to avoid memory leak
 41                                                    43 
 42 #include "G4LivermoreComptonModel.hh"              44 #include "G4LivermoreComptonModel.hh"
 43                                                << 
 44 #include "G4AtomicShell.hh"                    << 
 45 #include "G4AutoLock.hh"                       << 
 46 #include "G4DopplerProfile.hh"                 << 
 47 #include "G4Electron.hh"                       << 
 48 #include "G4Exp.hh"                            << 
 49 #include "G4Log.hh"                            << 
 50 #include "G4LossTableManager.hh"               << 
 51 #include "G4ParticleChangeForGamma.hh"         << 
 52 #include "G4PhysicalConstants.hh"                  45 #include "G4PhysicalConstants.hh"
 53 #include "G4ShellData.hh"                      << 
 54 #include "G4SystemOfUnits.hh"                      46 #include "G4SystemOfUnits.hh"
                                                   >>  47 #include "G4Electron.hh"
                                                   >>  48 #include "G4ParticleChangeForGamma.hh"
                                                   >>  49 #include "G4LossTableManager.hh"
 55 #include "G4VAtomDeexcitation.hh"                  50 #include "G4VAtomDeexcitation.hh"
                                                   >>  51 #include "G4AtomicShell.hh"
                                                   >>  52 #include "G4Gamma.hh"
                                                   >>  53 #include "G4ShellData.hh"
                                                   >>  54 #include "G4DopplerProfile.hh"
                                                   >>  55 #include "G4Log.hh"
                                                   >>  56 #include "G4Exp.hh"
 56                                                    57 
 57 //....oooOO0OOooo........oooOO0OOooo........oo     58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 58                                                    59 
 59 namespace                                      << 
 60 {                                              << 
 61 G4Mutex LivermoreComptonModelMutex = G4MUTEX_I << 
 62 }                                              << 
 63 using namespace std;                               60 using namespace std;
 64                                                    61 
 65 G4PhysicsFreeVector* G4LivermoreComptonModel:: <<  62 G4int G4LivermoreComptonModel::maxZ = 99;
 66 G4ShellData* G4LivermoreComptonModel::shellDat <<  63 G4LPhysicsFreeVector* G4LivermoreComptonModel::data[] = {0};
 67 G4DopplerProfile* G4LivermoreComptonModel::pro <<  64 G4ShellData*       G4LivermoreComptonModel::shellData = 0;
 68 G4String G4LivermoreComptonModel::gDataDirecto <<  65 G4DopplerProfile*  G4LivermoreComptonModel::profileData = 0;
 69                                                    66 
 70 static const G4double ln10 = G4Log(10.);           67 static const G4double ln10 = G4Log(10.);
 71                                                    68 
 72 G4LivermoreComptonModel::G4LivermoreComptonMod <<  69 G4LivermoreComptonModel::G4LivermoreComptonModel(const G4ParticleDefinition*, 
 73   : G4VEmModel(nam)                            <<  70              const G4String& nam)
 74 {                                              <<  71   : G4VEmModel(nam),isInitialised(false)
 75   fParticleChange = nullptr;                   <<  72 {  
 76   verboseLevel = 1;                            <<  73   lowestEnergy = 10 * eV;
                                                   >>  74 
                                                   >>  75   verboseLevel=1 ;
 77   // Verbosity scale:                              76   // Verbosity scale:
 78   // 0 = nothing                               <<  77   // 0 = nothing 
 79   // 1 = warning for energy non-conservation   <<  78   // 1 = warning for energy non-conservation 
 80   // 2 = details of energy budget                  79   // 2 = details of energy budget
 81   // 3 = calculation of cross sections, file o     80   // 3 = calculation of cross sections, file openings, sampling of atoms
 82   // 4 = entering in methods                       81   // 4 = entering in methods
 83                                                    82 
 84   if (verboseLevel > 1) {                      <<  83   if(  verboseLevel>1 ) { 
 85     G4cout << "Livermore Compton model is cons     84     G4cout << "Livermore Compton model is constructed " << G4endl;
 86   }                                                85   }
 87                                                    86 
 88   // Mark this model as "applicable" for atomi <<  87   //Mark this model as "applicable" for atomic deexcitation
 89   SetDeexcitationFlag(true);                       88   SetDeexcitationFlag(true);
 90                                                    89 
 91   fParticleChange = nullptr;                   <<  90   fParticleChange = 0;
 92   fAtomDeexcitation = nullptr;                 <<  91   fAtomDeexcitation = 0;
 93 }                                                  92 }
 94                                                    93 
 95 //....oooOO0OOooo........oooOO0OOooo........oo     94 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 96                                                    95 
 97 G4LivermoreComptonModel::~G4LivermoreComptonMo     96 G4LivermoreComptonModel::~G4LivermoreComptonModel()
 98 {                                              <<  97 {  
 99   if (IsMaster()) {                            <<  98   if(IsMaster()) {
100     delete shellData;                              99     delete shellData;
101     shellData = nullptr;                       << 100     shellData = 0;
102     delete profileData;                           101     delete profileData;
103     profileData = nullptr;                     << 102     profileData = 0;
104     for (G4int i = 0; i <= maxZ; ++i) {        << 
105       if (data[i]) {                           << 
106         delete data[i];                        << 
107         data[i] = nullptr;                     << 
108       }                                        << 
109     }                                          << 
110   }                                               103   }
111 }                                                 104 }
112                                                   105 
113 //....oooOO0OOooo........oooOO0OOooo........oo    106 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
114                                                   107 
115 void G4LivermoreComptonModel::Initialise(const    108 void G4LivermoreComptonModel::Initialise(const G4ParticleDefinition* particle,
116                                          const << 109            const G4DataVector& cuts)
117 {                                                 110 {
118   if (verboseLevel > 1) {                         111   if (verboseLevel > 1) {
119     G4cout << "Calling G4LivermoreComptonModel    112     G4cout << "Calling G4LivermoreComptonModel::Initialise()" << G4endl;
120   }                                               113   }
121                                                   114 
122   // Initialise element selector                  115   // Initialise element selector
123   if (IsMaster()) {                            << 116   
124     // Initialise element selector             << 117   if(IsMaster()) {
125     InitialiseElementSelectors(particle, cuts) << 
126                                                   118 
127     // Access to elements                         119     // Access to elements
128     const G4ElementTable* elemTable = G4Elemen << 120 
129     size_t numElems = (*elemTable).size();     << 121     char* path = getenv("G4LEDATA");
130     for (size_t ie = 0; ie < numElems; ++ie) { << 122 
131       const G4Element* elem = (*elemTable)[ie] << 123     G4ProductionCutsTable* theCoupleTable = 
132       const G4int Z = std::min(maxZ, elem->Get << 124       G4ProductionCutsTable::GetProductionCutsTable();
133       if (data[Z] == nullptr) {                << 125     G4int numOfCouples = theCoupleTable->GetTableSize();
134         ReadData(Z);                           << 126   
                                                   >> 127     for(G4int i=0; i<numOfCouples; ++i) {
                                                   >> 128       const G4Material* material = 
                                                   >> 129   theCoupleTable->GetMaterialCutsCouple(i)->GetMaterial();
                                                   >> 130       const G4ElementVector* theElementVector = material->GetElementVector();
                                                   >> 131       G4int nelm = material->GetNumberOfElements();
                                                   >> 132     
                                                   >> 133       for (G4int j=0; j<nelm; ++j) {
                                                   >> 134   G4int Z = G4lrint((*theElementVector)[j]->GetZ());
                                                   >> 135   if(Z < 1)        { Z = 1; }
                                                   >> 136   else if(Z > maxZ){ Z = maxZ; }
                                                   >> 137 
                                                   >> 138   if( (!data[Z]) ) { ReadData(Z, path); }
135       }                                           139       }
136     }                                             140     }
137                                                   141 
138     // For Doppler broadening                     142     // For Doppler broadening
139     if (shellData == nullptr) {                << 143     if(!shellData) {
140       shellData = new G4ShellData();           << 144       shellData = new G4ShellData(); 
141       shellData->SetOccupancyData();              145       shellData->SetOccupancyData();
142       G4String file = "/doppler/shell-doppler"    146       G4String file = "/doppler/shell-doppler";
143       shellData->LoadData(file);                  147       shellData->LoadData(file);
144     }                                             148     }
145     if (profileData == nullptr) {              << 149     if(!profileData) { profileData = new G4DopplerProfile(); }
146       profileData = new G4DopplerProfile();    << 150 
147     }                                          << 151     InitialiseElementSelectors(particle, cuts);
148   }                                               152   }
149                                                   153 
150   if (verboseLevel > 2) {                         154   if (verboseLevel > 2) {
151     G4cout << "Loaded cross section files" <<     155     G4cout << "Loaded cross section files" << G4endl;
152   }                                               156   }
153                                                << 157  
154   if (verboseLevel > 1) {                      << 158   if( verboseLevel>1 ) { 
155     G4cout << "G4LivermoreComptonModel is init    159     G4cout << "G4LivermoreComptonModel is initialized " << G4endl
156            << "Energy range: " << LowEnergyLim << 160      << "Energy range: "
157            << " GeV" << G4endl;                << 161      << LowEnergyLimit() / eV << " eV - "
158   }                                            << 162      << HighEnergyLimit() / GeV << " GeV"
159   //                                           << 163      << G4endl;
160   if (isInitialised) {                         << 
161     return;                                    << 
162   }                                               164   }
                                                   >> 165   //  
                                                   >> 166   if(isInitialised) { return; }
163                                                   167 
164   fParticleChange = GetParticleChangeForGamma(    168   fParticleChange = GetParticleChangeForGamma();
165   fAtomDeexcitation = G4LossTableManager::Inst << 169   fAtomDeexcitation  = G4LossTableManager::Instance()->AtomDeexcitation();
166   isInitialised = true;                           170   isInitialised = true;
167 }                                                 171 }
168                                                   172 
169 //....oooOO0OOooo........oooOO0OOooo........oo    173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
170                                                   174 
171 void G4LivermoreComptonModel::InitialiseLocal( << 175 void G4LivermoreComptonModel::InitialiseLocal(const G4ParticleDefinition*,
                                                   >> 176                 G4VEmModel* masterModel)
172 {                                                 177 {
173   SetElementSelectors(masterModel->GetElementS    178   SetElementSelectors(masterModel->GetElementSelectors());
174 }                                                 179 }
175                                                   180 
176 //....oooOO0OOooo........oooOO0OOooo........oo    181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
177                                                   182 
178 const G4String& G4LivermoreComptonModel::FindD << 183 void G4LivermoreComptonModel::ReadData(size_t Z, const char* path)
179 {                                              << 
180   // no check in this method - environment var << 
181   if (gDataDirectory.empty()) {                << 
182     auto param = G4EmParameters::Instance();   << 
183     std::ostringstream ost;                    << 
184     if (param->LivermoreDataDir() == "livermor << 
185       ost << param->GetDirLEDATA() << "/liverm << 
186     }                                          << 
187     else {                                     << 
188       ost << param->GetDirLEDATA() << "/epics2 << 
189     }                                          << 
190     gDataDirectory = ost.str();                << 
191   }                                            << 
192   return gDataDirectory;                       << 
193 }                                              << 
194                                                << 
195 //....oooOO0OOooo........oooOO0OOooo........oo << 
196                                                << 
197 void G4LivermoreComptonModel::ReadData(const G << 
198 {                                                 184 {
199   if (verboseLevel > 1) {                      << 185   if (verboseLevel > 1) 
200     G4cout << "G4LivermoreComptonModel::ReadDa << 186   {
201   }                                            << 187     G4cout << "G4LivermoreComptonModel::ReadData()" 
202   const G4int Z = std::min(ZZ, maxZ);          << 188      << G4endl;
203                                                << 189   }
204   if (data[Z] != nullptr) {                    << 190   if(data[Z]) { return; }  
205     return;                                    << 191   const char* datadir = path;
206   }                                            << 192   if(!datadir) 
207                                                << 193   {
208   data[Z] = new G4PhysicsFreeVector();         << 194     datadir = getenv("G4LEDATA");
209                                                << 195     if(!datadir) 
                                                   >> 196     {
                                                   >> 197       G4Exception("G4LivermoreComptonModel::ReadData()",
                                                   >> 198       "em0006",FatalException,
                                                   >> 199       "Environment variable G4LEDATA not defined");
                                                   >> 200       return;
                                                   >> 201     }
                                                   >> 202   }
                                                   >> 203   
                                                   >> 204   data[Z] = new G4LPhysicsFreeVector();
                                                   >> 205   
                                                   >> 206   // Activation of spline interpolation
                                                   >> 207   data[Z]->SetSpline(false);
                                                   >> 208   
210   std::ostringstream ost;                         209   std::ostringstream ost;
211   ost << FindDirectoryPath() << "ce-cs-" << Z  << 210   ost << datadir << "/livermore/comp/ce-cs-" << Z <<".dat";
212                                                << 
213   std::ifstream fin(ost.str().c_str());           211   std::ifstream fin(ost.str().c_str());
214                                                << 212   
215   if (!fin.is_open()) {                        << 213   if( !fin.is_open()) 
216     G4ExceptionDescription ed;                 << 214     {
217     ed << "G4LivermoreComptonModel data file < << 215       G4ExceptionDescription ed;
218        << G4endl;                              << 216       ed << "G4LivermoreComptonModel data file <" << ost.str().c_str()
219     G4Exception("G4LivermoreComptonModel::Read << 217    << "> is not opened!" << G4endl;
220                 "G4LEDATA version should be G4 << 218     G4Exception("G4LivermoreComptonModel::ReadData()",
221     return;                                    << 219     "em0003",FatalException,
222   }                                            << 220     ed,"G4LEDATA version should be G4EMLOW6.34 or later");
223   else {                                       << 221       return;
224     if (verboseLevel > 3) {                    << 222     } else {
225       G4cout << "File " << ost.str() << " is o << 223       if(verboseLevel > 3) {
226     }                                          << 224   G4cout << "File " << ost.str() 
227     data[Z]->Retrieve(fin, true);              << 225          << " is opened by G4LivermoreComptonModel" << G4endl;
228     data[Z]->ScaleVector(MeV, MeV * barn);     << 226       }   
229   }                                            << 227       data[Z]->Retrieve(fin, true);
                                                   >> 228       data[Z]->ScaleVector(MeV, MeV*barn);
                                                   >> 229     }   
230   fin.close();                                    230   fin.close();
231 }                                                 231 }
232                                                   232 
233 //....oooOO0OOooo........oooOO0OOooo........oo    233 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
234                                                   234 
235 G4double G4LivermoreComptonModel::ComputeCross << 235 G4double 
236                                                << 236 G4LivermoreComptonModel::ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
237                                                << 237                 G4double GammaEnergy,
                                                   >> 238                 G4double Z, G4double,
                                                   >> 239                 G4double, G4double)
238 {                                                 240 {
239   if (verboseLevel > 3) {                         241   if (verboseLevel > 3) {
240     G4cout << "G4LivermoreComptonModel::Comput << 242     G4cout << "G4LivermoreComptonModel::ComputeCrossSectionPerAtom()" 
                                                   >> 243      << G4endl;
241   }                                               244   }
242   G4double cs = 0.0;                           << 245   G4double cs = 0.0; 
243                                                   246 
244   if (GammaEnergy < LowEnergyLimit()) {        << 247   if (GammaEnergy < lowestEnergy) { return 0.0; }
245     return 0.0;                                << 
246   }                                            << 
247                                                   248 
248   G4int intZ = G4lrint(Z);                        249   G4int intZ = G4lrint(Z);
249   if (intZ < 1 || intZ > maxZ) {               << 250   if(intZ < 1 || intZ > maxZ) { return cs; } 
250     return cs;                                 << 
251   }                                            << 
252                                                   251 
253   G4PhysicsFreeVector* pv = data[intZ];        << 252   G4LPhysicsFreeVector* pv = data[intZ];
254                                                   253 
255   // if element was not initialised               254   // if element was not initialised
256   // do initialisation safely for MT mode         255   // do initialisation safely for MT mode
257   if (pv == nullptr) {                         << 256   if(!pv) 
258     InitialiseForElement(nullptr, intZ);       << 257     {
259     pv = data[intZ];                           << 258       InitialiseForElement(0, intZ);
260     if (pv == nullptr) {                       << 259       pv = data[intZ];
261       return cs;                               << 260       if(!pv) { return cs; }
262     }                                             261     }
263   }                                            << 
264                                                   262 
265   auto n = G4int(pv->GetVectorLength() - 1);   << 263   G4int n = pv->GetVectorLength() - 1;   
266   G4double e1 = pv->Energy(0);                    264   G4double e1 = pv->Energy(0);
267   G4double e2 = pv->Energy(n);                    265   G4double e2 = pv->Energy(n);
268                                                   266 
269   if (GammaEnergy <= e1) {                     << 267   if(GammaEnergy <= e1)      { cs = GammaEnergy/(e1*e1)*pv->Value(e1); }
270     cs = GammaEnergy / (e1 * e1) * pv->Value(e << 268   else if(GammaEnergy <= e2) { cs = pv->Value(GammaEnergy)/GammaEnergy; }
271   }                                            << 269   else if(GammaEnergy > e2)  { cs = pv->Value(e2)/GammaEnergy; }
272   else if (GammaEnergy <= e2) {                << 270  
273     cs = pv->Value(GammaEnergy) / GammaEnergy; << 
274   }                                            << 
275   else if (GammaEnergy > e2) {                 << 
276     cs = pv->Value(e2) / GammaEnergy;          << 
277   }                                            << 
278                                                << 
279   return cs;                                      271   return cs;
280 }                                                 272 }
281                                                   273 
282 //....oooOO0OOooo........oooOO0OOooo........oo    274 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
283                                                   275 
284 void G4LivermoreComptonModel::SampleSecondarie << 276 
285                                                << 277 void G4LivermoreComptonModel::SampleSecondaries(
286                                                << 278                              std::vector<G4DynamicParticle*>* fvect,
287                                                << 279            const G4MaterialCutsCouple* couple,
                                                   >> 280            const G4DynamicParticle* aDynamicGamma,
                                                   >> 281            G4double, G4double)
288 {                                                 282 {
289   // The scattered gamma energy is sampled acc << 283 
290   // formula then accepted or rejected dependi << 284   // The scattered gamma energy is sampled according to Klein - Nishina 
                                                   >> 285   // formula then accepted or rejected depending on the Scattering Function 
291   // multiplied by factor from Klein - Nishina    286   // multiplied by factor from Klein - Nishina formula.
292   // Expression of the angular distribution as    287   // Expression of the angular distribution as Klein Nishina
293   // angular and energy distribution and Scatt    288   // angular and energy distribution and Scattering fuctions is taken from
294   // D. E. Cullen "A simple model of photon tr    289   // D. E. Cullen "A simple model of photon transport" Nucl. Instr. Meth.
295   // Phys. Res. B 101 (1995). Method of sampli    290   // Phys. Res. B 101 (1995). Method of sampling with form factors is different
296   // data are interpolated while in the articl    291   // data are interpolated while in the article they are fitted.
297   // Reference to the article is from J. Stepa    292   // Reference to the article is from J. Stepanek New Photon, Positron
298   // and Electron Interaction Data for GEANT i    293   // and Electron Interaction Data for GEANT in Energy Range from 1 eV to 10
299   // TeV (draft).                                 294   // TeV (draft).
300   // The random number techniques of Butcher &    295   // The random number techniques of Butcher & Messel are used
301   // (Nucl Phys 20(1960),15).                     296   // (Nucl Phys 20(1960),15).
302                                                   297 
303   G4double photonEnergy0 = aDynamicGamma->GetK    298   G4double photonEnergy0 = aDynamicGamma->GetKineticEnergy();
304                                                   299 
305   if (verboseLevel > 3) {                         300   if (verboseLevel > 3) {
306     G4cout << "G4LivermoreComptonModel::Sample << 301     G4cout << "G4LivermoreComptonModel::SampleSecondaries() E(MeV)= " 
307            << " in " << couple->GetMaterial()- << 302      << photonEnergy0/MeV << " in " << couple->GetMaterial()->GetName() 
                                                   >> 303      << G4endl;
308   }                                               304   }
309                                                   305 
310   // do nothing below the threshold            << 306   // low-energy gamma is absorpted by this process
311   // should never get here because the XS is z << 307   if (photonEnergy0 <= lowestEnergy) 
312   if (photonEnergy0 < LowEnergyLimit()) return << 308     {
                                                   >> 309       fParticleChange->ProposeTrackStatus(fStopAndKill);
                                                   >> 310       fParticleChange->SetProposedKineticEnergy(0.);
                                                   >> 311       fParticleChange->ProposeLocalEnergyDeposit(photonEnergy0);
                                                   >> 312       return ;
                                                   >> 313     }
313                                                   314 
314   G4double e0m = photonEnergy0 / electron_mass << 315   G4double e0m = photonEnergy0 / electron_mass_c2 ;
315   G4ParticleMomentum photonDirection0 = aDynam    316   G4ParticleMomentum photonDirection0 = aDynamicGamma->GetMomentumDirection();
316                                                   317 
317   // Select randomly one element in the curren    318   // Select randomly one element in the current material
318   const G4ParticleDefinition* particle = aDyna << 319   const G4ParticleDefinition* particle =  aDynamicGamma->GetDefinition();
319   const G4Element* elm = SelectRandomAtom(coup << 320   const G4Element* elm = SelectRandomAtom(couple,particle,photonEnergy0);
320                                                   321 
321   G4int Z = elm->GetZasInt();                  << 322   G4int Z = G4lrint(elm->GetZ());
322                                                   323 
323   G4double epsilon0Local = 1. / (1. + 2. * e0m    324   G4double epsilon0Local = 1. / (1. + 2. * e0m);
324   G4double epsilon0Sq = epsilon0Local * epsilo    325   G4double epsilon0Sq = epsilon0Local * epsilon0Local;
325   G4double alpha1 = -G4Log(epsilon0Local);        326   G4double alpha1 = -G4Log(epsilon0Local);
326   G4double alpha2 = 0.5 * (1. - epsilon0Sq);      327   G4double alpha2 = 0.5 * (1. - epsilon0Sq);
327                                                   328 
328   G4double wlPhoton = h_Planck * c_light / pho << 329   G4double wlPhoton = h_Planck*c_light/photonEnergy0;
329                                                   330 
330   // Sample the energy of the scattered photon    331   // Sample the energy of the scattered photon
331   G4double epsilon;                               332   G4double epsilon;
332   G4double epsilonSq;                             333   G4double epsilonSq;
333   G4double oneCosT;                               334   G4double oneCosT;
334   G4double sinT2;                                 335   G4double sinT2;
335   G4double gReject;                               336   G4double gReject;
336                                                   337 
337   if (verboseLevel > 3) {                         338   if (verboseLevel > 3) {
338     G4cout << "Started loop to sample gamma en    339     G4cout << "Started loop to sample gamma energy" << G4endl;
339   }                                               340   }
340                                                << 341   
341   do {                                            342   do {
342     if (alpha1 / (alpha1 + alpha2) > G4Uniform << 343     if ( alpha1/(alpha1+alpha2) > G4UniformRand())
343       epsilon = G4Exp(-alpha1 * G4UniformRand( << 344       {
344       epsilonSq = epsilon * epsilon;           << 345         epsilon = G4Exp(-alpha1 * G4UniformRand());  
345     }                                          << 346         epsilonSq = epsilon * epsilon;
346     else {                                     << 347       }
347       epsilonSq = epsilon0Sq + (1. - epsilon0S << 348       else
348       epsilon = std::sqrt(epsilonSq);          << 349       {
349     }                                          << 350         epsilonSq = epsilon0Sq + (1. - epsilon0Sq) * G4UniformRand();
                                                   >> 351         epsilon = std::sqrt(epsilonSq);
                                                   >> 352       }
350                                                   353 
351     oneCosT = (1. - epsilon) / (epsilon * e0m) << 354       oneCosT = (1. - epsilon) / ( epsilon * e0m);
352     sinT2 = oneCosT * (2. - oneCosT);          << 355       sinT2 = oneCosT * (2. - oneCosT);
353     G4double x = std::sqrt(oneCosT / 2.) * cm  << 356       G4double x = std::sqrt(oneCosT/2.) * cm / wlPhoton;
354     G4double scatteringFunction = ComputeScatt << 357       G4double scatteringFunction = ComputeScatteringFunction(x, Z);
355     gReject = (1. - epsilon * sinT2 / (1. + ep << 358       gReject = (1. - epsilon * sinT2 / (1. + epsilonSq)) * scatteringFunction;
356                                                   359 
357   } while (gReject < G4UniformRand() * Z);     << 360   } while(gReject < G4UniformRand()*Z);
358                                                   361 
359   G4double cosTheta = 1. - oneCosT;               362   G4double cosTheta = 1. - oneCosT;
360   G4double sinTheta = std::sqrt(sinT2);        << 363   G4double sinTheta = std::sqrt (sinT2);
361   G4double phi = twopi * G4UniformRand();      << 364   G4double phi = twopi * G4UniformRand() ;
362   G4double dirx = sinTheta * std::cos(phi);       365   G4double dirx = sinTheta * std::cos(phi);
363   G4double diry = sinTheta * std::sin(phi);       366   G4double diry = sinTheta * std::sin(phi);
364   G4double dirz = cosTheta;                    << 367   G4double dirz = cosTheta ;
365                                                   368 
366   // Doppler broadening -  Method based on:       369   // Doppler broadening -  Method based on:
367   // Y. Namito, S. Ban and H. Hirayama,        << 370   // Y. Namito, S. Ban and H. Hirayama, 
368   // "Implementation of the Doppler Broadening << 371   // "Implementation of the Doppler Broadening of a Compton-Scattered Photon 
369   // into the EGS4 Code", NIM A 349, pp. 489-4    372   // into the EGS4 Code", NIM A 349, pp. 489-494, 1994
370                                                << 373   
371   // Maximum number of sampling iterations        374   // Maximum number of sampling iterations
372   static G4int maxDopplerIterations = 1000;       375   static G4int maxDopplerIterations = 1000;
373   G4double bindingE = 0.;                         376   G4double bindingE = 0.;
374   G4double photonEoriginal = epsilon * photonE    377   G4double photonEoriginal = epsilon * photonEnergy0;
375   G4double photonE = -1.;                         378   G4double photonE = -1.;
376   G4int iteration = 0;                            379   G4int iteration = 0;
377   G4double eMax = photonEnergy0;                  380   G4double eMax = photonEnergy0;
378                                                   381 
379   G4int shellIdx = 0;                             382   G4int shellIdx = 0;
380                                                   383 
381   if (verboseLevel > 3) {                         384   if (verboseLevel > 3) {
382     G4cout << "Started loop to sample broading    385     G4cout << "Started loop to sample broading" << G4endl;
383   }                                               386   }
384                                                   387 
385   do {                                         << 388   do
386     ++iteration;                               << 389     {
387     // Select shell based on shell occupancy   << 390       ++iteration;
388     shellIdx = shellData->SelectRandomShell(Z) << 391       // Select shell based on shell occupancy
389     bindingE = shellData->BindingEnergy(Z, she << 392       shellIdx = shellData->SelectRandomShell(Z);
390                                                << 393       bindingE = shellData->BindingEnergy(Z,shellIdx);
391     if (verboseLevel > 3) {                    << 394 
392       G4cout << "Shell ID= " << shellIdx << "  << 395       if (verboseLevel > 3) {
393     }                                          << 396   G4cout << "Shell ID= " << shellIdx 
394                                                << 397          << " Ebind(keV)= " << bindingE/keV << G4endl;
395     eMax = photonEnergy0 - bindingE;           << 
396                                                << 
397     // Randomly sample bound electron momentum << 
398     // (memento: the data set is in Atomic Uni << 
399     G4double pSample = profileData->RandomSele << 
400     if (verboseLevel > 3) {                    << 
401       G4cout << "pSample= " << pSample << G4en << 
402     }                                          << 
403     // Rescale from atomic units               << 
404     G4double pDoppler = pSample * fine_structu << 
405     G4double pDoppler2 = pDoppler * pDoppler;  << 
406     G4double var2 = 1. + oneCosT * e0m;        << 
407     G4double var3 = var2 * var2 - pDoppler2;   << 
408     G4double var4 = var2 - pDoppler2 * cosThet << 
409     G4double var = var4 * var4 - var3 + pDoppl << 
410     if (var > 0.) {                            << 
411       G4double varSqrt = std::sqrt(var);       << 
412       G4double scale = photonEnergy0 / var3;   << 
413       // Random select either root             << 
414       if (G4UniformRand() < 0.5) {             << 
415         photonE = (var4 - varSqrt) * scale;    << 
416       }                                           398       }
417       else {                                   << 399       
418         photonE = (var4 + varSqrt) * scale;    << 400       eMax = photonEnergy0 - bindingE;
                                                   >> 401      
                                                   >> 402       // Randomly sample bound electron momentum 
                                                   >> 403       // (memento: the data set is in Atomic Units)
                                                   >> 404       G4double pSample = profileData->RandomSelectMomentum(Z,shellIdx);
                                                   >> 405       if (verboseLevel > 3) {
                                                   >> 406   G4cout << "pSample= " << pSample << G4endl;
419       }                                           407       }
420     }                                          << 408       // Rescale from atomic units
421     else {                                     << 409       G4double pDoppler = pSample * fine_structure_const;
422       photonE = -1.;                           << 410       G4double pDoppler2 = pDoppler * pDoppler;
423     }                                          << 411       G4double var2 = 1. + oneCosT * e0m;
424   } while (iteration <= maxDopplerIterations & << 412       G4double var3 = var2*var2 - pDoppler2;
425                                                << 413       G4double var4 = var2 - pDoppler2 * cosTheta;
                                                   >> 414       G4double var = var4*var4 - var3 + pDoppler2 * var3;
                                                   >> 415       if (var > 0.)
                                                   >> 416   {
                                                   >> 417     G4double varSqrt = std::sqrt(var);        
                                                   >> 418     G4double scale = photonEnergy0 / var3;  
                                                   >> 419           // Random select either root
                                                   >> 420     if (G4UniformRand() < 0.5) { photonE = (var4 - varSqrt) * scale; }
                                                   >> 421     else                       { photonE = (var4 + varSqrt) * scale; }
                                                   >> 422   } 
                                                   >> 423       else
                                                   >> 424   {
                                                   >> 425     photonE = -1.;
                                                   >> 426   }
                                                   >> 427    } while (iteration <= maxDopplerIterations && photonE > eMax); 
                                                   >> 428   // (photonE < 0. || photonE > eMax || photonE < eMax*G4UniformRand()) );
                                                   >> 429       
                                                   >> 430  
426   // End of recalculation of photon energy wit    431   // End of recalculation of photon energy with Doppler broadening
427   // Revert to original if maximum number of i << 432   // Revert to original if maximum number of iterations threshold 
428   // has been reached                             433   // has been reached
429   if (iteration >= maxDopplerIterations) {     << 434 
430     photonE = photonEoriginal;                 << 435   if (iteration >= maxDopplerIterations)
431     bindingE = 0.;                             << 436     {
432   }                                            << 437       photonE = photonEoriginal;
                                                   >> 438       bindingE = 0.;
                                                   >> 439     }
433                                                   440 
434   // Update G4VParticleChange for the scattere    441   // Update G4VParticleChange for the scattered photon
435   G4ThreeVector photonDirection1(dirx, diry, d << 442 
                                                   >> 443   G4ThreeVector photonDirection1(dirx,diry,dirz);
436   photonDirection1.rotateUz(photonDirection0);    444   photonDirection1.rotateUz(photonDirection0);
437   fParticleChange->ProposeMomentumDirection(ph << 445   fParticleChange->ProposeMomentumDirection(photonDirection1) ;
438                                                   446 
439   G4double photonEnergy1 = photonE;               447   G4double photonEnergy1 = photonE;
440                                                   448 
441   if (photonEnergy1 > 0.) {                       449   if (photonEnergy1 > 0.) {
442     fParticleChange->SetProposedKineticEnergy( << 450     fParticleChange->SetProposedKineticEnergy(photonEnergy1) ;
443   }                                            << 451 
444   else {                                       << 452   } else {
445     // photon absorbed                            453     // photon absorbed
446     photonEnergy1 = 0.;                           454     photonEnergy1 = 0.;
447     fParticleChange->SetProposedKineticEnergy( << 455     fParticleChange->SetProposedKineticEnergy(0.) ;
448     fParticleChange->ProposeTrackStatus(fStopA << 456     fParticleChange->ProposeTrackStatus(fStopAndKill);   
449     fParticleChange->ProposeLocalEnergyDeposit    457     fParticleChange->ProposeLocalEnergyDeposit(photonEnergy0);
450     return;                                       458     return;
451   }                                               459   }
452                                                   460 
453   // Kinematics of the scattered electron         461   // Kinematics of the scattered electron
454   G4double eKineticEnergy = photonEnergy0 - ph    462   G4double eKineticEnergy = photonEnergy0 - photonEnergy1 - bindingE;
455                                                   463 
456   // protection against negative final energy:    464   // protection against negative final energy: no e- is created
457   if (eKineticEnergy < 0.0) {                  << 465   if(eKineticEnergy < 0.0) {
458     fParticleChange->ProposeLocalEnergyDeposit    466     fParticleChange->ProposeLocalEnergyDeposit(photonEnergy0 - photonEnergy1);
459     return;                                       467     return;
460   }                                               468   }
461                                                   469 
462   G4double eTotalEnergy = eKineticEnergy + ele    470   G4double eTotalEnergy = eKineticEnergy + electron_mass_c2;
463                                                   471 
464   G4double electronE = photonEnergy0 * (1. - e << 472   G4double electronE = photonEnergy0 * (1. - epsilon) + electron_mass_c2; 
465   G4double electronP2 = electronE * electronE  << 473   G4double electronP2 = 
                                                   >> 474     electronE*electronE - electron_mass_c2*electron_mass_c2;
466   G4double sinThetaE = -1.;                       475   G4double sinThetaE = -1.;
467   G4double cosThetaE = 0.;                        476   G4double cosThetaE = 0.;
468   if (electronP2 > 0.) {                       << 477   if (electronP2 > 0.)
469     cosThetaE = (eTotalEnergy + photonEnergy1) << 478     {
470     sinThetaE = -1. * sqrt(1. - cosThetaE * co << 479       cosThetaE = (eTotalEnergy + photonEnergy1 )* 
471   }                                            << 480   (1. - epsilon) / std::sqrt(electronP2);
472                                                << 481       sinThetaE = -1. * sqrt(1. - cosThetaE * cosThetaE); 
                                                   >> 482     }
                                                   >> 483   
473   G4double eDirX = sinThetaE * std::cos(phi);     484   G4double eDirX = sinThetaE * std::cos(phi);
474   G4double eDirY = sinThetaE * std::sin(phi);     485   G4double eDirY = sinThetaE * std::sin(phi);
475   G4double eDirZ = cosThetaE;                     486   G4double eDirZ = cosThetaE;
476                                                   487 
477   G4ThreeVector eDirection(eDirX, eDirY, eDirZ << 488   G4ThreeVector eDirection(eDirX,eDirY,eDirZ);
478   eDirection.rotateUz(photonDirection0);          489   eDirection.rotateUz(photonDirection0);
479   auto dp = new G4DynamicParticle(G4Electron:: << 490   G4DynamicParticle* dp = new G4DynamicParticle (G4Electron::Electron(),
                                                   >> 491              eDirection,eKineticEnergy) ;
480   fvect->push_back(dp);                           492   fvect->push_back(dp);
481                                                   493 
482   // sample deexcitation                          494   // sample deexcitation
                                                   >> 495   //
                                                   >> 496 
483   if (verboseLevel > 3) {                         497   if (verboseLevel > 3) {
484     G4cout << "Started atomic de-excitation "     498     G4cout << "Started atomic de-excitation " << fAtomDeexcitation << G4endl;
485   }                                               499   }
486                                                   500 
487   if (nullptr != fAtomDeexcitation && iteratio << 501   if(fAtomDeexcitation && iteration < maxDopplerIterations) {
488     G4int index = couple->GetIndex();             502     G4int index = couple->GetIndex();
489     if (fAtomDeexcitation->CheckDeexcitationAc << 503     if(fAtomDeexcitation->CheckDeexcitationActiveRegion(index)) {
490       size_t nbefore = fvect->size();             504       size_t nbefore = fvect->size();
491       auto as = G4AtomicShellEnumerator(shellI << 505       G4AtomicShellEnumerator as = G4AtomicShellEnumerator(shellIdx);
492       const G4AtomicShell* shell = fAtomDeexci    506       const G4AtomicShell* shell = fAtomDeexcitation->GetAtomicShell(Z, as);
493       fAtomDeexcitation->GenerateParticles(fve    507       fAtomDeexcitation->GenerateParticles(fvect, shell, Z, index);
494       size_t nafter = fvect->size();              508       size_t nafter = fvect->size();
495       if (nafter > nbefore) {                  << 509       if(nafter > nbefore) {
496         for (size_t i = nbefore; i < nafter; + << 510   for (size_t i=nbefore; i<nafter; ++i) {
497           // Check if there is enough residual << 511           //Check if there is enough residual energy 
498           if (bindingE >= ((*fvect)[i])->GetKi << 512           if (bindingE >= ((*fvect)[i])->GetKineticEnergy())
499             // Ok, this is a valid secondary:  << 513            {
500             bindingE -= ((*fvect)[i])->GetKine << 514              //Ok, this is a valid secondary: keep it
501           }                                    << 515        bindingE -= ((*fvect)[i])->GetKineticEnergy();
502           else {                               << 516            }
503             // Invalid secondary: not enough e << 517           else
504             // Keep its energy in the local de << 518            {
505             delete (*fvect)[i];                << 519        //Invalid secondary: not enough energy to create it!
506             (*fvect)[i] = nullptr;             << 520        //Keep its energy in the local deposit
507           }                                    << 521              delete (*fvect)[i]; 
508         }                                      << 522              (*fvect)[i]=0;
                                                   >> 523            }
                                                   >> 524   } 
509       }                                           525       }
510     }                                             526     }
511   }                                               527   }
512   bindingE = std::max(bindingE, 0.0);          << 528 
                                                   >> 529   //This should never happen
                                                   >> 530   if(bindingE < 0.0) 
                                                   >> 531     G4Exception("G4LowEPComptonModel::SampleSecondaries()",
                                                   >> 532     "em2051",FatalException,"Negative local energy deposit");
                                                   >> 533  
513   fParticleChange->ProposeLocalEnergyDeposit(b    534   fParticleChange->ProposeLocalEnergyDeposit(bindingE);
                                                   >> 535 
514 }                                                 536 }
515                                                   537 
516 //....oooOO0OOooo........oooOO0OOooo........oo    538 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
517                                                   539 
518 G4double G4LivermoreComptonModel::ComputeScatt << 540 G4double 
                                                   >> 541 G4LivermoreComptonModel::ComputeScatteringFunction(G4double x, G4int Z)
519 {                                                 542 {
520   G4double value = Z;                             543   G4double value = Z;
521   if (x <= ScatFuncFitParam[Z][3]) {           << 544   if (x <= ScatFuncFitParam[Z][2]) { 
522     G4double lgq = G4Log(x) / ln10;            << 
523                                                   545 
524     if (lgq < ScatFuncFitParam[Z][1]) {        << 546     G4double lgq = G4Log(x)/ln10; 
525       value = ScatFuncFitParam[Z][4] + lgq * S << 547       
526     }                                          << 548     if (lgq < ScatFuncFitParam[Z][1]) { 
527     else if (lgq >= ScatFuncFitParam[Z][1] &&  << 549       value = ScatFuncFitParam[Z][3] + lgq*ScatFuncFitParam[Z][4];
528       value = ScatFuncFitParam[Z][6]           << 550     } else {
529               + lgq                            << 551       value = ScatFuncFitParam[Z][5] + lgq*ScatFuncFitParam[Z][6] + 
530                   * (ScatFuncFitParam[Z][7]    << 552   lgq*lgq*ScatFuncFitParam[Z][7] + lgq*lgq*lgq*ScatFuncFitParam[Z][8];
531                      + lgq                     << 
532                          * (ScatFuncFitParam[Z << 
533                             + lgq * (ScatFuncF << 
534     }                                             553     }
535     else {                                     << 554     value = G4Exp(value*ln10);
536       value = ScatFuncFitParam[Z][11]          << 
537               + lgq                            << 
538                   * (ScatFuncFitParam[Z][12]   << 
539                      + lgq                     << 
540                          * (ScatFuncFitParam[Z << 
541                             + lgq * (ScatFuncF << 
542     }                                          << 
543     value = G4Exp(value * ln10);               << 
544   }                                               555   }
545   // G4cout << "    value= " << value << G4end << 556   //G4cout << "    value= " << value << G4endl;
546   return value;                                   557   return value;
547 }                                                 558 }
548                                                   559 
549 //....oooOO0OOooo........oooOO0OOooo........oo    560 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 561 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 562 
                                                   >> 563 #include "G4AutoLock.hh"
                                                   >> 564 namespace { G4Mutex LivermoreComptonModelMutex = G4MUTEX_INITIALIZER; }
550                                                   565 
551 void G4LivermoreComptonModel::InitialiseForEle << 566 void 
                                                   >> 567 G4LivermoreComptonModel::InitialiseForElement(const G4ParticleDefinition*, 
                                                   >> 568                 G4int Z)
552 {                                                 569 {
553   G4AutoLock l(&LivermoreComptonModelMutex);      570   G4AutoLock l(&LivermoreComptonModelMutex);
554   if (data[Z] == nullptr) {                    << 571   //  G4cout << "G4LivermoreComptonModel::InitialiseForElement Z= " 
555     ReadData(Z);                               << 572   //   << Z << G4endl;
556   }                                            << 573   if(!data[Z]) { ReadData(Z); }
557   l.unlock();                                     574   l.unlock();
558 }                                                 575 }
559                                                   576 
560 //....oooOO0OOooo........oooOO0OOooo........oo    577 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
561                                                   578 
562 // Fitting data to compute scattering function << 579 //Fitting data to compute scattering function 
563 const G4double G4LivermoreComptonModel::ScatFu << 580 const G4double G4LivermoreComptonModel::ScatFuncFitParam[101][9] = {
564   {0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  << 581 {  0,    0.,          0.,      0.,    0.,       0.,     0.,     0.,    0.},
565   {1, 6.000000000e+00, 7.087999300e+00, 1.4996 << 582 {  1, 6.673, 1.49968E+08, -14.352, 1.999, -143.374, 50.787, -5.951, 0.2304418},
566    -3.925518125e+02, 2.434944521e+02, -5.78439 << 583 {  2, 6.500, 2.50035E+08, -14.215, 1.970, -53.649, 13.892, -0.948, 0.006996759},
567    -1.649463594e+03, 8.121933215e+02, -1.49831 << 584 {  3, 6.551, 3.99945E+08, -13.555, 1.993, -62.090, 21.462, -2.453, 0.093416},
568   {2, 6.000000000e+00, 7.199000403e+00, 2.5003 << 585 {  4, 6.500, 5.00035E+08, -13.746, 1.998, -127.906, 46.491, -5.614, 0.2262103},
569    3.574019365e+02, -1.978574937e+02, 3.971327 << 586 {  5, 6.500, 5.99791E+08, -13.800, 1.998, -131.153, 47.132, -5.619, 0.2233819},
570    -4.009960832e+02, 1.575831469e+02, -2.17476 << 587 {  6, 6.708, 6.99842E+08, -13.885, 1.999, -128.143, 45.379, -5.325, 0.2083009},
571   {3, 6.000000000e+00, 7.301000136e+00, 3.9994 << 588 {  7, 6.685, 7.99834E+08, -13.885, 2.000, -131.048, 46.314, -5.421, 0.2114925},
572    7.051635443e+02, -4.223841786e+02, 9.318729 << 589 {  8, 6.669, 7.99834E+08, -13.962, 2.001, -128.225, 44.818, -5.183, 0.1997155},
573    1.524679907e+03, -7.851479582e+02, 1.509941 << 590 {  9, 6.711, 7.99834E+08, -13.999, 2.000, -122.112, 42.103, -4.796, 0.1819099},
574   {4, 6.000000000e+00, 7.349500202e+00, 5.0003 << 591 { 10, 6.702, 7.99834E+08, -14.044, 1.999, -110.143, 37.225, -4.143, 0.1532094},
575    -1.832909604e+02, 1.193997722e+02, -3.03432 << 592 { 11, 6.425, 1.00000E+09, -13.423, 1.993, -41.137, 12.313, -1.152, 0.03384553},
576    1.397476657e+03, -7.026416933e+02, 1.320720 << 593 { 12, 6.542, 1.00000E+09, -13.389, 1.997, -53.549, 17.420, -1.840, 0.06431849},
577   {5, 6.000000000e+00, 7.388999972e+00, 5.9979 << 594 { 13, 6.570, 1.49968E+09, -13.401, 1.997, -66.243, 22.297, -2.460, 0.09045854},
578    -2.334197545e+02, 1.467013466e+02, -3.57485 << 595 { 14, 6.364, 1.49968E+09, -13.452, 1.999, -78.271, 26.757, -3.008, 0.1128195},
579    6.784713308e+02, -3.419562074e+02, 6.433945 << 596 { 15, 6.500, 1.49968E+09, -13.488, 1.998, -85.069, 29.164, -3.291, 0.1239113},
580   {6, 6.000000000e+00, 7.422500001e+00, 6.9984 << 597 { 16, 6.500, 1.49968E+09, -13.532, 1.998, -93.640, 32.274, -3.665, 0.1388633},
581    -2.460254935e+02, 1.516613633e+02, -3.62202 << 598 { 17, 6.500, 1.49968E+09, -13.584, 2.000, -98.534, 33.958, -3.857, 0.1461557},
582    -1.610185428e+02, 7.010907070e+01, -1.14237 << 599 { 18, 6.500, 1.49968E+09, -13.618, 1.999, -100.077, 34.379, -3.891, 0.1468902},
583   {7, 6.000000000e+00, 7.451499931e+00, 7.9983 << 600 { 19, 6.500, 1.99986E+09, -13.185, 1.992, -53.819, 17.528, -1.851, 0.0648722},
584    -3.054540719e+02, 1.877740247e+02, -4.44027 << 601 { 20, 6.490, 1.99986E+09, -13.123, 1.993, -52.221, 17.169, -1.832, 0.06502094},
585    -2.263864349e+02, 1.017885461e+02, -1.71698 << 602 { 21, 6.498, 1.99986E+09, -13.157, 1.994, -55.365, 18.276, -1.961, 0.07002778},
586   {8, 6.000000000e+00, 7.451499931e+00, 7.9983 << 603 { 22, 6.495, 1.99986E+09, -13.183, 1.994, -57.412, 18.957, -2.036, 0.07278856},
587    -3.877174895e+02, 2.345831969e+02, -5.43182 << 604 { 23, 6.487, 1.99986E+09, -13.216, 1.995, -58.478, 19.270, -2.065, 0.07362722},
588    -7.949384302e+02, 3.757293602e+02, -6.66174 << 605 { 24, 6.500, 1.99986E+09, -13.330, 1.997, -62.192, 20.358, -2.167, 0.07666583},
589   {9, 6.000000000e+00, 7.451499931e+00, 7.9983 << 606 { 25, 6.488, 1.99986E+09, -13.277, 1.997, -58.007, 18.924, -2.003, 0.0704305},
590    -2.939854827e+02, 1.784214589e+02, -4.16847 << 607 { 26, 6.500, 5.00035E+09, -13.292, 1.997, -61.176, 20.067, -2.141, 0.0760269},
591    -1.169326170e+03, 5.545642014e+02, -9.86302 << 608 { 27, 6.500, 5.00035E+09, -13.321, 1.998, -61.909, 20.271, -2.159, 0.07653559},
592   {10, 6.000000000e+00, 7.451499931e+00, 7.998 << 609 { 28, 6.500, 5.00035E+09, -13.340, 1.998, -62.402, 20.391, -2.167, 0.07664243},
593    -2.615701853e+02, 1.582596311e+02, -3.69811 << 610 { 29, 6.500, 5.00035E+09, -13.439, 1.998, -67.305, 21.954, -2.331, 0.0823267},
594    -1.275287356e+03, 6.022076554e+02, -1.06641 << 611 { 30, 6.500, 5.00035E+09, -13.383, 1.999, -62.064, 20.136, -2.122, 0.07437589},
595   {11, 6.000000000e+00, 7.500000000e+00, 1.000 << 612 { 31, 6.500, 5.00035E+09, -13.349, 1.997, -61.068, 19.808, -2.086, 0.07307488},
596    1.112662501e+03, -6.807056448e+02, 1.545837 << 613 { 32, 6.500, 5.00035E+09, -13.373, 1.999, -63.126, 20.553, -2.175, 0.07660222},
597    -1.007702307e+03, 4.699937040e+02, -8.22035 << 614 { 33, 6.500, 5.00035E+09, -13.395, 1.999, -65.674, 21.445, -2.278, 0.08054694},
598   {12, 6.000000000e+00, 7.500000000e+00, 1.000 << 615 { 34, 6.500, 5.00035E+09, -13.417, 1.999, -69.457, 22.811, -2.442, 0.08709536},
599    9.895649717e+02, -5.983228286e+02, 1.340681 << 616 { 35, 6.500, 5.00035E+09, -13.442, 2.000, -72.283, 23.808, -2.558, 0.09156808},
600    -5.790532602e+02, 2.626052403e+02, -4.46354 << 617 { 36, 6.500, 5.00035E+09, -13.451, 1.998, -74.696, 24.641, -2.653, 0.09516597},
601   {13, 6.000000000e+00, 7.587999300e+00, 1.499 << 618 { 37, 6.500, 5.00035E+09, -13.082, 1.991, -46.235, 14.519, -1.458, 0.04837659},
602    7.335256091e+02, -4.405291562e+02, 9.770954 << 619 { 38, 6.465, 5.00035E+09, -13.022, 1.993, -41.784, 13.065, -1.300, 0.04267703},
603    -5.328832253e+02, 2.398514938e+02, -4.04455 << 620 { 39, 6.492, 5.00035E+09, -13.043, 1.994, -44.609, 14.114, -1.429, 0.0479348},
604   {14, 6.000000000e+00, 7.587999300e+00, 1.499 << 621 { 40, 6.499, 5.00035E+09, -13.064, 1.994, -47.142, 15.019, -1.536, 0.0521347},
605    3.978691889e+02, -2.370975001e+02, 5.158692 << 622 { 41, 6.384, 5.00035E+09, -13.156, 1.996, -53.114, 17.052, -1.766, 0.06079426},
606    -2.340256277e+02, 9.813362251e+01, -1.52789 << 623 { 42, 6.500, 5.00035E+09, -13.176, 1.996, -54.590, 17.550, -1.822, 0.06290335},
607   {15, 6.000000000e+00, 7.587999300e+00, 1.499 << 624 { 43, 6.500, 5.00035E+09, -13.133, 1.997, -51.272, 16.423, -1.694, 0.05806108},
608    2.569833671e+02, -1.513623448e+02, 3.210087 << 625 { 44, 6.500, 5.00035E+09, -13.220, 1.996, -58.314, 18.839, -1.969, 0.0684608},
609    -1.345727293e+01, -6.291081167e+00, 3.23596 << 626 { 45, 6.500, 5.00035E+09, -13.246, 1.998, -59.674, 19.295, -2.020, 0.07037294},
610   {16, 6.000000000e+00, 7.587999300e+00, 1.499 << 627 { 46, 6.500, 5.00035E+09, -13.407, 1.999, -72.228, 23.693, -2.532, 0.09017969},
611    1.015293074e+02, -5.721639224e+01, 1.078607 << 628 { 47, 6.500, 5.00035E+09, -13.277, 1.998, -60.890, 19.647, -2.053, 0.07138694},
612    1.854818165e+02, -1.000803879e+02, 1.979815 << 629 { 48, 6.500, 5.00035E+09, -13.222, 1.998, -56.152, 18.002, -1.863, 0.06410123},
613   {17, 6.000000000e+00, 7.587999300e+00, 1.499 << 630 { 49, 6.500, 5.00035E+09, -13.199, 1.997, -56.208, 18.052, -1.872, 0.06456884},
614    -4.294163461e+01, 2.862162412e+01, -8.28597 << 631 { 50, 6.500, 5.00035E+09, -13.215, 1.998, -58.478, 18.887, -1.973, 0.06860356},
615    1.676674074e+02, -8.976414784e+01, 1.763329 << 632 { 51, 6.500, 5.00035E+09, -13.230, 1.998, -60.708, 19.676, -2.066, 0.07225841},
616   {18, 6.000000000e+00, 7.587999300e+00, 1.499 << 633 { 52, 6.500, 7.99834E+09, -13.246, 1.998, -63.341, 20.632, -2.180, 0.0767412},
617    -3.573422746e+01, 2.403066369e+01, -7.17361 << 634 { 53, 6.500, 5.00035E+09, -13.262, 1.998, -66.339, 21.716, -2.310, 0.08191981},
618    1.811925229e+02, -9.574636323e+01, 1.861940 << 635 { 54, 6.500, 7.99834E+09, -13.279, 1.998, -67.649, 22.151, -2.357, 0.08357825},
619   {19, 6.000000000e+00, 7.650499797e+00, 1.999 << 636 { 55, 6.500, 5.00035E+09, -12.951, 1.990, -45.302, 14.219, -1.423, 0.04712317},
620    1.263152069e+02, -8.738932892e+01, 2.109042 << 637 { 56, 6.425, 5.00035E+09, -12.882, 1.992, -39.825, 12.363, -1.214, 0.03931009},
621    9.183312428e+01, -5.232836676e+01, 1.072450 << 638 { 57, 6.466, 2.82488E+09, -12.903, 1.992, -38.952, 11.982, -1.160, 0.03681554},
622   {20, 6.000000000e+00, 7.650499797e+00, 1.999 << 639 { 58, 6.451, 5.00035E+09, -12.915, 1.993, -41.959, 13.118, -1.302, 0.04271291},
623    6.620218058e+02, -4.057504297e+02, 9.180787 << 640 { 59, 6.434, 5.00035E+09, -12.914, 1.993, -40.528, 12.555, -1.230, 0.03971407},
624    7.034138711e+01, -4.198325416e+01, 8.861351 << 641 { 60, 6.444, 5.00035E+09, -12.922, 1.992, -39.986, 12.329, -1.200, 0.03843737},
625   {21, 6.000000000e+00, 7.650499797e+00, 1.999 << 642 { 61, 6.414, 7.99834E+09, -12.930, 1.993, -42.756, 13.362, -1.327, 0.0436124},
626    6.766093786e+02, -4.129087029e+02, 9.305090 << 643 { 62, 6.420, 7.99834E+09, -12.938, 1.992, -42.682, 13.314, -1.319, 0.04322509},
627    1.916559096e+01, -1.807294109e+01, 4.677205 << 644 { 63, 6.416, 7.99834E+09, -12.946, 1.993, -42.399, 13.185, -1.301, 0.04243861},
628   {22, 6.000000000e+00, 7.650499797e+00, 1.999 << 645 { 64, 6.443, 7.99834E+09, -12.963, 1.993, -43.226, 13.475, -1.335, 0.04377341},
629    6.969823082e+02, -4.236620289e+02, 9.513714 << 646 { 65, 6.449, 7.99834E+09, -12.973, 1.993, -43.232, 13.456, -1.330, 0.04347536},
630    -6.501317146e+01, 2.138553133e+01, -2.25099 << 647 { 66, 6.419, 7.99834E+09, -12.966, 1.993, -42.047, 12.990, -1.270, 0.04095499},
631   {23, 6.000000000e+00, 7.650499797e+00, 1.999 << 648 { 67, 6.406, 7.99834E+09, -12.976, 1.993, -42.405, 13.106, -1.283, 0.04146024},
632    6.889749928e+02, -4.181421624e+02, 9.373529 << 649 { 68, 6.424, 7.99834E+09, -12.986, 1.993, -41.974, 12.926, -1.259, 0.040435},
633    -1.382770534e+02, 5.540647456e+01, -8.17001 << 650 { 69, 6.417, 7.99834E+09, -12.989, 1.993, -42.132, 12.967, -1.262, 0.04048908},
634   {24, 6.000000000e+00, 7.650499797e+00, 1.999 << 651 { 70, 6.405, 7.99834E+09, -13.000, 1.994, -42.582, 13.122, -1.280, 0.04119599},
635    4.365566411e+02, -2.672774427e+02, 6.001631 << 652 { 71, 6.449, 7.99834E+09, -13.015, 1.994, -42.586, 13.115, -1.278, 0.04107587},
636    -2.393534124e+02, 1.020845165e+02, -1.62474 << 653 { 72, 6.465, 7.99834E+09, -13.030, 1.994, -43.708, 13.509, -1.324, 0.04286491},
637   {25, 6.000000000e+00, 7.650499797e+00, 1.999 << 654 { 73, 6.447, 7.99834E+09, -13.048, 1.996, -44.838, 13.902, -1.369, 0.04457132},
638    6.461381990e+02, -3.918546518e+02, 8.769548 << 655 { 74, 6.452, 7.99834E+09, -13.073, 1.997, -45.545, 14.137, -1.395, 0.04553459},
639    -2.597409979e+02, 1.113332866e+02, -1.78212 << 656 { 75, 6.432, 7.99834E+09, -13.082, 1.997, -46.426, 14.431, -1.428, 0.04678218},
640   {26, 6.000000000e+00, 7.849500202e+00, 5.000 << 657 { 76, 6.439, 7.99834E+09, -13.100, 1.997, -47.513, 14.806, -1.471, 0.04842566},
641    4.261007401e+02, -2.588846763e+02, 5.764613 << 658 { 77, 6.432, 7.99834E+09, -13.110, 1.997, -48.225, 15.042, -1.497, 0.04938364},
642    -1.982896712e+02, 8.274273985e+01, -1.28407 << 659 { 78, 6.500, 7.99834E+09, -13.185, 1.997, -53.256, 16.739, -1.687, 0.05645173},
643   {27, 6.000000000e+00, 7.849500202e+00, 5.000 << 660 { 79, 6.500, 7.99834E+09, -13.200, 1.997, -53.900, 16.946, -1.709, 0.05723134},
644    4.006816638e+02, -2.439311564e+02, 5.435031 << 661 { 80, 6.500, 7.99834E+09, -13.156, 1.998, -49.801, 15.536, -1.547, 0.05103522},
645    -2.205075564e+02, 9.262919772e+01, -1.44890 << 662 { 81, 6.500, 7.99834E+09, -13.128, 1.997, -49.651, 15.512, -1.548, 0.05123203},
646   {28, 6.000000000e+00, 7.849500202e+00, 5.000 << 663 { 82, 6.500, 7.99834E+09, -13.134, 1.997, -51.021, 16.018, -1.609, 0.05364831},
647    3.967750019e+02, -2.411866801e+02, 5.364872 << 664 { 83, 6.500, 7.99834E+09, -13.148, 1.998, -52.693, 16.612, -1.679, 0.05638698},
648    -2.516823030e+02, 1.065117131e+02, -1.68053 << 665 { 84, 6.500, 7.99834E+09, -13.161, 1.998, -54.415, 17.238, -1.754, 0.05935566},
649   {29, 6.000000000e+00, 7.849500202e+00, 5.000 << 666 { 85, 6.500, 7.99834E+09, -13.175, 1.998, -56.083, 17.834, -1.824, 0.06206068},
650    2.437671888e+02, -1.499592208e+02, 3.332221 << 667 { 86, 6.500, 7.99834E+09, -13.189, 1.998, -57.860, 18.463, -1.898, 0.0649633},
651    -2.874130637e+02, 1.223381969e+02, -1.94317 << 668 { 87, 6.500, 7.99834E+09, -12.885, 1.990, -39.973, 12.164, -1.162, 0.0364598},
652   {30, 6.000000000e+00, 7.849500202e+00, 5.000 << 669 { 88, 6.417, 7.99834E+09, -12.816, 1.991, -34.591, 10.338, -0.956, 0.0287409},
653    3.914867984e+02, -2.378147085e+02, 5.284517 << 670 { 89, 6.442, 7.99834E+09, -12.831, 1.992, -36.002, 10.867, -1.021, 0.03136835},
654    -3.235063319e+02, 1.384252948e+02, -2.21184 << 671 { 90, 6.463, 7.99834E+09, -12.850, 1.993, -37.660, 11.475, -1.095, 0.03435334},
655   {31, 6.000000000e+00, 7.849500202e+00, 5.000 << 672 { 91, 6.447, 7.99834E+09, -12.852, 1.993, -37.268, 11.301, -1.071, 0.0330539},
656    4.325820127e+02, -2.614587597e+02, 5.793273 << 673 { 92, 6.439, 7.99834E+09, -12.858, 1.993, -37.695, 11.438, -1.085, 0.03376669},
657    -3.359152840e+02, 1.437507638e+02, -2.29745 << 674 { 93, 6.437, 1.00000E+10, -12.866, 1.993, -39.010, 11.927, -1.146, 0.03630848},
658   {32, 6.000000000e+00, 7.849500202e+00, 5.000 << 675 { 94, 6.432, 7.99834E+09, -12.862, 1.993, -37.192, 11.229, -1.057, 0.0325621},
659    4.388195965e+02, -2.642662297e+02, 5.834159 << 676 { 95, 6.435, 7.99834E+09, -12.869, 1.993, -37.589, 11.363, -1.072, 0.03312393},
660    -3.430730654e+02, 1.467102631e+02, -2.34316 << 677 { 96, 6.449, 1.00000E+10, -12.886, 1.993, -39.573, 12.095, -1.162, 0.03680527},
661   {33, 6.000000000e+00, 7.849500202e+00, 5.000 << 678 { 97, 6.446, 1.00000E+10, -12.892, 1.993, -40.007, 12.242, -1.178, 0.03737377},
662    3.931399547e+02, -2.363700718e+02, 5.197696 << 679 { 98, 6.421, 1.00000E+10, -12.887, 1.993, -39.509, 12.041, -1.152, 0.03629023},
663    -3.501570134e+02, 1.497141578e+02, -2.39088 << 680 { 99, 6.414, 1.00000E+10, -12.894, 1.993, -39.939, 12.183, -1.168, 0.03690464},
664   {34, 6.000000000e+00, 7.849500202e+00, 5.000 << 681 {100, 6.412, 1.00000E+10, -12.900, 1.993, -39.973, 12.180, -1.166, 0.036773}
665    3.772588127e+02, -2.256347960e+02, 4.929790 << 682   };
666    -3.481053019e+02, 1.486490112e+02, -2.37074 << 
667   {35, 6.000000000e+00, 7.849500202e+00, 5.000 << 
668    3.344685842e+02, -1.994816236e+02, 4.332267 << 
669    -3.227660675e+02, 1.370301996e+02, -2.17154 << 
670   {36, 6.000000000e+00, 7.849500202e+00, 5.000 << 
671    3.004054446e+02, -1.781334135e+02, 3.834850 << 
672    -2.980827664e+02, 1.257508661e+02, -1.97879 << 
673   {37, 6.000000000e+00, 7.849500202e+00, 5.000 << 
674    -3.687188343e+01, 1.054409719e+01, -8.51658 << 
675    -2.699384784e+02, 1.129635316e+02, -1.76144 << 
676   {38, 6.000000000e+00, 7.849500202e+00, 5.000 << 
677    1.969969064e+02, -1.286503864e+02, 3.008431 << 
678    -2.331258613e+02, 9.627987243e+01, -1.47851 << 
679   {39, 6.000000000e+00, 7.849500202e+00, 5.000 << 
680    2.891710763e+02, -1.819536752e+02, 4.158265 << 
681    -1.997404800e+02, 8.119476676e+01, -1.22342 << 
682   {40, 6.000000000e+00, 7.849500202e+00, 5.000 << 
683    3.393782172e+02, -2.103908454e+02, 4.758278 << 
684    -1.549247582e+02, 6.091403935e+01, -8.79930 << 
685   {41, 6.000000000e+00, 7.849500202e+00, 5.000 << 
686    2.748604341e+02, -1.706429616e+02, 3.843757 << 
687    -1.163607425e+02, 4.350905533e+01, -5.85930 << 
688   {42, 6.000000000e+00, 7.849500202e+00, 5.000 << 
689    3.203285955e+02, -1.966282865e+02, 4.398204 << 
690    -9.364181222e+01, 3.329814493e+01, -4.14168 << 
691   {43, 6.000000000e+00, 7.849500202e+00, 5.000 << 
692    4.184977165e+02, -2.552902161e+02, 5.707764 << 
693    -8.395646154e+01, 2.898228589e+01, -3.42235 << 
694   {44, 6.000000000e+00, 7.849500202e+00, 5.000 << 
695    3.243555305e+02, -1.978255470e+02, 4.397580 << 
696    -5.506292375e+01, 1.599310639e+01, -1.23715 << 
697   {45, 6.000000000e+00, 7.849500202e+00, 5.000 << 
698    3.037823599e+02, -1.856628295e+02, 4.128167 << 
699    -5.014186072e+01, 1.386962969e+01, -8.95080 << 
700   {46, 6.000000000e+00, 7.849500202e+00, 5.000 << 
701    3.529797051e+02, -2.101512262e+02, 4.563946 << 
702    -4.815922691e+01, 1.301508788e+01, -7.58085 << 
703   {47, 6.000000000e+00, 7.849500202e+00, 5.000 << 
704    3.074953924e+02, -1.872462583e+02, 4.149827 << 
705    -4.897188379e+01, 1.335300002e+01, -8.11005 << 
706   {48, 6.000000000e+00, 7.849500202e+00, 5.000 << 
707    4.059717166e+02, -2.462737702e+02, 5.472040 << 
708    -5.901534554e+01, 1.791385249e+01, -1.58706 << 
709   {49, 6.000000000e+00, 7.849500202e+00, 5.000 << 
710    4.369774251e+02, -2.639721687e+02, 5.849617 << 
711    -7.399698219e+01, 2.469785523e+01, -2.73788 << 
712   {50, 6.000000000e+00, 7.849500202e+00, 5.000 << 
713    4.289361021e+02, -2.585593024e+02, 5.714058 << 
714    -9.269047286e+01, 3.314422349e+01, -4.16734 << 
715   {51, 6.000000000e+00, 7.849500202e+00, 5.000 << 
716    3.866985836e+02, -2.328379698e+02, 5.128884 << 
717    -1.067869310e+02, 3.950715983e+01, -5.24332 << 
718   {52, 6.000000000e+00, 7.951499931e+00, 7.998 << 
719    3.947511198e+02, -2.363799049e+02, 5.179393 << 
720    -1.069681982e+02, 3.995521754e+01, -5.38207 << 
721   {53, 6.000000000e+00, 7.849500202e+00, 5.000 << 
722    3.694394448e+02, -2.204699428e+02, 4.806381 << 
723    -1.180749905e+02, 4.460080701e+01, -6.10521 << 
724   {54, 6.000000000e+00, 7.951499931e+00, 7.998 << 
725    3.423943987e+02, -2.041330669e+02, 4.437639 << 
726    -1.288973984e+02, 4.985324046e+01, -7.05604 << 
727   {55, 6.000000000e+00, 7.849500202e+00, 5.000 << 
728    -7.663422017e+01, 3.462700567e+01, -6.27355 << 
729    -1.318428276e+02, 5.081036112e+01, -7.15490 << 
730   {56, 6.000000000e+00, 7.849500202e+00, 5.000 << 
731    1.084179205e+02, -7.602229206e+01, 1.843754 << 
732    -1.346311376e+02, 5.207427468e+01, -7.36983 << 
733   {57, 6.000000000e+00, 7.725500002e+00, 2.824 << 
734    2.995898890e+02, -1.889477671e+02, 4.336642 << 
735    5.503972208e+00, -1.227641064e+01, 3.699182 << 
736   {58, 6.000000000e+00, 7.849500202e+00, 5.000 << 
737    1.709135500e+02, -1.120124681e+02, 2.615893 << 
738    -1.375860132e+02, 5.337811974e+01, -7.58678 << 
739   {59, 6.000000000e+00, 7.849500202e+00, 5.000 << 
740    1.214691988e+02, -8.336119630e+01, 1.996468 << 
741    -1.631005912e+02, 6.472051894e+01, -9.47609 << 
742   {60, 6.000000000e+00, 7.849500202e+00, 5.000 << 
743    1.302719596e+02, -8.835087414e+01, 2.101971 << 
744    -1.692901279e+02, 6.742727614e+01, -9.92066 << 
745   {61, 6.000000000e+00, 7.951499931e+00, 7.998 << 
746    1.127680235e+02, -7.782238836e+01, 1.865126 << 
747    -2.059821608e+02, 8.384774285e+01, -1.26734 << 
748   {62, 6.000000000e+00, 7.951499931e+00, 7.998 << 
749    1.203145109e+02, -8.212556537e+01, 1.956606 << 
750    -2.158058793e+02, 8.810144391e+01, -1.33638 << 
751   {63, 6.000000000e+00, 7.951499931e+00, 7.998 << 
752    1.212159597e+02, -8.256559477e+01, 1.964122 << 
753    -2.278531434e+02, 9.336519465e+01, -1.42258 << 
754   {64, 6.000000000e+00, 7.951499931e+00, 7.998 << 
755    1.689382403e+02, -1.099987696e+02, 2.551961 << 
756    -2.282716670e+02, 9.348611199e+01, -1.42358 << 
757   {65, 6.000000000e+00, 7.951499931e+00, 7.998 << 
758    1.724155378e+02, -1.120798437e+02, 2.598264 << 
759    -2.322687147e+02, 9.517466656e+01, -1.45033 << 
760   {66, 6.000000000e+00, 7.951499931e+00, 7.998 << 
761    1.286079419e+02, -8.646296410e+01, 2.039801 << 
762    -2.420048480e+02, 9.935663043e+01, -1.51765 << 
763   {67, 6.000000000e+00, 7.951499931e+00, 7.998 << 
764    1.182799697e+02, -8.043389241e+01, 1.908027 << 
765    -2.464462609e+02, 1.012059056e+02, -1.54646 << 
766   {68, 6.000000000e+00, 7.951499931e+00, 7.998 << 
767    1.150510247e+02, -7.859576077e+01, 1.868688 << 
768    -2.457555063e+02, 1.007538481e+02, -1.53669 << 
769   {69, 6.000000000e+00, 7.951499931e+00, 7.998 << 
770    1.266280406e+02, -8.514491730e+01, 2.007089 << 
771    -2.492442707e+02, 1.021615320e+02, -1.55787 << 
772   {70, 6.000000000e+00, 7.951499931e+00, 7.998 << 
773    1.224253568e+02, -8.281395858e+01, 1.958609 << 
774    -2.488808342e+02, 1.018569466e+02, -1.55060 << 
775   {71, 6.000000000e+00, 7.951499931e+00, 7.998 << 
776    1.862181262e+02, -1.199038630e+02, 2.763107 << 
777    -2.403102476e+02, 9.796272016e+01, -1.48452 << 
778   {72, 6.000000000e+00, 7.951499931e+00, 7.998 << 
779    2.297759959e+02, -1.448485621e+02, 3.295877 << 
780    -2.282155654e+02, 9.249921555e+01, -1.39226 << 
781   {73, 6.000000000e+00, 7.951499931e+00, 7.998 << 
782    2.646909006e+02, -1.647716545e+02, 3.719903 << 
783    -2.165150972e+02, 8.722660467e+01, -1.30341 << 
784   {74, 6.000000000e+00, 7.951499931e+00, 7.998 << 
785    2.251239174e+02, -1.414731209e+02, 3.206048 << 
786    -2.070173544e+02, 8.296725365e+01, -1.23198 << 
787   {75, 6.000000000e+00, 7.951499931e+00, 7.998 << 
788    2.627532736e+02, -1.629008146e+02, 3.661592 << 
789    -1.945762063e+02, 7.740995255e+01, -1.13912 << 
790   {76, 6.000000000e+00, 7.951499931e+00, 7.998 << 
791    2.644549626e+02, -1.637369900e+02, 3.675734 << 
792    -1.725967865e+02, 6.755389456e+01, -9.73763 << 
793   {77, 6.000000000e+00, 7.951499931e+00, 7.998 << 
794    2.677629012e+02, -1.650589135e+02, 3.690999 << 
795    -1.584140848e+02, 6.122430396e+01, -8.68087 << 
796   {78, 6.000000000e+00, 7.951499931e+00, 7.998 << 
797    2.420702029e+02, -1.484461630e+02, 3.292288 << 
798    -1.319886050e+02, 4.940494114e+01, -6.70274 << 
799   {79, 6.000000000e+00, 7.951499931e+00, 7.998 << 
800    2.346714957e+02, -1.439356552e+02, 3.189416 << 
801    -1.130109430e+02, 4.093029258e+01, -5.28674 << 
802   {80, 6.000000000e+00, 7.951499931e+00, 7.998 << 
803    2.747370538e+02, -1.689673404e+02, 3.771696 << 
804    -9.001823908e+01, 3.066094857e+01, -3.57045 << 
805   {81, 6.000000000e+00, 7.951499931e+00, 7.998 << 
806    3.142563781e+02, -1.916613838e+02, 4.259167 << 
807    -7.642731867e+01, 2.462410146e+01, -2.56697 << 
808   {82, 6.000000000e+00, 7.951499931e+00, 7.998 << 
809    3.509258060e+02, -2.125470710e+02, 4.702461 << 
810    -5.173355302e+01, 1.362015056e+01, -7.32128 << 
811   {83, 6.000000000e+00, 7.951499931e+00, 7.998 << 
812    3.399729483e+02, -2.056319770e+02, 4.539614 << 
813    -4.131443229e+01, 8.986236911e+00, 3.924628 << 
814   {84, 6.000000000e+00, 7.951499931e+00, 7.998 << 
815    3.640602841e+02, -2.190164327e+02, 4.815603 << 
816    -3.256862965e+01, 5.115606198e+00, 6.800853 << 
817   {85, 6.000000000e+00, 7.951499931e+00, 7.998 << 
818    3.766488275e+02, -2.257321142e+02, 4.947300 << 
819    -2.300947210e+01, 8.615223509e-01, 1.388425 << 
820   {86, 6.000000000e+00, 7.951499931e+00, 7.998 << 
821    3.443622947e+02, -2.064342780e+02, 4.516044 << 
822    -5.399039282e+00, -7.002814559e+00, 2.70251 << 
823   {87, 6.000000000e+00, 7.951499931e+00, 7.998 << 
824    -3.706791591e+01, 1.118013187e+01, -1.05772 << 
825    -3.451314336e+00, -7.779254134e+00, 2.81626 << 
826   {88, 6.000000000e+00, 7.951499931e+00, 7.998 << 
827    6.125934670e+01, -4.855548659e+01, 1.248551 << 
828    -6.021643455e+00, -6.580234329e+00, 2.60744 << 
829   {89, 6.000000000e+00, 7.951499931e+00, 7.998 << 
830    1.350863292e+02, -9.126618691e+01, 2.169932 << 
831    1.937135880e+01, -1.787129621e+01, 4.485878 << 
832   {90, 6.000000000e+00, 7.951499931e+00, 7.998 << 
833    1.784388998e+02, -1.161623817e+02, 2.702376 << 
834    2.216057166e+01, -1.904990091e+01, 4.671627 << 
835   {91, 6.000000000e+00, 7.951499931e+00, 7.998 << 
836    1.368355213e+02, -9.179790820e+01, 2.169910 << 
837    4.516580666e+00, -1.118102949e+01, 3.357662 << 
838   {92, 6.000000000e+00, 7.951499931e+00, 7.998 << 
839    1.427130850e+02, -9.499714618e+01, 2.234475 << 
840    1.341991149e+01, -1.518503354e+01, 4.030838 << 
841   {93, 6.000000000e+00, 8.000000000e+00, 1.000 << 
842    2.341801100e+01, -2.506119713e+01, 7.023029 << 
843    -3.575331738e+01, 7.276302226e+00, 1.906771 << 
844   {94, 6.000000000e+00, 7.951499931e+00, 7.998 << 
845    1.287618322e+02, -8.721780968e+01, 2.073255 << 
846    -2.307262580e+01, 1.113132278e+00, 1.305250 << 
847   {95, 6.000000000e+00, 7.951499931e+00, 7.998 << 
848    1.334821220e+02, -8.985337775e+01, 2.127928 << 
849    -3.518662723e+01, 6.514543434e+00, 4.030862 << 
850   {96, 6.000000000e+00, 8.000000000e+00, 1.000 << 
851    4.545581472e+01, -3.771304300e+01, 9.729129 << 
852    -4.973805034e+01, 1.342335334e+01, -8.22113 << 
853   {97, 6.000000000e+00, 8.000000000e+00, 1.000 << 
854    4.689042092e+01, -3.843347264e+01, 9.859294 << 
855    -4.657434145e+01, 1.204637835e+01, -5.98244 << 
856   {98, 6.000000000e+00, 8.000000000e+00, 1.000 << 
857    1.337584189e+01, -1.907284620e+01, 5.691614 << 
858    -5.573362773e+01, 1.615667599e+01, -1.28896 << 
859   {99, 6.000000000e+00, 8.000000000e+00, 1.000 << 
860    1.376201293e+01, -1.919251815e+01, 5.693799 << 
861    -4.914211254e+01, 1.314247998e+01, -7.73933 << 
862   {100, 6.000000000e+00, 8.000000000e+00, 1.00 << 
863    1.277081775e+01, -1.854047224e+01, 5.534680 << 
864    -5.074293980e+01, 1.383260974e+01, -8.85890 << 
865 //....oooOO0OOooo........oooOO0OOooo........oo << 
866                                                   683