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