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