Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/particle_hp/src/G4ParticleHPChannel.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/hadronic/models/particle_hp/src/G4ParticleHPChannel.cc (Version 11.3.0) and /processes/hadronic/models/particle_hp/src/G4ParticleHPChannel.cc (Version 11.2.1)


  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 // neutron_hp -- source file                       26 // neutron_hp -- source file
 27 // J.P. Wellisch, Nov-1996                         27 // J.P. Wellisch, Nov-1996
 28 // A prototype of the low energy neutron trans     28 // A prototype of the low energy neutron transport model.
 29 //                                                 29 //
 30 // 070523 bug fix for G4FPE_DEBUG on by A. How     30 // 070523 bug fix for G4FPE_DEBUG on by A. Howard ( and T. Koi)
 31 // 071031 bug fix T. Koi on behalf of A. Howar     31 // 071031 bug fix T. Koi on behalf of A. Howard
 32 // 081203 bug fix in Register method by T. Koi     32 // 081203 bug fix in Register method by T. Koi
 33 //                                                 33 //
 34 // P. Arce, June-2014 Conversion neutron_hp to     34 // P. Arce, June-2014 Conversion neutron_hp to particle_hp
 35 //                                                 35 //
 36 // June-2019 - E. Mendoza --> Modification to      36 // June-2019 - E. Mendoza --> Modification to allow using an incomplete
 37 //   data library if the G4NEUTRONHP_SKIP_MISS     37 //   data library if the G4NEUTRONHP_SKIP_MISSING_ISOTOPES environmental
 38 //   flag is defined. The missing XS are set t     38 //   flag is defined. The missing XS are set to 0.
 39                                                    39 
 40 #include "G4ParticleHPChannel.hh"                  40 #include "G4ParticleHPChannel.hh"
 41                                                    41 
 42 #include "G4HadTmpUtil.hh"                         42 #include "G4HadTmpUtil.hh"
 43 #include "G4ParticleHPElasticFS.hh"                43 #include "G4ParticleHPElasticFS.hh"
 44 #include "G4ParticleHPFinalState.hh"               44 #include "G4ParticleHPFinalState.hh"
 45 #include "G4ParticleHPReactionWhiteBoard.hh"       45 #include "G4ParticleHPReactionWhiteBoard.hh"
 46 #include "G4ParticleHPThermalBoost.hh"             46 #include "G4ParticleHPThermalBoost.hh"
 47 #include "G4SystemOfUnits.hh"                      47 #include "G4SystemOfUnits.hh"
 48 #include "globals.hh"                              48 #include "globals.hh"
 49                                                    49 
 50 #include <cstdlib>                                 50 #include <cstdlib>
 51                                                    51 
 52 G4ParticleHPChannel::G4ParticleHPChannel(G4Par     52 G4ParticleHPChannel::G4ParticleHPChannel(G4ParticleDefinition* p)
 53 {                                                  53 {
 54   fManager = G4ParticleHPManager::GetInstance(     54   fManager = G4ParticleHPManager::GetInstance();
 55   if (fManager->GetUseWendtFissionModel()) {       55   if (fManager->GetUseWendtFissionModel()) {
 56     wendtFissionGenerator = G4WendtFissionFrag     56     wendtFissionGenerator = G4WendtFissionFragmentGenerator::GetInstance();
 57     // Make sure both fission fragment models      57     // Make sure both fission fragment models are not active at same time
 58     fManager->SetProduceFissionFragments(false     58     fManager->SetProduceFissionFragments(false);
 59   }                                                59   }
 60   theProjectile = (nullptr == p) ? G4Neutron::     60   theProjectile = (nullptr == p) ? G4Neutron::Neutron() : p;
 61   theChannelData = new G4ParticleHPVector;         61   theChannelData = new G4ParticleHPVector;
 62 }                                                  62 }
 63                                                    63 
 64 G4ParticleHPChannel::~G4ParticleHPChannel()        64 G4ParticleHPChannel::~G4ParticleHPChannel()
 65 {                                                  65 {
 66   delete theChannelData;                           66   delete theChannelData;
 67   // Following statement disabled to avoid SEG     67   // Following statement disabled to avoid SEGV
 68   // theBuffer is also deleted as "theChannelD     68   // theBuffer is also deleted as "theChannelData" in
 69   delete[] theIsotopeWiseData;                     69   delete[] theIsotopeWiseData;
 70   if (theFinalStates != nullptr) {                 70   if (theFinalStates != nullptr) {
 71     for (G4int i = 0; i < niso; i++) {             71     for (G4int i = 0; i < niso; i++) {
 72       delete theFinalStates[i];                    72       delete theFinalStates[i];
 73     }                                              73     }
 74     delete[] theFinalStates;                       74     delete[] theFinalStates;
 75   }                                                75   }
 76   delete[] active;                                 76   delete[] active;
 77 }                                                  77 }
 78                                                    78 
 79 G4double G4ParticleHPChannel::GetXsec(G4double <<  79 G4double G4ParticleHPChannel::GetXsec(G4double energy)
 80 {                                                  80 {
 81   return std::max(0., theChannelData->GetXsec(     81   return std::max(0., theChannelData->GetXsec(energy));
 82 }                                                  82 }
 83                                                    83 
 84 G4double G4ParticleHPChannel::GetWeightedXsec(     84 G4double G4ParticleHPChannel::GetWeightedXsec(G4double energy,
 85                 G4int isoNumber) const         <<  85                 G4int isoNumber)
 86 {                                                  86 {
 87   return theIsotopeWiseData[isoNumber].GetXsec     87   return theIsotopeWiseData[isoNumber].GetXsec(energy);
 88 }                                                  88 }
 89                                                    89 
 90 G4double G4ParticleHPChannel::GetFSCrossSectio     90 G4double G4ParticleHPChannel::GetFSCrossSection(G4double energy,
 91             G4int isoNumber) const             <<  91             G4int isoNumber)
 92 {                                                  92 {
 93   return theFinalStates[isoNumber]->GetXsec(en     93   return theFinalStates[isoNumber]->GetXsec(energy);
 94 }                                                  94 }
 95                                                    95 
 96 void G4ParticleHPChannel::Init(G4Element* anEl     96 void G4ParticleHPChannel::Init(G4Element* anElement, 
 97              const G4String& dirName, const G4     97              const G4String& dirName, const G4String& aFSType)
 98 {                                                  98 {
 99   theFSType = aFSType;                             99   theFSType = aFSType;
100   Init(anElement, dirName);                       100   Init(anElement, dirName);
101 }                                                 101 }
102                                                   102 
103 void G4ParticleHPChannel::Init(G4Element* anEl    103 void G4ParticleHPChannel::Init(G4Element* anElement, const G4String& dirName)
104 {                                                 104 {
105   theDir = dirName;                               105   theDir = dirName;
106   theElement = anElement;                         106   theElement = anElement;
107 }                                                 107 }
108                                                   108 
109 G4bool G4ParticleHPChannel::Register(G4Particl    109 G4bool G4ParticleHPChannel::Register(G4ParticleHPFinalState* theFS)
110 {                                                 110 {
111   ++registerCount;                                111   ++registerCount;
112   G4int Z = theElement->GetZasInt();              112   G4int Z = theElement->GetZasInt();
113                                                   113 
114   niso = (G4int)theElement->GetNumberOfIsotope    114   niso = (G4int)theElement->GetNumberOfIsotopes();
115   const std::size_t nsize = niso > 0 ? niso :  << 
116                                                   115 
117   delete[] theIsotopeWiseData;                    116   delete[] theIsotopeWiseData;
118   theIsotopeWiseData = new G4ParticleHPIsoData << 117   theIsotopeWiseData = new G4ParticleHPIsoData[niso];
119   delete[] active;                                118   delete[] active;
120   active = new G4bool[nsize];                  << 119   active = new G4bool[niso];
121                                                   120 
122   delete[] theFinalStates;                        121   delete[] theFinalStates;
123   theFinalStates = new G4ParticleHPFinalState* << 122   theFinalStates = new G4ParticleHPFinalState*[niso];
124   delete theChannelData;                          123   delete theChannelData;
125   theChannelData = new G4ParticleHPVector;        124   theChannelData = new G4ParticleHPVector;
126   for (G4int i = 0; i < niso; ++i) {              125   for (G4int i = 0; i < niso; ++i) {
127     theFinalStates[i] = theFS->New();             126     theFinalStates[i] = theFS->New();
128     theFinalStates[i]->SetProjectile(theProjec    127     theFinalStates[i]->SetProjectile(theProjectile);
129   }                                               128   }
130   if (niso != 0 && registerCount == 0) {          129   if (niso != 0 && registerCount == 0) {
131     for (G4int i1 = 0; i1 < niso; ++i1) {         130     for (G4int i1 = 0; i1 < niso; ++i1) {
132       G4int A = theElement->GetIsotope(i1)->Ge    131       G4int A = theElement->GetIsotope(i1)->GetN();
133       G4int M = theElement->GetIsotope(i1)->Ge    132       G4int M = theElement->GetIsotope(i1)->Getm();
134       //G4cout <<" Init: normal case i=" << i1    133       //G4cout <<" Init: normal case i=" << i1 
135       //     << " Z=" << Z << " A=" << A << G4    134       //     << " Z=" << Z << " A=" << A << G4endl;
136       G4double frac = theElement->GetRelativeA    135       G4double frac = theElement->GetRelativeAbundanceVector()[i1] / perCent;
137       theFinalStates[i1]->SetA_Z(A, Z, M);        136       theFinalStates[i1]->SetA_Z(A, Z, M);
138       UpdateData(A, Z, M, i1, frac, theProject    137       UpdateData(A, Z, M, i1, frac, theProjectile);
139     }                                             138     }
140   }                                               139   }
141   G4bool result = HasDataInAnyFinalState();       140   G4bool result = HasDataInAnyFinalState();
142                                                   141 
143   // To avoid issuing hash by worker threads      142   // To avoid issuing hash by worker threads
144   if (result) theChannelData->Hash();             143   if (result) theChannelData->Hash();
145                                                   144 
146   return result;                                  145   return result;
147 }                                                 146 }
148                                                   147 
149 void G4ParticleHPChannel::UpdateData(G4int A,     148 void G4ParticleHPChannel::UpdateData(G4int A, G4int Z, G4int M, G4int index,
150                                      G4double     149                                      G4double abundance,
151                                      G4Particl    150                                      G4ParticleDefinition* projectile)
152 {                                                 151 {
153   // Initialze the G4FissionFragment generator    152   // Initialze the G4FissionFragment generator for this isomer if needed
154   if (wendtFissionGenerator != nullptr) {         153   if (wendtFissionGenerator != nullptr) {
155     wendtFissionGenerator->InitializeANucleus(    154     wendtFissionGenerator->InitializeANucleus(A, Z, M, theDir);
156   }                                               155   }
157                                                   156 
158   theFinalStates[index]->Init(A, Z, M, theDir,    157   theFinalStates[index]->Init(A, Z, M, theDir, theFSType, projectile);
159   if (!theFinalStates[index]->HasAnyData()) re    158   if (!theFinalStates[index]->HasAnyData()) return;
160   // nothing there for exactly this isotope.      159   // nothing there for exactly this isotope.
161                                                   160 
162   // the above has put the X-sec into the FS      161   // the above has put the X-sec into the FS
163   theBuffer = nullptr;                            162   theBuffer = nullptr;
164   if (theFinalStates[index]->HasXsec()) {         163   if (theFinalStates[index]->HasXsec()) {
165     theBuffer = theFinalStates[index]->GetXsec    164     theBuffer = theFinalStates[index]->GetXsec();
166     theBuffer->Times(abundance / 100.);           165     theBuffer->Times(abundance / 100.);
167     theIsotopeWiseData[index].FillChannelData(    166     theIsotopeWiseData[index].FillChannelData(theBuffer);
168   }                                               167   }
169   else  // get data from CrossSection director    168   else  // get data from CrossSection directory
170   {                                               169   {
171     const G4String& tString = "/CrossSection"; << 170     G4String tString = "/CrossSection";
172     active[index] = theIsotopeWiseData[index].    171     active[index] = theIsotopeWiseData[index].Init(A, Z, M, abundance,
173                                                   172                                                    theDir, tString);
174     if (active[index]) theBuffer = theIsotopeW    173     if (active[index]) theBuffer = theIsotopeWiseData[index].MakeChannelData();
175   }                                               174   }
176   if (theBuffer != nullptr) Harmonise(theChann    175   if (theBuffer != nullptr) Harmonise(theChannelData, theBuffer);
177 }                                                 176 }
178                                                   177 
179 void G4ParticleHPChannel::Harmonise(G4Particle    178 void G4ParticleHPChannel::Harmonise(G4ParticleHPVector*& theStore,
180                                     G4Particle    179                                     G4ParticleHPVector* theNew)
181 {                                                 180 {
182   G4int s_tmp = 0, n = 0, m_tmp = 0;              181   G4int s_tmp = 0, n = 0, m_tmp = 0;
183   auto theMerge = new G4ParticleHPVector;         182   auto theMerge = new G4ParticleHPVector;
184   G4ParticleHPVector* anActive = theStore;        183   G4ParticleHPVector* anActive = theStore;
185   G4ParticleHPVector* aPassive = theNew;          184   G4ParticleHPVector* aPassive = theNew;
186   G4ParticleHPVector* tmp;                        185   G4ParticleHPVector* tmp;
187   G4int a = s_tmp, p = n, t;                      186   G4int a = s_tmp, p = n, t;
188   while (a < anActive->GetVectorLength() && p     187   while (a < anActive->GetVectorLength() && p < aPassive->GetVectorLength())
189     // Loop checking, 11.05.2015, T. Koi          188     // Loop checking, 11.05.2015, T. Koi
190   {                                               189   {
191     if (anActive->GetEnergy(a) <= aPassive->Ge    190     if (anActive->GetEnergy(a) <= aPassive->GetEnergy(p)) {
192       G4double xa = anActive->GetEnergy(a);       191       G4double xa = anActive->GetEnergy(a);
193       theMerge->SetData(m_tmp, xa, anActive->G    192       theMerge->SetData(m_tmp, xa, anActive->GetXsec(a) + std::max(0., aPassive->GetXsec(xa)));
194       m_tmp++;                                    193       m_tmp++;
195       a++;                                        194       a++;
196       G4double xp = aPassive->GetEnergy(p);       195       G4double xp = aPassive->GetEnergy(p);
197       if (std::abs(std::abs(xp - xa) / xa) < 0    196       if (std::abs(std::abs(xp - xa) / xa) < 0.001) {
198         ++p;                                      197         ++p;
199       }                                           198       }
200     }                                             199     }
201     else {                                        200     else {
202       tmp = anActive;                             201       tmp = anActive;
203       t = a;                                      202       t = a;
204       anActive = aPassive;                        203       anActive = aPassive;
205       a = p;                                      204       a = p;
206       aPassive = tmp;                             205       aPassive = tmp;
207       p = t;                                      206       p = t;
208     }                                             207     }
209   }                                               208   }
210   while (a != anActive->GetVectorLength())  //    209   while (a != anActive->GetVectorLength())  // Loop checking, 11.05.2015, T. Koi
211   {                                               210   {
212     theMerge->SetData(m_tmp++, anActive->GetEn    211     theMerge->SetData(m_tmp++, anActive->GetEnergy(a), anActive->GetXsec(a));
213     ++a;                                          212     ++a;
214   }                                               213   }
215   while (p != aPassive->GetVectorLength())  //    214   while (p != aPassive->GetVectorLength())  // Loop checking, 11.05.2015, T. Koi
216   {                                               215   {
217     if (std::abs(theMerge->GetEnergy(std::max(    216     if (std::abs(theMerge->GetEnergy(std::max(0, m_tmp - 1)) -
218      aPassive->GetEnergy(p)) / aPassive->GetEn    217      aPassive->GetEnergy(p)) / aPassive->GetEnergy(p) > 0.001)
219       theMerge->SetData(m_tmp++, aPassive->Get    218       theMerge->SetData(m_tmp++, aPassive->GetEnergy(p), aPassive->GetXsec(p));
220     ++p;                                          219     ++p;
221   }                                               220   }
222   delete theStore;                                221   delete theStore;
223   theStore = theMerge;                            222   theStore = theMerge;
224 }                                                 223 }
225                                                   224 
226 G4WendtFissionFragmentGenerator* G4ParticleHPC << 
227   if ( wendtFissionGenerator ) return wendtFis << 
228   else                         return nullptr; << 
229 }                                              << 
230                                                << 
231 G4HadFinalState*                                  225 G4HadFinalState*
232 G4ParticleHPChannel::ApplyYourself(const G4Had    226 G4ParticleHPChannel::ApplyYourself(const G4HadProjectile& theTrack,
233            G4int anIsotope, G4bool isElastic)     227            G4int anIsotope, G4bool isElastic)
234 {                                                 228 {
235   //G4cout << "G4ParticleHPChannel::ApplyYours    229   //G4cout << "G4ParticleHPChannel::ApplyYourself niso=" << niso
236   //   << " ni=" << anIsotope << " isElastic="    230   //   << " ni=" << anIsotope << " isElastic=" << isElastic <<G4endl;
237   if (anIsotope != -1 && anIsotope != -2) {       231   if (anIsotope != -1 && anIsotope != -2) {
238     // Inelastic Case                             232     // Inelastic Case
239     //G4cout << "G4ParticleHPChannel Inelastic    233     //G4cout << "G4ParticleHPChannel Inelastic Case"
240     //<< " Z= " << GetZ(anIsotope) << " A = "     234     //<< " Z= " << GetZ(anIsotope) << " A = " << GetN(anIsotope) << G4endl;
241     fManager->GetReactionWhiteBoard()->SetTarg    235     fManager->GetReactionWhiteBoard()->SetTargA((G4int)GetN(anIsotope));
242     fManager->GetReactionWhiteBoard()->SetTarg    236     fManager->GetReactionWhiteBoard()->SetTargZ((G4int)GetZ(anIsotope));
243     return theFinalStates[anIsotope]->ApplyYou    237     return theFinalStates[anIsotope]->ApplyYourself(theTrack);
244   }                                               238   }
245   G4double sum = 0;                               239   G4double sum = 0;
246   G4int it = 0;                                   240   G4int it = 0;
247   auto xsec = new G4double[niso];                 241   auto xsec = new G4double[niso];
248   G4ParticleHPThermalBoost aThermalE;             242   G4ParticleHPThermalBoost aThermalE;
249   for (G4int i = 0; i < niso; i++) {              243   for (G4int i = 0; i < niso; i++) {
250     if (theFinalStates[i]->HasAnyData()) {        244     if (theFinalStates[i]->HasAnyData()) {
251       /*                                          245       /*
252       G4cout << "FS: " << i << theTrack.GetDef    246       G4cout << "FS: " << i << theTrack.GetDefinition()->GetParticleName()
253        << " Z=" << theFinalStates[i]->GetZ()      247        << " Z=" << theFinalStates[i]->GetZ() 
254        << " A=" << theFinalStates[i]->GetN()      248        << " A=" << theFinalStates[i]->GetN() 
255        << G4endl;                                 249        << G4endl;
256       */                                          250       */
257       xsec[i] = theIsotopeWiseData[i].GetXsec(    251       xsec[i] = theIsotopeWiseData[i].GetXsec(
258         aThermalE.GetThermalEnergy(theTrack, t    252         aThermalE.GetThermalEnergy(theTrack, theFinalStates[i]->GetN(),
259                                    theFinalSta    253                                    theFinalStates[i]->GetZ(),
260                                    theTrack.Ge    254                                    theTrack.GetMaterial()->GetTemperature()));
261       sum += xsec[i];                             255       sum += xsec[i];
262     }                                             256     }
263     else {                                        257     else {
264       xsec[i] = 0;                                258       xsec[i] = 0;
265     }                                             259     }
266   }                                               260   }
267   if (sum == 0) {                                 261   if (sum == 0) {
268     it = G4lrint(niso * G4UniformRand());         262     it = G4lrint(niso * G4UniformRand());
269   }                                               263   }
270   else {                                          264   else {
271     G4double random = G4UniformRand();            265     G4double random = G4UniformRand();
272     G4double running = 0;                         266     G4double running = 0;
273     for (G4int ix = 0; ix < niso; ix++) {         267     for (G4int ix = 0; ix < niso; ix++) {
274       running += xsec[ix];                        268       running += xsec[ix];
275       if (sum == 0 || random <= running / sum)    269       if (sum == 0 || random <= running / sum) {
276         it = ix;                                  270         it = ix;
277         break;                                    271         break;
278       }                                           272       }
279     }                                             273     }
280     if (it == niso) it--;                         274     if (it == niso) it--;
281   }                                               275   }
282   delete[] xsec;                                  276   delete[] xsec;
283   G4HadFinalState* theFinalState = nullptr;       277   G4HadFinalState* theFinalState = nullptr;
284   const auto A = (G4int)this->GetN(it);           278   const auto A = (G4int)this->GetN(it);
285   const auto Z = (G4int)this->GetZ(it);           279   const auto Z = (G4int)this->GetZ(it);
286   const auto M = (G4int)this->GetM(it);           280   const auto M = (G4int)this->GetM(it);
287                                                   281 
288   //-2:Marker for Fission                         282   //-2:Marker for Fission
289   if ((wendtFissionGenerator != nullptr) && an    283   if ((wendtFissionGenerator != nullptr) && anIsotope == -2) {
290     theFinalState = wendtFissionGenerator->App    284     theFinalState = wendtFissionGenerator->ApplyYourself(theTrack, Z, A);
291   }                                               285   }
292                                                   286 
293   // Use the standard procedure if the G4Fissi    287   // Use the standard procedure if the G4FissionFragmentGenerator model fails
294   if (theFinalState == nullptr) {                 288   if (theFinalState == nullptr) {
295     G4int icounter = 0;                           289     G4int icounter = 0;
296     G4int icounter_max = 1024;                    290     G4int icounter_max = 1024;
297     while (theFinalState == nullptr)  // Loop     291     while (theFinalState == nullptr)  // Loop checking, 11.05.2015, T. Koi
298     {                                             292     {
299       icounter++;                                 293       icounter++;
300       if (icounter > icounter_max) {              294       if (icounter > icounter_max) {
301         G4cout << "Loop-counter exceeded the t    295         G4cout << "Loop-counter exceeded the threshold value at " 
302                << __LINE__ << "th line of " <<    296                << __LINE__ << "th line of " << __FILE__ << "." << G4endl;
303         break;                                    297         break;
304       }                                           298       }
305       if (isElastic) {                            299       if (isElastic) {
306         // Register 0 K cross-section for DBRC    300         // Register 0 K cross-section for DBRC for Doppler broadened elastic scattering kernel
307         G4ParticleHPVector* xsforFS = theIsoto    301         G4ParticleHPVector* xsforFS = theIsotopeWiseData[it].MakeChannelData();
308         // Only G4ParticleHPElasticFS has the     302         // Only G4ParticleHPElasticFS has the RegisterCrossSection method
309         static_cast<G4ParticleHPElasticFS*>(th    303         static_cast<G4ParticleHPElasticFS*>(theFinalStates[it])->RegisterCrossSection(xsforFS);
310       }                                           304       }
311       theFinalState = theFinalStates[it]->Appl    305       theFinalState = theFinalStates[it]->ApplyYourself(theTrack);
312     }                                             306     }
313   }                                               307   }
314                                                   308 
315   // G4cout <<"THE IMPORTANT RETURN"<<G4endl;     309   // G4cout <<"THE IMPORTANT RETURN"<<G4endl;
316   // G4cout << "TK G4ParticleHPChannel Elastic    310   // G4cout << "TK G4ParticleHPChannel Elastic, Capture and Fission Cases "
317   //<< " Z= " << this->GetZ(it) << " A = " <<     311   //<< " Z= " << this->GetZ(it) << " A = " << this->GetN(it) << G4endl;
318   fManager->GetReactionWhiteBoard()->SetTargA(    312   fManager->GetReactionWhiteBoard()->SetTargA(A);
319   fManager->GetReactionWhiteBoard()->SetTargZ(    313   fManager->GetReactionWhiteBoard()->SetTargZ(Z);
320   fManager->GetReactionWhiteBoard()->SetTargM(    314   fManager->GetReactionWhiteBoard()->SetTargM(M);
321                                                   315 
322   return theFinalState;                           316   return theFinalState;
323 }                                                 317 }
324                                                   318 
325 void G4ParticleHPChannel::DumpInfo() const     << 319 void G4ParticleHPChannel::DumpInfo()
326 {                                                 320 {
327   G4cout << " Element: " << theElement->GetNam    321   G4cout << " Element: " << theElement->GetName() << G4endl;
328   G4cout << " Directory name: " << theDir << G    322   G4cout << " Directory name: " << theDir << G4endl;
329   G4cout << " FS name: " << theFSType << G4end    323   G4cout << " FS name: " << theFSType << G4endl;
330   G4cout << " Number of Isotopes: " << niso <<    324   G4cout << " Number of Isotopes: " << niso << G4endl;
331   G4cout << " Have cross sections: " << G4endl    325   G4cout << " Have cross sections: " << G4endl;
332   for (int i = 0; i < niso; i++) {                326   for (int i = 0; i < niso; i++) {
333     G4cout << theFinalStates[i]->HasXsec() <<     327     G4cout << theFinalStates[i]->HasXsec() << "  ";
334   }                                               328   }
335   G4cout << G4endl;                               329   G4cout << G4endl;
336   if (theChannelData != nullptr) {                330   if (theChannelData != nullptr) {
337     G4cout << " Cross Section (total for this     331     G4cout << " Cross Section (total for this channel):" << G4endl;
338     int np = theChannelData->GetVectorLength()    332     int np = theChannelData->GetVectorLength();
339     G4cout << np << G4endl;                       333     G4cout << np << G4endl;
340     for (int i = 0; i < np; i++) {                334     for (int i = 0; i < np; i++) {
341       G4cout << theChannelData->GetEnergy(i) /    335       G4cout << theChannelData->GetEnergy(i) / eV << "  " << theChannelData->GetXsec(i) << G4endl;
342     }                                             336     }
343   }                                               337   }
344 }                                                 338 }
345                                                   339