Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/parton_string/diffraction/src/G4FTFModel.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/parton_string/diffraction/src/G4FTFModel.cc (Version 11.3.0) and /processes/hadronic/models/parton_string/diffraction/src/G4FTFModel.cc (Version 9.6.p1)


  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 //                                                 26 //
                                                   >>  27 // $Id$
                                                   >>  28 // GEANT4 tag $Name:  $
 27 //                                                 29 //
 28                                                    30 
 29 // -------------------------------------------     31 // ------------------------------------------------------------
 30 //      GEANT 4 class implementation file          32 //      GEANT 4 class implementation file
 31 //                                                 33 //
 32 //      ---------------- G4FTFModel ----------     34 //      ---------------- G4FTFModel ----------------
 33 //             by Gunter Folger, May 1998.         35 //             by Gunter Folger, May 1998.
 34 //       class implementing the excitation in      36 //       class implementing the excitation in the FTF Parton String Model
 35 //                                             << 
 36 //                Vladimir Uzhinsky, November  << 
 37 //       simulation of nucleus-nucleus interac << 
 38 // -------------------------------------------     37 // ------------------------------------------------------------
 39                                                    38 
 40 #include <utility>                                 39 #include <utility> 
 41                                                    40 
 42 #include "G4FTFModel.hh"                           41 #include "G4FTFModel.hh"
 43 #include "G4ios.hh"                                42 #include "G4ios.hh"
 44 #include "G4PhysicalConstants.hh"                  43 #include "G4PhysicalConstants.hh"
 45 #include "G4SystemOfUnits.hh"                      44 #include "G4SystemOfUnits.hh"
 46 #include "G4FTFParameters.hh"                      45 #include "G4FTFParameters.hh"
 47 #include "G4FTFParticipants.hh"                    46 #include "G4FTFParticipants.hh"
 48 #include "G4DiffractiveSplitableHadron.hh"         47 #include "G4DiffractiveSplitableHadron.hh"
 49 #include "G4InteractionContent.hh"                 48 #include "G4InteractionContent.hh"
 50 #include "G4LorentzRotation.hh"                    49 #include "G4LorentzRotation.hh"
 51 #include "G4ParticleDefinition.hh"                 50 #include "G4ParticleDefinition.hh"
 52 #include "G4ParticleTable.hh"                      51 #include "G4ParticleTable.hh"
 53 #include "G4IonTable.hh"                           52 #include "G4IonTable.hh"
 54 #include "G4KineticTrack.hh"                   << 
 55 #include "G4HyperNucleiProperties.hh"          << 
 56 #include "G4Exp.hh"                            << 
 57 #include "G4Log.hh"                            << 
 58                                                << 
 59 //============================================ << 
 60                                                << 
 61 //#define debugFTFmodel                        << 
 62 //#define debugReggeonCascade                  << 
 63 //#define debugPutOnMassShell                  << 
 64 //#define debugAdjust                          << 
 65 //#define debugBuildString                     << 
 66                                                << 
 67                                                << 
 68 //============================================ << 
 69                                                << 
 70 G4FTFModel::G4FTFModel( const G4String& modelN << 
 71   G4VPartonStringModel( modelName ),           << 
 72   theExcitation( new G4DiffractiveExcitation() << 
 73   theElastic( new G4ElasticHNScattering() ),   << 
 74   theAnnihilation( new G4FTFAnnihilation() )   << 
 75 {                                              << 
 76   // ---> JVY theParameters = 0;               << 
 77   theParameters = new G4FTFParameters();       << 
 78   //                                           << 
 79   NumberOfInvolvedNucleonsOfTarget = 0;        << 
 80   NumberOfInvolvedNucleonsOfProjectile= 0;     << 
 81   for ( G4int i = 0; i < 250; ++i ) {          << 
 82     TheInvolvedNucleonsOfTarget[i] = 0;        << 
 83     TheInvolvedNucleonsOfProjectile[i] = 0;    << 
 84   }                                            << 
 85                                                << 
 86   //LowEnergyLimit = 2000.0*MeV;               << 
 87   LowEnergyLimit = 1000.0*MeV;                 << 
 88                                                << 
 89   HighEnergyInter = true;                      << 
 90                                                << 
 91   G4LorentzVector tmp( 0.0, 0.0, 0.0, 0.0 );   << 
 92   ProjectileResidual4Momentum        = tmp;    << 
 93   ProjectileResidualMassNumber       = 0;      << 
 94   ProjectileResidualCharge           = 0;      << 
 95   ProjectileResidualLambdaNumber     = 0;      << 
 96   ProjectileResidualExcitationEnergy = 0.0;    << 
 97                                                << 
 98   TargetResidual4Momentum            = tmp;    << 
 99   TargetResidualMassNumber           = 0;      << 
100   TargetResidualCharge               = 0;      << 
101   TargetResidualExcitationEnergy     = 0.0;    << 
102                                                << 
103   Bimpact = -1.0;                              << 
104   BinInterval = false;                         << 
105   Bmin = 0.0;                                  << 
106   Bmax = 0.0;                                  << 
107   NumberOfProjectileSpectatorNucleons = 0;     << 
108   NumberOfTargetSpectatorNucleons = 0;         << 
109   NumberOfNNcollisions = 0;                    << 
110                                                << 
111   SetEnergyMomentumCheckLevels( 2.0*perCent, 1 << 
112 }                                              << 
113                                                << 
114                                                    53 
115 //============================================ <<  54 // Class G4FTFModel 
116                                                << 
117 struct DeleteVSplitableHadron { void operator( << 
118                                                    55 
                                                   >>  56 G4FTFModel::G4FTFModel(const G4String& modelName):G4VPartonStringModel(modelName),
                                                   >>  57                          theExcitation(new G4DiffractiveExcitation()),
                                                   >>  58                          theElastic(new G4ElasticHNScattering()),
                                                   >>  59                          theAnnihilation(new G4FTFAnnihilation())
                                                   >>  60 {
                                                   >>  61   G4VPartonStringModel::SetThisPointer(this);
                                                   >>  62         theParameters=0;
                                                   >>  63   NumberOfInvolvedNucleon=0;
                                                   >>  64         NumberOfInvolvedNucleonOfProjectile=0;
                                                   >>  65     SetEnergyMomentumCheckLevels(2*perCent, 150*MeV);
                                                   >>  66 }
119                                                    67 
120 //============================================ <<  68 struct DeleteVSplitableHadron { void operator()(G4VSplitableHadron * aH){ delete aH;} };
121                                                    69 
122 G4FTFModel::~G4FTFModel() {                    <<  70 G4FTFModel::~G4FTFModel()
123    // Because FTF model can be called for vari <<  71 {
124    //                                          <<  72 // Because FTF model can be called for various particles
125    // ---> NOTE (JVY): This statement below is <<  73 // theParameters must be erased at the end of each call.
126    // theParameters must be erased at the end  <<  74 // Thus the delete is also in G4FTFModel::GetStrings() method
127    // Thus the delete is also in G4FTFModel::G <<  75    if( theParameters   != 0 ) delete theParameters; 
128    // ---> JVY                                 <<  76    if( theExcitation   != 0 ) delete theExcitation;
129    //                                          <<  77    if( theElastic      != 0 ) delete theElastic; 
130    if ( theParameters   != 0 ) delete theParam <<  78    if( theAnnihilation != 0 ) delete theAnnihilation;
131    if ( theExcitation   != 0 ) delete theExcit <<  79 
132    if ( theElastic      != 0 ) delete theElast <<  80 // Erasing of strings created at annihilation
133    if ( theAnnihilation != 0 ) delete theAnnih <<  81    if(theAdditionalString.size() != 0)
134                                                <<  82    {
135    // Erasing of strings created at annihilati <<  83     std::for_each(theAdditionalString.begin(), theAdditionalString.end(), 
136    if ( theAdditionalString.size() != 0 ) {    <<  84                   DeleteVSplitableHadron());
137      std::for_each( theAdditionalString.begin( << 
138                     DeleteVSplitableHadron() ) << 
139    }                                               85    }
140    theAdditionalString.clear();                    86    theAdditionalString.clear();
141                                                    87 
142    // Erasing of target involved nucleons.     <<  88 // Erasing of target involved nucleons
143    if ( NumberOfInvolvedNucleonsOfTarget != 0  <<  89    if( NumberOfInvolvedNucleon != 0)
144      for ( G4int i = 0; i < NumberOfInvolvedNu <<  90    {
145        G4VSplitableHadron* aNucleon = TheInvol <<  91     for(G4int i=0; i < NumberOfInvolvedNucleon; i++)
146        if ( aNucleon ) delete aNucleon;        <<  92     {
147      }                                         <<  93      G4VSplitableHadron * aNucleon = TheInvolvedNucleon[i]->GetSplitableHadron();
148    }                                           <<  94      if(aNucleon) delete aNucleon;
149                                                << 
150    // Erasing of projectile involved nucleons. << 
151    if ( NumberOfInvolvedNucleonsOfProjectile ! << 
152      for ( G4int i = 0; i < NumberOfInvolvedNu << 
153        G4VSplitableHadron* aNucleon = TheInvol << 
154        if ( aNucleon ) delete aNucleon;        << 
155      }                                         << 
156    }                                           << 
157 }                                              << 
158                                                << 
159                                                << 
160 //============================================ << 
161                                                << 
162 void G4FTFModel::Init( const G4Nucleus& aNucle << 
163                                                << 
164   theProjectile = aProjectile;                 << 
165                                                << 
166   G4double PlabPerParticle( 0.0 );  // Laborat << 
167                                                << 
168   #ifdef debugFTFmodel                         << 
169   G4cout << "FTF init Proj Name " << theProjec << 
170          << "FTF init Proj Mass " << theProjec << 
171          << " " << theProjectile.GetMomentum() << 
172          << "FTF init Proj B Q  " << theProjec << 
173          << " " << (G4int) theProjectile.GetDe << 
174          << "FTF init Target A Z " << aNucleus << 
175          << " " << aNucleus.GetZ_asInt() << G4 << 
176   #endif                                       << 
177                                                << 
178   theParticipants.Clean();                     << 
179                                                << 
180   theParticipants.SetProjectileNucleus( 0 );   << 
181                                                << 
182   G4LorentzVector tmp( 0.0, 0.0, 0.0, 0.0 );   << 
183   ProjectileResidualMassNumber       = 0;      << 
184   ProjectileResidualCharge           = 0;      << 
185   ProjectileResidualLambdaNumber     = 0;      << 
186   ProjectileResidualExcitationEnergy = 0.0;    << 
187   ProjectileResidual4Momentum        = tmp;    << 
188                                                << 
189   TargetResidualMassNumber       = aNucleus.Ge << 
190   TargetResidualCharge           = aNucleus.Ge << 
191   TargetResidualExcitationEnergy = 0.0;        << 
192   TargetResidual4Momentum        = tmp;        << 
193   G4double TargetResidualMass = G4ParticleTabl << 
194                                 ->GetIonMass(  << 
195                                                << 
196   TargetResidual4Momentum.setE( TargetResidual << 
197                                                << 
198   if ( std::abs( theProjectile.GetDefinition() << 
199     // Projectile is a hadron : meson or baryo << 
200     ProjectileResidualMassNumber = std::abs( t << 
201     ProjectileResidualCharge = G4int( theProje << 
202     PlabPerParticle = theProjectile.GetMomentu << 
203     ProjectileResidualExcitationEnergy = 0.0;  << 
204     //G4double ProjectileResidualMass = thePro << 
205     ProjectileResidual4Momentum.setVect( thePr << 
206     ProjectileResidual4Momentum.setE( theProje << 
207     if ( PlabPerParticle < LowEnergyLimit ) {  << 
208       HighEnergyInter = false;                 << 
209     } else {                                   << 
210       HighEnergyInter = true;                  << 
211     }                                          << 
212   } else {                                     << 
213     if ( theProjectile.GetDefinition()->GetBar << 
214       // Projectile is a nucleus               << 
215       ProjectileResidualMassNumber = theProjec << 
216       ProjectileResidualCharge = G4int( thePro << 
217       ProjectileResidualLambdaNumber = theProj << 
218       PlabPerParticle = theProjectile.GetMomen << 
219       if ( PlabPerParticle < LowEnergyLimit )  << 
220         HighEnergyInter = false;               << 
221       } else {                                 << 
222         HighEnergyInter = true;                << 
223       }                                        << 
224       theParticipants.InitProjectileNucleus( P << 
225                ProjectileResidualLambdaNumber  << 
226     } else if ( theProjectile.GetDefinition()- << 
227       // Projectile is an anti-nucleus         << 
228       ProjectileResidualMassNumber = std::abs( << 
229       ProjectileResidualCharge = std::abs( G4i << 
230       ProjectileResidualLambdaNumber = theProj << 
231       PlabPerParticle = theProjectile.GetMomen << 
232       if ( PlabPerParticle < LowEnergyLimit )  << 
233         HighEnergyInter = false;               << 
234       } else {                                 << 
235         HighEnergyInter = true;                << 
236       }                                        << 
237       theParticipants.InitProjectileNucleus( P << 
238                                              P << 
239       theParticipants.GetProjectileNucleus()-> << 
240       G4Nucleon* aNucleon;                     << 
241       while ( ( aNucleon = theParticipants.Get << 
242         if ( aNucleon->GetDefinition() == G4Pr << 
243           aNucleon->SetParticleType( G4AntiPro << 
244         } else if ( aNucleon->GetDefinition()  << 
245           aNucleon->SetParticleType( G4AntiNeu << 
246         } else if ( aNucleon->GetDefinition()  << 
247     aNucleon->SetParticleType( G4AntiLambda::D << 
248   }                                            << 
249       }                                        << 
250     }                                              95     }
                                                   >>  96    }
251                                                    97 
252     G4ThreeVector BoostVector = theProjectile. <<  98 // Erasing of projectile involved nucleons
253     theParticipants.GetProjectileNucleus()->Do <<  99 /*
254     theParticipants.GetProjectileNucleus()->Do << 100    if( NumberOfInvolvedNucleonOfProjectile != 0)
255     ProjectileResidualExcitationEnergy = 0.0;  << 101    {
256     //G4double ProjectileResidualMass = thePro << 102     for(G4int i=0; i < NumberOfInvolvedNucleonOfProjectile; i++)
257     ProjectileResidual4Momentum.setVect( thePr << 103     {
258     ProjectileResidual4Momentum.setE( theProje << 104      G4VSplitableHadron * aNucleon = TheInvolvedNucleonOfProjectile[i]->GetSplitableHadron();
259   }                                            << 105      if(aNucleon) delete aNucleon;
260                                                << 
261   // Init target nucleus (assumed to be never  << 
262   theParticipants.Init( aNucleus.GetA_asInt(), << 
263                                                << 
264   NumberOfProjectileSpectatorNucleons = std::a << 
265   NumberOfTargetSpectatorNucleons = aNucleus.G << 
266   NumberOfNNcollisions = 0;                    << 
267                                                << 
268   // reset/recalculate everything for the new  << 
269   theParameters->InitForInteraction( theProjec << 
270                                      aNucleus. << 
271                                                << 
272   if ( theAdditionalString.size() != 0 ) {     << 
273     std::for_each( theAdditionalString.begin() << 
274                    DeleteVSplitableHadron() ); << 
275   }                                            << 
276   theAdditionalString.clear();                 << 
277                                                << 
278   #ifdef debugFTFmodel                         << 
279   G4cout << "FTF end of Init" << G4endl << G4e << 
280   #endif                                       << 
281                                                << 
282   // In the case of Hydrogen target, for non-i << 
283   // do NOT simulate quasi-elastic (by forcing << 
284   // elastic scatering in theParameters - whic << 
285   // This is necessary because in this case qu << 
286   // with only one nucleon would be identical  << 
287   // and the latter is already included in the << 
288   // (i.e. G4HadronElasticProcess).            << 
289   if ( std::abs( theProjectile.GetDefinition() << 
290        aNucleus.GetA_asInt() < 2 ) theParamete << 
291                                                << 
292   if ( SampleBinInterval() ) theParticipants.S << 
293 }                                              << 
294                                                << 
295                                                << 
296 //============================================ << 
297                                                << 
298 G4ExcitedStringVector* G4FTFModel::GetStrings( << 
299                                                << 
300   #ifdef debugFTFmodel                         << 
301   G4cout << "G4FTFModel::GetStrings() " << G4e << 
302   #endif                                       << 
303                                                << 
304   G4ExcitedStringVector* theStrings = new G4Ex << 
305   theParticipants.GetList( theProjectile, theP << 
306                                                << 
307   SetImpactParameter( theParticipants.GetImpac << 
308                                                << 
309   StoreInvolvedNucleon();                      << 
310                                                << 
311   G4bool Success( true );                      << 
312                                                << 
313   if ( HighEnergyInter ) {                     << 
314     ReggeonCascade();                          << 
315                                                << 
316     #ifdef debugFTFmodel                       << 
317     G4cout << "FTF PutOnMassShell " << G4endl; << 
318     #endif                                     << 
319                                                << 
320     Success = PutOnMassShell();                << 
321                                                << 
322     #ifdef debugFTFmodel                       << 
323     G4cout << "FTF PutOnMassShell Success?  "  << 
324     #endif                                     << 
325                                                << 
326   }                                            << 
327                                                << 
328   #ifdef debugFTFmodel                         << 
329   G4cout << "FTF ExciteParticipants " << G4end << 
330   #endif                                       << 
331                                                << 
332   if ( Success ) Success = ExciteParticipants( << 
333                                                << 
334   #ifdef debugFTFmodel                         << 
335   G4cout << "FTF ExciteParticipants Success? " << 
336   #endif                                       << 
337                                                << 
338   if ( Success ) {                             << 
339                                                << 
340     #ifdef debugFTFmodel                       << 
341     G4cout << "FTF BuildStrings ";             << 
342     #endif                                     << 
343                                                << 
344     BuildStrings( theStrings );                << 
345                                                << 
346     #ifdef debugFTFmodel                       << 
347     G4cout << "FTF BuildStrings " << theString << 
348            << "FTF GetResiduals of Nuclei " << << 
349     #endif                                     << 
350                                                << 
351     GetResiduals();                            << 
352                                                << 
353     /*                                         << 
354     if ( theParameters != 0 ) {                << 
355       delete theParameters;                    << 
356       theParameters = 0;                       << 
357     }                                          << 
358     */                                         << 
359   } else if ( ! GetProjectileNucleus() ) {     << 
360     // Erase the hadron projectile             << 
361     std::vector< G4VSplitableHadron* > primari << 
362     theParticipants.StartLoop();               << 
363     while ( theParticipants.Next() ) {  /* Loo << 
364       const G4InteractionContent& interaction  << 
365       // Do not allow for duplicates           << 
366       if ( primaries.end() ==                  << 
367            std::find( primaries.begin(), prima << 
368         primaries.push_back( interaction.GetPr << 
369       }                                        << 
370     }                                             106     }
371     std::for_each( primaries.begin(), primarie << 107    }
372     primaries.clear();                         << 108 */
373   }                                            << 
374                                                << 
375   // Cleaning of the memory                    << 
376   G4VSplitableHadron* aNucleon = 0;            << 
377                                                << 
378   // Erase the projectile nucleons             << 
379   for ( G4int i = 0; i < NumberOfInvolvedNucle << 
380     aNucleon = TheInvolvedNucleonsOfProjectile << 
381     if ( aNucleon ) delete aNucleon;           << 
382   }                                            << 
383   NumberOfInvolvedNucleonsOfProjectile = 0;    << 
384                                                << 
385   // Erase the target nucleons                 << 
386   for ( G4int i = 0; i < NumberOfInvolvedNucle << 
387     aNucleon = TheInvolvedNucleonsOfTarget[i]- << 
388     if ( aNucleon ) delete aNucleon;           << 
389   }                                            << 
390   NumberOfInvolvedNucleonsOfTarget = 0;        << 
391                                                << 
392   #ifdef debugFTFmodel                         << 
393   G4cout << "End of FTF. Go to fragmentation"  << 
394          << "To continue - enter 1, to stop -  << 
395   #endif                                       << 
396                                                << 
397   theParticipants.Clean();                     << 
398                                                << 
399   return theStrings;                           << 
400 }                                                 109 }
401                                                   110 
                                                   >> 111 // ------------------------------------------------------------
                                                   >> 112 void G4FTFModel::Init(const G4Nucleus & aNucleus, const G4DynamicParticle & aProjectile)
                                                   >> 113 {
                                                   >> 114   theProjectile = aProjectile;  
402                                                   115 
403 //============================================ << 116         G4double PlabPerParticle(0.);  // Laboratory momentum Pz per particle/nucleon
404                                                << 
405 void G4FTFModel::StoreInvolvedNucleon() {      << 
406   //To store nucleons involved in the interact << 
407                                                << 
408   NumberOfInvolvedNucleonsOfTarget = 0;        << 
409                                                << 
410   G4V3DNucleus* theTargetNucleus = GetTargetNu << 
411   theTargetNucleus->StartLoop();               << 
412                                                << 
413   G4Nucleon* aNucleon;                         << 
414   while ( ( aNucleon = theTargetNucleus->GetNe << 
415     if ( aNucleon->AreYouHit() ) {             << 
416       TheInvolvedNucleonsOfTarget[NumberOfInvo << 
417       NumberOfInvolvedNucleonsOfTarget++;      << 
418     }                                          << 
419   }                                            << 
420                                                << 
421   #ifdef debugFTFmodel                         << 
422   G4cout << "G4FTFModel::StoreInvolvedNucleon  << 
423   G4cout << "NumberOfInvolvedNucleonsOfTarget  << 
424          << G4endl << G4endl;                  << 
425   #endif                                       << 
426                                                << 
427                                                << 
428   if ( ! GetProjectileNucleus() ) return;  //  << 
429                                                << 
430   // The projectile is a nucleus or an anti-nu << 
431                                                << 
432   NumberOfInvolvedNucleonsOfProjectile = 0;    << 
433                                                << 
434   G4V3DNucleus* theProjectileNucleus = GetProj << 
435   theProjectileNucleus->StartLoop();           << 
436                                                << 
437   G4Nucleon* aProjectileNucleon;               << 
438   while ( ( aProjectileNucleon = theProjectile << 
439     if ( aProjectileNucleon->AreYouHit() ) {   << 
440       // Projectile nucleon was involved in th << 
441       TheInvolvedNucleonsOfProjectile[NumberOf << 
442       NumberOfInvolvedNucleonsOfProjectile++;  << 
443     }                                          << 
444   }                                            << 
445                                                << 
446   #ifdef debugFTFmodel                         << 
447   G4cout << "NumberOfInvolvedNucleonsOfProject << 
448          << G4endl << G4endl;                  << 
449   #endif                                       << 
450   return;                                      << 
451 }                                              << 
452                                                   117 
                                                   >> 118 /*
                                                   >> 119 G4cout<<"FTF init Pro Name "<<theProjectile.GetDefinition()->GetParticleName()<<G4endl;
                                                   >> 120 G4cout<<"FTF init Pro Mass "<<theProjectile.GetMass()<<" "<<theProjectile.GetMomentum()<<G4endl;
                                                   >> 121 G4cout<<"FTF init Pro B Q  "<<theProjectile.GetDefinition()->GetBaryonNumber()<<" "<<(G4int) theProjectile.GetDefinition()->GetPDGCharge()<<G4endl; 
                                                   >> 122 G4cout<<"FTF init A Z "<<aNucleus.GetA_asInt()<<" "<<aNucleus.GetZ_asInt()<<G4endl;
                                                   >> 123 G4cout<<"             "<<aNucleus.GetN()<<" "<<aNucleus.GetZ()<<G4endl;
                                                   >> 124 //G4int Uzhi; G4cin>>Uzhi;
                                                   >> 125 */
453                                                   126 
454 //============================================ << 127         theParticipants.SetProjectileNucleus(0);
                                                   >> 128         theParticipants.Init(aNucleus.GetA_asInt(),aNucleus.GetZ_asInt());
455                                                   129 
456 void G4FTFModel::ReggeonCascade() {            << 130         if(std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) <= 1) 
457   // Implementation of the reggeon theory insp << 131         { // Projectile is a hadron
                                                   >> 132          PlabPerParticle=theProjectile.GetMomentum().z();
458                                                   133 
459   #ifdef debugReggeonCascade                   << 134 //         S = sqr( theProjectile.GetMass() ) + sqr( ProtonMass ) +
460   G4cout << "G4FTFModel::ReggeonCascade ------ << 135 //                 2*ProtonMass*theProjectile.GetTotalEnergy();
461          << "theProjectile.GetTotalMomentum()  << 136         }
462          << "theProjectile.GetTotalEnergy() "  << 
463          << "ExcitationE/WN " << theParameters << 
464   #endif                                       << 
465                                                   137 
466   G4int InitNINt = NumberOfInvolvedNucleonsOfT << 
467                                                   138 
468   // Reggeon cascading in target nucleus       << 139         if(theProjectile.GetDefinition()->GetBaryonNumber() > 1) 
469   for ( G4int InvTN = 0; InvTN < InitNINt; Inv << 140         { // Projectile is a nucleus
470     G4Nucleon* aTargetNucleon = TheInvolvedNuc << 141          theParticipants.InitProjectileNucleus(
                                                   >> 142                       theProjectile.GetDefinition()->GetBaryonNumber(),
                                                   >> 143               (G4int) theProjectile.GetDefinition()->GetPDGCharge()    );
471                                                   144 
472     G4double CreationTime = aTargetNucleon->Ge << 145          G4ThreeVector BoostVector=theProjectile.GetMomentum()/theProjectile.GetTotalEnergy();
                                                   >> 146          theParticipants.theProjectileNucleus->DoLorentzBoost(BoostVector);
473                                                   147 
474     G4double XofWoundedNucleon = aTargetNucleo << 148          PlabPerParticle=theProjectile.GetMomentum().z()/
475     G4double YofWoundedNucleon = aTargetNucleo << 149                          theProjectile.GetDefinition()->GetBaryonNumber();
476                                                << 
477     G4V3DNucleus* theTargetNucleus = GetTarget << 
478     theTargetNucleus->StartLoop();             << 
479                                                   150 
480     G4Nucleon* Neighbour(0);                   << 151 //         S =         2.*sqr( ProtonMass ) + 2*ProtonMass*
481     while ( ( Neighbour = theTargetNucleus->Ge << 152 //             theProjectile.GetTotalEnergy()/theProjectile.GetDefinition()->GetBaryonNumber();
482       if ( ! Neighbour->AreYouHit() ) {        << 
483         G4double impact2 = sqr( XofWoundedNucl << 
484                            sqr( YofWoundedNucl << 
485                                                << 
486         if ( G4UniformRand() < theParameters-> << 
487                                G4Exp( -impact2 << 
488            ) {                                 << 
489           // The neighbour nucleon is involved << 
490           TheInvolvedNucleonsOfTarget[ NumberO << 
491           NumberOfInvolvedNucleonsOfTarget++;  << 
492                                                << 
493           G4VSplitableHadron* targetSplitable; << 
494           targetSplitable = new G4DiffractiveS << 
495                                                << 
496           Neighbour->Hit( targetSplitable );   << 
497           targetSplitable->SetTimeOfCreation(  << 
498           targetSplitable->SetStatus( 3 );  // << 
499         }                                         153         }
500       }                                        << 
501     }                                          << 
502   }                                            << 
503                                                   154 
504   #ifdef debugReggeonCascade                   << 155         if(theProjectile.GetDefinition()->GetBaryonNumber() < -1) 
505   G4cout << "Final NumberOfInvolvedNucleonsOfT << 156         { // Projectile is an anti-nucleus
506          << NumberOfInvolvedNucleonsOfTarget < << 157          theParticipants.InitProjectileNucleus(
507   #endif                                       << 158              std::abs(        theProjectile.GetDefinition()->GetBaryonNumber()),
                                                   >> 159              std::abs((G4int) theProjectile.GetDefinition()->GetPDGCharge())    );
508                                                   160 
509   if ( ! GetProjectileNucleus() ) return;      << 161          G4ThreeVector BoostVector=theProjectile.GetMomentum()/theProjectile.GetTotalEnergy();
510                                                   162 
511   // Nucleus-Nucleus Interaction : Destruction << 163          theParticipants.theProjectileNucleus->StartLoop();
512   G4int InitNINp = NumberOfInvolvedNucleonsOfP << 164          G4Nucleon * aNucleon;
                                                   >> 165          while ( (aNucleon = theParticipants.theProjectileNucleus->GetNextNucleon()) )
                                                   >> 166          {
                                                   >> 167           if(aNucleon->GetDefinition()->GetPDGEncoding() == 2212) // Proton
                                                   >> 168           {aNucleon->SetParticleType(G4AntiProton::AntiProton());} 
513                                                   169 
514   //for ( G4int InvPN = 0; InvPN < NumberOfInv << 170           if(aNucleon->GetDefinition()->GetPDGEncoding() == 2112) // Neutron
515   for ( G4int InvPN = 0; InvPN < InitNINp; Inv << 171           {aNucleon->SetParticleType(G4AntiNeutron::AntiNeutron());} 
516     G4Nucleon* aProjectileNucleon = TheInvolve << 172          }   // end of while (theParticipant.theProjectileNucleus->GetNextNucleon())
517                                                   173 
518     G4double CreationTime = aProjectileNucleon << 174          theParticipants.theProjectileNucleus->DoLorentzBoost(BoostVector);
519                                                   175 
520     G4double XofWoundedNucleon = aProjectileNu << 176          PlabPerParticle=         theProjectile.GetMomentum().z()/
521     G4double YofWoundedNucleon = aProjectileNu << 177                          std::abs(theProjectile.GetDefinition()->GetBaryonNumber());
522                                                << 
523     G4V3DNucleus* theProjectileNucleus = GetPr << 
524     theProjectileNucleus->StartLoop();         << 
525                                                   178 
526     G4Nucleon* Neighbour( 0 );                 << 179 //         S =        2.*sqr( ProtonMass ) + 2*ProtonMass*
527     while ( ( Neighbour = theProjectileNucleus << 180 //                      theProjectile.GetTotalEnergy()/
528       if ( ! Neighbour->AreYouHit() ) {        << 181 //             std::abs(theProjectile.GetDefinition()->GetBaryonNumber());
529         G4double impact2= sqr( XofWoundedNucle << 
530                           sqr( YofWoundedNucle << 
531                                                << 
532         if ( G4UniformRand() < theParameters-> << 
533                                G4Exp( -impact2 << 
534            ) {                                 << 
535           // The neighbour nucleon is involved << 
536           TheInvolvedNucleonsOfProjectile[ Num << 
537           NumberOfInvolvedNucleonsOfProjectile << 
538                                                << 
539           G4VSplitableHadron* projectileSplita << 
540           projectileSplitable = new G4Diffract << 
541                                                << 
542           Neighbour->Hit( projectileSplitable  << 
543           projectileSplitable->SetTimeOfCreati << 
544           projectileSplitable->SetStatus( 3 ); << 
545         }                                         182         }
546       }                                        << 
547     }                                          << 
548   }                                            << 
549                                                   183 
550   #ifdef debugReggeonCascade                   << 184 // ------------------------------------------------------------------------
551   G4cout << "NumberOfInvolvedNucleonsOfProject << 185       if( theParameters != 0 ) delete theParameters;
552          << NumberOfInvolvedNucleonsOfProjecti << 186       theParameters = new G4FTFParameters(theProjectile.GetDefinition(),
553   #endif                                       << 187                                           aNucleus.GetA_asInt(),aNucleus.GetZ_asInt(),
554 }                                              << 188                                           PlabPerParticle);
555                                                << 189 //G4cout<<" End Init "<<theProjectile.GetMomentum()<<G4endl;
556                                                << 190 // To turn on/off (1/0) elastic scattering close/open ...
557 //============================================ << 191 //theParameters->SetProbabilityOfElasticScatt(0.); 
558                                                << 192 //G4cout<<" etProbabilityOfElasticScatt "<<theParameters->GetProbabilityOfElasticScatt()<<G4endl;
559 G4bool G4FTFModel::PutOnMassShell() {          << 193 //G4cout<<" INIT ";
560                                                << 194 //G4int Uzhi; G4cin>>Uzhi;
561   G4bool isProjectileNucleus = false;          << 
562   if ( GetProjectileNucleus() ) isProjectileNu << 
563                                                << 
564   #ifdef debugPutOnMassShell                   << 
565   G4cout << "PutOnMassShell start " << G4endl; << 
566   if ( isProjectileNucleus ) {                 << 
567     G4cout << "PutOnMassShell for Nucleus_Nucl << 
568   }                                            << 
569   #endif                                       << 
570                                                << 
571   G4LorentzVector Pprojectile( theProjectile.G << 
572   if ( Pprojectile.z() < 0.0 ) return false;   << 
573                                                << 
574   G4bool isOk = true;                          << 
575                                                << 
576   G4LorentzVector Ptarget( 0.0, 0.0, 0.0, 0.0  << 
577   G4LorentzVector PtargetResidual( 0.0, 0.0, 0 << 
578   G4double SumMasses = 0.0;                    << 
579   G4V3DNucleus* theTargetNucleus = GetTargetNu << 
580   G4double TargetResidualMass = 0.0;           << 
581                                                << 
582   #ifdef debugPutOnMassShell                   << 
583   G4cout << "Target : ";                       << 
584   #endif                                       << 
585   isOk = ComputeNucleusProperties( theTargetNu << 
586                                    TargetResid << 
587                                    TargetResid << 
588   if ( ! isOk ) return false;                  << 
589                                                << 
590   G4double Mprojectile  = 0.0;                 << 
591   G4double M2projectile = 0.0;                 << 
592   G4LorentzVector Pproj( 0.0, 0.0, 0.0, 0.0 ); << 
593   G4LorentzVector PprojResidual( 0.0, 0.0, 0.0 << 
594   G4V3DNucleus* thePrNucleus = GetProjectileNu << 
595   G4double PrResidualMass = 0.0;               << 
596                                                << 
597   if ( ! isProjectileNucleus ) {  // hadron-nu << 
598     Mprojectile  = Pprojectile.mag();          << 
599     M2projectile = Pprojectile.mag2();         << 
600     SumMasses += Mprojectile + 20.0*MeV;       << 
601   } else {  // nucleus-nucleus or antinucleus- << 
602     #ifdef debugPutOnMassShell                 << 
603     G4cout << "Projectile : ";                 << 
604     #endif                                     << 
605     isOk = ComputeNucleusProperties( thePrNucl << 
606                                      Projectil << 
607                                      Projectil << 
608     if ( ! isOk ) return false;                << 
609   }                                            << 
610                                                << 
611   G4LorentzVector Psum = Pprojectile + Ptarget << 
612   G4double SqrtS = Psum.mag();                 << 
613   G4double     S = Psum.mag2();                << 
614                                                << 
615   #ifdef debugPutOnMassShell                   << 
616   G4cout << "Psum " << Psum/GeV << " GeV" << G << 
617          << "SumMasses, PrResidualMass and Tar << 
618          << PrResidualMass/GeV << " " << Targe << 
619   #endif                                       << 
620                                                << 
621   if ( SqrtS < SumMasses ) return false;  // I << 
622                                                << 
623   // Try to consider also the excitation energ << 
624   // possible, with the available energy; othe << 
625   G4double savedSumMasses = SumMasses;         << 
626   if ( isProjectileNucleus ) {                 << 
627     SumMasses -= std::sqrt( sqr( PrResidualMas << 
628     SumMasses += std::sqrt( sqr( PrResidualMas << 
629                             + PprojResidual.pe << 
630   }                                            << 
631   SumMasses -= std::sqrt( sqr( TargetResidualM << 
632   SumMasses += std::sqrt( sqr( TargetResidualM << 
633                           + PtargetResidual.pe << 
634                                                << 
635   if ( SqrtS < SumMasses ) {                   << 
636     SumMasses = savedSumMasses;                << 
637     if ( isProjectileNucleus ) ProjectileResid << 
638     TargetResidualExcitationEnergy = 0.0;      << 
639   }                                            << 
640                                                << 
641   TargetResidualMass += TargetResidualExcitati << 
642   if ( isProjectileNucleus ) PrResidualMass += << 
643                                                << 
644   #ifdef debugPutOnMassShell                   << 
645   if ( isProjectileNucleus ) {                 << 
646     G4cout << "PrResidualMass ProjResidualExci << 
647      << ProjectileResidualExcitationEnergy <<  << 
648   }                                            << 
649   G4cout << "TargetResidualMass TargetResidual << 
650          << TargetResidualExcitationEnergy <<  << 
651          << "Sum masses " << SumMasses/GeV <<  << 
652   #endif                                       << 
653                                                << 
654   // Sampling of nucleons what can transfer to << 
655   if ( isProjectileNucleus  &&  thePrNucleus-> << 
656       isOk = GenerateDeltaIsobar( SqrtS, Numbe << 
657                                   TheInvolvedN << 
658   }                                            << 
659   if ( theTargetNucleus->GetMassNumber() != 1  << 
660     isOk = isOk  &&  GenerateDeltaIsobar( Sqrt << 
661                                           TheI << 
662   }                                            << 
663   if ( ! isOk ) return false;                  << 
664                                                << 
665   // Now we know that it is kinematically poss << 
666   // of the involved nucleons (or correspondin << 
667   // We have to sample the kinematical variabl << 
668   // of the final state. The sampled kinematic << 
669   // Notice that the sampling of the transvers << 
670   // Fermi motion.                             << 
671                                                << 
672   G4LorentzRotation toCms( -1*Psum.boostVector << 
673   G4LorentzVector Ptmp = toCms*Pprojectile;    << 
674   if ( Ptmp.pz() <= 0.0 ) return false;  // "S << 
675                                                << 
676   G4LorentzRotation toLab( toCms.inverse() );  << 
677                                                << 
678   G4double YprojectileNucleus = 0.0;           << 
679   if ( isProjectileNucleus ) {                 << 
680     Ptmp = toCms*Pproj;                        << 
681     YprojectileNucleus = Ptmp.rapidity();      << 
682   }                                            << 
683   Ptmp = toCms*Ptarget;                        << 
684   G4double YtargetNucleus = Ptmp.rapidity();   << 
685                                                << 
686   // Ascribing of the involved nucleons Pt and << 
687   G4double DcorP = 0.0;                        << 
688   if ( isProjectileNucleus ) DcorP = theParame << 
689   G4double DcorT       = theParameters->GetDof << 
690   G4double AveragePt2  = theParameters->GetPt2 << 
691   G4double maxPtSquare = theParameters->GetMax << 
692                                                << 
693   #ifdef debugPutOnMassShell                   << 
694   if ( isProjectileNucleus ) {                 << 
695     G4cout << "Y projectileNucleus " << Yproje << 
696   }                                            << 
697   G4cout << "Y targetNucleus     " << YtargetN << 
698          << "Dcor " << theParameters->GetDofNu << 
699          << " DcorP DcorT " << DcorP << " " << << 
700   #endif                                       << 
701                                                << 
702   G4double M2proj = M2projectile;  // Initiali << 
703   G4double WplusProjectile = 0.0;              << 
704   G4double M2target = 0.0;                     << 
705   G4double WminusTarget = 0.0;                 << 
706   G4int NumberOfTries = 0;                     << 
707   G4double ScaleFactor = 2.0;                  << 
708   G4bool OuterSuccess = true;                  << 
709                                                << 
710   const G4int maxNumberOfLoops = 1000;         << 
711   G4int loopCounter = 0;                       << 
712   do {  // while ( ! OuterSuccess )            << 
713     OuterSuccess = true;                       << 
714     const G4int maxNumberOfInnerLoops = 10000; << 
715     do {  // while ( SqrtS < Mprojectile + std << 
716       NumberOfTries++;                         << 
717       if ( NumberOfTries == 100*(NumberOfTries << 
718         // After many tries, it is convenient  << 
719         // AveragePt2, so that the sampled mom << 
720   // involved nucleons (or corresponding delta << 
721         // it is more likely to satisfy the mo << 
722         ScaleFactor /= 2.0;                    << 
723         DcorP       *= ScaleFactor;            << 
724         DcorT       *= ScaleFactor;            << 
725         AveragePt2  *= ScaleFactor;            << 
726       }                                        << 
727       if ( isProjectileNucleus ) {             << 
728         // Sampling of kinematical properties  << 
729         isOk = SamplingNucleonKinematics( Aver << 
730                                           theP << 
731                                           PrRe << 
732                                           Numb << 
733                                           TheI << 
734       }                                        << 
735       // Sampling of kinematical properties of << 
736       isOk = isOk  &&  SamplingNucleonKinemati << 
737                                                << 
738                                                << 
739                                                << 
740                                                << 
741       #ifdef debugPutOnMassShell               << 
742       G4cout << "SqrtS, Mp+Mt, Mp, Mt " << Sqr << 
743              << ( std::sqrt( M2proj ) + std::s << 
744              << std::sqrt( M2proj )/GeV << " " << 
745       #endif                                   << 
746       if ( ! isOk ) return false;              << 
747     } while ( ( SqrtS < std::sqrt( M2proj ) +  << 
748               NumberOfTries < maxNumberOfInner << 
749     if ( NumberOfTries >= maxNumberOfInnerLoop << 
750       #ifdef debugPutOnMassShell               << 
751       G4cout << "BAD situation: forced exit of << 
752       #endif                                   << 
753       return false;                            << 
754     }                                          << 
755     if ( isProjectileNucleus ) {               << 
756       isOk = CheckKinematics( S, SqrtS, M2proj << 
757                               NumberOfInvolved << 
758                               TheInvolvedNucle << 
759                               WminusTarget, Wp << 
760     }                                          << 
761     isOk = isOk  &&  CheckKinematics( S, SqrtS << 
762                                       NumberOf << 
763                                       WminusTa << 
764     if ( ! isOk ) return false;                << 
765   } while ( ( ! OuterSuccess ) &&              << 
766             ++loopCounter < maxNumberOfLoops ) << 
767   if ( loopCounter >= maxNumberOfLoops ) {     << 
768     #ifdef debugPutOnMassShell                 << 
769     G4cout << "BAD situation: forced exit of t << 
770     #endif                                     << 
771     return false;                              << 
772   }                                            << 
773                                                << 
774   // Now the sampling is completed, and we can << 
775   // whole system. This is done first in the c << 
776   // to the lab frame. The transverse momentum << 
777   // the recoil of each hadron (nucleon or del << 
778   // to conserve (by construction) the transve << 
779                                                << 
780   if ( ! isProjectileNucleus ) {  // hadron-nu << 
781                                                << 
782     G4double Pzprojectile = WplusProjectile/2. << 
783     G4double Eprojectile  = WplusProjectile/2. << 
784     Pprojectile.setPz( Pzprojectile );         << 
785     Pprojectile.setE( Eprojectile );           << 
786                                                << 
787     #ifdef debugPutOnMassShell                 << 
788     G4cout << "Proj after in CMS " << Pproject << 
789     #endif                                     << 
790                                                << 
791     Pprojectile.transform( toLab );            << 
792     theProjectile.SetMomentum( Pprojectile.vec << 
793     theProjectile.SetTotalEnergy( Pprojectile. << 
794                                                << 
795     theParticipants.StartLoop();               << 
796     theParticipants.Next();                    << 
797     G4VSplitableHadron* primary = theParticipa << 
798     primary->Set4Momentum( Pprojectile );      << 
799                                                << 
800     #ifdef debugPutOnMassShell                 << 
801     G4cout << "Final proj. mom in Lab. " << pr << 
802     #endif                                     << 
803                                                << 
804   } else {  // nucleus-nucleus or antinucleus- << 
805                                                << 
806     isOk = FinalizeKinematics( WplusProjectile << 
807                                ProjectileResid << 
808                                TheInvolvedNucl << 
809                                                << 
810     #ifdef debugPutOnMassShell                 << 
811     G4cout << "Projectile Residual4Momentum in << 
812     #endif                                     << 
813                                                << 
814     if ( ! isOk ) return false;                << 
815                                                << 
816     ProjectileResidual4Momentum.transform( toL << 
817                                                << 
818     #ifdef debugPutOnMassShell                 << 
819     G4cout << "Projectile Residual4Momentum in << 
820     #endif                                     << 
821                                                << 
822   }                                            << 
823                                                << 
824   isOk = FinalizeKinematics( WminusTarget, fal << 
825                              TargetResidualMas << 
826                              TheInvolvedNucleo << 
827                                                << 
828   #ifdef debugPutOnMassShell                   << 
829   G4cout << "Target Residual4Momentum in CMS " << 
830   #endif                                       << 
831                                                << 
832   if ( ! isOk ) return false;                  << 
833                                                << 
834   TargetResidual4Momentum.transform( toLab );  << 
835                                                << 
836   #ifdef debugPutOnMassShell                   << 
837   G4cout << "Target Residual4Momentum in Lab " << 
838   #endif                                       << 
839                                                << 
840   return true;                                 << 
841                                                   195 
                                                   >> 196    if(theAdditionalString.size() != 0)
                                                   >> 197    {
                                                   >> 198     std::for_each(theAdditionalString.begin(), theAdditionalString.end(), 
                                                   >> 199                   DeleteVSplitableHadron());
                                                   >> 200    }
                                                   >> 201    theAdditionalString.clear();
                                                   >> 202 //G4cout<<" End Init theProjectile.GetMomentum()"<<theProjectile.GetMomentum()<<G4endl;
842 }                                                 203 }
843                                                   204 
844                                                << 205 // ------------------------------------------------------------
845 //============================================ << 206 G4ExcitedStringVector * G4FTFModel::GetStrings()
846                                                << 207 { 
847 G4bool G4FTFModel::ExciteParticipants() {      << 208         G4ExcitedStringVector * theStrings(0);
848                                                << 209 
849   #ifdef debugBuildString                      << 210   theParticipants.GetList(theProjectile,theParameters);
850   G4cout << "G4FTFModel::ExciteParticipants()  << 211 //        StoreInvolvedNucleon();
851   #endif                                       << 212 //G4cout<<" GetList theProjectile.GetMomentum()  GetBaryonNumber() "<<theProjectile.GetMomentum()<<" "<<theProjectile.GetDefinition()->GetBaryonNumber()<<G4endl;
852                                                << 213         G4bool Success(true);
853   G4bool Success( false );                     << 214 
854   G4int MaxNumOfInelCollisions = G4int( thePar << 215         if((std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) <= 1) &&
855   if ( MaxNumOfInelCollisions > 0 ) {  //  Pla << 216                     (theProjectile.GetDefinition()->GetBaryonNumber() != -1)   )
856     G4double ProbMaxNumber = theParameters->Ge << 217         { // Standard variant of FTF for projectile hadron/nucleon
857     if ( G4UniformRand() < ProbMaxNumber ) Max << 218 //G4cout<<"Standard variant of FTF for projectile hadron/nucleon"<<G4endl;
858   } else {                                     << 219          ReggeonCascade(); 
859     // Plab < Pbound, normal application of FT << 220 //G4cout<<"Success after Reggeon "<<Success<<" PutOnMasShell"<<G4endl;
860     MaxNumOfInelCollisions = 1;                << 221          Success=PutOnMassShell(); 
861   }                                            << 222 //G4cout<<"Success after PutOn "<<Success<<" GetResid"<<G4endl;
862                                                << 223          GetResidualNucleus();
863   #ifdef debugBuildString                      << 
864   G4cout << "MaxNumOfInelCollisions per hadron << 
865   #endif                                       << 
866                                                << 
867   G4int CurrentInteraction( 0 );               << 
868   theParticipants.StartLoop();                 << 
869                                                << 
870   G4bool InnerSuccess( true );                 << 
871   while ( theParticipants.Next() ) {  /* Loop  << 
872     CurrentInteraction++;                      << 
873     const G4InteractionContent& collision = th << 
874     G4VSplitableHadron* projectile = collision << 
875     G4Nucleon* ProjectileNucleon = collision.G << 
876     G4VSplitableHadron* target = collision.Get << 
877     G4Nucleon* TargetNucleon = collision.GetTa << 
878                                                << 
879     #ifdef debugBuildString                    << 
880     G4cout << G4endl << "Interaction # Status  << 
881            << collision.GetStatus() << G4endl  << 
882            << target << G4endl << "projectile- << 
883            << projectile->GetStatus() << " " < << 
884            << "projectile->GetSoftC  target->G << 
885            << " " << target->GetSoftCollisionC << 
886     #endif                                     << 
887                                                << 
888     if ( collision.GetStatus() ) {             << 
889       if ( G4UniformRand() < theParameters->Ge << 
890         // Elastic scattering                  << 
891                                                << 
892         #ifdef debugBuildString                << 
893         G4cout << "Elastic scattering" << G4en << 
894         #endif                                 << 
895                                                << 
896         if ( ! HighEnergyInter ) {             << 
897           G4bool Annihilation = false;         << 
898           G4bool Result = AdjustNucleons( proj << 
899                                           Targ << 
900           if ( ! Result ) continue;            << 
901          }                                     << 
902          InnerSuccess = theElastic->ElasticSca << 
903       } else if ( G4UniformRand() > theParamet << 
904         // Inelastic scattering                << 
905                                                << 
906         #ifdef debugBuildString                << 
907         G4cout << "Inelastic interaction" << G << 
908                << "MaxNumOfInelCollisions per  << 
909         #endif                                 << 
910                                                << 
911         if ( ! HighEnergyInter ) {             << 
912           G4bool Annihilation = false;         << 
913           G4bool Result = AdjustNucleons( proj << 
914                                           Targ << 
915           if ( ! Result ) continue;            << 
916         }                                         224         } 
917         if ( G4UniformRand() <                 << 225 //G4cout<<"Success after GetN "<<Success<<G4endl;
918              ( 1.0 - target->GetSoftCollisionC << 226 //G4int Uzhi; G4cin>>Uzhi;
919              ( 1.0 - projectile->GetSoftCollis << 227         if(theProjectile.GetDefinition()->GetBaryonNumber() > 1)
920           //if ( ! HighEnergyInter ) {         << 228         { // Variant of FTF for projectile nuclei
921           //  G4bool Annihilation = false;     << 229 //G4cout<<"Variant of FTF for projectile nuclei"<<G4endl;
922           //  G4bool Result = AdjustNucleons(  << 230          StoreInvolvedNucleon();
923           //                                   << 231          ReggeonCascade(); 
924           //  if ( ! Result ) continue;        << 232          Success=PutOnMassShell(); 
925           //}                                  << 233          GetResidualNucleus();
926           if ( theExcitation->ExciteParticipan << 
927             InnerSuccess = true;               << 
928             NumberOfNNcollisions++;            << 
929             #ifdef debugBuildString            << 
930             G4cout << "FTF excitation Successf << 
931             // G4cout << "After  pro " << proj << 
932             //        << projectile->Get4Momen << 
933             //        << "After  tar " << targ << 
934             //        << target->Get4Momentum( << 
935             #endif                             << 
936           } else {                             << 
937             InnerSuccess = theElastic->Elastic << 
938             #ifdef debugBuildString            << 
939             G4cout << "FTF excitation Non Inne << 
940                    << InnerSuccess << G4endl;  << 
941             #endif                             << 
942           }                                    << 
943         } else {  // The inelastic interactiti << 
944           #ifdef debugBuildString              << 
945           G4cout << "Elastic scat. at rejectio << 
946           #endif                               << 
947           //if ( ! HighEnergyInter ) {         << 
948           //  G4bool Annihilation = false;     << 
949           //  G4bool Result = AdjustNucleons(  << 
950           //                                   << 
951           //  if ( ! Result) continue;         << 
952           //}                                  << 
953           InnerSuccess = theElastic->ElasticSc << 
954         }                                         234         } 
955       } else {  // Annihilation                << 
956                                                << 
957         #ifdef debugBuildString                << 
958         G4cout << "Annihilation" << G4endl;    << 
959         #endif                                 << 
960                                                << 
961         // At last, annihilation               << 
962         if ( ! HighEnergyInter ) {             << 
963           G4bool Annihilation = true;          << 
964           G4bool Result = AdjustNucleons( proj << 
965                                           Targ << 
966           if ( ! Result ) continue;            << 
967         }                                      << 
968                                                   235 
969         G4VSplitableHadron* AdditionalString = << 236 //        G4bool LowE_Anti_Ion(false);
970         if ( theAnnihilation->Annihilate( proj << 237         if(theProjectile.GetDefinition()->GetBaryonNumber() <= -1) 
971           InnerSuccess = true;                 << 238         { // Projectile is Anti-baryon or Anti-Nucleus
972           #ifdef debugBuildString              << 239 //G4cout<<"Projectile is Anti-baryon or Anti-Nucleus "<<G4endl;
973           G4cout << "Annihilation successfull. << 240 //G4cout<<"Be4 Store"<<G4endl;
974                  << AdditionalString << G4endl << 241          StoreInvolvedNucleon();
975           //G4cout << "After  pro " << project << 242          if(theProjectile.GetTotalMomentum()/
976           //G4cout << "After  tar " << target- << 243             std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) > 5000.*MeV)
977           #endif                               << 244          {// High energy interaction
978                                                << 245 //G4cout<<"High energy interaction "<<G4endl;
979           if ( AdditionalString != 0 ) theAddi << 246 //G4cout<<"Regeon "<<G4endl;
980                                                << 247           ReggeonCascade(); 
981           NumberOfNNcollisions++;              << 248 //G4cout<<"Put on mass "<<G4endl;
982                                                << 249           Success=PutOnMassShell(); 
983           // Skipping possible interactions of << 250 //G4cout<<"Residual "<<G4endl;
984           while ( theParticipants.Next() ) {   << 251           GetResidualNucleus();
985             G4InteractionContent& acollision = << 252          }
986             G4VSplitableHadron* NextProjectile << 253          else
987             G4VSplitableHadron* NextTargetNucl << 254          {
988             if ( projectile == NextProjectileN << 255 //G4cout<<"Low energy interaction "<<G4endl;
989               acollision.SetStatus( 0 );       << 256 //          LowE_Anti_Ion=true;
990             }                                  << 257           Success=true;
                                                   >> 258          }
                                                   >> 259         }
                                                   >> 260 //G4cout<<"Before Excite Success "<<Success<<G4endl;
                                                   >> 261         Success=Success && ExciteParticipants();
                                                   >> 262 //G4cout<<"Success ExciteParticipants()? "<<Success<<G4endl;
                                                   >> 263 //        if(LowE_Anti_Ion) Success=Success && GetResidualNucleusAfterAnnihilation();
                                                   >> 264 
                                                   >> 265         if( Success )
                                                   >> 266         {       
                                                   >> 267     theStrings = BuildStrings();
                                                   >> 268 //G4cout<<"BuildStrings OK"<<G4endl;
                                                   >> 269           if( theParameters != 0 )
                                                   >> 270           {
                                                   >> 271            delete theParameters;
                                                   >> 272            theParameters=0;
991           }                                       273           }
992                                                << 274          }
993           // Continue the interactions         << 275 /*
994           theParticipants.StartLoop();         << 276         if( Success )
995           for ( G4int i = 0; i < CurrentIntera << 277         {
996                                                << 278          if( ExciteParticipants() )
997           /*                                   << 279          {
998           if ( target->GetStatus() == 4 ) {    << 280 //G4cout<<"Excite partic OK"<<G4endl;
999             // Skipping possible interactions  << 281     theStrings = BuildStrings();
1000             while ( theParticipants.Next() )  << 282 //G4cout<<"Build String OK"<<G4endl;
1001               G4InteractionContent& acollisio << 283           if(LowE_Anti_Ion) GetResidualNucleusAfterAnnihilation();
1002               G4VSplitableHadron* NextProject << 284 
1003               G4VSplitableHadron* NextTargetN << 285           if( theParameters != 0 )
1004               if ( target == NextTargetNucleo << 286           {
1005             }                                 << 287            delete theParameters;
                                                   >> 288            theParameters=0;
1006           }                                      289           }
1007           theParticipants.StartLoop();        << 290          } else                      // if( ExciteParticipants() )
1008           for ( G4int I = 0; I < CurrentInter << 291          {     Success=false;}
1009           */                                  << 292         } else                       // if( Success )
1010                                               << 293         {      Success=false;}
1011         }                                     << 294 */
1012       }                                       << 295         if(!Success)   
1013     }                                         << 296         {
1014                                               << 297            // -------------- Erase the projectile ----------------
1015     if( InnerSuccess ) Success = true;        << 298 //G4cout<<"Erase Proj"<<G4endl;
1016                                               << 299    std::vector<G4VSplitableHadron *> primaries;
1017     #ifdef debugBuildString                   << 300 
1018     G4cout << "-----------------------------  << 301    theParticipants.StartLoop();    // restart a loop 
1019            << "projectile->GetStatus target-> << 302          while ( theParticipants.Next() ) 
1020            << " " << target->GetStatus() << G << 303    {
1021            << projectile->GetSoftCollisionCou << 304       const G4InteractionContent & interaction=theParticipants.GetInteraction();
1022            << G4endl << "ExciteParticipants() << 305 
1023     #endif                                    << 306                    //  do not allow for duplicates ...
1024                                               << 307       if ( primaries.end() == std::find(primaries.begin(), primaries.end(),
1025   }  // end of while ( theParticipants.Next() << 308                                                    interaction.GetProjectile()) )
1026                                               << 309         primaries.push_back(interaction.GetProjectile());                
1027   return Success;                             << 310          }
1028 }                                             << 311          std::for_each(primaries.begin(), primaries.end(), DeleteVSplitableHadron());
                                                   >> 312          primaries.clear();
                                                   >> 313         }
                                                   >> 314 // -------------- Cleaning of the memory --------------
                                                   >> 315         G4VSplitableHadron * aNucleon = 0;
                                                   >> 316 // -------------- Erase the projectile nucleon --------
                                                   >> 317 /*
                                                   >> 318         G4VSplitableHadron * aNucleon = 0;
                                                   >> 319         for(G4int i=0; i < NumberOfInvolvedNucleonOfProjectile; i++)
                                                   >> 320         {
                                                   >> 321            aNucleon = TheInvolvedNucleonOfProjectile[i]->GetSplitableHadron();
                                                   >> 322            if(aNucleon) delete aNucleon;
                                                   >> 323         } 
1029                                                  324 
                                                   >> 325         NumberOfInvolvedNucleonOfProjectile=0;
                                                   >> 326 */  // Maybe it will be needed latter------------------
1030                                                  327 
1031 //=========================================== << 328 // -------------- Erase the target nucleons -----------
                                                   >> 329 //G4cout<<"Erase Target Ninv "<<NumberOfInvolvedNucleon<<G4endl;
                                                   >> 330         for(G4int i=0; i < NumberOfInvolvedNucleon; i++)
                                                   >> 331         {
                                                   >> 332            aNucleon = TheInvolvedNucleon[i]->GetSplitableHadron();
                                                   >> 333            if(aNucleon) delete aNucleon;
                                                   >> 334         } 
1032                                                  335 
1033 G4bool G4FTFModel::AdjustNucleons( G4VSplitab << 336         NumberOfInvolvedNucleon=0;
1034                                    G4Nucleon* << 337 //G4cout<<"Go to fragmentation"<<G4endl;
1035                                    G4VSplitab << 338         return theStrings;
1036                                    G4Nucleon* << 
1037                                    G4bool Ann << 
1038                                               << 
1039   #ifdef debugAdjust                          << 
1040   G4cout << "AdjustNucleons ----------------- << 
1041          << "Proj is nucleus? " << GetProject << 
1042          << "Proj 4mom " << SelectedAntiBaryo << 
1043          << "Targ 4mom " << SelectedTargetNuc << 
1044          << "Pr ResidualMassNumber Pr Residua << 
1045          << ProjectileResidualMassNumber << " << 
1046          << ProjectileResidualExcitationEnerg << 
1047          << "Tr ResidualMassNumber Tr Residua << 
1048          << TargetResidualMassNumber << " " < << 
1049          << TargetResidualExcitationEnergy << << 
1050          << "Collis. pr tr " << SelectedAntiB << 
1051          << SelectedTargetNucleon->GetSoftCol << 
1052   #endif                                      << 
1053                                               << 
1054   if ( SelectedAntiBaryon->GetSoftCollisionCo << 
1055        SelectedTargetNucleon->GetSoftCollisio << 
1056     return true; // Selected hadrons were adj << 
1057   }                                           << 
1058                                               << 
1059   G4int interactionCase = 0;                  << 
1060   if (    ( ! GetProjectileNucleus()  &&      << 
1061             SelectedAntiBaryon->GetSoftCollis << 
1062             SelectedTargetNucleon->GetSoftCol << 
1063        ||                                     << 
1064           ( SelectedAntiBaryon->GetSoftCollis << 
1065             SelectedTargetNucleon->GetSoftCol << 
1066     // The case of hadron-nucleus interaction << 
1067     // the case when projectile nuclear nucle << 
1068     // a collision, but target nucleon did no << 
1069     interactionCase = 1;                      << 
1070     #ifdef debugAdjust                        << 
1071     G4cout << "case 1, hA prcol=0 trcol=0, AA << 
1072     #endif                                    << 
1073     if ( TargetResidualMassNumber < 1 ) {     << 
1074       return false;                           << 
1075     }                                         << 
1076     if ( SelectedAntiBaryon->Get4Momentum().r << 
1077       return false;                           << 
1078     }                                         << 
1079     if ( TargetResidualMassNumber == 1 ) {    << 
1080       TargetResidualMassNumber       = 0;     << 
1081       TargetResidualCharge           = 0;     << 
1082       TargetResidualExcitationEnergy = 0.0;   << 
1083       SelectedTargetNucleon->Set4Momentum( Ta << 
1084       TargetResidual4Momentum = G4LorentzVect << 
1085       return true;                            << 
1086     }                                         << 
1087   } else if ( SelectedAntiBaryon->GetSoftColl << 
1088               SelectedTargetNucleon->GetSoftC << 
1089     // It is assumed that in the case there i << 
1090     interactionCase = 2;                      << 
1091     #ifdef debugAdjust                        << 
1092     G4cout << "case 2,  prcol=0 trcol#0" << G << 
1093     #endif                                    << 
1094     if ( ProjectileResidualMassNumber < 1 ) { << 
1095       return false;                           << 
1096     }                                         << 
1097     if ( ProjectileResidual4Momentum.rapidity << 
1098          SelectedTargetNucleon->Get4Momentum( << 
1099       return false;                           << 
1100     }                                         << 
1101     if ( ProjectileResidualMassNumber == 1 )  << 
1102       ProjectileResidualMassNumber       = 0; << 
1103       ProjectileResidualCharge           = 0; << 
1104       ProjectileResidualExcitationEnergy = 0. << 
1105       SelectedAntiBaryon->Set4Momentum( Proje << 
1106       ProjectileResidual4Momentum = G4Lorentz << 
1107       return true;                            << 
1108     }                                         << 
1109   } else {  // It has to be a nucleus-nucleus << 
1110     interactionCase = 3;                      << 
1111     #ifdef debugAdjust                        << 
1112     G4cout << "case 3,  prcol=0 trcol=0" << G << 
1113     #endif                                    << 
1114     if ( ! GetProjectileNucleus() ) {         << 
1115       return false;                           << 
1116     }                                         << 
1117     #ifdef debugAdjust                        << 
1118     G4cout << "Proj res Init " << ProjectileR << 
1119            << "Targ res Init " << TargetResid << 
1120            << "ProjectileResidualMassNumber P << 
1121            << ProjectileResidualMassNumber << << 
1122            << " (" << ProjectileResidualLambd << 
1123            << "TargetResidualMassNumber Targe << 
1124            << " " << TargetResidualCharge <<  << 
1125     #endif                                    << 
1126   }                                           << 
1127                                               << 
1128   CommonVariables common;                     << 
1129   G4int returnCode = AdjustNucleonsAlgorithm_ << 
1130                                               << 
1131                                               << 
1132   G4bool returnResult = false;                << 
1133   if ( returnCode == 0 ) {                    << 
1134     returnResult = true;  // Successfully end << 
1135   } else if ( returnCode == 1 ) {             << 
1136     // The part before sampling has been succ << 
1137     returnResult = AdjustNucleonsAlgorithm_Sa << 
1138     if ( returnResult ) {  // The sampling ha << 
1139       AdjustNucleonsAlgorithm_afterSampling(  << 
1140                                               << 
1141     }                                         << 
1142   }                                           << 
1143                                                  339 
1144   return returnResult;                        << 
1145 }                                                340 }
1146                                                  341 
1147 //-------------------------------------------    342 //-------------------------------------------------------------------
                                                   >> 343 void G4FTFModel::StoreInvolvedNucleon()                             
                                                   >> 344 { //--- To store nucleons involved in low energy interaction  -------
                                                   >> 345 if(std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) <= 1)
                                                   >> 346 { // the projectile is a hadron -----------
                                                   >> 347 //G4cout<<"the projectile is a hadron"<<G4endl;
                                                   >> 348         NumberOfInvolvedNucleon=0;
                                                   >> 349 
                                                   >> 350         theParticipants.StartLoop();
                                                   >> 351 
                                                   >> 352   while (theParticipants.Next())
                                                   >> 353   {   
                                                   >> 354 //G4cout<<"theParticipants.Next()"<<G4endl;
                                                   >> 355      const G4InteractionContent & collision=theParticipants.GetInteraction();
                                                   >> 356 //G4cout<<"collision=theParticipants.GetInteraction()"<<G4endl;
                                                   >> 357            G4Nucleon * TargetNucleon=collision.GetTargetNucleon();
                                                   >> 358 //G4cout<<"TargetNucleon=collision.GetTargetNucleon()"<<G4endl;
                                                   >> 359 
                                                   >> 360            TheInvolvedNucleon[NumberOfInvolvedNucleon]=TargetNucleon;
                                                   >> 361            NumberOfInvolvedNucleon++;
                                                   >> 362 //G4cout<<G4endl<<"Prim NumberOfInvolvedNucleon "<<NumberOfInvolvedNucleon<<G4endl;
                                                   >> 363   }      // end of while (theParticipants.Next())
                                                   >> 364 
                                                   >> 365         NumberOfInvolvedTargetNucleon=NumberOfInvolvedNucleon;
                                                   >> 366 // ---------------- Calculation of creation time for each target nucleon -----------
                                                   >> 367 //G4cout<<"theParticipants.StartLoop() "<<G4endl;
                                                   >> 368   theParticipants.StartLoop();    // restart a loop
                                                   >> 369 //G4cout<<"theParticipants.Next();"<<G4endl;
                                                   >> 370         theParticipants.Next();
                                                   >> 371   G4VSplitableHadron * primary = theParticipants.GetInteraction().GetProjectile();
                                                   >> 372 //G4cout<<"primary->Get4Momentum() "<<primary->Get4Momentum()<<G4endl;
                                                   >> 373 //G4cout<<"primary->Get4Momentum().pz() "<<primary->Get4Momentum().pz()<<G4endl;
                                                   >> 374 //G4cout<<"primary->Get4Momentum().e() "<<primary->Get4Momentum().e()<<G4endl;
                                                   >> 375 
                                                   >> 376         G4double betta_z=primary->Get4Momentum().pz()/primary->Get4Momentum().e();
                                                   >> 377 //G4cout<<"betta_z "<<betta_z<<G4endl;
                                                   >> 378         primary->SetTimeOfCreation(0.);
                                                   >> 379 
                                                   >> 380         G4double ZcoordinateOfPreviousCollision(0.);
                                                   >> 381         G4double ZcoordinateOfCurrentInteraction(0.);
                                                   >> 382         G4double TimeOfPreviousCollision(0.);
                                                   >> 383         G4double TimeOfCurrentCollision(0);
                                                   >> 384 
                                                   >> 385         theParticipants.theNucleus->StartLoop();
                                                   >> 386         G4Nucleon * aNucleon;
                                                   >> 387         G4bool theFirstInvolvedNucleon(true);
                                                   >> 388   while ( (aNucleon = theParticipants.theNucleus->GetNextNucleon()) )
                                                   >> 389         {
                                                   >> 390 //G4cout<<"aNucleon->AreYouHit() "<<aNucleon->AreYouHit()<<G4endl;
                                                   >> 391           if(aNucleon->AreYouHit())
                                                   >> 392           {
                                                   >> 393             if(theFirstInvolvedNucleon)
                                                   >> 394             {
                                                   >> 395               ZcoordinateOfPreviousCollision=aNucleon->GetPosition().z();
                                                   >> 396 //G4cout<<"ZcoordinateOfPreviousCollision "<<ZcoordinateOfPreviousCollision/fermi<<G4endl;
                                                   >> 397               theFirstInvolvedNucleon=false;
                                                   >> 398             }
1148                                                  399 
1149 G4int G4FTFModel::AdjustNucleonsAlgorithm_bef << 400             ZcoordinateOfCurrentInteraction=aNucleon->GetPosition().z();
1150                                               << 401 //G4cout<<"ZcoordinateOfCurrentInteraction "<<ZcoordinateOfCurrentInteraction/fermi<<G4endl;
1151                                               << 402 //G4cout<<"TimeOfPreviousCollision "<<TimeOfPreviousCollision<<G4endl;
1152                                               << 403 
1153                                               << 404             // A.R. 18-Oct-2011 : Protection needed for nuclear capture of
1154                                               << 405             //                    anti-proton at rest.
1155                                               << 406       if ( betta_z > 1.0e-10 ) {
1156   // First of the three utility methods used  << 407               TimeOfCurrentCollision=TimeOfPreviousCollision+ 
1157   // This method returns an integer code - in << 408               (ZcoordinateOfCurrentInteraction-ZcoordinateOfPreviousCollision)/betta_z;
1158   //   "0" : successfully ended and nothing e << 409             } else {
1159   //   "1" : successfully completed, but the  << 410               TimeOfCurrentCollision=TimeOfPreviousCollision;
1160   //  "99" : unsuccessfully ended, nothing el << 411             } 
1161   G4int returnCode = 99;                      << 412 
1162                                               << 413 //G4cout<<"TimeOfCurrentCollision "<<TimeOfCurrentCollision<<G4endl;
1163   G4double ExcitationEnergyPerWoundedNucleon  << 414 // It is assumed that the nucleons are ordered on increasing z-coordinate ------------
1164                                               << 415             aNucleon->GetSplitableHadron()->SetTimeOfCreation(TimeOfCurrentCollision);
1165   // some checks and initializations          << 416 
1166   if ( interactionCase == 1 ) {               << 417             ZcoordinateOfPreviousCollision=ZcoordinateOfCurrentInteraction;
1167     common.Psum = SelectedAntiBaryon->Get4Mom << 418             TimeOfPreviousCollision=TimeOfCurrentCollision;
1168     #ifdef debugAdjust                        << 419           }  // end of if(aNucleon->AreYouHit())
1169     G4cout << "Targ res Init " << TargetResid << 420   }   // end of while (theParticipant.theNucleus->GetNextNucleon())
1170     #endif                                    << 421 //
1171     common.Pprojectile = SelectedAntiBaryon-> << 422         return;
1172   } else if ( interactionCase == 2 ) {        << 423 } // end of if(std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) <= 1)
1173     common.Psum = ProjectileResidual4Momentum << 
1174     common.Pprojectile = ProjectileResidual4M << 
1175   } else if ( interactionCase == 3 ) {        << 
1176     common.Psum = ProjectileResidual4Momentum << 
1177     common.Pprojectile = ProjectileResidual4M << 
1178   }                                           << 
1179                                               << 
1180   // transform momenta to cms and then rotate << 
1181   common.toCms = G4LorentzRotation( -1*common << 
1182   common.Ptmp = common.toCms * common.Pprojec << 
1183   common.toCms.rotateZ( -1*common.Ptmp.phi()  << 
1184   common.toCms.rotateY( -1*common.Ptmp.theta( << 
1185   common.Pprojectile.transform( common.toCms  << 
1186   common.toLab = common.toCms.inverse();      << 
1187   common.SqrtS = common.Psum.mag();           << 
1188   common.S = sqr( common.SqrtS );             << 
1189                                               << 
1190   // get properties of the target residual an << 
1191   G4bool Stopping = false;                    << 
1192   if ( interactionCase == 1 ) {               << 
1193     common.TResidualMassNumber = TargetResidu << 
1194     common.TResidualCharge =   TargetResidual << 
1195                              - G4int( TargetN << 
1196     common.TResidualExcitationEnergy =   Targ << 
1197                                        - Exci << 
1198     if ( common.TResidualMassNumber <= 1 ) {  << 
1199       common.TResidualExcitationEnergy = 0.0; << 
1200     }                                         << 
1201     if ( common.TResidualMassNumber != 0 ) {  << 
1202       common.TResidualMass = G4ParticleTable: << 
1203                              ->GetIonMass( co << 
1204     }                                         << 
1205     common.TNucleonMass = TargetNucleon->GetD << 
1206     common.SumMasses =   SelectedAntiBaryon-> << 
1207                        + common.TResidualMass << 
1208     #ifdef debugAdjust                        << 
1209     G4cout << "Annihilation " << Annihilation << 
1210     #endif                                    << 
1211   } else if ( interactionCase == 2 ) {        << 
1212     common.Ptarget = common.toCms * SelectedT << 
1213     common.TResidualMassNumber = ProjectileRe << 
1214     common.TResidualCharge =   ProjectileResi << 
1215                              - std::abs( G4in << 
1216     common.TResidualExcitationEnergy =   Proj << 
1217                                        - Exci << 
1218     if ( common.TResidualMassNumber <= 1 ) {  << 
1219       common.TResidualExcitationEnergy = 0.0; << 
1220     }                                         << 
1221     if ( common.TResidualMassNumber != 0 ) {  << 
1222       common.TResidualMass = G4ParticleTable: << 
1223                              ->GetIonMass( co << 
1224     }                                         << 
1225     common.TNucleonMass = ProjectileNucleon-> << 
1226     common.SumMasses =   SelectedTargetNucleo << 
1227                        + common.TResidualMass << 
1228     #ifdef debugAdjust                        << 
1229     G4cout << "SelectedTN.mag() PNMass + PRes << 
1230            << SelectedTargetNucleon->Get4Mome << 
1231            << common.TNucleonMass << " " << c << 
1232     #endif                                    << 
1233   } else if ( interactionCase == 3 ) {        << 
1234     common.Ptarget = common.toCms * TargetRes << 
1235     common.PResidualMassNumber = ProjectileRe << 
1236     common.PResidualCharge =   ProjectileResi << 
1237                              - std::abs( G4in << 
1238     common.PResidualLambdaNumber = Projectile << 
1239     if ( ProjectileNucleon->GetDefinition() = << 
1240    ProjectileNucleon->GetDefinition() == G4An << 
1241       --common.PResidualLambdaNumber;         << 
1242     }                                         << 
1243     common.PResidualExcitationEnergy =   Proj << 
1244                                        - Exci << 
1245     if ( common.PResidualMassNumber <= 1 ) {  << 
1246       common.PResidualExcitationEnergy = 0.0; << 
1247     }                                         << 
1248     if ( common.PResidualMassNumber != 0 ) {  << 
1249       if ( common.PResidualMassNumber == 1 )  << 
1250         if ( std::abs( common.PResidualCharge << 
1251           common.PResidualMass = G4Proton::De << 
1252         } else if ( common.PResidualLambdaNum << 
1253           common.PResidualMass = G4Lambda::De << 
1254         } else {                              << 
1255           common.PResidualMass = G4Neutron::D << 
1256         }                                     << 
1257       } else {                                << 
1258         if ( common.PResidualLambdaNumber > 0 << 
1259           if ( common.PResidualMassNumber ==  << 
1260             common.PResidualMass = G4Lambda:: << 
1261       if ( std::abs( common.PResidualCharge ) << 
1262         common.PResidualMass += G4Proton::Def << 
1263       } else if ( common.PResidualLambdaNumbe << 
1264         common.PResidualMass += G4Neutron::De << 
1265       } else {                                << 
1266         common.PResidualMass += G4Lambda::Def << 
1267       }                                       << 
1268     } else {                                  << 
1269       common.PResidualMass = G4HyperNucleiPro << 
1270                         std::abs( common.PRes << 
1271                       common.PResidualLambdaN << 
1272     }                                         << 
1273         } else {                              << 
1274     common.PResidualMass = G4ParticleTable::G << 
1275                            GetIonMass( std::a << 
1276         }                                     << 
1277       }                                       << 
1278     }                                         << 
1279     common.PNucleonMass = ProjectileNucleon-> << 
1280     common.TResidualMassNumber = TargetResidu << 
1281     common.TResidualCharge =   TargetResidual << 
1282                              - G4int( TargetN << 
1283     common.TResidualExcitationEnergy =   Targ << 
1284                                        - Exci << 
1285     if ( common.TResidualMassNumber <= 1 ) {  << 
1286       common.TResidualExcitationEnergy = 0.0; << 
1287     }                                         << 
1288     if ( common.TResidualMassNumber != 0 ) {  << 
1289       common.TResidualMass = G4ParticleTable: << 
1290                              GetIonMass( comm << 
1291     }                                         << 
1292     common.TNucleonMass = TargetNucleon->GetD << 
1293     common.SumMasses =   common.PNucleonMass  << 
1294                        + common.TResidualMass << 
1295     #ifdef debugAdjust                        << 
1296     G4cout << "PNucleonMass PResidualMass TNu << 
1297            << " " << common.PResidualMass <<  << 
1298            << common.TResidualMass << G4endl  << 
1299            << "PResidualExcitationEnergy " << << 
1300            << "TResidualExcitationEnergy " << << 
1301     #endif                                    << 
1302   }  // End-if on interactionCase             << 
1303                                               << 
1304   if ( ! Annihilation ) {                     << 
1305     if ( common.SqrtS < common.SumMasses ) {  << 
1306       #ifdef debugAdjust                      << 
1307       G4cout << "SqrtS < SumMasses " << commo << 
1308       #endif                                  << 
1309       return returnCode;  // Unsuccessfully e << 
1310     }                                         << 
1311     if ( interactionCase == 1  ||  interactio << 
1312       if ( common.SqrtS < common.SumMasses +  << 
1313         #ifdef debugAdjust                    << 
1314         G4cout << "TResidualExcitationEnergy  << 
1315         #endif                                << 
1316         common.TResidualExcitationEnergy = co << 
1317         #ifdef debugAdjust                    << 
1318         G4cout << "TResidualExcitationEnergy  << 
1319         #endif                                << 
1320         Stopping = true;                      << 
1321         return returnCode;  // unsuccessfully << 
1322       }                                       << 
1323     } else if ( interactionCase == 3 ) {      << 
1324       #ifdef debugAdjust                      << 
1325       G4cout << "SqrtS < SumMasses + PResidua << 
1326              << common.SqrtS << " " << common << 
1327              << G4endl;                       << 
1328       #endif                                  << 
1329       if ( common.SqrtS <   common.SumMasses  << 
1330                           + common.TResidualE << 
1331         Stopping = true;                      << 
1332         if ( common.PResidualExcitationEnergy << 
1333           common.TResidualExcitationEnergy =  << 
1334         } else if ( common.TResidualExcitatio << 
1335           common.PResidualExcitationEnergy =  << 
1336         } else {                              << 
1337           G4double Fraction = ( common.SqrtS  << 
1338             /  ( common.PResidualExcitationEn << 
1339           common.PResidualExcitationEnergy *= << 
1340           common.TResidualExcitationEnergy *= << 
1341         }                                     << 
1342       }                                       << 
1343     }                                         << 
1344   }  // End-if on ! Annihilation              << 
1345                                               << 
1346   if ( Annihilation ) {                       << 
1347     #ifdef debugAdjust                        << 
1348     G4cout << "SqrtS < SumMasses - TNucleonMa << 
1349            << common.SumMasses - common.TNucl << 
1350     #endif                                    << 
1351     if ( common.SqrtS < common.SumMasses - co << 
1352       return returnCode;  // unsuccessfully e << 
1353     }                                         << 
1354     #ifdef debugAdjust                        << 
1355     G4cout << "SqrtS < SumMasses " << common. << 
1356     #endif                                    << 
1357     if ( common.SqrtS < common.SumMasses ) {  << 
1358       if ( interactionCase == 2  ||  interact << 
1359         common.TResidualExcitationEnergy = 0. << 
1360       }                                       << 
1361       common.TNucleonMass =   common.SqrtS -  << 
1362                             - common.TResidua << 
1363       #ifdef debugAdjust                      << 
1364       G4cout << "TNucleonMass " << common.TNu << 
1365       #endif                                  << 
1366       common.SumMasses = common.SqrtS - commo << 
1367       Stopping = true;                        << 
1368       #ifdef debugAdjust                      << 
1369       G4cout << "SqrtS < SumMasses " << commo << 
1370       #endif                                  << 
1371     }                                         << 
1372     if ( interactionCase == 1  ||  interactio << 
1373       if ( common.SqrtS < common.SumMasses +  << 
1374         common.TResidualExcitationEnergy = co << 
1375         Stopping = true;                      << 
1376       }                                       << 
1377     } else if ( interactionCase == 3 ) {      << 
1378       if ( common.SqrtS <   common.SumMasses  << 
1379                           + common.TResidualE << 
1380         Stopping = true;                      << 
1381         if ( common.PResidualExcitationEnergy << 
1382           common.TResidualExcitationEnergy =  << 
1383         } else if ( common.TResidualExcitatio << 
1384           common.PResidualExcitationEnergy =  << 
1385         } else {                              << 
1386           G4double Fraction = ( common.SqrtS  << 
1387             ( common.PResidualExcitationEnerg << 
1388           common.PResidualExcitationEnergy *= << 
1389           common.TResidualExcitationEnergy *= << 
1390         }                                     << 
1391       }                                       << 
1392     }                                         << 
1393   }  // End-if on Annihilation                << 
1394                                               << 
1395   #ifdef debugAdjust                          << 
1396   G4cout << "Stopping " << Stopping << G4endl << 
1397   #endif                                      << 
1398                                               << 
1399   if ( Stopping ) {                           << 
1400     // All 3-momenta of particles = 0         << 
1401     common.Ptmp.setPx( 0.0 ); common.Ptmp.set << 
1402     // New projectile                         << 
1403     if ( interactionCase == 1 ) {             << 
1404       common.Ptmp.setE( SelectedAntiBaryon->G << 
1405     } else if ( interactionCase == 2 ) {      << 
1406       common.Ptmp.setE( common.TNucleonMass ) << 
1407     } else if ( interactionCase == 3 ) {      << 
1408       common.Ptmp.setE( common.PNucleonMass ) << 
1409     }                                         << 
1410     #ifdef debugAdjust                        << 
1411     G4cout << "Proj stop " << common.Ptmp <<  << 
1412     #endif                                    << 
1413     common.Pprojectile = common.Ptmp;         << 
1414     common.Pprojectile.transform( common.toLa << 
1415     //---AR-Jul2019 : To avoid unphysical pro << 
1416     //                original momentum of th << 
1417     G4LorentzVector saveSelectedAntiBaryon4Mo << 
1418     saveSelectedAntiBaryon4Momentum.transform << 
1419     //---                                     << 
1420     SelectedAntiBaryon->Set4Momentum( common. << 
1421     // New target nucleon                     << 
1422     if ( interactionCase == 1  ||  interactio << 
1423       common.Ptmp.setE( common.TNucleonMass ) << 
1424     } else if ( interactionCase == 2 ) {      << 
1425       common.Ptmp.setE( SelectedTargetNucleon << 
1426     }                                         << 
1427     #ifdef debugAdjust                        << 
1428     G4cout << "Targ stop " << common.Ptmp <<  << 
1429     #endif                                    << 
1430     common.Ptarget = common.Ptmp;             << 
1431     common.Ptarget.transform( common.toLab ); << 
1432     //---AR-Jul2019 : To avoid unphysical tar << 
1433     //                momentum of the target  << 
1434     G4LorentzVector saveSelectedTargetNucleon << 
1435     saveSelectedTargetNucleon4Momentum.transf << 
1436     //---                                     << 
1437     SelectedTargetNucleon->Set4Momentum( comm << 
1438     // New target residual                    << 
1439     if ( interactionCase == 1  ||  interactio << 
1440       common.Ptmp.setPx( 0.0 ); common.Ptmp.s << 
1441       TargetResidualMassNumber       = common << 
1442       TargetResidualCharge           = common << 
1443       TargetResidualExcitationEnergy = common << 
1444       //---AR-Jul2019 : To avoid unphysical t << 
1445       //                original momentum of  << 
1446       //                This is a rough and s << 
1447       //common.Ptmp.setE( common.TResidualMas << 
1448       common.Ptmp.setPx( -saveSelectedTargetN << 
1449       common.Ptmp.setPy( -saveSelectedTargetN << 
1450       common.Ptmp.setPz( -saveSelectedTargetN << 
1451       common.Ptmp.setE( std::sqrt( sqr( commo << 
1452       //---                                   << 
1453       #ifdef debugAdjust                      << 
1454       G4cout << "Targ Resi stop " << common.P << 
1455       #endif                                  << 
1456       common.Ptmp.transform( common.toLab );  << 
1457       TargetResidual4Momentum = common.Ptmp;  << 
1458     }                                         << 
1459     // New projectile residual                << 
1460     if ( interactionCase == 2  ||  interactio << 
1461       common.Ptmp.setPx( 0.0 ); common.Ptmp.s << 
1462       if ( interactionCase == 2 ) {           << 
1463         ProjectileResidualMassNumber       =  << 
1464         ProjectileResidualCharge           =  << 
1465   ProjectileResidualLambdaNumber     = 0;  // << 
1466         ProjectileResidualExcitationEnergy =  << 
1467         common.Ptmp.setE( common.TResidualMas << 
1468       } else {                                << 
1469         ProjectileResidualMassNumber       =  << 
1470         ProjectileResidualCharge           =  << 
1471   ProjectileResidualLambdaNumber     = common << 
1472         ProjectileResidualExcitationEnergy =  << 
1473         //---AR-Jul2019 : To avoid unphysical << 
1474         //                saved original mome << 
1475         //                This is a rough and << 
1476         //common.Ptmp.setE( common.PResidualM << 
1477         common.Ptmp.setPx( -saveSelectedAntiB << 
1478         common.Ptmp.setPy( -saveSelectedAntiB << 
1479         common.Ptmp.setPz( -saveSelectedAntiB << 
1480         common.Ptmp.setE( std::sqrt( sqr( com << 
1481         //---                                 << 
1482       }                                       << 
1483       #ifdef debugAdjust                      << 
1484       G4cout << "Proj Resi stop " << common.P << 
1485       #endif                                  << 
1486       common.Ptmp.transform( common.toLab );  << 
1487       ProjectileResidual4Momentum = common.Pt << 
1488     }                                         << 
1489     return returnCode = 0;  // successfully e << 
1490   }  // End-if on Stopping                    << 
1491                                               << 
1492   // Initializations before sampling          << 
1493   if ( interactionCase == 1 ) {               << 
1494     common.Mprojectile  = common.Pprojectile. << 
1495     common.M2projectile = common.Pprojectile. << 
1496     common.TResidual4Momentum = common.toCms  << 
1497     common.YtargetNucleus = common.TResidual4 << 
1498     common.TResidualMass += common.TResidualE << 
1499   } else if ( interactionCase == 2 ) {        << 
1500     common.Mtarget  = common.Ptarget.mag();   << 
1501     common.M2target = common.Ptarget.mag2();  << 
1502     common.TResidual4Momentum = common.toCms  << 
1503     common.YprojectileNucleus = common.TResid << 
1504     common.TResidualMass += common.TResidualE << 
1505   } else if ( interactionCase == 3 ) {        << 
1506     common.PResidual4Momentum = common.toCms  << 
1507     common.YprojectileNucleus = common.PResid << 
1508     common.TResidual4Momentum = common.toCms* << 
1509     common.YtargetNucleus = common.TResidual4 << 
1510     common.PResidualMass += common.PResidualE << 
1511     common.TResidualMass += common.TResidualE << 
1512   }                                           << 
1513   #ifdef debugAdjust                          << 
1514   G4cout << "YprojectileNucleus " << common.Y << 
1515   #endif                                      << 
1516                                                  424 
1517   return returnCode = 1;  // successfully com << 425 // The projectile is a nucleus or an anti-nucleus
1518 }                                             << 426 //G4cout<<"FTF The projectile is a nucleus or an anti-nucleus"<<G4endl;
                                                   >> 427         NumberOfInvolvedNucleonOfProjectile=0;
                                                   >> 428 
                                                   >> 429         G4V3DNucleus * ProjectileNucleus =theParticipants.GetProjectileNucleus();
                                                   >> 430   ProjectileNucleus->StartLoop();
                                                   >> 431 
                                                   >> 432         G4Nucleon *    ProjectileNucleon;
                                                   >> 433         while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
                                                   >> 434         {
                                                   >> 435          if ( ProjectileNucleon->AreYouHit() )
                                                   >> 436          {  // Projectile nucleon was involved in the interaction.
                                                   >> 437            TheInvolvedNucleonOfProjectile[NumberOfInvolvedNucleonOfProjectile]=
                                                   >> 438                                     ProjectileNucleon;
                                                   >> 439            NumberOfInvolvedNucleonOfProjectile++;
                                                   >> 440          }
                                                   >> 441         } // End of while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
                                                   >> 442 
                                                   >> 443 //------------------
                                                   >> 444         NumberOfInvolvedNucleon=0;
                                                   >> 445 
                                                   >> 446         G4V3DNucleus * TargetNucleus =theParticipants.GetWoundedNucleus();
                                                   >> 447   TargetNucleus->StartLoop();
                                                   >> 448 
                                                   >> 449         G4Nucleon *    TargetNucleon;
                                                   >> 450         while ( (TargetNucleon=TargetNucleus->GetNextNucleon()) )
                                                   >> 451         {
                                                   >> 452          if ( TargetNucleon->AreYouHit() )
                                                   >> 453          {  // Target nucleon was involved in the interaction.
                                                   >> 454            TheInvolvedNucleon[NumberOfInvolvedNucleon]=TargetNucleon;
                                                   >> 455            NumberOfInvolvedNucleon++;
                                                   >> 456          }
                                                   >> 457         } // End of while ( (TargetNucleon=TargetNucleus->GetNextNucleon()) )
                                                   >> 458 //G4cout<<"Store inv "<<NumberOfInvolvedNucleonOfProjectile<<" "<<NumberOfInvolvedNucleon<<G4endl;
1519                                                  459 
                                                   >> 460         NumberOfInvolvedTargetNucleon=NumberOfInvolvedNucleon;
                                                   >> 461         return;
                                                   >> 462 }                                                             // Uzhi 10 Feb. 2011
1520                                                  463 
1521 //-------------------------------------------    464 //-------------------------------------------------------------------
                                                   >> 465 void G4FTFModel::ReggeonCascade()                             
                                                   >> 466 { //--- Implementation of the reggeon theory inspired model-------
                                                   >> 467 //G4cout<<"In reggeon"<<G4endl;
                                                   >> 468 
                                                   >> 469         if(std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) > 1) return;
                                                   >> 470 //      For Nucleus-nucleus or Anti-nucleus - nucleus interactions 
                                                   >> 471 //      the cascading will be implemented latter.
                                                   >> 472 
                                                   >> 473         NumberOfInvolvedNucleon=0;
                                                   >> 474 
                                                   >> 475         theParticipants.StartLoop();
                                                   >> 476   while (theParticipants.Next())
                                                   >> 477   {   
                                                   >> 478      const G4InteractionContent & collision=theParticipants.GetInteraction();
                                                   >> 479 
                                                   >> 480            G4Nucleon * TargetNucleon=collision.GetTargetNucleon();
                                                   >> 481 
                                                   >> 482            TheInvolvedNucleon[NumberOfInvolvedNucleon]=TargetNucleon;
                                                   >> 483            NumberOfInvolvedNucleon++;
                                                   >> 484 //G4cout<<"Prim NumberOfInvolvedNucleon "<<NumberOfInvolvedNucleon<<G4endl;
                                                   >> 485            G4double XofWoundedNucleon = TargetNucleon->GetPosition().x();
                                                   >> 486            G4double YofWoundedNucleon = TargetNucleon->GetPosition().y();
                                                   >> 487 
                                                   >> 488            theParticipants.theNucleus->StartLoop();
                                                   >> 489            G4Nucleon * Neighbour(0);
                                                   >> 490 
                                                   >> 491      while ( (Neighbour = theParticipants.theNucleus->GetNextNucleon()) )
                                                   >> 492            {
                                                   >> 493             if(!Neighbour->AreYouHit())
                                                   >> 494             {
                                                   >> 495            G4double impact2= sqr(XofWoundedNucleon - Neighbour->GetPosition().x()) +
                                                   >> 496                                sqr(YofWoundedNucleon - Neighbour->GetPosition().y());
                                                   >> 497 
                                                   >> 498              if(G4UniformRand() < theParameters->GetCofNuclearDestruction()*
                                                   >> 499                 std::exp(-impact2/theParameters->GetR2ofNuclearDestruction()))  
                                                   >> 500              { // The neighbour nucleon is involved in the reggeon cascade
                                                   >> 501 
                                                   >> 502               TheInvolvedNucleon[NumberOfInvolvedNucleon]=Neighbour;
                                                   >> 503               NumberOfInvolvedNucleon++;
                                                   >> 504 //G4cout<<"Seco NumberOfInvolvedNucleon "<<NumberOfInvolvedNucleon<<G4endl;
                                                   >> 505 
                                                   >> 506               G4VSplitableHadron *targetSplitable; 
                                                   >> 507               targetSplitable = new G4DiffractiveSplitableHadron(*Neighbour); 
                                                   >> 508 
                                                   >> 509               Neighbour->Hit(targetSplitable);
                                                   >> 510               targetSplitable->SetStatus(2);     
                                                   >> 511              }
                                                   >> 512             }  // end of if(!Neighbour->AreYouHit())
                                                   >> 513      }   // end of while (theParticipant.theNucleus->GetNextNucleon())
                                                   >> 514   }      // end of while (theParticipants.Next())
                                                   >> 515 
                                                   >> 516         NumberOfInvolvedTargetNucleon=NumberOfInvolvedNucleon;
                                                   >> 517 
                                                   >> 518 // ---------------- Calculation of creation time for each target nucleon -----------
                                                   >> 519   theParticipants.StartLoop();    // restart a loop
                                                   >> 520         theParticipants.Next();
                                                   >> 521   G4VSplitableHadron * primary = theParticipants.GetInteraction().GetProjectile();
                                                   >> 522         G4double betta_z=primary->Get4Momentum().pz()/primary->Get4Momentum().e();
                                                   >> 523         primary->SetTimeOfCreation(0.);
                                                   >> 524 
                                                   >> 525         G4double ZcoordinateOfPreviousCollision(0.);
                                                   >> 526         G4double ZcoordinateOfCurrentInteraction(0.);
                                                   >> 527         G4double TimeOfPreviousCollision(0.);
                                                   >> 528         G4double TimeOfCurrentCollision(0);
                                                   >> 529 
                                                   >> 530         theParticipants.theNucleus->StartLoop();
                                                   >> 531         G4Nucleon * aNucleon;
                                                   >> 532         G4bool theFirstInvolvedNucleon(true);
                                                   >> 533   while ( (aNucleon = theParticipants.theNucleus->GetNextNucleon()) )
                                                   >> 534         {
                                                   >> 535           if(aNucleon->AreYouHit())
                                                   >> 536           {
                                                   >> 537             if(theFirstInvolvedNucleon)
                                                   >> 538             {
                                                   >> 539               ZcoordinateOfPreviousCollision=aNucleon->GetPosition().z();
                                                   >> 540               theFirstInvolvedNucleon=false;
                                                   >> 541             }
1522                                                  542 
1523 G4bool G4FTFModel::AdjustNucleonsAlgorithm_Sa << 543             ZcoordinateOfCurrentInteraction=aNucleon->GetPosition().z();
1524                                               << 544             TimeOfCurrentCollision=TimeOfPreviousCollision+ 
1525   // Second of the three utility methods used << 545             (ZcoordinateOfCurrentInteraction-ZcoordinateOfPreviousCollision)/betta_z; 
1526   // This method returns "false" if it fails  << 546 // It is assumed that the nucleons are ordered on increasing z-coordinate ------------
1527                                               << 547             aNucleon->GetSplitableHadron()->SetTimeOfCreation(TimeOfCurrentCollision);
1528   // Ascribing of the involved nucleons Pt an << 548 
1529   G4double Dcor = theParameters->GetDofNuclea << 549             ZcoordinateOfPreviousCollision=ZcoordinateOfCurrentInteraction;
1530   G4double DcorP = 0.0, DcorT = 0.0;          << 550             TimeOfPreviousCollision=TimeOfCurrentCollision;
1531   if ( ProjectileResidualMassNumber != 0 ) Dc << 551           }  // end of if(aNucleon->AreYouHit())
1532   if ( TargetResidualMassNumber != 0 )     Dc << 552   }   // end of while (theParticipant.theNucleus->GetNextNucleon())
1533   G4double AveragePt2 = theParameters->GetPt2 << 553 //
1534   G4double maxPtSquare = theParameters->GetMa << 554 // The algorithm can be improved, but it will be more complicated, and will require
1535                                               << 555 // changes in G4DiffractiveExcitation.cc and G4ElasticHNScattering.cc
1536   G4double ScaleFactor = 1.0;                 << 556 }                                                             // Uzhi 26 July 2009
1537   G4bool OuterSuccess = true;                 << 
1538   const G4int maxNumberOfLoops = 1000;        << 
1539   const G4int maxNumberOfTries = 10000;       << 
1540   G4int loopCounter = 0;                      << 
1541   G4int NumberOfTries = 0;                    << 
1542   do {  // Outmost do while loop              << 
1543     OuterSuccess = true;                      << 
1544     G4bool loopCondition = false;             << 
1545     do {  // Intermediate do while loop       << 
1546       if ( NumberOfTries == 100*(NumberOfTrie << 
1547         // At large number of tries it would  << 
1548         ScaleFactor /= 2.0;                   << 
1549         DcorP      *= ScaleFactor;            << 
1550         DcorT      *= ScaleFactor;            << 
1551         AveragePt2 *= ScaleFactor;            << 
1552         #ifdef debugAdjust                    << 
1553         //G4cout << "NumberOfTries ScaleFacto << 
1554         #endif                                << 
1555       }                                       << 
1556                                               << 
1557       // Some kinematics                      << 
1558       if ( interactionCase == 1 ) {           << 
1559       } else if ( interactionCase == 2 ) {    << 
1560         #ifdef debugAdjust                    << 
1561         G4cout << "ProjectileResidualMassNumb << 
1562         #endif                                << 
1563         if ( ProjectileResidualMassNumber > 1 << 
1564           common.PtNucleon = GaussianPt( Aver << 
1565         } else {                              << 
1566           common.PtNucleon = G4ThreeVector( 0 << 
1567         }                                     << 
1568         common.PtResidual = - common.PtNucleo << 
1569         common.Mprojectile =   std::sqrt( sqr << 
1570                              + std::sqrt( sqr << 
1571         #ifdef debugAdjust                    << 
1572         G4cout << "SqrtS < Mtarget + Mproject << 
1573                << " " << common.Mprojectile < << 
1574         #endif                                << 
1575         common.M2projectile = sqr( common.Mpr << 
1576         if ( common.SqrtS < common.Mtarget +  << 
1577           OuterSuccess = false;               << 
1578           loopCondition = true;               << 
1579           continue;                           << 
1580         }                                     << 
1581       } else if ( interactionCase == 3 ) {    << 
1582         if ( ProjectileResidualMassNumber > 1 << 
1583           common.PtNucleonP = GaussianPt( Ave << 
1584         } else {                              << 
1585           common.PtNucleonP = G4ThreeVector(  << 
1586         }                                     << 
1587         common.PtResidualP = - common.PtNucle << 
1588         if ( TargetResidualMassNumber > 1 ) { << 
1589           common.PtNucleonT = GaussianPt( Ave << 
1590         } else {                              << 
1591           common.PtNucleonT = G4ThreeVector(  << 
1592         }                                     << 
1593         common.PtResidualT = - common.PtNucle << 
1594         common.Mprojectile =   std::sqrt( sqr << 
1595                              + std::sqrt( sqr << 
1596         common.M2projectile = sqr( common.Mpr << 
1597         common.Mtarget =   std::sqrt( sqr( co << 
1598                          + std::sqrt( sqr( co << 
1599         common.M2target = sqr( common.Mtarget << 
1600         if ( common.SqrtS < common.Mprojectil << 
1601           OuterSuccess = false;               << 
1602           loopCondition = true;               << 
1603           continue;                           << 
1604         }                                     << 
1605       }  // End-if on interactionCase         << 
1606                                                  557 
1607       G4int numberOfTimesExecuteInnerLoop = 1 << 558 // ------------------------------------------------------------
1608       if ( interactionCase == 3 ) numberOfTim << 559 G4bool G4FTFModel::PutOnMassShell()
1609       for ( G4int iExecute = 0; iExecute < nu << 560 {
1610                                               << 561 //G4cout<<"PutOnMassShell start "<<G4endl;
1611         G4bool InnerSuccess = true;           << 562         if(std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) > 1) // !!!!
1612         G4bool isTargetToBeHandled = ( intera << 563         { // The projectile is a nucleus or an anti-nucleus
1613                                        ( inte << 564 //G4cout<<"PutOnMassShell AA "<<G4endl;
1614         G4bool condition = false;             << 565          G4LorentzVector P_total(0.,0.,0.,0.);
1615         if ( isTargetToBeHandled ) {          << 566 
1616           condition = ( TargetResidualMassNum << 567          G4LorentzVector P_participants(0.,0.,0.,0.);
1617   } else {  // Projectile to be handled       << 568          G4int MultiplicityOfParticipants(0);
1618           condition = ( ProjectileResidualMas << 569 
1619         }                                     << 570          G4V3DNucleus * ProjectileNucleus =theParticipants.GetProjectileNucleus();
1620         if ( condition ) {                    << 571    ProjectileNucleus->StartLoop();
1621           const G4int maxNumberOfInnerLoops = << 572 
1622           G4int innerLoopCounter = 0;         << 573          G4Nucleon *    ProjectileNucleon;
1623           do {  // Inner do while loop        << 574          while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
1624             InnerSuccess = true;              << 575          {
1625             if ( isTargetToBeHandled ) {      << 576           if ( ProjectileNucleon->AreYouHit() )
1626               G4double Xcenter = 0.0;         << 577           {  // Projectile nucleon was involved in the interaction.
1627               if ( interactionCase == 1 ) {   << 578            P_total+=ProjectileNucleon->Get4Momentum();
1628                 common.PtNucleon = GaussianPt << 579            MultiplicityOfParticipants++;
1629                 common.PtResidual = - common. << 580            P_participants+=ProjectileNucleon->Get4Momentum();
1630                 common.Mtarget =   std::sqrt( << 
1631                                  + std::sqrt( << 
1632                 if ( common.SqrtS < common.Mp << 
1633                   InnerSuccess = false;       << 
1634                   continue;                   << 
1635                 }                             << 
1636                 Xcenter = std::sqrt( sqr( com << 
1637                           / common.Mtarget;   << 
1638               } else {                        << 
1639                 Xcenter = std::sqrt( sqr( com << 
1640                           / common.Mtarget;   << 
1641               }                               << 
1642               G4ThreeVector tmpX = GaussianPt << 
1643               common.XminusNucleon = Xcenter  << 
1644               if ( common.XminusNucleon <= 0. << 
1645                 InnerSuccess = false;         << 
1646                 continue;                     << 
1647               }                               << 
1648               common.XminusResidual = 1.0 - c << 
1649             } else {  // Projectile to be han << 
1650               G4ThreeVector tmpX = GaussianPt << 
1651               G4double Xcenter = 0.0;         << 
1652               if ( interactionCase == 2 ) {   << 
1653                 Xcenter = std::sqrt( sqr( com << 
1654                           / common.Mprojectil << 
1655               } else {                        << 
1656                 Xcenter = std::sqrt( sqr( com << 
1657                           / common.Mprojectil << 
1658               }                               << 
1659               common.XplusNucleon = Xcenter + << 
1660               if ( common.XplusNucleon <= 0.0 << 
1661                 InnerSuccess = false;         << 
1662                 continue;                     << 
1663               }                               << 
1664               common.XplusResidual = 1.0 - co << 
1665             }  // End-if on isTargetToBeHandl << 
1666           } while ( ( ! InnerSuccess ) &&     << 
1667                       ++innerLoopCounter < ma << 
1668           if ( innerLoopCounter >= maxNumberO << 
1669             #ifdef debugAdjust                << 
1670             G4cout << "BAD situation: forced  << 
1671             #endif                            << 
1672             return false;                     << 
1673           }                                      581           }
1674         } else {  // condition is false       << 582          } // End of while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
1675           if ( isTargetToBeHandled ) {        << 583 //G4cout<<"MultParts mom Pr "<<MultiplicityOfParticipants<<" "<<P_participants<<G4endl;
1676             common.XminusNucleon  = 1.0;      << 584 //------------------
1677             common.XminusResidual = 1.0;  //  << 585          G4int ResidualMassNumber(0);
1678           } else {  // Projectile to be handl << 586          G4int ResidualCharge(0);
1679             common.XplusNucleon  = 1.0;       << 587          ResidualExcitationEnergy=0.;
1680             common.XplusResidual = 1.0;   //  << 588          G4LorentzVector PnuclearResidual(0.,0.,0.,0.);
1681           }                                   << 589 
1682         }  // End-if on condition             << 590          G4double ExcitationEnergyPerWoundedNucleon=
1683                                               << 591                   theParameters->GetExcitationEnergyPerWoundedNucleon();
1684       }  // End of for loop on iExecute       << 592 
1685                                               << 593          G4V3DNucleus * TargetNucleus =theParticipants.GetWoundedNucleus();
1686       if ( interactionCase == 1 ) {           << 594    TargetNucleus->StartLoop();
1687         common.M2target =    ( sqr( common.TN << 595 
1688                              / common.XminusN << 596          G4Nucleon *    TargetNucleon;
1689                           +  ( sqr( common.TR << 597          while ( (TargetNucleon=TargetNucleus->GetNextNucleon()) )
1690                              / common.XminusR << 598          {
1691         loopCondition = ( common.SqrtS < comm << 599           P_total+=TargetNucleon->Get4Momentum();
1692       } else if ( interactionCase == 2 ) {    << 600           if ( TargetNucleon->AreYouHit() )
1693         #ifdef debugAdjust                    << 601           {  // Target nucleon was involved in the interaction.
1694         G4cout << "TNucleonMass PtNucleon Xpl << 602            MultiplicityOfParticipants++;
1695                << common.PtNucleon << " " <<  << 603            P_participants+=TargetNucleon->Get4Momentum();
1696                << "TResidualMass PtResidual X << 604            ResidualExcitationEnergy+=ExcitationEnergyPerWoundedNucleon; 
1697                << common.PtResidual << "  " < << 605           }
1698         #endif                                << 606           else
1699         common.M2projectile =    ( sqr( commo << 607           {
1700                                  / common.Xpl << 608            ResidualMassNumber+=1;
1701                               +  ( sqr( commo << 609            ResidualCharge+=(G4int) TargetNucleon->GetDefinition()->GetPDGCharge();
1702                                  / common.Xpl << 610            PnuclearResidual+=TargetNucleon->Get4Momentum();
1703         #ifdef debugAdjust                    << 611           }
1704         G4cout << "SqrtS < Mtarget + std::sqr << 612          } // End of while ( (TargetNucleon=TargetNucleus->GetNextNucleon()) )
1705                << common.Mtarget << " " << st << 
1706                << common.Mtarget + std::sqrt( << 
1707         #endif                                << 
1708         loopCondition = ( common.SqrtS < comm << 
1709       } else if ( interactionCase == 3 ) {    << 
1710         #ifdef debugAdjust                    << 
1711         G4cout << "PtNucleonP " << common.PtN << 
1712                << "XplusNucleon XplusResidual << 
1713                << " " << common.XplusResidual << 
1714                << "PtNucleonT " << common.PtN << 
1715                << "XminusNucleon XminusResidu << 
1716                << " " << common.XminusResidua << 
1717         #endif                                << 
1718         common.M2projectile =   ( sqr( common << 
1719                                 / common.Xplu << 
1720                               + ( sqr( common << 
1721                                 / common.Xplu << 
1722         common.M2target =    ( sqr( common.TN << 
1723                              / common.XminusN << 
1724                           +  ( sqr( common.TR << 
1725                              / common.XminusR << 
1726         loopCondition = ( common.SqrtS < (    << 
1727              + std::sqrt( common.M2target ) ) << 
1728       }  // End-if on interactionCase         << 
1729                                               << 
1730     } while ( loopCondition &&                << 
1731               ++NumberOfTries < maxNumberOfTr << 
1732     if ( NumberOfTries >= maxNumberOfTries )  << 
1733       #ifdef debugAdjust                      << 
1734       G4cout << "BAD situation: forced exit o << 
1735       #endif                                  << 
1736       return false;                           << 
1737     }                                         << 
1738                                               << 
1739     // kinematics                             << 
1740     G4double Yprojectile = 0.0, YprojectileNu << 
1741     G4double DecayMomentum2 = sqr( common.S ) << 
1742                               - 2.0 * ( commo << 
1743                                         + com << 
1744     if ( interactionCase == 1 ) {             << 
1745       common.WminusTarget = (   common.S - co << 
1746                               + std::sqrt( De << 
1747       common.WplusProjectile = common.SqrtS - << 
1748       common.Pzprojectile =   common.WplusPro << 
1749                             - common.M2projec << 
1750       common.Eprojectile =    common.WplusPro << 
1751                             + common.M2projec << 
1752       Yprojectile  = 0.5 * G4Log(   ( common. << 
1753                                   / ( common. << 
1754       #ifdef debugAdjust                      << 
1755       G4cout << "DecayMomentum2 " << DecayMom << 
1756              << "WminusTarget WplusProjectile << 
1757              << " " << common.WplusProjectile << 
1758              << "Yprojectile " << Yprojectile << 
1759       #endif                                  << 
1760       common.Mt2targetNucleon = sqr( common.T << 
1761       common.PztargetNucleon = - common.Wminu << 
1762                                + common.Mt2ta << 
1763                                  / ( 2.0 * co << 
1764       common.EtargetNucleon =   common.Wminus << 
1765                               + common.Mt2tar << 
1766                                 / ( 2.0 * com << 
1767       YtargetNucleon = 0.5 * G4Log(   ( commo << 
1768                                     / ( commo << 
1769       #ifdef debugAdjust                      << 
1770       G4cout << "YtN Ytr YtN-Ytr " << " " <<  << 
1771              << " " << YtargetNucleon - commo << 
1772              << "YtN Ypr YtN-Ypr " << " " <<  << 
1773              << " " << YtargetNucleon - Yproj << 
1774       #endif                                  << 
1775       if ( std::abs( YtargetNucleon - common. << 
1776            Yprojectile < YtargetNucleon ) {   << 
1777         OuterSuccess = false;                 << 
1778         continue;                             << 
1779       }                                       << 
1780     } else if ( interactionCase == 2 ) {      << 
1781       common.WplusProjectile = (   common.S + << 
1782                                  + std::sqrt( << 
1783       common.WminusTarget = common.SqrtS - co << 
1784       common.Pztarget = - common.WminusTarget << 
1785       common.Etarget =    common.WminusTarget << 
1786       Ytarget = 0.5 * G4Log(   ( common.Etarg << 
1787                              / ( common.Etarg << 
1788       #ifdef debugAdjust                      << 
1789       G4cout << "DecayMomentum2 " << DecayMom << 
1790              << "WminusTarget WplusProjectile << 
1791              << " " << common.WplusProjectile << 
1792              << "Ytarget " << Ytarget << G4en << 
1793       #endif                                  << 
1794       common.Mt2projectileNucleon = sqr( comm << 
1795       common.PzprojectileNucleon =   common.W << 
1796                                    - common.M << 
1797                                      / ( 2.0  << 
1798       common.EprojectileNucleon =    common.W << 
1799                                    + common.M << 
1800                                      / ( 2.0  << 
1801       YprojectileNucleon = 0.5 * G4Log(   ( c << 
1802                                         / ( c << 
1803       #ifdef debugAdjust                      << 
1804       G4cout << "YpN Ypr YpN-Ypr " << " " <<  << 
1805              << " " << YprojectileNucleon - c << 
1806              << "YpN Ytr YpN-Ytr " << " " <<  << 
1807              << " " << YprojectileNucleon - Y << 
1808       #endif                                  << 
1809       if ( std::abs( YprojectileNucleon - com << 
1810            Ytarget > YprojectileNucleon ) {   << 
1811         OuterSuccess = false;                 << 
1812         continue;                             << 
1813       }                                       << 
1814     } else if ( interactionCase == 3 ) {      << 
1815       common.WplusProjectile = (   common.S + << 
1816                                  + std::sqrt( << 
1817       common.WminusTarget = common.SqrtS - co << 
1818       common.Mt2projectileNucleon = sqr( comm << 
1819       common.PzprojectileNucleon =   common.W << 
1820                                    - common.M << 
1821                                      / ( 2.0  << 
1822       common.EprojectileNucleon =    common.W << 
1823                                    + common.M << 
1824                                      / ( 2.0  << 
1825       YprojectileNucleon = 0.5 * G4Log(   ( c << 
1826                                         / ( c << 
1827       common.Mt2targetNucleon = sqr( common.T << 
1828       common.PztargetNucleon = - common.Wminu << 
1829                                + common.Mt2ta << 
1830                                  / ( 2.0 * co << 
1831       common.EtargetNucleon =    common.Wminu << 
1832                                + common.Mt2ta << 
1833                                  / ( 2.0 * co << 
1834       YtargetNucleon = 0.5 * G4Log(   ( commo << 
1835                                     / ( commo << 
1836       if ( std::abs( YtargetNucleon - common. << 
1837            std::abs( YprojectileNucleon - com << 
1838            YprojectileNucleon < YtargetNucleo << 
1839         OuterSuccess = false;                 << 
1840         continue;                             << 
1841       }                                       << 
1842     }  // End-if on interactionCase           << 
1843                                               << 
1844   } while ( ( ! OuterSuccess ) &&             << 
1845             ++loopCounter < maxNumberOfLoops  << 
1846   if ( loopCounter >= maxNumberOfLoops ) {    << 
1847     #ifdef debugAdjust                        << 
1848     G4cout << "BAD situation: forced exit of  << 
1849     #endif                                    << 
1850     return false;                             << 
1851   }                                           << 
1852                                               << 
1853   return true;                                << 
1854 }                                             << 
1855                                               << 
1856 //------------------------------------------- << 
1857                                                  613 
1858 void G4FTFModel::AdjustNucleonsAlgorithm_afte << 614          G4double ResidualMass(0.);
1859                                               << 615          if(ResidualMassNumber == 0)
1860                                               << 616          {
1861                                               << 617           ResidualMass=0.;
1862   // Third of the three utility methods used  << 618           ResidualExcitationEnergy=0.;
1863   // and transform back.                      << 619          }
1864                                               << 620          else
1865   // New projectile                           << 621          {
1866   if ( interactionCase == 1 ) {               << 622           ResidualMass=G4ParticleTable::GetParticleTable()->GetIonTable()->
1867     common.Pprojectile.setPz( common.Pzprojec << 623                               GetIonMass(ResidualCharge ,ResidualMassNumber);
1868     common.Pprojectile.setE( common.Eprojecti << 624           if(ResidualMassNumber == 1) {ResidualExcitationEnergy=0.;}
1869   } else if ( interactionCase == 2 ) {        << 625          }
1870     common.Pprojectile.setPx( common.PtNucleo << 626 //      ResidualMass +=ResidualExcitationEnergy; // Will be given after checks
1871     common.Pprojectile.setPy( common.PtNucleo << 627 
1872     common.Pprojectile.setPz( common.Pzprojec << 628 //G4cout<<"MultPars mom+Tr  "<<MultiplicityOfParticipants<<" "<<P_participants<<G4endl;
1873     common.Pprojectile.setE( common.Eprojecti << 629 //G4cout<<"Res              "<<ResidualMassNumber<<" "<<PnuclearResidual<<G4endl;
1874   } else if ( interactionCase == 3 ) {        << 630 //G4cout<<"P_total "<<P_total<<G4endl;
1875     common.Pprojectile.setPx( common.PtNucleo << 631 
1876     common.Pprojectile.setPy( common.PtNucleo << 632 //G4cout<<"Rez A Z M E* "<<ResidualMassNumber<<" "<<ResidualCharge<<" "<<ResidualMass<<" "<<ResidualExcitationEnergy<<G4endl;
1877     common.Pprojectile.setPz( common.Pzprojec << 633 //--------------
1878     common.Pprojectile.setE( common.Eprojecti << 634          G4double SqrtS=P_total.mag();
1879   }                                           << 635          G4double     S=P_total.mag2();
1880   #ifdef debugAdjust                          << 636 
1881   G4cout << "Proj after in CMS " << common.Pp << 637 //         if(theProjectile.GetDefinition()->GetBaryonNumber() > 1)
1882   #endif                                      << 638          { // For nucleus-nucleus interactions
1883   common.Pprojectile.transform( common.toLab  << 639           G4double MassOfParticipants=P_participants.mag();
1884   SelectedAntiBaryon->Set4Momentum( common.Pp << 640           G4double MassOfParticipants2=sqr(MassOfParticipants);
1885   #ifdef debugAdjust                          << 641 
1886   G4cout << "Proj after in Lab " << common.Pp << 642 //G4cout<<"ResidualMass + MassOfParticipants "<<ResidualMass + MassOfParticipants<<G4endl;
1887   #endif                                      << 643           if(SqrtS < ResidualMass + MassOfParticipants) {return false;}
1888                                               << 644 
1889   // New target nucleon                       << 645           if(SqrtS < ResidualMass+ResidualExcitationEnergy + MassOfParticipants)
1890   if ( interactionCase == 1 ) {               << 646           {ResidualExcitationEnergy=0.;}
1891     common.Ptarget.setPx( common.PtNucleon.x( << 647 
1892     common.Ptarget.setPy( common.PtNucleon.y( << 648           ResidualMass +=ResidualExcitationEnergy; 
1893     common.Ptarget.setPz( common.PztargetNucl << 649 //G4cout<<"Rez A Z M E* "<<ResidualMassNumber<<" "<<ResidualCharge<<" "<<ResidualMass<<" "<<ResidualExcitationEnergy<<G4endl;
1894     common.Ptarget.setE( common.EtargetNucleo << 650 
1895   } else if ( interactionCase == 2 ) {        << 651           G4double ResidualMass2=sqr(ResidualMass);
1896     common.Ptarget.setPz( common.Pztarget );  << 652 
1897     common.Ptarget.setE( common.Etarget );    << 653           G4LorentzRotation toCms(-1*P_total.boostVector());
1898   } else if ( interactionCase == 3 ) {        << 654 
1899     common.Ptarget.setPx( common.PtNucleonT.x << 655           G4LorentzVector Pcms=toCms*P_participants;
1900     common.Ptarget.setPy( common.PtNucleonT.y << 656 //G4cout<<"Ppart in CMS "<<Ptmp<<G4endl;
1901     common.Ptarget.setPz( common.PztargetNucl << 657 
1902     common.Ptarget.setE( common.EtargetNucleo << 658           if ( Pcms.pz() <= 0. )                                
1903   }                                           << 659           {  // "String" moving backwards in  CMS, abort collision !!
1904   #ifdef debugAdjust                          << 660            //G4cout << " abort ColliDeleteVSplitableHadronsion!! " << G4endl;
1905   G4cout << "Targ after in CMS " << common.Pt << 661            return false; 
1906   #endif                                      << 662           }
1907   common.Ptarget.transform( common.toLab );   << 
1908   SelectedTargetNucleon->Set4Momentum( common << 
1909   #ifdef debugAdjust                          << 
1910   G4cout << "Targ after in Lab " << common.Pt << 
1911   #endif                                      << 
1912                                               << 
1913   // New target residual                      << 
1914   if ( interactionCase == 1  ||  interactionC << 
1915     TargetResidualMassNumber       = common.T << 
1916     TargetResidualCharge           = common.T << 
1917     TargetResidualExcitationEnergy = common.T << 
1918     #ifdef debugAdjust                        << 
1919     G4cout << "TargetResidualMassNumber Targe << 
1920            << TargetResidualMassNumber << " " << 
1921            << TargetResidualExcitationEnergy  << 
1922     #endif                                    << 
1923     if ( TargetResidualMassNumber != 0 ) {    << 
1924       G4double Mt2 = 0.0;                     << 
1925       if ( interactionCase == 1 ) {           << 
1926         Mt2 = sqr( common.TResidualMass ) + c << 
1927         TargetResidual4Momentum.setPx( common << 
1928         TargetResidual4Momentum.setPy( common << 
1929       } else {  // interactionCase == 3       << 
1930         Mt2 = sqr( common.TResidualMass ) + c << 
1931         TargetResidual4Momentum.setPx( common << 
1932         TargetResidual4Momentum.setPy( common << 
1933       }                                       << 
1934       G4double Pz = - common.WminusTarget * c << 
1935                     + Mt2 / ( 2.0 * common.Wm << 
1936       G4double E =    common.WminusTarget * c << 
1937                     + Mt2 / ( 2.0 * common.Wm << 
1938       TargetResidual4Momentum.setPz( Pz );    << 
1939       TargetResidual4Momentum.setE( E ) ;     << 
1940       TargetResidual4Momentum.transform( comm << 
1941     } else {                                  << 
1942       TargetResidual4Momentum = G4LorentzVect << 
1943     }                                         << 
1944     #ifdef debugAdjust                        << 
1945     G4cout << "Tr N R " << common.Ptarget <<  << 
1946     #endif                                    << 
1947   }                                           << 
1948                                               << 
1949   // New projectile residual                  << 
1950   if ( interactionCase == 2  ||  interactionC << 
1951     if ( interactionCase == 2 ) {             << 
1952       ProjectileResidualMassNumber       = co << 
1953       ProjectileResidualCharge           = co << 
1954       ProjectileResidualExcitationEnergy = co << 
1955       ProjectileResidualLambdaNumber     = co << 
1956     } else {  // interactionCase == 3         << 
1957       ProjectileResidualMassNumber       = co << 
1958       ProjectileResidualCharge           = co << 
1959       ProjectileResidualExcitationEnergy = co << 
1960       ProjectileResidualLambdaNumber     = co << 
1961     }                                         << 
1962     #ifdef debugAdjust                        << 
1963     G4cout << "ProjectileResidualMassNumber P << 
1964            << ProjectileResidualMassNumber << << 
1965            << ProjectileResidualLambdaNumber  << 
1966            << ProjectileResidualExcitationEne << 
1967     #endif                                    << 
1968     if ( ProjectileResidualMassNumber != 0 )  << 
1969       G4double Mt2 = 0.0;                     << 
1970       if ( interactionCase == 2 ) {           << 
1971         Mt2 = sqr( common.TResidualMass ) + c << 
1972         ProjectileResidual4Momentum.setPx( co << 
1973         ProjectileResidual4Momentum.setPy( co << 
1974       } else {  // interactionCase == 3       << 
1975         Mt2 = sqr( common.PResidualMass ) + c << 
1976         ProjectileResidual4Momentum.setPx( co << 
1977         ProjectileResidual4Momentum.setPy( co << 
1978       }                                       << 
1979       G4double Pz =   common.WplusProjectile  << 
1980                     - Mt2 / ( 2.0 * common.Wp << 
1981       G4double E  =   common.WplusProjectile  << 
1982                     + Mt2 / ( 2.0 * common.Wp << 
1983       ProjectileResidual4Momentum.setPz( Pz ) << 
1984       ProjectileResidual4Momentum.setE( E );  << 
1985       ProjectileResidual4Momentum.transform(  << 
1986     } else {                                  << 
1987       ProjectileResidual4Momentum = G4Lorentz << 
1988     }                                         << 
1989     #ifdef debugAdjust                        << 
1990     G4cout << "Pr N R " << common.Pprojectile << 
1991            << "       " << ProjectileResidual << 
1992     #endif                                    << 
1993   }                                           << 
1994                                                  663 
1995 }                                             << 664           toCms.rotateZ(-1*Pcms.phi());              // Uzhi 5.12.09
                                                   >> 665           toCms.rotateY(-1*Pcms.theta());            // Uzhi 5.12.09
1996                                                  666 
                                                   >> 667 //G4cout<<"Mpa M res "<<ResidualMass<<" "<<MassOfParticipants<<" "<<SqrtS<<G4endl;
                                                   >> 668           G4LorentzRotation toLab(toCms.inverse());
1997                                                  669 
1998 //=========================================== << 670           G4double DecayMomentum2= 
                                                   >> 671                       sqr(S)+sqr(MassOfParticipants2)+ sqr(ResidualMass2) -
                                                   >> 672                           2.*S*MassOfParticipants2 - 2.*S*ResidualMass2 
                                                   >> 673                               -2.*MassOfParticipants2*ResidualMass2;
                                                   >> 674 
                                                   >> 675           if(DecayMomentum2 < 0.) return false;
                                                   >> 676 
                                                   >> 677           DecayMomentum2/=(4.*S);
                                                   >> 678           G4double DecayMomentum = std::sqrt(DecayMomentum2);
                                                   >> 679 //G4cout<<"DecayMomentum "<<DecayMomentum<<G4endl;
                                                   >> 680 
                                                   >> 681           G4LorentzVector New_P_participants(0.,0.,DecayMomentum,
                                                   >> 682                                              std::sqrt(DecayMomentum2+MassOfParticipants2));
                                                   >> 683           G4LorentzVector New_PnuclearResidual(0.,0.,-DecayMomentum,
                                                   >> 684                                              std::sqrt(DecayMomentum2+ResidualMass2));
                                                   >> 685 
                                                   >> 686 //G4cout<<"MultPars mom     "<<MultiplicityOfParticipants<<" "<<New_P_participants<<G4endl;
                                                   >> 687 //G4cout<<"Res              "<<ResidualMassNumber<<" "<<New_PnuclearResidual<<G4endl;
                                                   >> 688           New_P_participants.transform(toLab);
                                                   >> 689           New_PnuclearResidual.transform(toLab);
                                                   >> 690 
                                                   >> 691 //G4cout<<"MultPars mom     "<<MultiplicityOfParticipants<<" "<<New_P_participants<<G4endl;
                                                   >> 692 //G4cout<<"Res              "<<ResidualMassNumber<<" "<<New_PnuclearResidual<<G4endl;
                                                   >> 693 
                                                   >> 694           G4LorentzVector DeltaP_participants=(New_P_participants - P_participants)/
                                                   >> 695                                               ((G4double) MultiplicityOfParticipants);
                                                   >> 696 
                                                   >> 697 //G4cout<<"DeltaP_participants "<<DeltaP_participants<<G4endl;
                                                   >> 698 //-------------
                                                   >> 699           ProjectileNucleus->StartLoop();
                                                   >> 700           while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
                                                   >> 701           {
                                                   >> 702            if ( ProjectileNucleon->AreYouHit() )
                                                   >> 703            {  // Projectile nucleon was involved in the interaction.
                                                   >> 704             G4LorentzVector Ptmp=ProjectileNucleon->Get4Momentum() + DeltaP_participants;
                                                   >> 705             ProjectileNucleon->GetSplitableHadron()->Set4Momentum(Ptmp);
                                                   >> 706             ProjectileNucleon->SetMomentum(Ptmp);
                                                   >> 707            }
                                                   >> 708           } // End of while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
                                                   >> 709 
                                                   >> 710 //-------------
                                                   >> 711           TargetNucleus->StartLoop();
                                                   >> 712           while ( (TargetNucleon=TargetNucleus->GetNextNucleon()) )
                                                   >> 713           {
                                                   >> 714            if ( TargetNucleon->AreYouHit() )
                                                   >> 715            {  // Target nucleon was involved in the interaction.
                                                   >> 716             G4LorentzVector Ptmp=TargetNucleon->Get4Momentum() + DeltaP_participants;
                                                   >> 717             TargetNucleon->GetSplitableHadron()->Set4Momentum(Ptmp);
                                                   >> 718            }
                                                   >> 719           } // End of while ( (TargetNucleon=TargetNucleus->GetNextNucleon()) )
                                                   >> 720 
                                                   >> 721           Residual4Momentum = New_PnuclearResidual;        
                                                   >> 722 //          return true;
                                                   >> 723          } // End of if(theProjectile.GetDefinition()->GetBaryonNumber() > 1)
                                                   >> 724 
                                                   >> 725          return true;
                                                   >> 726         }
                                                   >> 727 //---------------------------------------------------------------------
                                                   >> 728 // -------- The projectile is hadron, or baryon, or anti-baryon -------
                                                   >> 729 // -------------- Properties of the projectile ------------------------
                                                   >> 730   theParticipants.StartLoop();    // restart a loop
                                                   >> 731         theParticipants.Next();
                                                   >> 732   G4VSplitableHadron * primary = theParticipants.GetInteraction().GetProjectile();
                                                   >> 733   G4LorentzVector Pprojectile=primary->Get4Momentum();
                                                   >> 734 
                                                   >> 735 // 13.06.2012 G4bool ProjectileIsAntiBaryon = primary->GetDefinition()->GetBaryonNumber() < 0;
                                                   >> 736 
                                                   >> 737 //G4cout<<"PutOnMass Pprojectile "<<Pprojectile<<G4endl;
                                                   >> 738 // To get original projectile particle
                                                   >> 739 
                                                   >> 740         if(Pprojectile.z() < 0.){return false;}
                                                   >> 741 
                                                   >> 742         G4double Mprojectile  = Pprojectile.mag();
                                                   >> 743         G4double M2projectile = Pprojectile.mag2();
                                                   >> 744 //-------------------------------------------------------------
                                                   >> 745   G4LorentzVector Psum      = Pprojectile;
                                                   >> 746 
                                                   >> 747         G4double        SumMasses = Mprojectile + 20.*MeV; // 13.12.09
                                                   >> 748                                                // Separation energy for projectile
                                                   >> 749 //        if(ProjectileIsAntiBaryon) {SumMasses = Mprojectile;}
                                                   >> 750 //G4cout<<"SumMasses Pr "<<SumMasses<<G4endl;
                                                   >> 751 //--------------- Target nucleus ------------------------------
                                                   >> 752         G4V3DNucleus *theNucleus = GetWoundedNucleus();
                                                   >> 753         G4int ResidualMassNumber=theNucleus->GetMassNumber();
                                                   >> 754         G4int ResidualCharge    =theNucleus->GetCharge();
                                                   >> 755 
                                                   >> 756         ResidualExcitationEnergy=0.;
                                                   >> 757   G4LorentzVector Ptarget(0.,0.,0.,0.);
                                                   >> 758   G4LorentzVector PnuclearResidual(0.,0.,0.,0.); // Uzhi 12.06.2012
                                                   >> 759 
                                                   >> 760         G4double ExcitationEnergyPerWoundedNucleon=
                                                   >> 761                   theParameters->GetExcitationEnergyPerWoundedNucleon();
                                                   >> 762 
                                                   >> 763 //G4cout<<"ExcitationEnergyPerWoundedNucleon "<<ExcitationEnergyPerWoundedNucleon<<G4endl;
                                                   >> 764 
                                                   >> 765         theNucleus->StartLoop();
                                                   >> 766 
                                                   >> 767   while (G4Nucleon * aNucleon = theNucleus->GetNextNucleon())
                                                   >> 768         {
                                                   >> 769          Ptarget+=aNucleon->Get4Momentum();
                                                   >> 770 
                                                   >> 771          if(aNucleon->AreYouHit())
                                                   >> 772          {   // Involved nucleons
                                                   >> 773 //G4cout<<"PutOn Tr "<<aNucleon->Get4Momentum()<<G4endl;
                                                   >> 774 //        Psum += aNucleon->Get4Momentum();                       // Uzhi 20 Sept.
                                                   >> 775 //          if(!ProjectileIsAntiBaryon)                           // Uzhi 13.06.2012
                                                   >> 776 //          {
                                                   >> 777            SumMasses += std::sqrt(sqr(aNucleon->GetDefinition()->GetPDGMass()) //Uzhi 12.06.2012
                                                   >> 778                      +  aNucleon->Get4Momentum().perp2());                     //Uzhi 12.06.2012
                                                   >> 779            SumMasses += 20.*MeV;   // 13.12.09 Separation energy for a nucleon
                                                   >> 780            ResidualExcitationEnergy+=ExcitationEnergyPerWoundedNucleon;
                                                   >> 781 /*                                                                             //Uzhi 13.06.2012
                                                   >> 782           } else 
                                                   >> 783           {
                                                   >> 784            SumMasses += aNucleon->Get4Momentum().mag();           // 4.12.2010
                                                   >> 785            G4LorentzVector tmp=aNucleon->Get4Momentum();
                                                   >> 786            tmp.setE(aNucleon->Get4Momentum().mag());   // It is need to save mass 6.12.2011
                                                   >> 787            aNucleon->SetMomentum(tmp);
                                                   >> 788           }
                                                   >> 789 */                                                                            //Uzhi 13.06.2012
1999                                                  790 
2000 void G4FTFModel::BuildStrings( G4ExcitedStrin << 791           ResidualMassNumber--;
2001   // Loop over all collisions; find all prima << 792           ResidualCharge-=(G4int) aNucleon->GetDefinition()->GetPDGCharge();
2002   // (targets may be duplicate in the List (t << 793          }
2003                                               << 794          else
2004   G4ExcitedString* FirstString( 0 );     // I << 795          {   // Spectator nucleons
2005   G4ExcitedString* SecondString( 0 );    // t << 796           PnuclearResidual += aNucleon->Get4Momentum();          // Uzhi 12.06.2012
2006                                               << 797          }  // end of if(!aNucleon->AreYouHit())
2007   if ( ! GetProjectileNucleus() ) {           << 798   }   // end of while (theNucleus->GetNextNucleon())
2008                                               << 799 
2009     std::vector< G4VSplitableHadron* > primar << 800         Psum += Ptarget;   
2010     theParticipants.StartLoop();              << 801         PnuclearResidual.setPz(0.); PnuclearResidual.setE(0.);   // Uzhi 12.06.2012
2011     while ( theParticipants.Next() ) {  /* Lo << 802 //G4cout<<"ResidualCharge ,ResidualMassNumber "<<ResidualCharge<<" "<<ResidualMassNumber<<" "<<Ptarget<<" "<<PnuclearResidual<<G4endl;
2012       const G4InteractionContent& interaction << 803 
2013       //  do not allow for duplicates ...     << 804         G4double ResidualMass(0.);
2014       if ( interaction.GetStatus() ) {        << 805         if(ResidualMassNumber == 0)
2015         if ( primaries.end() == std::find( pr << 806         {
2016                                            in << 807          ResidualMass=0.;
2017           primaries.push_back( interaction.Ge << 808          ResidualExcitationEnergy=0.;
                                                   >> 809         }
                                                   >> 810         else
                                                   >> 811         {
                                                   >> 812          ResidualMass=G4ParticleTable::GetParticleTable()->GetIonTable()->
                                                   >> 813                               GetIonMass(ResidualCharge ,ResidualMassNumber);
                                                   >> 814          if(ResidualMassNumber == 1) {ResidualExcitationEnergy=0.;}
2018         }                                        815         }
2019       }                                       << 816  
2020     }                                         << 817 //      ResidualMass +=ResidualExcitationEnergy; // Will be given after checks
2021                                               << 818 //G4cout<<"SumMasses And ResidualMass "<<SumMasses<<" "<<ResidualMass<<G4endl;
2022     #ifdef debugBuildString                   << 819         SumMasses += std::sqrt(sqr(ResidualMass)+PnuclearResidual.mag2()); // Uzhi 12.06.2012
2023     G4cout << "G4FTFModel::BuildStrings()" << << 820 //G4cout<<"SumMasses + ResM "<<SumMasses<<G4endl;
2024            << "Number of projectile strings " << 821 //G4cout<<"Psum "<<Psum<<G4endl;
2025     #endif                                    << 822 //-------------------------------------------------------------
2026                                               << 823 
2027     for ( unsigned int ahadron = 0; ahadron < << 824         G4double SqrtS=Psum.mag();
2028       G4bool isProjectile( true );            << 825         G4double     S=Psum.mag2();
2029       //G4cout << "primaries[ ahadron ] " <<  << 826 
2030       //if ( primaries[ ahadron ]->GetStatus( << 827 //G4cout<<"SqrtS < SumMasses "<<SqrtS<<" "<<SumMasses<<G4endl;
2031       FirstString = 0; SecondString = 0;      << 828 
2032       if ( primaries[ahadron]->GetStatus() == << 829         if(SqrtS < SumMasses)      {return false;} // It is impossible to simulate
2033        theExcitation->CreateStrings( primarie << 830                                                    // after putting nuclear nucleons
2034                                      FirstStr << 831                                                    // on mass-shell
2035        NumberOfProjectileSpectatorNucleons--; << 832 
2036       } else if ( primaries[ahadron]->GetStat << 833         SumMasses -= std::sqrt(sqr(ResidualMass)+PnuclearResidual.mag2()); // Uzhi 12.06.2012
2037                && primaries[ahadron]->GetSoft << 834         SumMasses += std::sqrt(sqr(ResidualMass+ResidualExcitationEnergy)
2038        theExcitation->CreateStrings( primarie << 835                     +PnuclearResidual.mag2());                             // Uzhi 12.06.2012
2039                                      FirstStr << 836         if(SqrtS < SumMasses)                                              // Uzhi 12.06.2012
2040        NumberOfProjectileSpectatorNucleons--; << 837         {
2041       } else if ( primaries[ahadron]->GetStat << 838          SumMasses -= std::sqrt(sqr(ResidualMass+ResidualExcitationEnergy)
2042                && primaries[ahadron]->GetSoft << 839                      +PnuclearResidual.mag2());                            // Uzhi 12.06.2012
2043        G4LorentzVector ParticleMomentum=prima << 840          SumMasses += std::sqrt(sqr(ResidualMass)+PnuclearResidual.mag2());// Uzhi 12.06.2012
2044        G4KineticTrack* aTrack = new G4Kinetic << 841          ResidualExcitationEnergy=0.;
2045                                               << 842         }
2046                                               << 843 
2047                                               << 844         ResidualMass +=ResidualExcitationEnergy;
2048        FirstString = new G4ExcitedString( aTr << 845 //      SumMasses    +=ResidualExcitationEnergy;                           // Uzhi 12.06.2012
2049       } else if (primaries[ahadron]->GetStatu << 846 //G4cout<<"ResidualMass SumMasses ResidualExcitationEnergy "<<ResidualMass<<" "<<SumMasses<<" "<<ResidualExcitationEnergy<<G4endl;
2050        G4LorentzVector ParticleMomentum=prima << 847 //-------------------------------------------------------------
2051        G4KineticTrack* aTrack = new G4Kinetic << 848 // Sampling of nucleons what are transfered to delta-isobars --
2052                                               << 849         G4int MaxNumberOfDeltas = (int)((SqrtS - SumMasses)/(400.*MeV));
2053                                               << 850         G4int NumberOfDeltas(0);
2054                                               << 851 //G4cout<<"MaxNumberOfDeltas "<<MaxNumberOfDeltas<<G4endl;
2055        FirstString = new G4ExcitedString( aTr << 852         if(theNucleus->GetMassNumber() != 1)
2056        NumberOfProjectileSpectatorNucleons--; << 853         {
2057       } else {                                << 854 //G4cout<<"NumberOfInvolvedNucleon "<<NumberOfInvolvedNucleon<<G4endl;
2058         G4cout << "Something wrong in FTF Mod << 855           G4double ProbDeltaIsobar(0.05);                                  // Uzhi 6.07.2012
2059       }                                       << 856     for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
2060                                               << 857           {
2061       if ( FirstString  != 0 ) strings->push_ << 858             if((G4UniformRand() < ProbDeltaIsobar)&&(NumberOfDeltas < MaxNumberOfDeltas))
2062       if ( SecondString != 0 ) strings->push_ << 859             {
2063                                               << 860               NumberOfDeltas++;
2064       #ifdef debugBuildString                 << 861               G4VSplitableHadron * targetSplitable=TheInvolvedNucleon[i]->GetSplitableHadron();
2065       G4cout << "FirstString & SecondString?  << 862               G4double MassDec=std::sqrt(sqr(targetSplitable->GetDefinition()->GetPDGMass())
2066       if ( FirstString->IsExcited() ) {       << 863                                            + targetSplitable->Get4Momentum().perp2());
2067         G4cout << "Quarks on the FirstString  << 864 
2068                << " " << FirstString->GetLeft << 865               G4int PDGcode = targetSplitable->GetDefinition()->GetPDGEncoding();
2069       } else {                                << 866               G4ParticleDefinition* Old_def = targetSplitable->GetDefinition();
2070         G4cout << "Kinetic track is stored" < << 867 
2071       }                                       << 868               G4int newPDGcode = PDGcode/10; newPDGcode=newPDGcode*10+4; // Delta
2072       #endif                                  << 869               G4ParticleDefinition* ptr = 
2073                                               << 870                  G4ParticleTable::GetParticleTable()->FindParticle(newPDGcode);
2074     }                                         << 871               targetSplitable->SetDefinition(ptr);
2075                                               << 872               G4double MassInc=std::sqrt(sqr(targetSplitable->GetDefinition()->GetPDGMass())
2076     #ifdef debugBuildString                   << 873                                            + targetSplitable->Get4Momentum().perp2());
2077     if ( FirstString->IsExcited() ) {         << 874               if(SqrtS < SumMasses + MassInc - MassDec)                    // Uzhi 12.06.2012
2078       G4cout << "Check 1 string " << strings- << 875               { // Change cannot be acsepted!
2079              << " " << strings->operator[](0) << 876                targetSplitable->SetDefinition(Old_def);
2080     }                                         << 877                ProbDeltaIsobar = 0.;
2081     #endif                                    << 878               } else
2082                                               << 879               { // Change is acsepted.
2083     std::for_each( primaries.begin(), primari << 880                SumMasses += (MassInc - MassDec);
2084     primaries.clear();                        << 881               }
2085                                               << 882             } 
2086   } else {  // Projectile is a nucleus        << 883           }   // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
2087                                               << 884         }   // end of if(theNucleus.GetMassNumber() != 1)
2088     #ifdef debugBuildString                   << 885 
2089     G4cout << "Building of projectile-like st << 886 //-------------------------------------------------------------
2090     #endif                                    << 887 
2091                                               << 888         G4LorentzRotation toCms(-1*Psum.boostVector());
2092     G4bool isProjectile = true;               << 889         G4LorentzVector Ptmp=toCms*Pprojectile;
2093     for ( G4int ahadron = 0; ahadron < Number << 890         if ( Ptmp.pz() <= 0. )                                
2094                                               << 891         {  // "String" moving backwards in  CMS, abort collision !!
2095       #ifdef debugBuildString                 << 892            //G4cout << " abort ColliDeleteVSplitableHadronsion!! " << G4endl;
2096       G4cout << "Nucleon #, status, intCount  << 893          return false; 
2097              << TheInvolvedNucleonsOfProjecti << 894         }
2098              << " " << TheInvolvedNucleonsOfP << 895 
2099                        ->GetSoftCollisionCoun << 896         G4LorentzRotation toLab(toCms.inverse());
2100       #endif                                  << 897 
2101                                               << 898         Ptmp=toCms*Ptarget;                      
2102       G4VSplitableHadron* aProjectile =       << 899         G4double YtargetNucleus=Ptmp.rapidity();
2103           TheInvolvedNucleonsOfProjectile[ ah << 900 //G4cout<<"YtargetNucleus "<<YtargetNucleus<<G4endl;
2104                                               << 901 //-------------------------------------------------------------
2105       #ifdef debugBuildString                 << 902 //------- Ascribing of the involved nucleons Pt and Xminus ----
2106       G4cout << G4endl << "ahadron aProjectil << 903         G4double Dcor        = theParameters->GetDofNuclearDestruction()/
2107              << " " << aProjectile->GetStatus << 904                                                theNucleus->GetMassNumber();
2108       #endif                                  << 905 
2109                                               << 906         G4double AveragePt2  = theParameters->GetPt2ofNuclearDestruction();
2110       FirstString = 0; SecondString = 0;      << 907         G4double maxPtSquare = theParameters->GetMaxPt2ofNuclearDestruction();
2111       if ( aProjectile->GetStatus() == 0 ) {  << 908 //G4cout<<"Dcor "<<theParameters->GetDofNuclearDestruction()<<" "<<Dcor<<" AveragePt2 "<<AveragePt2<<G4endl;
2112                                               << 909         G4double M2target(0.);
2113         #ifdef debugBuildString               << 910         G4double WminusTarget(0.);
2114         G4cout << "Case1 aProjectile->GetStat << 911         G4double WplusProjectile(0.);
2115         #endif                                << 912 
2116                                               << 913         G4int    NumberOfTries(0);
2117         theExcitation->CreateStrings(         << 914         G4double ScaleFactor(1.);
2118                            TheInvolvedNucleon << 915         G4bool OuterSuccess(true);
2119                            isProjectile, Firs << 916         do    // while (!OuterSuccess)
2120         NumberOfProjectileSpectatorNucleons-- << 917         {
2121       } else if ( aProjectile->GetStatus() == << 918           OuterSuccess=true;
2122         // Nucleon took part in diffractive i << 919 
2123                                               << 920           do    // while (SqrtS < Mprojectile + std::sqrt(M2target))
2124         #ifdef debugBuildString               << 921           {     // while (DecayMomentum < 0.)
2125         G4cout << "Case2 aProjectile->GetStat << 922 
2126         #endif                                << 923             NumberOfTries++;
2127                                               << 924 
2128         theExcitation->CreateStrings(         << 925             if(NumberOfTries == 100*(NumberOfTries/100))   // 100
2129                            TheInvolvedNucleon << 926             { // At large number of tries it would be better to reduce the values
2130                            isProjectile, Firs << 927               ScaleFactor/=2.;
2131         NumberOfProjectileSpectatorNucleons-- << 928               Dcor       *=ScaleFactor;
2132       } else if ( aProjectile->GetStatus() == << 929               AveragePt2 *=ScaleFactor;
2133                   HighEnergyInter ) {         << 930             }
2134         // Nucleon was considered as a parici << 
2135         // but the interaction was skipped du << 
2136         // It is now considered as an involve << 
2137                                               << 
2138         #ifdef debugBuildString               << 
2139         G4cout << "Case3 aProjectile->GetStat << 
2140         #endif                                << 
2141                                               << 
2142         G4LorentzVector ParticleMomentum = aP << 
2143         G4KineticTrack* aTrack = new G4Kineti << 
2144                                               << 
2145                                               << 
2146                                               << 
2147         FirstString = new G4ExcitedString( aT << 
2148                                               << 
2149         #ifdef debugBuildString               << 
2150         G4cout << " Strings are built for nuc << 
2151                << " the interaction was skipp << 
2152         #endif                                << 
2153                                               << 
2154       } else if ( aProjectile->GetStatus() == << 
2155         // Nucleon which was involved in the  << 
2156                                               << 
2157         #ifdef debugBuildString               << 
2158         G4cout << "Case4 aProjectile->GetStat << 
2159         #endif                                << 
2160                                               << 
2161         G4LorentzVector ParticleMomentum = aP << 
2162         G4KineticTrack* aTrack = new G4Kineti << 
2163                                               << 
2164                                               << 
2165                                               << 
2166         FirstString = new G4ExcitedString( aT << 
2167                                               << 
2168         #ifdef debugBuildString               << 
2169         G4cout << " Strings are build for inv << 
2170         #endif                                << 
2171                                               << 
2172         if ( aProjectile->GetStatus() == 2 )  << 
2173       } else {                                << 
2174                                               << 
2175         #ifdef debugBuildString               << 
2176         G4cout << "Case5 " << G4endl;         << 
2177         #endif                                << 
2178                                               << 
2179         //TheInvolvedNucleonsOfProjectile[ ah << 
2180         //G4cout << TheInvolvedNucleonsOfProj << 
2181                                               << 
2182         #ifdef debugBuildString               << 
2183         G4cout << " No string" << G4endl;     << 
2184         #endif                                << 
2185                                                  931 
2186       }                                       << 932             G4ThreeVector PtSum(0.,0.,0.);
                                                   >> 933             G4double XminusSum(0.);
                                                   >> 934             G4double Xminus(0.);
                                                   >> 935             G4bool InerSuccess=true;
                                                   >> 936 
                                                   >> 937             do      // while(!InerSuccess);
                                                   >> 938             {
                                                   >> 939              InerSuccess=true;
                                                   >> 940 
                                                   >> 941              PtSum    =G4ThreeVector(0.,0.,0.);
                                                   >> 942              XminusSum=0.;
                                                   >> 943 
                                                   >> 944        for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 945              {
                                                   >> 946                G4Nucleon * aNucleon = TheInvolvedNucleon[i];
                                                   >> 947 
                                                   >> 948                G4ThreeVector tmpPt = GaussianPt(AveragePt2, maxPtSquare);
                                                   >> 949                PtSum += tmpPt;
                                                   >> 950 
                                                   >> 951                G4ThreeVector tmpX=GaussianPt(Dcor*Dcor, 1.);
                                                   >> 952                Xminus=tmpX.x();
                                                   >> 953                XminusSum+=Xminus;
                                                   >> 954 
                                                   >> 955                G4LorentzVector tmp(tmpPt.x(),tmpPt.y(),Xminus,     // 6 Dec.2010
                                                   >> 956                                    aNucleon->Get4Momentum().e());  // 6 Dec.2010
                                                   >> 957 
                                                   >> 958                aNucleon->SetMomentum(tmp);
                                                   >> 959              }   // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 960 
                                                   >> 961 //---------------------------------------------------------------------------
                                                   >> 962              G4double DeltaX = (PtSum.x()-PnuclearResidual.x())/NumberOfInvolvedNucleon;
                                                   >> 963              G4double DeltaY = (PtSum.y()-PnuclearResidual.y())/NumberOfInvolvedNucleon;
                                                   >> 964              G4double DeltaXminus(0.);
                                                   >> 965 
                                                   >> 966              if(ResidualMassNumber == 0)
                                                   >> 967              {
                                                   >> 968               DeltaXminus = (XminusSum-1.)/NumberOfInvolvedNucleon;
                                                   >> 969              }
                                                   >> 970              else
                                                   >> 971              {
                                                   >> 972               DeltaXminus = -1./theNucleus->GetMassNumber();
                                                   >> 973              }
                                                   >> 974 
                                                   >> 975              XminusSum=1.;
                                                   >> 976              M2target =0.;
                                                   >> 977 
                                                   >> 978        for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 979              {
                                                   >> 980                G4Nucleon * aNucleon = TheInvolvedNucleon[i];
                                                   >> 981 
                                                   >> 982                Xminus = aNucleon->Get4Momentum().pz() - DeltaXminus;
                                                   >> 983                XminusSum-=Xminus;               
                                                   >> 984 
                                                   >> 985                if(ResidualMassNumber == 0)               
                                                   >> 986                {
                                                   >> 987                 if((Xminus <= 0.)   || (Xminus > 1.))    {InerSuccess=false; break;}
                                                   >> 988                } else
                                                   >> 989                {
                                                   >> 990                 if((Xminus <= 0.)   || (Xminus > 1.) || 
                                                   >> 991                    (XminusSum <=0.) || (XminusSum > 1.)) {InerSuccess=false; break;}
                                                   >> 992                }                                          
                                                   >> 993 
                                                   >> 994                G4double Px=aNucleon->Get4Momentum().px() - DeltaX;
                                                   >> 995                G4double Py=aNucleon->Get4Momentum().py() - DeltaY;
                                                   >> 996 
                                                   >> 997 //               if(!ProjectileIsAntiBaryon)                          // 4.12.2010
                                                   >> 998 //               {
                                                   >> 999                 M2target +=(aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass()*
                                                   >> 1000                             aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass()  + 
                                                   >> 1001                             Px*Px + Py*Py)/Xminus;
                                                   >> 1002 /*
                                                   >> 1003                } else
                                                   >> 1004                {
                                                   >> 1005                 M2target +=(aNucleon->Get4Momentum().e() *
                                                   >> 1006                             aNucleon->Get4Momentum().e()  +      // 6.12.2010
                                                   >> 1007                             Px*Px + Py*Py)/Xminus;
                                                   >> 1008                }
                                                   >> 1009 */
                                                   >> 1010                G4LorentzVector tmp(Px,Py,Xminus,aNucleon->Get4Momentum().e()); // 6.12.2010
                                                   >> 1011                aNucleon->SetMomentum(tmp);
                                                   >> 1012              }   // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 1013 
                                                   >> 1014              if(InerSuccess && (ResidualMassNumber != 0))
                                                   >> 1015              {
                                                   >> 1016               M2target +=(sqr(ResidualMass) + PnuclearResidual.mag2())/XminusSum;
                                                   >> 1017              }
                                                   >> 1018 //G4cout<<"InerSuccess "<<InerSuccess<<" "<<SqrtS<<" "<<Mprojectile + std::sqrt(M2target)<<" "<<std::sqrt(M2target)<<G4endl;
                                                   >> 1019 //G4int Uzhi;G4cin>>Uzhi;
                                                   >> 1020             } while(!InerSuccess);
                                                   >> 1021           } while (SqrtS < Mprojectile + std::sqrt(M2target));
                                                   >> 1022 //-------------------------------------------------------------
                                                   >> 1023           G4double DecayMomentum2= S*S+M2projectile*M2projectile+M2target*M2target
                                                   >> 1024                                     -2.*S*M2projectile - 2.*S*M2target 
                                                   >> 1025                                          -2.*M2projectile*M2target;
                                                   >> 1026 
                                                   >> 1027           WminusTarget=(S-M2projectile+M2target+std::sqrt(DecayMomentum2))/2./SqrtS;
                                                   >> 1028           WplusProjectile=SqrtS - M2target/WminusTarget;
                                                   >> 1029 
                                                   >> 1030           G4double Pzprojectile=WplusProjectile/2. - M2projectile/2./WplusProjectile;// 8.06.11
                                                   >> 1031           G4double Eprojectile =WplusProjectile/2. + M2projectile/2./WplusProjectile;// 8.06.11
                                                   >> 1032           G4double Yprojectile=0.5*std::log((Eprojectile+Pzprojectile)/
                                                   >> 1033                                             (Eprojectile-Pzprojectile));            // 1.07.11
                                                   >> 1034 
                                                   >> 1035 //G4cout<<"Yprojectile "<<Yprojectile<<G4endl;
                                                   >> 1036 //G4LorentzVector TestPprojectile=Pprojectile;
                                                   >> 1037 //TestPprojectile.setPz(Pzprojectile);  TestPprojectile.setE(Eprojectile);
                                                   >> 1038 
                                                   >> 1039 //G4cout<<"DecayMomentum2 "<<DecayMomentum2<<G4endl;
                                                   >> 1040 //G4cout<<"WminusTarget WplusProjectile "<<WminusTarget<<" "<<WplusProjectile<<G4endl;
                                                   >> 1041 //G4int Uzhi;G4cin>>Uzhi;
                                                   >> 1042 //-------------------------------------------------------------
                                                   >> 1043     for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 1044           {
                                                   >> 1045            G4Nucleon * aNucleon = TheInvolvedNucleon[i];
                                                   >> 1046            G4LorentzVector tmp=aNucleon->Get4Momentum();
                                                   >> 1047 
                                                   >> 1048            G4double Mt2(0.);
                                                   >> 1049 
                                                   >> 1050 //           if(!ProjectileIsAntiBaryon)                          // 4.12.2010
                                                   >> 1051 //           {
                                                   >> 1052             Mt2 = sqr(tmp.x())+sqr(tmp.y())+
                                                   >> 1053                   sqr(aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass());
                                                   >> 1054 /*
                                                   >> 1055            } else
                                                   >> 1056            {
                                                   >> 1057             Mt2 = sqr(tmp.x())+sqr(tmp.y())+                   // 4.12.2010
                                                   >> 1058                   sqr(aNucleon->Get4Momentum().e());    // sqr
                                                   >> 1059            }
                                                   >> 1060 */
                                                   >> 1061            G4double Xminus=tmp.z();
                                                   >> 1062 
                                                   >> 1063            G4double Pz=-WminusTarget*Xminus/2. + Mt2/(2.*WminusTarget*Xminus);
                                                   >> 1064            G4double E = WminusTarget*Xminus/2. + Mt2/(2.*WminusTarget*Xminus);
                                                   >> 1065            G4double YtargetNucleon=0.5*std::log((E+Pz)/(E-Pz));   // 1.07.11 //Uzhi 20 Sept.
                                                   >> 1066 
                                                   >> 1067 //G4cout<<"YtargetNucleon "<<YtargetNucleon<<G4endl;
                                                   >> 1068 //G4cout<<"YtargetNucleon-YtargetNucleus "<<YtargetNucleon-YtargetNucleus<<G4endl;
                                                   >> 1069 //G4cout<<"Yprojectile  YtargetNucleon "<<Yprojectile<<" "<<YtargetNucleon<<G4endl;
                                                   >> 1070 if((std::abs(YtargetNucleon-YtargetNucleus) > 2) || 
                                                   >> 1071             (Yprojectile  < YtargetNucleon))        {OuterSuccess=false; break;} // 1.07.11
                                                   >> 1072 
                                                   >> 1073           }   // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 1074 //if(ProjectileIsAntiBaryon) {G4int Uzhi;G4cin>>Uzhi;}
                                                   >> 1075         } while(!OuterSuccess);
                                                   >> 1076 
                                                   >> 1077 //-------------------------------------------------------------
                                                   >> 1078         G4double Pzprojectile=WplusProjectile/2. - M2projectile/2./WplusProjectile;
                                                   >> 1079         G4double Eprojectile =WplusProjectile/2. + M2projectile/2./WplusProjectile;
                                                   >> 1080         Pprojectile.setPz(Pzprojectile);  Pprojectile.setE(Eprojectile);
                                                   >> 1081 //G4cout<<"Proj after in CMS "<<Pprojectile<<G4endl;
                                                   >> 1082 
                                                   >> 1083         Pprojectile.transform(toLab);       // The work with the projectile
                                                   >> 1084         primary->Set4Momentum(Pprojectile); // is finished at the moment.
                                                   >> 1085 //G4cout<<"Final proj mom "<<primary->Get4Momentum()<<G4endl;
                                                   >> 1086 
                                                   >> 1087 //-------------------------------------------------------------
                                                   >> 1088         G4ThreeVector Residual3Momentum(0.,0.,1.);
                                                   >> 1089 
                                                   >> 1090   for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 1091         {
                                                   >> 1092            G4Nucleon * aNucleon = TheInvolvedNucleon[i];
                                                   >> 1093            G4LorentzVector tmp=aNucleon->Get4Momentum();
                                                   >> 1094 //G4cout<<"trg "<<aNucleon->Get4Momentum()<<G4endl;
                                                   >> 1095            Residual3Momentum-=tmp.vect();
                                                   >> 1096 
                                                   >> 1097            G4double Mt2(0.);
                                                   >> 1098 
                                                   >> 1099 //           if(!ProjectileIsAntiBaryon)                          // 4.12.2010
                                                   >> 1100 //           {
                                                   >> 1101             Mt2 = sqr(tmp.x())+sqr(tmp.y())+
                                                   >> 1102                   sqr(aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass());
                                                   >> 1103 /*
                                                   >> 1104            } else
                                                   >> 1105            {
                                                   >> 1106             Mt2 = sqr(tmp.x())+sqr(tmp.y())+                   // 4.12.2010
                                                   >> 1107                   aNucleon->Get4Momentum().e()*aNucleon->Get4Momentum().e();
                                                   >> 1108            }
                                                   >> 1109 */
                                                   >> 1110            G4double Xminus=tmp.z();
                                                   >> 1111 
                                                   >> 1112            G4double Pz=-WminusTarget*Xminus/2. + Mt2/(2.*WminusTarget*Xminus);
                                                   >> 1113            G4double E = WminusTarget*Xminus/2. + Mt2/(2.*WminusTarget*Xminus);
                                                   >> 1114 
                                                   >> 1115            tmp.setPz(Pz); 
                                                   >> 1116            tmp.setE(E);
                                                   >> 1117 //G4cout<<"Targ after in CMS "<<tmp<<G4endl;
                                                   >> 1118            tmp.transform(toLab);
                                                   >> 1119 
                                                   >> 1120            aNucleon->SetMomentum(tmp);
                                                   >> 1121 //G4cout<<"Targ after in LAB "<<aNucleon->Get4Momentum()<<G4endl;
                                                   >> 1122            G4VSplitableHadron * targetSplitable=aNucleon->GetSplitableHadron();
                                                   >> 1123            targetSplitable->Set4Momentum(tmp);
                                                   >> 1124            
                                                   >> 1125         }   // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
2187                                                  1126 
2188       if ( FirstString  != 0 ) strings->push_ << 1127 //G4cout<<"ResidualMassNumber and Mom "<<ResidualMassNumber<<" "<<Residual3Momentum<<G4endl;
2189       if ( SecondString != 0 ) strings->push_ << 1128         G4double Mt2Residual=sqr(ResidualMass) +
2190     }                                         << 1129                                  sqr(Residual3Momentum.x())+sqr(Residual3Momentum.y());
2191   }                                           << 1130 //==========================
                                                   >> 1131 //G4cout<<"WminusTarget Residual3Momentum.z() "<<WminusTarget<<" "<<Residual3Momentum.z()<<G4endl;
                                                   >> 1132         G4double PzResidual=0.;
                                                   >> 1133         G4double EResidual =0.;
                                                   >> 1134         if(ResidualMassNumber != 0)
                                                   >> 1135         {
                                                   >> 1136          PzResidual=-WminusTarget*Residual3Momentum.z()/2. + 
                                                   >> 1137                              Mt2Residual/(2.*WminusTarget*Residual3Momentum.z());
                                                   >> 1138          EResidual = WminusTarget*Residual3Momentum.z()/2. + 
                                                   >> 1139                              Mt2Residual/(2.*WminusTarget*Residual3Momentum.z());
                                                   >> 1140         }
                                                   >> 1141 //==========================
                                                   >> 1142         Residual4Momentum.setPx(Residual3Momentum.x());
                                                   >> 1143         Residual4Momentum.setPy(Residual3Momentum.y());
                                                   >> 1144         Residual4Momentum.setPz(PzResidual); 
                                                   >> 1145         Residual4Momentum.setE(EResidual);
                                                   >> 1146 //G4cout<<"Residual4Momentum in CMS Y "<<Residual4Momentum.beta()<<G4endl;
                                                   >> 1147 //G4int Uzhi; G4cin>>Uzhi;
                                                   >> 1148         Residual4Momentum.transform(toLab);
                                                   >> 1149 //G4cout<<"Residual4Momentum in Lab "<<Residual4Momentum<<G4endl;
                                                   >> 1150 //G4int Uzhi; G4cin>>Uzhi;
                                                   >> 1151 //-------------------------------------------------------------
                                                   >> 1152  return true;
                                                   >> 1153 }
2192                                                  1154 
2193   #ifdef debugBuildString                     << 1155 // ------------------------------------------------------------
2194   G4cout << "Building of target-like strings" << 1156 G4bool G4FTFModel::ExciteParticipants()
2195   #endif                                      << 1157 {
2196                                               << 1158 //G4cout<<"G4FTFModel::ExciteParticipants() "<<G4endl;
2197   G4bool isProjectile = false;                << 1159         G4bool Successfull(true);  //(false); // 1.07.11
2198   for ( G4int ahadron = 0; ahadron < NumberOf << 
2199     G4VSplitableHadron* aNucleon = TheInvolve << 
2200                                               << 
2201     #ifdef debugBuildString                   << 
2202     G4cout << "Nucleon #, status, intCount "  << 
2203            << aNucleon->GetStatus() << " " << << 
2204     #endif                                    << 
2205                                               << 
2206     FirstString = 0 ; SecondString = 0;       << 
2207                                               << 
2208     if ( aNucleon->GetStatus() == 0 ) { // A  << 
2209       theExcitation->CreateStrings( aNucleon, << 
2210                                     FirstStri << 
2211       NumberOfTargetSpectatorNucleons--;      << 
2212                                               << 
2213       #ifdef debugBuildString                 << 
2214       G4cout << " 1 case A string is build" < << 
2215       #endif                                  << 
2216                                               << 
2217     } else if ( aNucleon->GetStatus() == 1  & << 
2218       // A nucleon took part in diffractive i << 
2219       theExcitation->CreateStrings( aNucleon, << 
2220                                     FirstStri << 
2221                                               << 
2222       #ifdef debugBuildString                 << 
2223       G4cout << " 2 case A string is build, n << 
2224       #endif                                  << 
2225                                               << 
2226       NumberOfTargetSpectatorNucleons--;      << 
2227                                               << 
2228     } else if ( aNucleon->GetStatus() == 1  & << 
2229                 HighEnergyInter ) {           << 
2230       // A nucleon was considered as a partic << 
2231       // its interactions were skipped. It wi << 
2232       // at high energies.                    << 
2233                                               << 
2234       G4LorentzVector ParticleMomentum = aNuc << 
2235       G4KineticTrack* aTrack = new G4KineticT << 
2236                                               << 
2237                                               << 
2238                                               << 
2239                                               << 
2240       FirstString = new G4ExcitedString( aTra << 
2241                                               << 
2242       #ifdef debugBuildString                 << 
2243       G4cout << "3 case A string is build" << << 
2244       #endif                                  << 
2245                                               << 
2246     } else if ( aNucleon->GetStatus() == 1  & << 
2247                 ! HighEnergyInter ) {         << 
2248       // A nucleon was considered as a partic << 
2249       // its interactions were skipped. It wi << 
2250       // at low energies energies.            << 
2251       aNucleon->SetStatus( 5 );  // 4->5      << 
2252       // ??? delete aNucleon;                 << 
2253                                               << 
2254       #ifdef debugBuildString                 << 
2255       G4cout << "4 case A string is not build << 
2256       #endif                                  << 
2257                                               << 
2258     } else if ( aNucleon->GetStatus() == 2  | << 
2259                 aNucleon->GetStatus() == 3  ) << 
2260       G4LorentzVector ParticleMomentum = aNuc << 
2261       G4KineticTrack* aTrack = new G4KineticT << 
2262                                               << 
2263                                               << 
2264                                               << 
2265       FirstString = new G4ExcitedString( aTra << 
2266                                               << 
2267       #ifdef debugBuildString                 << 
2268       G4cout << "5 case A string is build" << << 
2269       #endif                                  << 
2270                                               << 
2271       if ( aNucleon->GetStatus() == 2 ) Numbe << 
2272                                               << 
2273     } else {                                  << 
2274                                               << 
2275       #ifdef debugBuildString                 << 
2276       G4cout << "6 case No string" << G4endl; << 
2277       #endif                                  << 
2278                                                  1160 
2279     }                                         << 1161         theParticipants.StartLoop();
                                                   >> 1162         G4int CurrentInteraction(0);   // Uzhi Feb26
2280                                                  1163 
2281     if ( FirstString  != 0 ) strings->push_ba << 1164         G4int MaxNumOfInelCollisions=G4int(theParameters->GetMaxNumberOfCollisions());
2282     if ( SecondString != 0 ) strings->push_ba << 1165 //G4cout<<"MaxNumOfInelCollisions "<<MaxNumOfInelCollisions<<G4endl;
                                                   >> 1166         G4double NumberOfInel(0.);
                                                   >> 1167 //
                                                   >> 1168         if(MaxNumOfInelCollisions > 0)  
                                                   >> 1169         {   //  Plab > Pbound, Normal application of FTF is possible
                                                   >> 1170          G4double ProbMaxNumber=theParameters->GetMaxNumberOfCollisions()-
                                                   >> 1171                                                   MaxNumOfInelCollisions;
                                                   >> 1172          if(G4UniformRand() < ProbMaxNumber) {MaxNumOfInelCollisions++;}
                                                   >> 1173          NumberOfInel=MaxNumOfInelCollisions;
                                                   >> 1174 //G4cout<<"Plab > Pbound MaxNumOfInelCollisions "<<MaxNumOfInelCollisions<<G4endl;
                                                   >> 1175         } else
                                                   >> 1176         {   //  Plab < Pbound, Normal application of FTF is impossible, 
                                                   >> 1177             //                 low energy corrections applied.
                                                   >> 1178          if(theParticipants.theNucleus->GetMassNumber() > 1)
                                                   >> 1179          {
                                                   >> 1180           NumberOfInel = theParameters->GetProbOfInteraction();
                                                   >> 1181           MaxNumOfInelCollisions = 1;
                                                   >> 1182          } else
                                                   >> 1183          { // Special case for hadron-nucleon interactions
                                                   >> 1184           NumberOfInel = 1.;
                                                   >> 1185           MaxNumOfInelCollisions = 1;
                                                   >> 1186 //G4cout<<"Plab < Pbound MaxNumOfInelCollisions "<<MaxNumOfInelCollisions<<G4endl;
                                                   >> 1187          }
                                                   >> 1188         }  // end of if(MaxNumOfInelCollisions > 0)
                                                   >> 1189 //
                                                   >> 1190 //G4cout<<"MaxNumOfInelCollisions MaxNumOfInelCollisions "<<MaxNumOfInelCollisions<<" "<<MaxNumOfInelCollisions<<G4endl;
2283                                                  1191 
2284   }                                           << 1192   while (theParticipants.Next())
                                                   >> 1193   {    
                                                   >> 1194            CurrentInteraction++;
                                                   >> 1195      const G4InteractionContent & collision=theParticipants.GetInteraction();
2285                                                  1196 
2286   #ifdef debugBuildString                     << 1197      G4VSplitableHadron * projectile=collision.GetProjectile();
2287   G4cout << G4endl << "theAdditionalString.si << 1198      G4VSplitableHadron * target=collision.GetTarget();
2288          << G4endl << G4endl;                 << 1199 //
2289   #endif                                      << 1200 //G4cout<<"Ppr tr "<<projectile<<" "<<target<<G4endl;
2290                                               << 1201 //G4cout<<"theInter Time "<<collision.GetInteractionTime()/fermi<<G4endl;
2291   isProjectile = true;                        << 1202 //G4cout<<"Int Status    "<<collision.GetStatus()<<" "<<CurrentInteraction<<G4endl;
2292   if ( theAdditionalString.size() != 0 ) {    << 1203 //G4cout<<"Proj M "<<projectile->Get4Momentum()<<" "<<projectile->Get4Momentum().mag()<<G4endl;
2293     for ( unsigned int  ahadron = 0; ahadron  << 1204 //G4cout<<"Targ M "<<target->Get4Momentum()<<" "<<target->Get4Momentum().mag()<<G4endl;
2294       //if ( theAdditionalString[ ahadron ]-> << 1205 //G4cout<<"ProbabilityOfElasticScatt "<<theParameters->GetProbabilityOfElasticScatt()<<G4endl;
2295       FirstString = 0; SecondString = 0;      << 1206 //G4cout<<"ProbabilityOfAnnihilation "<<theParameters->GetProbabilityOfAnnihilation()<<G4endl;
2296       theExcitation->CreateStrings( theAdditi << 1207 //G4cout<<"projectile->GetStatus target->GetStatus "<<projectile->GetStatus()<<" "<<target->GetStatus()<<G4endl;
2297                                     FirstStri << 1208 //if((projectile->GetStatus() == 1) && (target->GetStatus() ==1))
2298       if ( FirstString  != 0 ) strings->push_ << 1209 //
2299       if ( SecondString != 0 ) strings->push_ << 1210 if(collision.GetStatus())                                          // Uzhi Feb26
2300     }                                         << 1211 {
2301   }                                           << 
2302                                                  1212 
2303   //for ( unsigned int ahadron = 0; ahadron < << 1213 //theParameters->SetProbabilityOfElasticScatt(1.);
2304   //  G4cout << ahadron << " " << strings->op << 1214 //G4cout<<"before pro "<<projectile->Get4Momentum()<<" "<<projectile->Get4Momentum().mag()<<G4endl;
2305   //         << " " << strings->operator[]( a << 1215 //G4cout<<"before tar "<<target->Get4Momentum()<<" "<<target->Get4Momentum().mag()<<G4endl;
2306   //}                                         << 1216 //G4cout<<"Prob el "<<theParameters->GetProbabilityOfElasticScatt()<<G4endl;
2307   //G4cout << "------------------------" << G << 1217 //G4cout<<"Prob an "<<theParameters->GetProbabilityOfAnnihilation()<<G4endl;
                                                   >> 1218 
                                                   >> 1219 //G4cout<<"Pr Tr "<<projectile->GetDefinition()->GetPDGEncoding()<<" "<<target->GetDefinition()->GetPDGEncoding()<<G4endl;
                                                   >> 1220 //G4int Uzhi; G4cin>>Uzhi;
                                                   >> 1221 
                                                   >> 1222            if(G4UniformRand()< theParameters->GetProbabilityOfElasticScatt())
                                                   >> 1223            { //   Elastic scattering -------------------------
                                                   >> 1224 //G4cout<<"Elastic FTF"<<G4endl;
                                                   >> 1225             Successfull = theElastic->ElasticScattering(projectile, target, theParameters)
                                                   >> 1226                        || Successfull;              // 9.06.2012
                                                   >> 1227            }
                                                   >> 1228            else if(G4UniformRand() > theParameters->GetProbabilityOfAnnihilation())
                                                   >> 1229            { //   Inelastic scattering ---------------------- 
                                                   >> 1230 //G4cout<<"Inelastic FTF"<<G4endl;
                                                   >> 1231 //G4cout<<"NumberOfInel MaxNumOfInelCollisions "<<NumberOfInel<<" "<<MaxNumOfInelCollisions<<G4endl;
                                                   >> 1232             if(G4UniformRand()< NumberOfInel/MaxNumOfInelCollisions)
                                                   >> 1233             {
                                                   >> 1234              if(theExcitation->ExciteParticipants(projectile, target, 
                                                   >> 1235                                                  theParameters, theElastic))
                                                   >> 1236              {
                                                   >> 1237               NumberOfInel--;
                                                   >> 1238 //G4cout<<"Excitation FTF  Successfull "<<G4endl;
                                                   >> 1239 //G4cout<<"After  pro "<<projectile->Get4Momentum()<<" "<<projectile->Get4Momentum().mag()<<G4endl;
                                                   >> 1240 //G4cout<<"After  tar "<<target->Get4Momentum()<<" "<<target->Get4Momentum().mag()<<G4endl;
                                                   >> 1241              } else
                                                   >> 1242              {
                                                   >> 1243 //G4cout<<"Excitation FTF  Non Successfull -> Elastic scattering "<<Successfull<<G4endl;
                                                   >> 1244 
                                                   >> 1245               Successfull = theElastic->ElasticScattering(projectile, target, theParameters)
                                                   >> 1246                          || Successfull;              // 9.06.2012
                                                   >> 1247 
                                                   >> 1248 /*
                                                   >> 1249               if(NumberOfInvolvedTargetNucleon > 1)
                                                   >> 1250               {
                                                   >> 1251                NumberOfInvolvedTargetNucleon--;
                                                   >> 1252                target->SetStatus(0);  // 1->0 return nucleon to the target  VU 10.04.2012
                                                   >> 1253               }
                                                   >> 1254 */
                                                   >> 1255              }
                                                   >> 1256             } else // If NumOfInel
                                                   >> 1257             {
                                                   >> 1258 //G4cout<<"Elastic at rejected inelastic scattering"<<G4endl;
                                                   >> 1259              Successfull = theElastic->ElasticScattering(projectile, target, theParameters)
                                                   >> 1260                         || Successfull;              // 9.06.2012
                                                   >> 1261 /*
                                                   >> 1262              if(theElastic->ElasticScattering(projectile, target, theParameters))
                                                   >> 1263              {
                                                   >> 1264 //              Successfull = Successfull || true;
                                                   >> 1265              } else
                                                   >> 1266              {
                                                   >> 1267 //            Successfull = Successfull || false;
                                                   >> 1268 //Successfull = Successfull && false;
                                                   >> 1269 Successfull = false; break;                         // 1.07.11
                                                   >> 1270 
                                                   >> 1271               if(NumberOfInvolvedTargetNucleon > 1)
                                                   >> 1272               {
                                                   >> 1273                NumberOfInvolvedTargetNucleon--;
                                                   >> 1274                target->SetStatus(4); // 1->0 return nucleon to the target  VU 10.04.2012
                                                   >> 1275               }
                                                   >> 1276              }
                                                   >> 1277 */
                                                   >> 1278             }   // end if NumOfInel
                                                   >> 1279            } 
                                                   >> 1280            else  // Annihilation
                                                   >> 1281            {
                                                   >> 1282 //G4cout<<"Annihilation"<<G4endl;
                                                   >> 1283 //G4cout<<"Before  pro "<<projectile->Get4Momentum()<<G4endl;
                                                   >> 1284 //G4cout<<"Before  tar "<<target->Get4Momentum()<<G4endl;
                                                   >> 1285 //G4cout<<"Mom pro "<<theProjectile.GetTotalMomentum()<<G4endl;
                                                   >> 1286 //if(theProjectile.GetTotalMomentum() < 2000.*MeV)           
                                                   >> 1287 { 
                                                   >> 1288             while (theParticipants.Next())
                                                   >> 1289             {   
                                                   >> 1290             G4InteractionContent & acollision=theParticipants.GetInteraction();//Uzhi Feb26
                                                   >> 1291 
                                                   >> 1292        G4VSplitableHadron * NextProjectileNucleon=acollision.GetProjectile(); // Uzhi Feb26
                                                   >> 1293        G4VSplitableHadron * NextTargetNucleon    =acollision.GetTarget();
                                                   >> 1294              if((projectile == NextProjectileNucleon) ||
                                                   >> 1295                 (target     == NextTargetNucleon        )) acollision.SetStatus(0);
                                                   >> 1296 //             if(target != NextTargetNucleon) NextTargetNucleon->SetStatus(0); // Uzhi Feb26
                                                   >> 1297             }
2308                                                  1298 
2309   return;                                     << 1299             theParticipants.StartLoop(); 
                                                   >> 1300             for(G4int I=0; I < CurrentInteraction; I++) theParticipants.Next();
                                                   >> 1301             
                                                   >> 1302 //-----------------------------------------
                                                   >> 1303 // 1Nov2011            AjustTargetNucleonForAnnihilation(projectile, target);
                                                   >> 1304 //-----------------------------------------
                                                   >> 1305 //G4cout<<"After Ajsd pro "<<projectile->Get4Momentum()<<G4endl;
                                                   >> 1306 //G4cout<<"After Ajst tar "<<target->Get4Momentum()<<G4endl;
2310 }                                                1307 }
                                                   >> 1308             G4VSplitableHadron *AdditionalString=0;
                                                   >> 1309             if(theAnnihilation->Annihilate(projectile, target, AdditionalString, theParameters))
                                                   >> 1310             {
                                                   >> 1311              Successfull = Successfull || true;
                                                   >> 1312 //G4cout<<G4endl<<"*AdditionalString "<<AdditionalString<<G4endl;
                                                   >> 1313 //G4cout<<"After  pro "<<projectile->Get4Momentum()<<G4endl;
                                                   >> 1314 //G4cout<<"After  tar "<<target->Get4Momentum()<<G4endl;
                                                   >> 1315 
                                                   >> 1316              if(AdditionalString != 0) theAdditionalString.push_back(AdditionalString);
                                                   >> 1317 
                                                   >> 1318 //             break;
                                                   >> 1319 
                                                   >> 1320             } else
                                                   >> 1321             {
                                                   >> 1322               //A.R. 25-Jul-2012 : commenting the next line to fix a Coverity
                                                   >> 1323               //                   "logically dead code".
                                                   >> 1324               //Successfull = Successfull || false;
2311                                                  1325 
                                                   >> 1326 //             target->SetStatus(2);
                                                   >> 1327             }
                                                   >> 1328            } 
                                                   >> 1329 //
                                                   >> 1330 } // End of if((projectile->GetStatus() == 1) && (target->GetStatus() ==1))
2312                                                  1331 
2313 //=========================================== << 1332         }       // end of while (theParticipants.Next())
2314                                               << 
2315 void G4FTFModel::GetResiduals() {             << 
2316   // This method is needed for the correct ap << 
2317                                               << 
2318   #ifdef debugFTFmodel                        << 
2319   G4cout << "GetResiduals(): HighEnergyInter? << 
2320          << HighEnergyInter << " " << GetProj << 
2321   #endif                                      << 
2322                                               << 
2323   if ( HighEnergyInter ) {                    << 
2324                                               << 
2325     #ifdef debugFTFmodel                      << 
2326     G4cout << "NumberOfInvolvedNucleonsOfTarg << 
2327     #endif                                    << 
2328                                               << 
2329     G4double DeltaExcitationE = TargetResidua << 
2330                                 G4double( Num << 
2331     G4LorentzVector DeltaPResidualNucleus = T << 
2332                                             G << 
2333                                               << 
2334     for ( G4int i = 0; i < NumberOfInvolvedNu << 
2335       G4Nucleon* aNucleon = TheInvolvedNucleo << 
2336                                               << 
2337       #ifdef debugFTFmodel                    << 
2338       G4VSplitableHadron* targetSplitable = a << 
2339       G4cout << i << " Hit? " << aNucleon->Ar << 
2340       if ( targetSplitable ) G4cout << i << " << 
2341       #endif                                  << 
2342                                               << 
2343       G4LorentzVector tmp = -DeltaPResidualNu << 
2344       aNucleon->SetMomentum( tmp );           << 
2345       aNucleon->SetBindingEnergy( DeltaExcita << 
2346     }                                         << 
2347                                               << 
2348     if ( TargetResidualMassNumber != 0 ) {    << 
2349       G4ThreeVector bstToCM = TargetResidual4 << 
2350                                                  1333 
2351       G4V3DNucleus* theTargetNucleus = GetTar << 1334 //Successfull=true;
2352       G4LorentzVector residualMomentum( 0.0,  << 1335 //G4cout<<"G4FTFModel::ExciteParticipants() Successfull "<<Successfull<<G4endl;
2353       G4Nucleon* aNucleon = 0;                << 1336 //G4int Uzhi; G4cin>>Uzhi;
2354       theTargetNucleus->StartLoop();          << 1337   return Successfull;
2355       while ( ( aNucleon = theTargetNucleus-> << 1338 }
2356         if ( ! aNucleon->AreYouHit() ) {      << 
2357           G4LorentzVector tmp = aNucleon->Get << 
2358           aNucleon->SetMomentum( tmp );       << 
2359           residualMomentum += tmp;            << 
2360         }                                     << 
2361       }                                       << 
2362                                                  1339 
2363       residualMomentum /= TargetResidualMassN << 1340 //-------------------------------------------------------------------
                                                   >> 1341 void G4FTFModel::AjustTargetNucleonForAnnihilation(G4VSplitableHadron *SelectedAntiBaryon,
                                                   >> 1342                                                    G4VSplitableHadron *SelectedTargetNucleon)
                                                   >> 1343 {
                                                   >> 1344         G4LorentzVector Pparticipants=SelectedAntiBaryon->Get4Momentum()+
                                                   >> 1345                                       SelectedTargetNucleon->Get4Momentum();
2364                                                  1346 
2365       G4double Mass = TargetResidual4Momentum << 1347         G4V3DNucleus *theNucleus = GetWoundedNucleus();
2366       G4double SumMasses = 0.0;               << 1348 //G4cout<<"Init A mass "<<theNucleus->GetMass()<<" "<<theNucleus->GetMassNumber()<<" "<<theNucleus->GetCharge()<<G4endl;
2367                                               << 
2368       aNucleon = 0;                           << 
2369       theTargetNucleus->StartLoop();          << 
2370       while ( ( aNucleon = theTargetNucleus-> << 
2371         if ( ! aNucleon->AreYouHit() ) {      << 
2372           G4LorentzVector tmp = aNucleon->Get << 
2373           G4double E = std::sqrt( tmp.vect(). << 
2374                                   sqr( aNucle << 
2375           tmp.setE( E );  aNucleon->SetMoment << 
2376           SumMasses += E;                     << 
2377         }                                     << 
2378       }                                       << 
2379                                                  1349 
2380       G4double Chigh = Mass / SumMasses; G4do << 1350         ResidualExcitationEnergy=0.;
2381       const G4int maxNumberOfLoops = 1000;    << 1351         G4int ResidualCharge    =theNucleus->GetCharge();
2382       G4int loopCounter = 0;                  << 1352         G4int ResidualMassNumber=theNucleus->GetMassNumber();
2383       do {                                    << 1353 
2384         C = ( Chigh + Clow ) / 2.0;           << 1354         G4ThreeVector   P3nuclearResidual(0.,0.,0.);
2385         SumMasses = 0.0;                      << 1355         G4LorentzVector PnuclearResidual(0.,0.,0.,0.);
2386         aNucleon = 0;                         << 1356 
2387         theTargetNucleus->StartLoop();        << 1357 
2388         while ( ( aNucleon = theTargetNucleus << 1358         G4double ExcitationEnergyPerWoundedNucleon=
2389           if ( ! aNucleon->AreYouHit() ) {    << 1359                  theParameters->GetExcitationEnergyPerWoundedNucleon();
2390             G4LorentzVector tmp = aNucleon->G << 1360 //-------
2391             G4double E = std::sqrt( tmp.vect( << 1361         G4Nucleon * aNucleon;
2392                                     sqr( aNuc << 1362         theNucleus->StartLoop();
2393             SumMasses += E;                   << 1363         G4int NumberOfHoles(0);
                                                   >> 1364 //G4cout<<"Start loop"<<G4endl;
                                                   >> 1365   while ((aNucleon = theNucleus->GetNextNucleon()))
                                                   >> 1366         {
                                                   >> 1367          G4int CurrentStatus=0;
                                                   >> 1368          if(aNucleon->AreYouHit()) 
                                                   >> 1369          {
                                                   >> 1370           if(aNucleon->GetSplitableHadron() == SelectedTargetNucleon)
                                                   >> 1371           {CurrentStatus=1;}
                                                   >> 1372           else
                                                   >> 1373           {
                                                   >> 1374            if(aNucleon->GetSplitableHadron()->GetSoftCollisionCount() == 0) 
                                                   >> 1375            {CurrentStatus=0;}
                                                   >> 1376            else {CurrentStatus=1;}
2394           }                                      1377           }
                                                   >> 1378          }
                                                   >> 1379 //G4cout<<"CurrentStatus "<<CurrentStatus<<G4endl;
                                                   >> 1380          if(CurrentStatus != 0)
                                                   >> 1381          {   // Participating nucleons
                                                   >> 1382 //G4cout<<"              Partic "<<aNucleon->GetSplitableHadron()->GetStatus()<<" "<<aNucleon->GetSplitableHadron()->GetSoftCollisionCount()<<G4endl;
                                                   >> 1383           NumberOfHoles++;
                                                   >> 1384           ResidualExcitationEnergy+=ExcitationEnergyPerWoundedNucleon;
                                                   >> 1385           ResidualCharge-=(G4int) aNucleon->GetDefinition()->GetPDGCharge();
                                                   >> 1386           ResidualMassNumber--;
                                                   >> 1387          }
                                                   >> 1388          else
                                                   >> 1389          {   // Spectator nucleon
                                                   >> 1390           PnuclearResidual+=aNucleon->Get4Momentum();
                                                   >> 1391          }
                                                   >> 1392   }   // end of while (theNucleus->GetNextNucleon())
                                                   >> 1393 
                                                   >> 1394 //G4cout<<"Res Z M "<<ResidualCharge<<" "<<ResidualMassNumber<<G4endl;
                                                   >> 1395 //-------------------------------
                                                   >> 1396         G4LorentzVector Psum=Pparticipants + PnuclearResidual;  // 4-momentum in CMS
                                                   >> 1397 
                                                   >> 1398 // Transform momenta to cms and then rotate parallel to z axis;
                                                   >> 1399         G4LorentzRotation toCms(-1*Psum.boostVector());
                                                   >> 1400 
                                                   >> 1401         G4LorentzVector Ptmp=toCms*Psum;
                                                   >> 1402 
                                                   >> 1403         toCms.rotateZ(-1*Ptmp.phi());
                                                   >> 1404         toCms.rotateY(-1*Ptmp.theta());
                                                   >> 1405 
                                                   >> 1406         G4LorentzRotation toLab(toCms.inverse());
                                                   >> 1407 
                                                   >> 1408 //-------------------------------
                                                   >> 1409         G4double SqrtS=Psum.mag();
                                                   >> 1410         G4double S    =sqr(SqrtS);
                                                   >> 1411 
                                                   >> 1412         G4double ResidualMass(0.);
                                                   >> 1413         if(ResidualMassNumber != 0) 
                                                   >> 1414         {
                                                   >> 1415          ResidualMass=G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(
                                                   >> 1416                                                    ResidualCharge,ResidualMassNumber);
                                                   >> 1417         } else {return;}
                                                   >> 1418 
                                                   >> 1419 //G4cout<<"Res Mass E* "<<ResidualMass<<" "<<ResidualExcitationEnergy<<G4endl;
                                                   >> 1420 
                                                   >> 1421         if(ResidualMass > SqrtS) {return;}
                                                   >> 1422         else 
                                                   >> 1423         {
                                                   >> 1424          if(ResidualMass+ResidualExcitationEnergy > SqrtS)
                                                   >> 1425            ResidualExcitationEnergy = SqrtS-ResidualMass;
                                                   >> 1426         }
                                                   >> 1427 
                                                   >> 1428         ResidualMass+=ResidualExcitationEnergy;
                                                   >> 1429         G4double ResidualMass2=sqr(ResidualMass);
                                                   >> 1430 //G4cout<<"New Res Mass E* "<<ResidualMass<<" "<<ResidualExcitationEnergy<<G4endl;
                                                   >> 1431 
                                                   >> 1432 //-------
                                                   >> 1433         G4double ParticipantMass=Pparticipants.mag();
                                                   >> 1434         G4double ParticipantMass2=sqr(ParticipantMass);
                                                   >> 1435 
                                                   >> 1436         if(ResidualMass + ParticipantMass > SqrtS) ParticipantMass=SqrtS-ResidualMass;
                                                   >> 1437 
                                                   >> 1438 //G4cout<<"Parts P "<<Pparticipants<<G4endl;
                                                   >> 1439 //G4cout<<"Res Nuc "<<PnuclearResidual<<G4endl;
                                                   >> 1440 
                                                   >> 1441         G4double DecayMomentum2= 
                                                   >> 1442                       sqr(S)+sqr(ParticipantMass2)+ sqr(ResidualMass2) -
                                                   >> 1443                           2.*S*ParticipantMass2 - 2.*S*ResidualMass2 
                                                   >> 1444                               -2.*ParticipantMass2*ResidualMass2;
                                                   >> 1445 
                                                   >> 1446         if(DecayMomentum2 < 0.) return;
                                                   >> 1447 
                                                   >> 1448         DecayMomentum2/=(4.*S);
                                                   >> 1449         G4double DecayMomentum = std::sqrt(DecayMomentum2);
                                                   >> 1450 //G4cout<<"DecayMomentum "<<DecayMomentum<<G4endl;
                                                   >> 1451 
                                                   >> 1452         G4LorentzVector New_Pparticipants(0.,0.,DecayMomentum,
                                                   >> 1453                                 std::sqrt(DecayMomentum2+ParticipantMass2));
                                                   >> 1454 
                                                   >> 1455         G4LorentzVector New_PnuclearResidual(0.,0.,-DecayMomentum,
                                                   >> 1456                                 std::sqrt(DecayMomentum2+ResidualMass2));
                                                   >> 1457 
                                                   >> 1458 //G4cout<<"New part P "<<New_Pparticipants<<" "<<New_Pparticipants.mag()<<G4endl;
                                                   >> 1459 //G4cout<<"New resd P "<<New_PnuclearResidual<<" "<<New_PnuclearResidual.mag()<<G4endl;
                                                   >> 1460 
                                                   >> 1461         New_Pparticipants.transform(toLab);
                                                   >> 1462         New_PnuclearResidual.transform(toLab);
                                                   >> 1463 //G4cout<<"New part P "<<New_Pparticipants<<" "<<New_Pparticipants.mag()<<G4endl;
                                                   >> 1464 //G4cout<<"New resd P "<<New_PnuclearResidual<<" "<<New_PnuclearResidual.mag()<<G4endl;
                                                   >> 1465 
                                                   >> 1466         G4LorentzVector DeltaP_participants=(Pparticipants - New_Pparticipants)/2.;
                                                   >> 1467         G4LorentzVector DeltaP_nuclearResidual=(PnuclearResidual - New_PnuclearResidual)/
                                                   >> 1468                                                (G4double) ResidualMassNumber;
                                                   >> 1469 //------------------
                                                   >> 1470 
                                                   >> 1471         Ptmp=SelectedAntiBaryon->Get4Momentum() - DeltaP_participants;
                                                   >> 1472         SelectedAntiBaryon->Set4Momentum(Ptmp);
                                                   >> 1473 
                                                   >> 1474         Ptmp=SelectedTargetNucleon->Get4Momentum() - DeltaP_participants;
                                                   >> 1475         SelectedTargetNucleon->Set4Momentum(Ptmp);
                                                   >> 1476 //-----------
                                                   >> 1477 
                                                   >> 1478         //A.R. 25-Jul-2012 : Fix to Covery "Division by zero"
                                                   >> 1479         //G4double DeltaExcitationEnergy=ResidualExcitationEnergy/((G4double) NumberOfHoles);
                                                   >> 1480         G4double DeltaExcitationEnergy = 0.0;
                                                   >> 1481         if ( NumberOfHoles != 0 ) {
                                                   >> 1482           DeltaExcitationEnergy = ResidualExcitationEnergy / ((G4double) NumberOfHoles);
2395         }                                        1483         }
2396                                               << 1484  
2397         if ( SumMasses > Mass ) Chigh = C;    << 1485 // Re-definition of the wounded nucleon momenta
2398         else                    Clow  = C;    << 1486         theNucleus->StartLoop();
2399                                               << 1487   while ((aNucleon = theNucleus->GetNextNucleon()))
2400       } while ( Chigh - Clow > 0.01  &&       << 1488         {
2401                 ++loopCounter < maxNumberOfLo << 1489          G4int CurrentStatus=0;
2402       if ( loopCounter >= maxNumberOfLoops )  << 1490          if(aNucleon->AreYouHit()) 
2403         #ifdef debugFTFmodel                  << 1491          {
2404         G4cout << "BAD situation: forced exit << 1492           if(aNucleon->GetSplitableHadron() == SelectedTargetNucleon)
2405                << "\t return immediately from << 1493           {CurrentStatus=1;}
2406         #endif                                << 1494           else
2407         return;                               << 1495           {
2408       }                                       << 1496            if(aNucleon->GetSplitableHadron()->GetSoftCollisionCount() == 0) 
2409                                               << 1497            {CurrentStatus=0;}
2410       aNucleon = 0;                           << 1498            else {CurrentStatus=1;}
2411       theTargetNucleus->StartLoop();          << 
2412       while ( ( aNucleon = theTargetNucleus-> << 
2413         if ( !aNucleon->AreYouHit() ) {       << 
2414           G4LorentzVector tmp = aNucleon->Get << 
2415           G4double E = std::sqrt( tmp.vect(). << 
2416                                   sqr( aNucle << 
2417           tmp.setE( E ); tmp.boost( -bstToCM  << 
2418           aNucleon->SetMomentum( tmp );       << 
2419         }                                     << 
2420       }                                       << 
2421     }                                         << 
2422                                               << 
2423     if ( ! GetProjectileNucleus() ) return;   << 
2424                                               << 
2425     #ifdef debugFTFmodel                      << 
2426     G4cout << "NumberOfInvolvedNucleonsOfProj << 
2427            << G4endl << "ProjectileResidualEx << 
2428            << ProjectileResidualExcitationEne << 
2429     #endif                                    << 
2430                                               << 
2431     DeltaExcitationE = ProjectileResidualExci << 
2432                        G4double( NumberOfInvo << 
2433     DeltaPResidualNucleus = ProjectileResidua << 
2434                             G4double( NumberO << 
2435                                               << 
2436     for ( G4int i = 0; i < NumberOfInvolvedNu << 
2437       G4Nucleon* aNucleon = TheInvolvedNucleo << 
2438                                               << 
2439       #ifdef debugFTFmodel                    << 
2440       G4VSplitableHadron* projSplitable = aNu << 
2441       G4cout << i << " Hit? " << aNucleon->Ar << 
2442       if ( projSplitable ) G4cout << i << "St << 
2443       #endif                                  << 
2444                                               << 
2445       G4LorentzVector tmp = -DeltaPResidualNu << 
2446       aNucleon->SetMomentum( tmp );           << 
2447       aNucleon->SetBindingEnergy( DeltaExcita << 
2448     }                                         << 
2449                                               << 
2450     if ( ProjectileResidualMassNumber != 0 )  << 
2451       G4ThreeVector bstToCM = ProjectileResid << 
2452                                               << 
2453       G4V3DNucleus* theProjectileNucleus = Ge << 
2454       G4LorentzVector residualMomentum( 0.0,  << 
2455       G4Nucleon* aNucleon = 0;                << 
2456       theProjectileNucleus->StartLoop();      << 
2457       while ( ( aNucleon = theProjectileNucle << 
2458         if ( ! aNucleon->AreYouHit() ) {      << 
2459           G4LorentzVector tmp = aNucleon->Get << 
2460           aNucleon->SetMomentum( tmp );       << 
2461           residualMomentum += tmp;            << 
2462         }                                     << 
2463       }                                       << 
2464                                               << 
2465       residualMomentum /= ProjectileResidualM << 
2466                                               << 
2467       G4double Mass = ProjectileResidual4Mome << 
2468       G4double SumMasses= 0.0;                << 
2469                                               << 
2470       aNucleon = 0;                           << 
2471       theProjectileNucleus->StartLoop();      << 
2472       while ( ( aNucleon = theProjectileNucle << 
2473         if ( ! aNucleon->AreYouHit() ) {      << 
2474           G4LorentzVector tmp = aNucleon->Get << 
2475           G4double E=std::sqrt( tmp.vect().ma << 
2476                                 sqr(aNucleon- << 
2477           tmp.setE( E );  aNucleon->SetMoment << 
2478           SumMasses += E;                     << 
2479         }                                     << 
2480       }                                       << 
2481                                               << 
2482       G4double Chigh = Mass / SumMasses; G4do << 
2483       const G4int maxNumberOfLoops = 1000;    << 
2484       G4int loopCounter = 0;                  << 
2485       do {                                    << 
2486         C = ( Chigh + Clow ) / 2.0;           << 
2487                                               << 
2488         SumMasses = 0.0;                      << 
2489         aNucleon = 0;                         << 
2490         theProjectileNucleus->StartLoop();    << 
2491         while ( ( aNucleon = theProjectileNuc << 
2492           if ( ! aNucleon->AreYouHit() ) {    << 
2493             G4LorentzVector tmp = aNucleon->G << 
2494             G4double E = std::sqrt( tmp.vect( << 
2495                                     sqr( aNuc << 
2496             SumMasses += E;                   << 
2497           }                                      1499           }
2498         }                                     << 1500          }
                                                   >> 1501 //G4cout<<"CurrentStatus "<<CurrentStatus<<G4endl;
                                                   >> 1502          if(CurrentStatus != 0)
                                                   >> 1503          {   // Participating nucleons
                                                   >> 1504 //G4cout<<"              Partic "<<aNucleon->GetSplitableHadron()->GetStatus()<<" "<<aNucleon->GetSplitableHadron()->GetSoftCollisionCount()<<G4endl;
                                                   >> 1505           aNucleon->SetBindingEnergy(DeltaExcitationEnergy);
                                                   >> 1506          }
                                                   >> 1507          else
                                                   >> 1508          { // Spectator nucleon of nuclear residual
                                                   >> 1509           Ptmp=aNucleon->Get4Momentum() - DeltaP_nuclearResidual;
                                                   >> 1510           aNucleon->SetMomentum(Ptmp);
                                                   >> 1511          }
                                                   >> 1512   }   // end of while (theNucleus->GetNextNucleon())
2499                                                  1513 
2500         if ( SumMasses > Mass) Chigh = C;     << 1514 //-------------------------------
2501         else                   Clow  = C;     << 
2502                                               << 
2503       } while ( Chigh - Clow > 0.01  &&       << 
2504                 ++loopCounter < maxNumberOfLo << 
2505       if ( loopCounter >= maxNumberOfLoops )  << 
2506         #ifdef debugFTFmodel                  << 
2507         G4cout << "BAD situation: forced exit << 
2508                << "\t return immediately from << 
2509         #endif                                << 
2510         return;                                  1515         return;
2511       }                                       << 
2512                                               << 
2513       aNucleon = 0;                           << 
2514       theProjectileNucleus->StartLoop();      << 
2515       while ( ( aNucleon = theProjectileNucle << 
2516         if ( ! aNucleon->AreYouHit() ) {      << 
2517           G4LorentzVector tmp = aNucleon->Get << 
2518           G4double E = std::sqrt( tmp.vect(). << 
2519                                   sqr( aNucle << 
2520           tmp.setE( E ); tmp.boost( -bstToCM  << 
2521           aNucleon->SetMomentum( tmp );       << 
2522         }                                     << 
2523       }                                       << 
2524     }   // End of if ( ProjectileResidualMass << 
2525                                               << 
2526     #ifdef debugFTFmodel                      << 
2527     G4cout << "End projectile" << G4endl;     << 
2528     #endif                                    << 
2529                                               << 
2530   } else {  // Related to the condition: if ( << 
2531                                               << 
2532     #ifdef debugFTFmodel                      << 
2533     G4cout << "Low energy interaction: Target << 
2534            << "Tr ResidualMassNumber Tr Resid << 
2535            << TargetResidualMassNumber << " " << 
2536            << TargetResidualExcitationEnergy  << 
2537     #endif                                    << 
2538                                               << 
2539     G4int NumberOfTargetParticipant( 0 );     << 
2540     for ( G4int i = 0; i < NumberOfInvolvedNu << 
2541       G4Nucleon* aNucleon = TheInvolvedNucleo << 
2542       G4VSplitableHadron* targetSplitable = a << 
2543       if ( targetSplitable->GetSoftCollisionC << 
2544     }                                         << 
2545                                               << 
2546     G4double DeltaExcitationE( 0.0 );         << 
2547     G4LorentzVector DeltaPResidualNucleus = G << 
2548                                               << 
2549     if ( NumberOfTargetParticipant != 0 ) {   << 
2550       DeltaExcitationE = TargetResidualExcita << 
2551       DeltaPResidualNucleus = TargetResidual4 << 
2552     }                                         << 
2553                                               << 
2554     for ( G4int i = 0; i < NumberOfInvolvedNu << 
2555       G4Nucleon* aNucleon = TheInvolvedNucleo << 
2556       G4VSplitableHadron* targetSplitable = a << 
2557       if ( targetSplitable->GetSoftCollisionC << 
2558         G4LorentzVector tmp = -DeltaPResidual << 
2559         aNucleon->SetMomentum( tmp );         << 
2560         aNucleon->SetBindingEnergy( DeltaExci << 
2561       } else {                                << 
2562         delete targetSplitable;               << 
2563         targetSplitable = 0;                  << 
2564         aNucleon->Hit( targetSplitable );     << 
2565         aNucleon->SetBindingEnergy( 0.0 );    << 
2566       }                                       << 
2567     }                                         << 
2568                                               << 
2569     #ifdef debugFTFmodel                      << 
2570     G4cout << "NumberOfTargetParticipant " << << 
2571            << "TargetResidual4Momentum  " <<  << 
2572     #endif                                    << 
2573                                               << 
2574     if ( ! GetProjectileNucleus() ) return;   << 
2575                                               << 
2576     #ifdef debugFTFmodel                      << 
2577     G4cout << "Low energy interaction: Projec << 
2578            << "Pr ResidualMassNumber Pr Resid << 
2579            << ProjectileResidualMassNumber << << 
2580            << ProjectileResidualExcitationEne << 
2581     #endif                                    << 
2582                                               << 
2583     G4int NumberOfProjectileParticipant( 0 ); << 
2584     for ( G4int i = 0; i < NumberOfInvolvedNu << 
2585       G4Nucleon* aNucleon = TheInvolvedNucleo << 
2586       G4VSplitableHadron* projectileSplitable << 
2587       if ( projectileSplitable->GetSoftCollis << 
2588     }                                         << 
2589                                               << 
2590     #ifdef debugFTFmodel                      << 
2591     G4cout << "NumberOfProjectileParticipant" << 
2592     #endif                                    << 
2593                                               << 
2594     DeltaExcitationE = 0.0;                   << 
2595     DeltaPResidualNucleus = G4LorentzVector(  << 
2596                                               << 
2597     if ( NumberOfProjectileParticipant != 0 ) << 
2598       DeltaExcitationE = ProjectileResidualEx << 
2599       DeltaPResidualNucleus = ProjectileResid << 
2600     }                                         << 
2601     //G4cout << "DeltaExcitationE DeltaPResid << 
2602     //       << " " << DeltaPResidualNucleus  << 
2603     for ( G4int i = 0; i < NumberOfInvolvedNu << 
2604       G4Nucleon* aNucleon = TheInvolvedNucleo << 
2605       G4VSplitableHadron* projectileSplitable << 
2606       if ( projectileSplitable->GetSoftCollis << 
2607         G4LorentzVector tmp = -DeltaPResidual << 
2608         aNucleon->SetMomentum( tmp );         << 
2609         aNucleon->SetBindingEnergy( DeltaExci << 
2610       } else {                                << 
2611         delete projectileSplitable;           << 
2612         projectileSplitable = 0;              << 
2613         aNucleon->Hit( projectileSplitable ); << 
2614         aNucleon->SetBindingEnergy( 0.0 );    << 
2615       }                                       << 
2616     }                                         << 
2617                                               << 
2618     #ifdef debugFTFmodel                      << 
2619     G4cout << "NumberOfProjectileParticipant  << 
2620            << "ProjectileResidual4Momentum "  << 
2621     #endif                                    << 
2622                                               << 
2623   }  // End of the condition: if ( HighEnergy << 
2624                                               << 
2625   #ifdef debugFTFmodel                        << 
2626   G4cout << "End GetResiduals --------------- << 
2627   #endif                                      << 
2628                                               << 
2629 }                                                1516 }
2630                                                  1517 
                                                   >> 1518 // ------------------------------------------------------------
                                                   >> 1519 G4ExcitedStringVector * G4FTFModel::BuildStrings()
                                                   >> 1520 { 
                                                   >> 1521 // Loop over all collisions; find all primaries, and all target ( targets may 
                                                   >> 1522 //  be duplicate in the List ( to unique G4VSplitableHadrons)
                                                   >> 1523 
                                                   >> 1524   G4ExcitedStringVector * strings;
                                                   >> 1525   strings = new G4ExcitedStringVector();
                                                   >> 1526   
                                                   >> 1527   std::vector<G4VSplitableHadron *> primaries;
                                                   >> 1528   
                                                   >> 1529         G4ExcitedString * FirstString(0);     // If there will be a kink,
                                                   >> 1530         G4ExcitedString * SecondString(0);    // two strings will be produced.
2631                                                  1531 
2632 //=========================================== << 1532   theParticipants.StartLoop();    // restart a loop 
2633                                               << 1533 //
2634 G4ThreeVector G4FTFModel::GaussianPt( G4doubl << 1534   while ( theParticipants.Next() ) 
2635                                               << 1535   {
2636   G4double Pt2( 0.0 ), Pt( 0.0 );             << 1536       const G4InteractionContent & interaction=theParticipants.GetInteraction();
                                                   >> 1537 //         if(interaction.GetStatus() != 0)   // Uzhi Feb26
                                                   >> 1538          {
                                                   >> 1539                  //  do not allow for duplicates ...
                                                   >> 1540       if ( primaries.end() == std::find(primaries.begin(), primaries.end(),
                                                   >> 1541                                                 interaction.GetProjectile()) )
                                                   >> 1542         primaries.push_back(interaction.GetProjectile());     
                                                   >> 1543          } // Uzhi Feb26
                                                   >> 1544   }
2637                                                  1545 
2638   if (AveragePt2 > 0.0) {                     << 1546 //G4cout<<G4endl<<"primaries.size() "<<primaries.size()<<G4endl;
2639     const G4double ymax = maxPtSquare/Average << 1547   for (unsigned int ahadron=0; ahadron < primaries.size() ; ahadron++)
2640     if ( ymax < 200. ) {                      << 1548   {
2641       Pt2 = -AveragePt2 * G4Log( 1.0 + G4Unif << 1549             G4bool isProjectile(0);
2642     } else {                                  << 1550 
2643       Pt2 = -AveragePt2 * G4Log( 1.0 - G4Unif << 1551             if(primaries[ahadron]->GetStatus() <= 1) {isProjectile=true; } // VU 10.04.2012
2644     }                                         << 1552 //            if(primaries[ahadron]->GetStatus() == 3) {isProjectile=false;}
2645     Pt = std::sqrt( Pt2 );                    << 1553 
2646   }                                           << 1554             FirstString=0; SecondString=0;
                                                   >> 1555             theExcitation->CreateStrings(primaries[ahadron], isProjectile,
                                                   >> 1556                                          FirstString, SecondString,
                                                   >> 1557                                          theParameters);
                                                   >> 1558 
                                                   >> 1559       if(FirstString  != 0) strings->push_back(FirstString);
                                                   >> 1560             if(SecondString != 0) strings->push_back(SecondString);
                                                   >> 1561 //G4cout<<"Quarks in the string in FTF"<<FirstString->GetRightParton()->GetPDGcode()<<" "<<FirstString->GetLeftParton()->GetPDGcode()<<G4endl;
2647                                                  1562 
2648   G4double phi = G4UniformRand() * twopi;     << 1563 //G4cout<<FirstString<<" "<<SecondString<<G4endl;
2649                                               << 1564   }
2650   return G4ThreeVector( Pt*std::cos(phi), Pt* << 
2651 }                                             << 
2652                                                  1565 
2653 //=========================================== << 1566 //G4cout<<"Check "<<strings->operator[](0)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](0)->GetLeftParton()->GetPDGcode()<<G4endl;
                                                   >> 1567 //
                                                   >> 1568 // Looking for spectator nucleons of the projectile-----------
                                                   >> 1569         G4V3DNucleus * ProjectileNucleus =theParticipants.GetProjectileNucleus();
                                                   >> 1570         if(ProjectileNucleus)
                                                   >> 1571         {
                                                   >> 1572          ProjectileNucleus->StartLoop();
                                                   >> 1573 
                                                   >> 1574          G4Nucleon *    ProjectileNucleon;
                                                   >> 1575          while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
                                                   >> 1576          {
                                                   >> 1577           if ( !ProjectileNucleon->AreYouHit() )
                                                   >> 1578           {  // Projectile nucleon was involved in the interaction.
                                                   >> 1579 
                                                   >> 1580            G4VSplitableHadron * ProjectileSplitable=0;
                                                   >> 1581            ProjectileSplitable= new G4DiffractiveSplitableHadron(*ProjectileNucleon);
                                                   >> 1582            ProjectileNucleon->Hit(0);
                                                   >> 1583 
                                                   >> 1584      G4bool isProjectile=true;
                                                   >> 1585            FirstString=0; SecondString=0;
                                                   >> 1586            theExcitation->CreateStrings(ProjectileSplitable,
                                                   >> 1587                                         isProjectile,
                                                   >> 1588                                         FirstString, SecondString,
                                                   >> 1589                                         theParameters);
                                                   >> 1590            if(FirstString  != 0) strings->push_back(FirstString);
                                                   >> 1591            if(SecondString != 0) strings->push_back(SecondString);
2654                                                  1592 
2655 G4bool G4FTFModel::                           << 1593            delete  ProjectileSplitable;     
2656 ComputeNucleusProperties( G4V3DNucleus* nucle << 
2657                           G4LorentzVector& nu << 
2658                           G4LorentzVector& re << 
2659                           G4double& sumMasses << 
2660                           G4double& residualE << 
2661                           G4double& residualM << 
2662                           G4int& residualMass << 
2663                           G4int& residualChar << 
2664                                               << 
2665   // This method, which is called only by Put << 
2666   // -  either the target nucleus (which is n << 
2667   //    of hadronic interaction (hadron-nucle << 
2668   // -  or the projectile nucleus or antinucl << 
2669   //    or antinucleus-nucleus interaction.   << 
2670   // This method assumes that the all the par << 
2671   // the action of this method consists in mo << 
2672   // first one. The return value is "false" o << 
2673   // is null.                                 << 
2674                                               << 
2675   if ( ! nucleus ) return false;              << 
2676                                               << 
2677   G4double ExcitationEnergyPerWoundedNucleon  << 
2678     theParameters->GetExcitationEnergyPerWoun << 
2679                                               << 
2680   // Loop over the nucleons of the nucleus.   << 
2681   // The nucleons that have been involved in  << 
2682   // Reggeon Cascading) will be candidate to  << 
2683   // All the remaining nucleons will be the n << 
2684   // The variable sumMasses is the amount of  << 
2685   //     1. transverse mass of each involved  << 
2686   //     2. 20.0*MeV separation energy for ea << 
2687   //     3. transverse mass of the residual n << 
2688   // In this first evaluation of sumMasses, t << 
2689   // (residualExcitationEnergy, estimated by  << 
2690   // nucleon) is not taken into account.      << 
2691   G4int residualNumberOfLambdas = 0;  // Proj << 
2692   G4Nucleon* aNucleon = 0;                    << 
2693   nucleus->StartLoop();                       << 
2694   while ( ( aNucleon = nucleus->GetNextNucleo << 
2695     nucleusMomentum += aNucleon->Get4Momentum << 
2696     if ( aNucleon->AreYouHit() ) {  // Involv << 
2697       // Consider in sumMasses the nominal, i << 
2698       // (not the current masses, which could << 
2699       sumMasses += std::sqrt( sqr( aNucleon-> << 
2700                               +  aNucleon->Ge << 
2701       sumMasses += 20.0*MeV;  // Separation e << 
2702                                               << 
2703       //residualExcitationEnergy += Excitatio << 
2704       residualExcitationEnergy += -Excitation << 
2705                                               << 
2706       residualMassNumber--;                   << 
2707       // The absolute value below is needed o << 
2708       residualCharge -= std::abs( G4int( aNuc << 
2709     } else {   // Spectator nucleons          << 
2710       residualMomentum += aNucleon->Get4Momen << 
2711       if ( aNucleon->GetDefinition() == G4Lam << 
2712      aNucleon->GetDefinition() == G4AntiLambd << 
2713   ++residualNumberOfLambdas;                  << 
2714       }                                       << 
2715     }                                         << 
2716   }                                           << 
2717   #ifdef debugPutOnMassShell                  << 
2718   G4cout << "ExcitationEnergyPerWoundedNucleo << 
2719          << "\t Residual Charge, MassNumber ( << 
2720    << residualMassNumber << " (" << residualN << 
2721          << G4endl << "\t Initial Momentum "  << 
2722          << G4endl << "\t Residual Momentum   << 
2723   #endif                                      << 
2724   residualMomentum.setPz( 0.0 );              << 
2725   residualMomentum.setE( 0.0 );               << 
2726   if ( residualMassNumber == 0 ) {            << 
2727     residualMass = 0.0;                       << 
2728     residualExcitationEnergy = 0.0;           << 
2729   } else {                                    << 
2730     if ( residualMassNumber == 1 ) {          << 
2731       if ( std::abs( residualCharge ) == 1 )  << 
2732         residualMass = G4Proton::Definition() << 
2733       } else if ( residualNumberOfLambdas ==  << 
2734         residualMass = G4Lambda::Definition() << 
2735       } else {                                << 
2736         residualMass = G4Neutron::Definition( << 
2737       }                                       << 
2738       residualExcitationEnergy = 0.0;         << 
2739     } else {                                  << 
2740       if ( residualNumberOfLambdas > 0 ) {    << 
2741         if ( residualMassNumber == 2 ) {      << 
2742     residualMass = G4Lambda::Definition()->Ge << 
2743           if ( std::abs( residualCharge ) ==  << 
2744             residualMass += G4Proton::Definit << 
2745     } else if ( residualNumberOfLambdas == 1  << 
2746       residualMass += G4Neutron::Definition() << 
2747           } else {                            << 
2748       residualMass += G4Lambda::Definition()- << 
2749           }                                      1594           }
2750         } else {                              << 1595          } // End of while ( (ProjectileNucleon=ProjectileNucleus->GetNextNucleon()) )
2751     residualMass = G4HyperNucleiProperties::G << 1596         }  // End of if(ProjectileNucleus)
2752                     residualNumberOfLambdas ) << 
2753         }                                     << 
2754       } else {                                << 
2755         residualMass = G4ParticleTable::GetPa << 
2756                  GetIonMass( std::abs( residu << 
2757       }                                       << 
2758     }                                         << 
2759     residualMass += residualExcitationEnergy; << 
2760   }                                           << 
2761   sumMasses += std::sqrt( sqr( residualMass ) << 
2762   return true;                                << 
2763 }                                             << 
2764                                               << 
2765                                               << 
2766 //=========================================== << 
2767                                               << 
2768 G4bool G4FTFModel::                           << 
2769 GenerateDeltaIsobar( const G4double sqrtS,    << 
2770                      const G4int numberOfInvo << 
2771                      G4Nucleon* involvedNucle << 
2772                      G4double& sumMasses ) {  << 
2773                                               << 
2774   // This method, which is called only by Put << 
2775   // re-interpret some of the involved nucleo << 
2776   // - either by replacing a proton (2212) wi << 
2777   // - or by replacing a neutron (2112) with  << 
2778   // The on-shell mass of these delta-isobars << 
2779   // the corresponding nucleon on-shell mass. << 
2780   // the max number of deltas compatible with << 
2781   // The delta-isobars are considered with th << 
2782   // corresponding nucleons.                  << 
2783   // This method assumes that all the paramet << 
2784   // the action of this method consists in mo << 
2785   // sumMasses. The return value is "false" o << 
2786   // have unphysical values.                  << 
2787                                               << 
2788   if ( sqrtS < 0.0  ||  numberOfInvolvedNucle << 
2789                                               << 
2790   const G4double probDeltaIsobar = 0.05;      << 
2791                                               << 
2792   G4int maxNumberOfDeltas = G4int( (sqrtS - s << 
2793   G4int numberOfDeltas = 0;                   << 
2794                                               << 
2795   for ( G4int i = 0; i < numberOfInvolvedNucl << 
2796                                               << 
2797     if ( G4UniformRand() < probDeltaIsobar  & << 
2798       numberOfDeltas++;                       << 
2799       if ( ! involvedNucleons[i] ) continue;  << 
2800       // Skip any eventual lambda (that can b << 
2801       if ( involvedNucleons[i]->GetDefinition << 
2802      involvedNucleons[i]->GetDefinition() ==  << 
2803       G4VSplitableHadron* splitableHadron = i << 
2804       G4double massNuc = std::sqrt( sqr( spli << 
2805                                     + splitab << 
2806       // The absolute value below is needed i << 
2807       G4int pdgCode = std::abs( splitableHadr << 
2808       const G4ParticleDefinition* old_def = s << 
2809       G4int newPdgCode = pdgCode/10; newPdgCo << 
2810       if ( splitableHadron->GetDefinition()-> << 
2811       const G4ParticleDefinition* ptr =       << 
2812         G4ParticleTable::GetParticleTable()-> << 
2813       splitableHadron->SetDefinition( ptr );  << 
2814       G4double massDelta = std::sqrt( sqr( sp << 
2815                                       + split << 
2816       //G4cout << i << " " << sqrtS/GeV << "  << 
2817       //       << " " << massNuc << G4endl;   << 
2818       if ( sqrtS < sumMasses + massDelta - ma << 
2819         splitableHadron->SetDefinition( old_d << 
2820         break;                                << 
2821       } else {  // Change is accepted         << 
2822         sumMasses += ( massDelta - massNuc ); << 
2823       }                                       << 
2824     }                                         << 
2825   }                                           << 
2826                                               << 
2827   return true;                                << 
2828 }                                             << 
2829                                               << 
2830                                               << 
2831 //=========================================== << 
2832                                                  1597 
2833 G4bool G4FTFModel::                           << 1598 //G4cout<<G4endl<<"theAdditionalString.size() "<<theAdditionalString.size()<<G4endl;
2834 SamplingNucleonKinematics( G4double averagePt << 1599         if(theAdditionalString.size() != 0)
2835                            const G4double max << 1600         {
2836                            G4double dCor,     << 1601    for (unsigned int  ahadron=0; ahadron < theAdditionalString.size() ; ahadron++)
2837                            G4V3DNucleus* nucl << 1602    {
2838                            const G4LorentzVec << 1603             G4bool isProjectile(0);
2839                            const G4double res << 1604 
2840                            const G4int residu << 1605             if(theAdditionalString[ahadron]->GetStatus() <= 1) {isProjectile=true; } // VU 10.04.2012
2841                            const G4int number << 1606 //            if(theAdditionalString[ahadron]->GetStatus() == 3) {isProjectile=false;}
2842                            G4Nucleon* involve << 1607 
2843                            G4double& mass2 )  << 1608             FirstString=0; SecondString=0;
2844                                               << 1609             theExcitation->CreateStrings(theAdditionalString[ahadron], isProjectile,
2845   // This method, which is called only by Put << 1610                                          FirstString, SecondString,
2846   // -  either the target nucleons: this for  << 1611                                          theParameters);
2847   //    (hadron-nucleus, nucleus-nucleus, ant << 1612 
2848   // -  or the projectile nucleons or antinuc << 1613       if(FirstString  != 0) strings->push_back(FirstString);
2849   //    nucleus-nucleus or antinucleus-nucleu << 1614             if(SecondString != 0) strings->push_back(SecondString);
2850   // This method assumes that all the paramet << 1615 //G4cout<<"Quarks in the string in FTF"<<FirstString->GetRightParton()->GetPDGcode()<<" "<<FirstString->GetLeftParton()->GetPDGcode()<<G4endl;
2851   // the action of this method consists in ch << 1616 //G4cout<<FirstString<<" "<<SecondString<<G4endl;
2852   // whose pointers are in the vector involve << 1617    }
2853   // variable mass2.                          << 
2854 #ifdef debugPutOnMassShell                    << 
2855   G4cout << "G4FTFModel::SamplingNucleonKinem << 
2856   G4cout << " averagePt2= " << averagePt2 <<  << 
2857    << " dCor= " << dCor << " resMass(GeV)= "  << 
2858    << " resMassN= " << residualMassNumber     << 
2859          << " nNuc= " << numberOfInvolvedNucl << 
2860    << " lv= " << pResidual << G4endl;         << 
2861 #endif                                        << 
2862                                               << 
2863   if ( ! nucleus  ||  numberOfInvolvedNucleon << 
2864                                               << 
2865   if ( residualMassNumber == 0  &&  numberOfI << 
2866     dCor = 0.0;                               << 
2867     averagePt2 = 0.0;                         << 
2868   }                                           << 
2869                                               << 
2870   G4bool success = true;                      << 
2871                                               << 
2872   G4double SumMasses = residualMass;          << 
2873   G4double invN = 1.0 / (G4double)numberOfInv << 
2874                                               << 
2875   // to avoid problems due to precision lost  << 
2876   const G4double eps = 1.e-10;                << 
2877   const G4int maxNumberOfLoops = 1000;        << 
2878   G4int loopCounter = 0;                      << 
2879   do {                                        << 
2880                                               << 
2881     success = true;                           << 
2882                                               << 
2883     // Sampling of nucleon Pt                 << 
2884     G4ThreeVector ptSum( 0.0, 0.0, 0.0 );     << 
2885     if( averagePt2 > 0.0 ) {                  << 
2886       for ( G4int i = 0; i < numberOfInvolved << 
2887   G4Nucleon* aNucleon = involvedNucleons[i];  << 
2888   if ( ! aNucleon ) continue;                 << 
2889   G4ThreeVector tmpPt = GaussianPt( averagePt << 
2890   ptSum += tmpPt;                             << 
2891   G4LorentzVector tmp( tmpPt.x(), tmpPt.y(),  << 
2892   aNucleon->SetMomentum( tmp );               << 
2893       }                                       << 
2894     }                                         << 
2895                                               << 
2896     G4double deltaPx = ( ptSum.x() - pResidua << 
2897     G4double deltaPy = ( ptSum.y() - pResidua << 
2898                                               << 
2899     SumMasses = residualMass;                 << 
2900     for ( G4int i = 0; i < numberOfInvolvedNu << 
2901       G4Nucleon* aNucleon = involvedNucleons[ << 
2902       if ( ! aNucleon ) continue;             << 
2903       G4double px = aNucleon->Get4Momentum(). << 
2904       G4double py = aNucleon->Get4Momentum(). << 
2905       G4double MtN = std::sqrt( sqr( aNucleon << 
2906                                 + sqr( px ) + << 
2907       SumMasses += MtN;                       << 
2908       G4LorentzVector tmp( px, py, 0.0, MtN); << 
2909       aNucleon->SetMomentum( tmp );           << 
2910     }                                         << 
2911                                               << 
2912     // Sampling X of nucleon                  << 
2913     G4double xSum = 0.0;                      << 
2914                                               << 
2915     for ( G4int i = 0; i < numberOfInvolvedNu << 
2916       G4Nucleon* aNucleon = involvedNucleons[ << 
2917       if ( ! aNucleon ) continue;             << 
2918                                               << 
2919       G4double x = 0.0;                       << 
2920       if( 0.0 != dCor ) {                     << 
2921   G4ThreeVector tmpX = GaussianPt( dCor*dCor, << 
2922         x = tmpX.x();                         << 
2923       }                                       << 
2924       x += aNucleon->Get4Momentum().e()/SumMa << 
2925       if ( x < -eps  ||  x > 1.0 + eps ) {    << 
2926         success = false;                      << 
2927         break;                                << 
2928       }                                       << 
2929       x = std::min(1.0, std::max(x, 0.0));    << 
2930       xSum += x;                              << 
2931       // The energy is in the lab (instead of << 
2932                                               << 
2933       G4LorentzVector tmp( aNucleon->Get4Mome << 
2934                            aNucleon->Get4Mome << 
2935                            x, aNucleon->Get4M << 
2936       aNucleon->SetMomentum( tmp );           << 
2937     }                                         << 
2938                                               << 
2939     if ( xSum < -eps || xSum > 1.0 + eps ) su << 
2940     if ( ! success ) continue;                << 
2941                                               << 
2942     G4double delta = ( residualMassNumber ==  << 
2943                                               << 
2944     xSum = 1.0;                               << 
2945     mass2 = 0.0;                              << 
2946     for ( G4int i = 0; i < numberOfInvolvedNu << 
2947       G4Nucleon* aNucleon = involvedNucleons[ << 
2948       if ( ! aNucleon ) continue;             << 
2949       G4double x = aNucleon->Get4Momentum().p << 
2950       xSum -= x;                              << 
2951                                               << 
2952       if ( residualMassNumber == 0 ) {        << 
2953         if ( x <= -eps || x > 1.0 + eps ) {   << 
2954           success = false;                    << 
2955           break;                              << 
2956         }                                     << 
2957       } else {                                << 
2958         if ( x <= -eps || x > 1.0 + eps || xS << 
2959           success = false;                    << 
2960           break;                              << 
2961         }                                        1618         }
2962       }                                       << 1619 //G4cout<<"Check "<<strings->operator[](0)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](0)->GetLeftParton()->GetPDGcode()<<G4endl;
2963       x = std::min( 1.0, std::max(x, eps) );  << 1620 //G4cout<<"Check "<<strings->operator[](1)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](1)->GetLeftParton()->GetPDGcode()<<G4endl;
2964                                               << 1621 //
2965       mass2 += sqr( aNucleon->Get4Momentum(). << 1622 //G4cout<<G4endl<<"NumberOfInvolvedNucleon "<<NumberOfInvolvedNucleon<<G4endl;
                                                   >> 1623   for (G4int ahadron=0; ahadron < NumberOfInvolvedNucleon ; ahadron++)
                                                   >> 1624   {
                                                   >> 1625 //G4cout<<"Nucleon status & int# "<<ahadron<<" "<<TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetStatus()<<" "<<TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetSoftCollisionCount()<<G4endl;
                                                   >> 1626             if(TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetStatus() ==4)
                                                   >> 1627             { // A nucleon is returned back to the nucleus after annihilation act for example
                                                   >> 1628 //G4cout<<" Delete 0"<<G4endl;
                                                   >> 1629              delete TheInvolvedNucleon[ahadron]->GetSplitableHadron();
                                                   >> 1630              G4VSplitableHadron *aHit=0; 
                                                   >> 1631              TheInvolvedNucleon[ahadron]->Hit(aHit);
                                                   >> 1632             }
                                                   >> 1633             else if((TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetStatus() <=1)  && // VU 10.04.2012
                                                   >> 1634             (TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetSoftCollisionCount() ==0))
                                                   >> 1635             { // A nucleon is returned back to the nucleus after rejected interactions
                                                   >> 1636               // due to an annihilation before
                                                   >> 1637 //G4cout<<" Delete int# 0"<<G4endl;
                                                   >> 1638              delete TheInvolvedNucleon[ahadron]->GetSplitableHadron();
                                                   >> 1639              G4VSplitableHadron *aHit=0; 
                                                   >> 1640              TheInvolvedNucleon[ahadron]->Hit(aHit);
                                                   >> 1641             }
                                                   >> 1642             else if((TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetStatus() <=1)  && // VU 10.04.2012
                                                   >> 1643             (TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetSoftCollisionCount() !=0))
                                                   >> 1644             { // Nucleon which participate in the interactions, 
                                                   >> 1645 //G4cout<<"Taken 1 !=0"<<G4endl;
                                                   >> 1646        G4bool isProjectile=false;
                                                   >> 1647              FirstString=0; SecondString=0;
                                                   >> 1648              theExcitation->CreateStrings(
                                                   >> 1649                             TheInvolvedNucleon[ahadron]->GetSplitableHadron(),
                                                   >> 1650                                           isProjectile,
                                                   >> 1651                                           FirstString, SecondString,
                                                   >> 1652                                           theParameters);
                                                   >> 1653        if(FirstString  != 0) strings->push_back(FirstString);
                                                   >> 1654              if(SecondString != 0) strings->push_back(SecondString);
                                                   >> 1655             }
                                                   >> 1656             else if(TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetStatus() ==2)
                                                   >> 1657             { // Nucleon which was involved in the Reggeon cascading
                                                   >> 1658 //G4cout<<"Taken st 2"<<G4endl;
                                                   >> 1659        G4bool isProjectile=false;
                                                   >> 1660              FirstString=0; SecondString=0;
                                                   >> 1661              theExcitation->CreateStrings(
                                                   >> 1662                             TheInvolvedNucleon[ahadron]->GetSplitableHadron(),
                                                   >> 1663                                           isProjectile,
                                                   >> 1664                                           FirstString, SecondString,
                                                   >> 1665                                           theParameters);
                                                   >> 1666        if(FirstString  != 0) strings->push_back(FirstString);
                                                   >> 1667              if(SecondString != 0) strings->push_back(SecondString);
                                                   >> 1668 //G4cout<<FirstString<<" "<<SecondString<<G4endl;
                                                   >> 1669             }
                                                   >> 1670             else if(TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetStatus() ==3)
                                                   >> 1671             { // Nucleon which has participated in annihilation and disappiered
                                                   >> 1672 //G4cout<<"Status 3 "<<G4endl;
                                                   >> 1673               TheInvolvedNucleon[ahadron]->SetBindingEnergy(theParameters->GetExcitationEnergyPerWoundedNucleon());
                                                   >> 1674             }
                                                   >> 1675             else {}
2966                                                  1676 
2967       G4LorentzVector tmp( aNucleon->Get4Mome << 1677   }
2968                            x, aNucleon->Get4M << 1678 /*
2969       aNucleon->SetMomentum( tmp );           << 1679 G4cout<<"Check "<<strings->operator[](0)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](0)->GetLeftParton()->GetPDGcode()<<G4endl;
2970     }                                         << 1680 G4cout<<"Check "<<strings->operator[](1)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](1)->GetLeftParton()->GetPDGcode()<<G4endl;
2971     if ( ! success ) continue;                << 1681 //G4cout<<"Check "<<strings->operator[](2)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](2)->GetLeftParton()->GetPDGcode()<<G4endl;
2972     xSum = std::min( 1.0, std::max(xSum, eps) << 1682 
                                                   >> 1683 G4cout<<"*** "<<strings->operator[](0)->GetRightParton()<<" "<<strings->operator[](0)->GetLeftParton()<<G4endl;
                                                   >> 1684 G4cout<<"*** "<<strings->operator[](1)->GetRightParton()<<" "<<strings->operator[](1)->GetLeftParton()<<G4endl;
                                                   >> 1685 //G4cout<<"*** "<<strings->operator[](2)->GetRightParton()<<" "<<strings->operator[](2)->GetLeftParton()<<G4endl;
                                                   >> 1686 */
                                                   >> 1687   std::for_each(primaries.begin(), primaries.end(), DeleteVSplitableHadron());
                                                   >> 1688   primaries.clear();
                                                   >> 1689 /*
                                                   >> 1690 G4cout<<"*** "<<strings->operator[](0)->GetRightParton()<<" "<<strings->operator[](0)->GetLeftParton()<<G4endl;
                                                   >> 1691 G4cout<<"*** "<<strings->operator[](1)->GetRightParton()<<" "<<strings->operator[](1)->GetLeftParton()<<G4endl;
                                                   >> 1692 G4cout<<"*** "<<strings->operator[](2)->GetRightParton()<<" "<<strings->operator[](2)->GetLeftParton()<<G4endl;
                                                   >> 1693 
                                                   >> 1694 G4cout<<"Check "<<strings->operator[](0)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](0)->GetLeftParton()->GetPDGcode()<<G4endl;
                                                   >> 1695 G4cout<<"Check "<<strings->operator[](1)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](1)->GetLeftParton()->GetPDGcode()<<G4endl;
                                                   >> 1696 G4cout<<"Check "<<strings->operator[](2)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](2)->GetLeftParton()->GetPDGcode()<<G4endl;
                                                   >> 1697 */
2973                                                  1698 
2974     if ( residualMassNumber > 0 ) mass2 += (  << 1699 /*
2975                                               << 1700 for (unsigned int ahadron=0; ahadron < strings->size() ; ahadron++)
2976     #ifdef debugPutOnMassShell                << 1701 {
2977     G4cout << "success: " << success << " Mt( << 1702 G4cout<<ahadron<<" "<<strings->operator[](ahadron)->GetRightParton()->GetPDGcode()<<" "<<strings->operator[](ahadron)->GetLeftParton()->GetPDGcode()<<G4endl;
2978      << std::sqrt( mass2 )/GeV << G4endl;     << 
2979     #endif                                    << 
2980                                               << 
2981   } while ( ( ! success ) &&                  << 
2982             ++loopCounter < maxNumberOfLoops  << 
2983   return ( loopCounter < maxNumberOfLoops );  << 
2984 }                                                1703 }
2985                                               << 1704 G4cout<<"------------------------"<<G4endl;
2986                                               << 1705 */
2987 //=========================================== << 1706 //G4int Uzhi; G4cin >> Uzhi;
2988                                               << 1707   return strings;
2989 G4bool G4FTFModel::                           << 
2990 CheckKinematics( const G4double sValue,       << 
2991                  const G4double sqrtS,        << 
2992                  const G4double projectileMas << 
2993                  const G4double targetMass2,  << 
2994                  const G4double nucleusY,     << 
2995                  const G4bool isProjectileNuc << 
2996                  const G4int numberOfInvolved << 
2997                  G4Nucleon* involvedNucleons[ << 
2998                  G4double& targetWminus,      << 
2999                  G4double& projectileWplus,   << 
3000                  G4bool& success ) {          << 
3001                                               << 
3002   // This method, which is called only by Put << 
3003   // kinematics is acceptable or not.         << 
3004   // This method assumes that all the paramet << 
3005   // notice that the input boolean parameter  << 
3006   // only in the case of nucleus or antinucle << 
3007   // The action of this method consists in co << 
3008   // and setting the parameter success to fal << 
3009   // be rejeted.                              << 
3010                                               << 
3011   G4double decayMomentum2 = sqr( sValue ) + s << 
3012                             - 2.0*( sValue*(  << 
3013                                     + project << 
3014   targetWminus = ( sValue - projectileMass2 + << 
3015                  / 2.0 / sqrtS;               << 
3016   projectileWplus = sqrtS - targetMass2/targe << 
3017   G4double projectilePz = projectileWplus/2.0 << 
3018   G4double projectileE  = projectileWplus/2.0 << 
3019   G4double projectileY  = 0.5 * G4Log( (proje << 
3020                                        (proje << 
3021   G4double targetPz = -targetWminus/2.0 + tar << 
3022   G4double targetE  =  targetWminus/2.0 + tar << 
3023   G4double targetY  = 0.5 * G4Log( (targetE + << 
3024                                               << 
3025   #ifdef debugPutOnMassShell                  << 
3026   G4cout << "decayMomentum2 " << decayMomentu << 
3027          << "\t targetWminus projectileWplus  << 
3028          << "\t projectileY targetY " << proj << 
3029   if ( isProjectileNucleus ) {                << 
3030     G4cout << "Order# of Wounded nucleon i, n << 
3031   } else {                                    << 
3032     G4cout << "Order# of Wounded nucleon i, n << 
3033   }                                           << 
3034   G4cout << G4endl;                           << 
3035   #endif                                      << 
3036                                               << 
3037   for ( G4int i = 0; i < numberOfInvolvedNucl << 
3038     G4Nucleon* aNucleon = involvedNucleons[i] << 
3039     if ( ! aNucleon ) continue;               << 
3040     G4LorentzVector tmp = aNucleon->Get4Momen << 
3041     G4double mt2 = sqr( tmp.x() ) + sqr( tmp. << 
3042                    sqr( aNucleon->GetSplitabl << 
3043     G4double x = tmp.z();                     << 
3044     G4double pz = -targetWminus*x/2.0 + mt2/( << 
3045     G4double e =   targetWminus*x/2.0 + mt2/( << 
3046     if ( isProjectileNucleus ) {              << 
3047       pz = projectileWplus*x/2.0 - mt2/(2.0*p << 
3048       e =  projectileWplus*x/2.0 + mt2/(2.0*p << 
3049     }                                         << 
3050     G4double nucleonY = 0.5 * G4Log( (e + pz) << 
3051                                               << 
3052     #ifdef debugPutOnMassShell                << 
3053     if( isProjectileNucleus ) {               << 
3054       G4cout << " " << i << " " << nucleonY < << 
3055     } else {                                  << 
3056       G4cout << " " << i << " " << nucleonY < << 
3057     }                                         << 
3058     G4cout << G4endl;                         << 
3059     #endif                                    << 
3060                                               << 
3061     if ( std::abs( nucleonY - nucleusY ) > 2  << 
3062          ( isProjectileNucleus  &&  targetY > << 
3063          ( ! isProjectileNucleus  &&  project << 
3064       success = false;                        << 
3065       break;                                  << 
3066     }                                         << 
3067   }                                           << 
3068   return true;                                << 
3069 }                                             << 
3070                                               << 
3071                                               << 
3072 //=========================================== << 
3073                                               << 
3074 G4bool G4FTFModel::                           << 
3075 FinalizeKinematics( const G4double w,         << 
3076                     const G4bool isProjectile << 
3077                     const G4LorentzRotation&  << 
3078                     const G4double residualMa << 
3079                     const G4int residualMassN << 
3080                     const G4int numberOfInvol << 
3081                     G4Nucleon* involvedNucleo << 
3082               G4LorentzVector& residual4Momen << 
3083                                               << 
3084   // This method, which is called only by Put << 
3085   // this method is called when we are sure t << 
3086   // acceptable.                              << 
3087   // This method assumes that all the paramet << 
3088   // notice that the input boolean parameter  << 
3089   // only in the case of nucleus or antinucle << 
3090   // because the sign of pz (in the center-of << 
3091   // with respect to the case of a normal had << 
3092   // The action of this method consists in mo << 
3093   // (in the lab frame) and computing the res << 
3094   // frame).                                  << 
3095                                               << 
3096   G4ThreeVector residual3Momentum( 0.0, 0.0,  << 
3097                                               << 
3098   for ( G4int i = 0; i < numberOfInvolvedNucl << 
3099     G4Nucleon* aNucleon = involvedNucleons[i] << 
3100     if ( ! aNucleon ) continue;               << 
3101     G4LorentzVector tmp = aNucleon->Get4Momen << 
3102     residual3Momentum -= tmp.vect();          << 
3103     G4double mt2 = sqr( tmp.x() ) + sqr( tmp. << 
3104                    sqr( aNucleon->GetSplitabl << 
3105     G4double x = tmp.z();                     << 
3106     G4double pz = -w * x / 2.0  +  mt2 / ( 2. << 
3107     G4double e  =  w * x / 2.0  +  mt2 / ( 2. << 
3108     // Reverse the sign of pz in the case of  << 
3109     if ( isProjectileNucleus ) pz *= -1.0;    << 
3110     tmp.setPz( pz );                          << 
3111     tmp.setE( e );                            << 
3112     tmp.transform( boostFromCmsToLab );       << 
3113     aNucleon->SetMomentum( tmp );             << 
3114     G4VSplitableHadron* splitableHadron = aNu << 
3115     splitableHadron->Set4Momentum( tmp );     << 
3116   }                                           << 
3117                                               << 
3118   G4double residualMt2 = sqr( residualMass )  << 
3119                        + sqr( residual3Moment << 
3120                                               << 
3121   #ifdef debugPutOnMassShell                  << 
3122   if ( isProjectileNucleus ) {                << 
3123     G4cout << "Wminus Proj and residual3Momen << 
3124   } else {                                    << 
3125     G4cout << "Wplus  Targ and residual3Momen << 
3126   }                                           << 
3127   #endif                                      << 
3128                                               << 
3129   G4double residualPz = 0.0;                  << 
3130   G4double residualE  = 0.0;                  << 
3131   if ( residualMassNumber != 0 ) {            << 
3132     residualPz = -w * residual3Momentum.z() / << 
3133                   residualMt2 / ( 2.0 * w * r << 
3134     residualE  =  w * residual3Momentum.z() / << 
3135                   residualMt2 / ( 2.0 * w * r << 
3136     // Reverse the sign of residualPz in the  << 
3137     if ( isProjectileNucleus ) residualPz *=  << 
3138   }                                           << 
3139                                               << 
3140   residual4Momentum.setPx( residual3Momentum. << 
3141   residual4Momentum.setPy( residual3Momentum. << 
3142   residual4Momentum.setPz( residualPz );      << 
3143   residual4Momentum.setE( residualE );        << 
3144                                               << 
3145   return true;                                << 
3146 }                                                1708 }
                                                   >> 1709 // ------------------------------------------------------------
                                                   >> 1710 void G4FTFModel::GetResidualNucleus()
                                                   >> 1711 { // This method is needed for the correct application of G4PrecompoundModelInterface
                                                   >> 1712         G4double DeltaExcitationE=ResidualExcitationEnergy/
                                                   >> 1713                                   (G4double) NumberOfInvolvedNucleon;
                                                   >> 1714         G4LorentzVector DeltaPResidualNucleus = Residual4Momentum/
                                                   >> 1715                                   (G4double) NumberOfInvolvedNucleon;
                                                   >> 1716 
                                                   >> 1717   for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
                                                   >> 1718         {
                                                   >> 1719          G4Nucleon * aNucleon = TheInvolvedNucleon[i];
                                                   >> 1720 //         G4LorentzVector tmp=aNucleon->Get4Momentum()-DeltaPResidualNucleus;
                                                   >> 1721          G4LorentzVector tmp=-DeltaPResidualNucleus;
                                                   >> 1722          aNucleon->SetMomentum(tmp);
                                                   >> 1723          aNucleon->SetBindingEnergy(DeltaExcitationE);
                                                   >> 1724         }   // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
3147                                                  1725 
3148                                               << 1726 }
3149 //=========================================== << 
3150                                                  1727 
3151 void G4FTFModel::ModelDescription( std::ostre << 1728 // ------------------------------------------------------------
3152   desc << "                 FTF (Fritiof) Mod << 1729 G4ThreeVector G4FTFModel::GaussianPt(G4double AveragePt2, G4double maxPtSquare) const
3153        << "The FTF model is based on the well << 1730 {            //  @@ this method is used in FTFModel as well. Should go somewhere common!
3154        << "model (B. Andersson et al., Nucl.  << 1731   
3155        << "(1987)). Its first program impleme << 1732   G4double Pt2(0.);
3156        << "by B. Nilsson-Almquist and E. Sten << 1733         if(AveragePt2 <= 0.) {Pt2=0.;}
3157        << "Comm. 43, 387 (1987)). The Fritiof << 1734         else
3158        << "that all hadron-hadron interaction << 1735         {
3159        << "reactions, h_1+h_2->h_1'+h_2' wher << 1736          Pt2 = -AveragePt2 * std::log(1. + G4UniformRand() * 
3160        << "are excited states of the hadrons  << 1737                 (std::exp(-maxPtSquare/AveragePt2)-1.)); 
3161        << "mass spectra. The excited hadrons  << 1738   }
3162        << "QCD-strings, and the corresponding << 1739   G4double Pt=std::sqrt(Pt2);
3163        << "fragmentation model is applied for << 1740   G4double phi=G4UniformRand() * twopi;
3164        << "their decays.                      << 1741   
3165        << "   The Fritiof model assumes that  << 1742   return G4ThreeVector (Pt*std::cos(phi), Pt*std::sin(phi), 0.);    
3166        << "a hadron-nucleus interaction a str << 
3167        << "from the projectile can interact w << 
3168        << "nuclear nucleons and becomes into  << 
3169        << "states. The probability of multipl << 
3170        << "calculated in the Glauber approxim << 
3171        << "of secondary particles was neglect << 
3172        << "to these, the original Fritiof mod << 
3173        << "cribe a nuclear destruction and sl << 
3174        << "   In order to overcome the diffic << 
3175        << "the model by the reggeon theory in << 
3176        << "nuclear desctruction (Kh. Abdel-Wa << 
3177        << "nsky, Phys. Atom. Nucl. 60, 828 (1 << 
3178        << "(1997)). Momenta of the nucleons e << 
3179        << "leus in the reggeon cascading are  << 
3180        << "to a Fermi motion algorithm presen << 
3181        << "Collaboration (M.I. Adamovich et a << 
3182        << "A358, 337 (1997)).                 << 
3183        << "   New features were also added to << 
3184        << "implemented in Geant4: a simulatio << 
3185        << "ron-nucleon scatterings, a simulat << 
3186        << "reactions like NN>NN* in hadron-nu << 
3187        << "a separate simulation of single di << 
3188        << " diffractive events. These allowed << 
3189        << "model parameter tuning a wide set  << 
3190        << "data.                              << 
3191 }                                                1743 }
3192                                                  1744 
                                                   >> 1745 void G4FTFModel::ModelDescription(std::ostream& desc) const
                                                   >> 1746 {
                                                   >> 1747   desc << "please add description here" << G4endl;
                                                   >> 1748 }
3193                                                  1749