Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/qmd/src/G4QMDReaction.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/qmd/src/G4QMDReaction.cc (Version 11.3.0) and /processes/hadronic/models/qmd/src/G4QMDReaction.cc (Version 9.4.p3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // 080505 Fixed and changed sampling method of     26 // 080505 Fixed and changed sampling method of impact parameter by T. Koi 
 27 // 080602 Fix memory leaks by T. Koi               27 // 080602 Fix memory leaks by T. Koi 
 28 // 080612 Delete unnecessary dependency and un     28 // 080612 Delete unnecessary dependency and unused functions
 29 //        Change criterion of reaction by T. K     29 //        Change criterion of reaction by T. Koi
 30 // 081107 Add UnUseGEM (then use the default c     30 // 081107 Add UnUseGEM (then use the default channel of G4Evaporation)
 31 //            UseFrag (chage criterion of a in     31 //            UseFrag (chage criterion of a inelastic reaction)
 32 //        Fix bug in nucleon projectiles  by T     32 //        Fix bug in nucleon projectiles  by T. Koi    
 33 // 090122 Be8 -> Alpha + Alpha                     33 // 090122 Be8 -> Alpha + Alpha 
 34 // 090331 Change member shenXS and genspaXS ob     34 // 090331 Change member shenXS and genspaXS object to pointer 
 35 // 091119 Fix for incidence of neutral particl     35 // 091119 Fix for incidence of neutral particles 
 36 //                                                 36 //
 37 #include "G4QMDReaction.hh"                        37 #include "G4QMDReaction.hh"
 38 #include "G4QMDNucleus.hh"                         38 #include "G4QMDNucleus.hh"
 39 #include "G4QMDGroundStateNucleus.hh"              39 #include "G4QMDGroundStateNucleus.hh"
 40 #include "G4Pow.hh"                            << 
 41 #include "G4PhysicalConstants.hh"              << 
 42 #include "G4SystemOfUnits.hh"                  << 
 43 #include "G4NistManager.hh"                    << 
 44                                                << 
 45 #include "G4CrossSectionDataSetRegistry.hh"    << 
 46 #include "G4BGGPionElasticXS.hh"               << 
 47 #include "G4BGGPionInelasticXS.hh"             << 
 48 #include "G4VCrossSectionDataSet.hh"           << 
 49 #include "G4CrossSectionInelastic.hh"          << 
 50 #include "G4ComponentGGNuclNuclXsc.hh"         << 
 51 #include "G4PhysicsModelCatalog.hh"            << 
 52                                                    40 
                                                   >>  41 #include "G4NistManager.hh"
 53                                                    42 
 54 G4QMDReaction::G4QMDReaction()                     43 G4QMDReaction::G4QMDReaction()
 55 : G4HadronicInteraction("QMDModel")            <<  44 : system ( NULL )
 56 , system ( NULL )                              << 
 57 , deltaT ( 1 ) // in fsec (c=1)                    45 , deltaT ( 1 ) // in fsec (c=1)
 58 , maxTime ( 100 ) // will have maxTime-th time     46 , maxTime ( 100 ) // will have maxTime-th time step
 59 , envelopF ( 1.05 ) // 10% for Peripheral reac     47 , envelopF ( 1.05 ) // 10% for Peripheral reactions
 60 , gem ( true )                                     48 , gem ( true )
 61 , frag ( false )                                   49 , frag ( false )
 62 , secID( -1 )                                  << 
 63 {                                                  50 {
 64    theXS = new G4CrossSectionInelastic( new G4 << 
 65    pipElNucXS = new G4BGGPionElasticXS(G4PionP << 
 66    pipElNucXS->BuildPhysicsTable(*(G4PionPlus: << 
 67                                                << 
 68    pimElNucXS = new G4BGGPionElasticXS(G4PionM << 
 69    pimElNucXS->BuildPhysicsTable(*(G4PionMinus << 
 70                                                << 
 71    pipInelNucXS = new G4BGGPionInelasticXS(G4P << 
 72    pipInelNucXS->BuildPhysicsTable(*(G4PionPlu << 
 73                                                << 
 74    pimInelNucXS = new G4BGGPionInelasticXS(G4P << 
 75    pimInelNucXS->BuildPhysicsTable(*(G4PionMin << 
 76                                                    51 
                                                   >>  52    //090331
                                                   >>  53    shenXS = new G4IonsShenCrossSection();
                                                   >>  54    //genspaXS = new G4GeneralSpaceNNCrossSection();
                                                   >>  55    piNucXS = new G4PiNuclearCrossSection();
 77    meanField = new G4QMDMeanField();               56    meanField = new G4QMDMeanField();
 78    collision = new G4QMDCollision();               57    collision = new G4QMDCollision();
 79                                                    58 
 80    excitationHandler = new G4ExcitationHandler <<  59    excitationHandler = new G4ExcitationHandler;
                                                   >>  60    evaporation = new G4Evaporation;
                                                   >>  61    excitationHandler->SetEvaporation( evaporation );
 81    setEvaporationCh();                             62    setEvaporationCh();
 82                                                << 
 83    coulomb_collision_gamma_proj = 0.0;         << 
 84    coulomb_collision_rx_proj = 0.0;            << 
 85    coulomb_collision_rz_proj = 0.0;            << 
 86    coulomb_collision_px_proj = 0.0;            << 
 87    coulomb_collision_pz_proj = 0.0;            << 
 88                                                << 
 89    coulomb_collision_gamma_targ = 0.0;         << 
 90    coulomb_collision_rx_targ = 0.0;            << 
 91    coulomb_collision_rz_targ = 0.0;            << 
 92    coulomb_collision_px_targ = 0.0;            << 
 93    coulomb_collision_pz_targ = 0.0;            << 
 94                                                << 
 95    secID = G4PhysicsModelCatalog::GetModelID(  << 
 96 }                                                  63 }
 97                                                    64 
 98                                                    65 
                                                   >>  66 
 99 G4QMDReaction::~G4QMDReaction()                    67 G4QMDReaction::~G4QMDReaction()
100 {                                                  68 {
                                                   >>  69    delete evaporation; 
101    delete excitationHandler;                       70    delete excitationHandler;
102    delete collision;                               71    delete collision;
103    delete meanField;                               72    delete meanField;
104 }                                                  73 }
105                                                    74 
106                                                    75 
                                                   >>  76 
107 G4HadFinalState* G4QMDReaction::ApplyYourself(     77 G4HadFinalState* G4QMDReaction::ApplyYourself( const G4HadProjectile & projectile , G4Nucleus & target )
108 {                                                  78 {
109    //G4cout << "G4QMDReaction::ApplyYourself"      79    //G4cout << "G4QMDReaction::ApplyYourself" << G4endl;
110                                                    80 
111    theParticleChange.Clear();                      81    theParticleChange.Clear();
112                                                    82 
113    system = new G4QMDSystem;                       83    system = new G4QMDSystem;
114                                                    84 
115    G4int proj_Z = 0;                               85    G4int proj_Z = 0;
116    G4int proj_A = 0;                               86    G4int proj_A = 0;
117    const G4ParticleDefinition* proj_pd = ( con <<  87    G4ParticleDefinition* proj_pd = ( G4ParticleDefinition* ) projectile.GetDefinition();
118    if ( proj_pd->GetParticleType() == "nucleus     88    if ( proj_pd->GetParticleType() == "nucleus" )
119    {                                               89    {
120       proj_Z = proj_pd->GetAtomicNumber();         90       proj_Z = proj_pd->GetAtomicNumber();
121       proj_A = proj_pd->GetAtomicMass();           91       proj_A = proj_pd->GetAtomicMass();
122    }                                               92    }
123    else                                            93    else
124    {                                               94    {
125       proj_Z = (int)( proj_pd->GetPDGCharge()/     95       proj_Z = (int)( proj_pd->GetPDGCharge()/eplus );
126       proj_A = 1;                                  96       proj_A = 1;
127    }                                               97    }
128    //G4int targ_Z = int ( target.GetZ() + 0.5  <<  98    G4int targ_Z = int ( target.GetZ() + 0.5 );
129    //G4int targ_A = int ( target.GetN() + 0.5  <<  99    G4int targ_A = int ( target.GetN() + 0.5 );
130    //migrate to integer A and Z (GetN_asInt re << 100    G4ParticleDefinition* targ_pd = G4ParticleTable::GetParticleTable()->GetIon( targ_Z , targ_A , 0.0 );
131    G4int targ_Z = target.GetZ_asInt();         << 
132    G4int targ_A = target.GetA_asInt();         << 
133    const G4ParticleDefinition* targ_pd = G4Ion << 
134                                                   101 
135                                                   102 
136    //G4NistManager* nistMan = G4NistManager::I << 103    G4NistManager* nistMan = G4NistManager::Instance();
137 //   G4Element* G4NistManager::FindOrBuildElem    104 //   G4Element* G4NistManager::FindOrBuildElement( targ_Z );
138                                                   105 
139    const G4DynamicParticle* proj_dp = new G4Dy << 106      const G4DynamicParticle* proj_dp = new G4DynamicParticle ( proj_pd , projectile.Get4Momentum() );
140    //const G4Element* targ_ele =  nistMan->Fin << 107      const G4Element* targ_ele =  nistMan->FindOrBuildElement( targ_Z ); 
141    //G4double aTemp = projectile.GetMaterial() << 108      G4double aTemp = projectile.GetMaterial()->GetTemperature();
142                                                << 109 
143    // Glauber-Gribov nucleus-nucleus cross sec << 110      //090331
144    // therefore call GetElementCrossSection in << 111   
145    //G4double xs_0 = theXS->GetIsoCrossSection << 112    G4VCrossSectionDataSet* theXS = shenXS;
146    G4double xs_0 = theXS->GetElementCrossSecti << 113 
147                                                << 114    if ( proj_pd->GetParticleType() == "meson" ) theXS = piNucXS;
148    // When the projectile is a pion            << 
149    if (proj_pd == G4PionPlus::PionPlus() ) {   << 
150      xs_0 = pipElNucXS->GetElementCrossSection << 
151             pipInelNucXS->GetElementCrossSecti << 
152    } else if (proj_pd == G4PionMinus::PionMinu << 
153      xs_0 = pimElNucXS->GetElementCrossSection << 
154             pimInelNucXS->GetElementCrossSecti << 
155    }                                           << 
156                                                   115 
157    //G4double xs_0 = genspaXS->GetCrossSection << 116    G4double xs_0 = theXS->GetCrossSection ( proj_dp , targ_ele , aTemp );
158    //G4double xs_0 = theXS->GetCrossSection (  << 
159    //110822                                    << 
160                                                   117 
                                                   >> 118      //G4double xs_0 = genspaXS->GetCrossSection ( proj_dp , targ_ele , aTemp );
161      G4double bmax_0 = std::sqrt( xs_0 / pi );    119      G4double bmax_0 = std::sqrt( xs_0 / pi );
162      //std::cout << "bmax_0 in fm (fermi) " <<    120      //std::cout << "bmax_0 in fm (fermi) " <<  bmax_0/fermi << std::endl;
163                                                   121 
164      //delete proj_dp;                            122      //delete proj_dp; 
165                                                   123 
166    G4bool elastic = true;                         124    G4bool elastic = true;
167                                                   125    
168    std::vector< G4QMDNucleus* > nucleuses; //     126    std::vector< G4QMDNucleus* > nucleuses; // Secondary nuceluses 
169    G4ThreeVector boostToReac; // ReactionSyste    127    G4ThreeVector boostToReac; // ReactionSystem (CM or NN); 
170    G4ThreeVector boostBackToLAB; // Reaction S    128    G4ThreeVector boostBackToLAB; // Reaction System to LAB; 
171                                                   129 
172    G4LorentzVector targ4p( G4ThreeVector( 0.0     130    G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ_pd->GetPDGMass()/GeV );
173    G4ThreeVector boostLABtoCM = targ4p.findBoo    131    G4ThreeVector boostLABtoCM = targ4p.findBoostToCM( proj_dp->Get4Momentum()/GeV ); // CM of target and proj; 
174                                                   132 
175    G4double p1 = proj_dp->GetMomentum().mag()/    133    G4double p1 = proj_dp->GetMomentum().mag()/GeV/proj_A; 
176    G4double m1 = proj_dp->GetDefinition()->Get    134    G4double m1 = proj_dp->GetDefinition()->GetPDGMass()/GeV/proj_A;
177    G4double e1 = std::sqrt( p1*p1 + m1*m1 );      135    G4double e1 = std::sqrt( p1*p1 + m1*m1 ); 
178    G4double e2 = targ_pd->GetPDGMass()/GeV/tar    136    G4double e2 = targ_pd->GetPDGMass()/GeV/targ_A;
179    G4double beta_nn = -p1 / ( e1+e2 );            137    G4double beta_nn = -p1 / ( e1+e2 );
180                                                   138 
181    G4ThreeVector boostLABtoNN ( 0. , 0. , beta    139    G4ThreeVector boostLABtoNN ( 0. , 0. , beta_nn ); // CM of NN; 
182                                                   140 
183    G4double beta_nncm = ( - boostLABtoCM.beta(    141    G4double beta_nncm = ( - boostLABtoCM.beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.beta() * boostLABtoNN.beta() ) ;  
184                                                   142 
185    //std::cout << targ4p << std::endl;            143    //std::cout << targ4p << std::endl; 
186    //std::cout << proj_dp->Get4Momentum()<< st    144    //std::cout << proj_dp->Get4Momentum()<< std::endl; 
187    //std::cout << beta_nncm << std::endl;         145    //std::cout << beta_nncm << std::endl; 
188    G4ThreeVector boostNNtoCM( 0. , 0. , beta_n    146    G4ThreeVector boostNNtoCM( 0. , 0. , beta_nncm ); // 
189    G4ThreeVector boostCMtoNN( 0. , 0. , -beta_    147    G4ThreeVector boostCMtoNN( 0. , 0. , -beta_nncm ); // 
190                                                   148 
191    boostToReac = boostLABtoNN;                    149    boostToReac = boostLABtoNN; 
192    boostBackToLAB = -boostLABtoNN;                150    boostBackToLAB = -boostLABtoNN; 
193                                                   151 
194    delete proj_dp;                                152    delete proj_dp; 
195                                                   153 
196    G4int icounter = 0;                         << 154    while ( elastic ) 
197    G4int icounter_max = 1024;                  << 155    {
198    while ( elastic ) // Loop checking, 11.03.2 << 
199    {                                           << 
200       icounter++;                              << 
201       if ( icounter > icounter_max ) {         << 
202    G4cout << "Loop-counter exceeded the thresh << 
203          break;                                << 
204       }                                        << 
205                                                   156 
206 // impact parameter                               157 // impact parameter 
207       //G4double bmax = 1.05*(bmax_0/fermi);      158       //G4double bmax = 1.05*(bmax_0/fermi);  // 10% for Peripheral reactions
208       G4double bmax = envelopF*(bmax_0/fermi);    159       G4double bmax = envelopF*(bmax_0/fermi);
209       G4double b = bmax * std::sqrt ( G4Unifor    160       G4double b = bmax * std::sqrt ( G4UniformRand() );
210 //071112                                          161 //071112
211       //G4double b = 0;                           162       //G4double b = 0;
212       //G4double b = bmax;                        163       //G4double b = bmax;
213       //G4double b = bmax/1.05 * 0.7 * G4Unifo    164       //G4double b = bmax/1.05 * 0.7 * G4UniformRand();
214                                                   165 
215       //G4cout << "G4QMDRESULT bmax_0 = " << b    166       //G4cout << "G4QMDRESULT bmax_0 = " << bmax_0/fermi << " fm, bmax = " << bmax << " fm , b = " << b  << " fm " << G4endl; 
216                                                   167 
217       G4double plab = projectile.GetTotalMomen    168       G4double plab = projectile.GetTotalMomentum()/GeV;
218       G4double elab = ( projectile.GetKineticE    169       G4double elab = ( projectile.GetKineticEnergy() + proj_pd->GetPDGMass() + targ_pd->GetPDGMass() )/GeV;
219                                                   170 
220       calcOffSetOfCollision( b , proj_pd , tar    171       calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN );
221                                                   172 
222 // Projectile                                     173 // Projectile
223       G4LorentzVector proj4pLAB = projectile.G    174       G4LorentzVector proj4pLAB = projectile.Get4Momentum()/GeV;
224                                                   175 
225       G4QMDGroundStateNucleus* proj(NULL);        176       G4QMDGroundStateNucleus* proj(NULL); 
226       if ( projectile.GetDefinition()->GetPart    177       if ( projectile.GetDefinition()->GetParticleType() == "nucleus" 
227         || projectile.GetDefinition()->GetPart    178         || projectile.GetDefinition()->GetParticleName() == "proton"
228         || projectile.GetDefinition()->GetPart    179         || projectile.GetDefinition()->GetParticleName() == "neutron" )
229       {                                           180       {
230                                                   181 
231          proj_Z = proj_pd->GetAtomicNumber();     182          proj_Z = proj_pd->GetAtomicNumber();
232          proj_A = proj_pd->GetAtomicMass();       183          proj_A = proj_pd->GetAtomicMass();
233                                                   184 
234          proj = new G4QMDGroundStateNucleus( p    185          proj = new G4QMDGroundStateNucleus( proj_Z , proj_A );
235          //proj->ShowParticipants();              186          //proj->ShowParticipants();
236                                                   187 
237                                                   188 
238          meanField->SetSystem ( proj );           189          meanField->SetSystem ( proj );
239          proj->SetTotalPotential( meanField->G    190          proj->SetTotalPotential( meanField->GetTotalPotential() );
240          proj->CalEnergyAndAngularMomentumInCM    191          proj->CalEnergyAndAngularMomentumInCM();
241                                                   192 
242       }                                           193       }
243                                                   194 
244 // Target                                         195 // Target
245       //G4int iz = int ( target.GetZ() );      << 196       G4int iz = int ( target.GetZ() );
246       //G4int ia = int ( target.GetN() );      << 197       G4int ia = int ( target.GetN() );
247       //migrate to integer A and Z (GetN_asInt << 
248       G4int iz = int ( target.GetZ_asInt() );  << 
249       G4int ia = int ( target.GetA_asInt() );  << 
250                                                   198 
251       G4QMDGroundStateNucleus* targ = new G4QM    199       G4QMDGroundStateNucleus* targ = new G4QMDGroundStateNucleus( iz , ia );
252                                                   200 
253       meanField->SetSystem (targ );               201       meanField->SetSystem (targ );
254       targ->SetTotalPotential( meanField->GetT    202       targ->SetTotalPotential( meanField->GetTotalPotential() );
255       targ->CalEnergyAndAngularMomentumInCM();    203       targ->CalEnergyAndAngularMomentumInCM();
256                                                   204    
257       //G4LorentzVector targ4p( G4ThreeVector(    205       //G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ->GetNuclearMass()/GeV );
258 // Boost Vector to CM                             206 // Boost Vector to CM
259       //boostToCM = targ4p.findBoostToCM( proj    207       //boostToCM = targ4p.findBoostToCM( proj4pLAB );
260                                                   208 
261 //    Target                                      209 //    Target 
262       for ( G4int i = 0 ; i < targ->GetTotalNu    210       for ( G4int i = 0 ; i < targ->GetTotalNumberOfParticipant() ; i++ )
263       {                                           211       {
264                                                   212 
265          G4ThreeVector p0 = targ->GetParticipa    213          G4ThreeVector p0 = targ->GetParticipant( i )->GetMomentum();
266          G4ThreeVector r0 = targ->GetParticipa    214          G4ThreeVector r0 = targ->GetParticipant( i )->GetPosition();
267                                                   215 
268          G4ThreeVector p ( p0.x() + coulomb_co    216          G4ThreeVector p ( p0.x() + coulomb_collision_px_targ 
269                          , p0.y()                 217                          , p0.y() 
270                          , p0.z() * coulomb_co    218                          , p0.z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ ); 
271                                                   219 
272          G4ThreeVector r ( r0.x() + coulomb_co    220          G4ThreeVector r ( r0.x() + coulomb_collision_rx_targ 
273                          , r0.y()                 221                          , r0.y() 
274                          , r0.z() / coulomb_co    222                          , r0.z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ ); 
275                                                   223      
276          system->SetParticipant( new G4QMDPart    224          system->SetParticipant( new G4QMDParticipant( targ->GetParticipant( i )->GetDefinition() , p , r ) );
277          system->GetParticipant( i )->SetTarge    225          system->GetParticipant( i )->SetTarget();
278                                                   226 
279       }                                           227       }
280                                                   228 
281       G4LorentzVector proj4pCM = CLHEP::boostO    229       G4LorentzVector proj4pCM = CLHEP::boostOf ( proj4pLAB , boostToReac );
282       G4LorentzVector targ4pCM = CLHEP::boostO    230       G4LorentzVector targ4pCM = CLHEP::boostOf ( targ4p , boostToReac );
283                                                   231 
284 //    Projectile                                  232 //    Projectile
285       //G4cout << "proj : " << proj << G4endl; << 233       if ( proj != NULL )
286       //if ( proj != NULL )                    << 
287       if ( proj_A != 1 )                       << 
288       {                                           234       {
289                                                   235 
290 //    projectile is nucleus                       236 //    projectile is nucleus
291                                                   237 
292          for ( G4int i = 0 ; i < proj->GetTota    238          for ( G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ )
293          {                                        239          {
294                                                   240 
295             G4ThreeVector p0 = proj->GetPartic    241             G4ThreeVector p0 = proj->GetParticipant( i )->GetMomentum();
296             G4ThreeVector r0 = proj->GetPartic    242             G4ThreeVector r0 = proj->GetParticipant( i )->GetPosition();
297                                                   243 
298             G4ThreeVector p ( p0.x() + coulomb    244             G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 
299                             , p0.y()              245                             , p0.y() 
300                             , p0.z() * coulomb    246                             , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 
301                                                   247 
302             G4ThreeVector r ( r0.x() + coulomb    248             G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 
303                             , r0.y()              249                             , r0.y() 
304                             , r0.z() / coulomb    250                             , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 
305                                                   251      
306             system->SetParticipant( new G4QMDP    252             system->SetParticipant( new G4QMDParticipant( proj->GetParticipant( i )->GetDefinition() , p  , r ) );
307             system->GetParticipant ( i + targ-    253             system->GetParticipant ( i + targ->GetTotalNumberOfParticipant() )->SetProjectile();
308          }                                        254          }
309                                                   255 
310       }                                           256       }
311       else                                        257       else
312       {                                           258       {
313                                                   259 
314 //       projectile is particle                   260 //       projectile is particle
315                                                   261 
316          // avoid multiple set in "elastic" lo    262          // avoid multiple set in "elastic" loop
317          //G4cout << "system Total Participant << 
318          if ( system->GetTotalNumberOfParticip    263          if ( system->GetTotalNumberOfParticipant() == targ->GetTotalNumberOfParticipant() )
319          {                                        264          {
320                                                   265 
321             G4int i = targ->GetTotalNumberOfPa    266             G4int i = targ->GetTotalNumberOfParticipant(); 
322                                                   267       
323             G4ThreeVector p0( 0 );                268             G4ThreeVector p0( 0 ); 
324             G4ThreeVector r0( 0 );                269             G4ThreeVector r0( 0 );
325                                                   270 
326             G4ThreeVector p ( p0.x() + coulomb    271             G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 
327                             , p0.y()              272                             , p0.y() 
328                             , p0.z() * coulomb    273                             , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 
329                                                   274 
330             G4ThreeVector r ( r0.x() + coulomb    275             G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 
331                             , r0.y()              276                             , r0.y() 
332                             , r0.z() / coulomb    277                             , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 
333                                                   278 
334             system->SetParticipant( new G4QMDP    279             system->SetParticipant( new G4QMDParticipant( (G4ParticleDefinition*)projectile.GetDefinition() , p , r ) );
335             // This is not important becase on    280             // This is not important becase only 1 projectile particle.
336             system->GetParticipant ( i )->SetP    281             system->GetParticipant ( i )->SetProjectile();
337          }                                        282          }
338                                                   283 
339       }                                           284       }
340       //system->ShowParticipants();               285       //system->ShowParticipants();
341                                                   286 
342       delete targ;                                287       delete targ;
343       delete proj;                                288       delete proj;
344                                                   289 
345    meanField->SetSystem ( system );               290    meanField->SetSystem ( system );
346    collision->SetMeanField ( meanField );         291    collision->SetMeanField ( meanField );
347                                                   292 
348 // Time Evolution                                 293 // Time Evolution 
349    //std::cout << "Start time evolution " << s    294    //std::cout << "Start time evolution " << std::endl;
350    //system->ShowParticipants();                  295    //system->ShowParticipants();
351    for ( G4int i = 0 ; i < maxTime ; i++ )        296    for ( G4int i = 0 ; i < maxTime ; i++ )
352    {                                              297    {
353       //G4cout << " do Paropagate " << i << "     298       //G4cout << " do Paropagate " << i << " th time step. " << G4endl;
354       meanField->DoPropagation( deltaT );         299       meanField->DoPropagation( deltaT );
355       //system->ShowParticipants();               300       //system->ShowParticipants();
356       collision->CalKinematicsOfBinaryCollisio    301       collision->CalKinematicsOfBinaryCollisions( deltaT );
357                                                   302 
358       if ( i / 10 * 10 == i )                     303       if ( i / 10 * 10 == i ) 
359       {                                           304       {
360          //G4cout << i << " th time step. " <<    305          //G4cout << i << " th time step. " << G4endl;
361          //system->ShowParticipants();            306          //system->ShowParticipants();
362       }                                           307       } 
363       //system->ShowParticipants();               308       //system->ShowParticipants();
364    }                                              309    }
365    //system->ShowParticipants();                  310    //system->ShowParticipants();
366                                                   311 
367                                                   312 
368    //std::cout << "Doing Cluster Judgment " <<    313    //std::cout << "Doing Cluster Judgment " << std::endl;
369                                                   314 
370    nucleuses = meanField->DoClusterJudgment();    315    nucleuses = meanField->DoClusterJudgment();
371                                                   316 
372 // Elastic Judgment                               317 // Elastic Judgment  
373                                                   318 
374    G4int numberOfSecondary = int ( nucleuses.s    319    G4int numberOfSecondary = int ( nucleuses.size() ) + system->GetTotalNumberOfParticipant(); 
375                                                   320 
376    G4int sec_a_Z = 0;                             321    G4int sec_a_Z = 0;
377    G4int sec_a_A = 0;                             322    G4int sec_a_A = 0;
378    const G4ParticleDefinition* sec_a_pd = NULL << 323    G4ParticleDefinition* sec_a_pd = NULL;
379    G4int sec_b_Z = 0;                             324    G4int sec_b_Z = 0;
380    G4int sec_b_A = 0;                             325    G4int sec_b_A = 0;
381    const G4ParticleDefinition* sec_b_pd = NULL << 326    G4ParticleDefinition* sec_b_pd = NULL;
382                                                   327 
383    if ( numberOfSecondary == 2 )                  328    if ( numberOfSecondary == 2 )
384    {                                              329    {
385                                                   330 
386       G4bool elasticLike_system = false;          331       G4bool elasticLike_system = false;
387       if ( nucleuses.size() == 2 )                332       if ( nucleuses.size() == 2 ) 
388       {                                           333       {
389                                                   334 
390          sec_a_Z = nucleuses[0]->GetAtomicNumb    335          sec_a_Z = nucleuses[0]->GetAtomicNumber();
391          sec_a_A = nucleuses[0]->GetMassNumber    336          sec_a_A = nucleuses[0]->GetMassNumber();
392          sec_b_Z = nucleuses[1]->GetAtomicNumb    337          sec_b_Z = nucleuses[1]->GetAtomicNumber();
393          sec_b_A = nucleuses[1]->GetMassNumber    338          sec_b_A = nucleuses[1]->GetMassNumber();
394                                                   339 
395          if ( ( sec_a_Z == proj_Z && sec_a_A =    340          if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A )
396            || ( sec_a_Z == targ_Z && sec_a_A =    341            || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) )
397          {                                        342          {
398             elasticLike_system = true;            343             elasticLike_system = true;
399          }                                        344          } 
400                                                   345 
401       }                                           346       }
402       else if ( nucleuses.size() == 1 )           347       else if ( nucleuses.size() == 1 ) 
403       {                                           348       {
404                                                   349 
405          sec_a_Z = nucleuses[0]->GetAtomicNumb    350          sec_a_Z = nucleuses[0]->GetAtomicNumber();
406          sec_a_A = nucleuses[0]->GetMassNumber    351          sec_a_A = nucleuses[0]->GetMassNumber();
407          sec_b_pd = system->GetParticipant( 0     352          sec_b_pd = system->GetParticipant( 0 )->GetDefinition();
408                                                   353 
409          if ( ( sec_a_Z == proj_Z && sec_a_A =    354          if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd )
410            || ( sec_a_Z == targ_Z && sec_a_A =    355            || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) )
411          {                                        356          {
412             elasticLike_system = true;            357             elasticLike_system = true;
413          }                                        358          } 
414                                                   359 
415       }                                           360       }  
416       else                                        361       else
417       {                                           362       {
418                                                   363 
419          sec_a_pd = system->GetParticipant( 0     364          sec_a_pd = system->GetParticipant( 0 )->GetDefinition();
420          sec_b_pd = system->GetParticipant( 1     365          sec_b_pd = system->GetParticipant( 1 )->GetDefinition();
421                                                   366  
422          if ( ( sec_a_pd == proj_pd && sec_b_p    367          if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd ) 
423            || ( sec_a_pd == targ_pd && sec_b_p    368            || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) ) 
424          {                                        369          {
425             elasticLike_system = true;            370             elasticLike_system = true;
426          }                                        371          } 
427                                                   372 
428       }                                           373       } 
429                                                   374 
430       if ( elasticLike_system == true )           375       if ( elasticLike_system == true )
431       {                                           376       {
432                                                   377 
433          G4bool elasticLike_energy = true;        378          G4bool elasticLike_energy = true;
434 //    Cal ExcitationEnergy                        379 //    Cal ExcitationEnergy 
435          for ( G4int i = 0 ; i < int ( nucleus    380          for ( G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ )
436          {                                        381          { 
437                                                   382 
438             //meanField->SetSystem( nucleuses[    383             //meanField->SetSystem( nucleuses[i] );
439             meanField->SetNucleus( nucleuses[i    384             meanField->SetNucleus( nucleuses[i] );
440             //nucleuses[i]->SetTotalPotential(    385             //nucleuses[i]->SetTotalPotential( meanField->GetTotalPotential() );
441             //nucleuses[i]->CalEnergyAndAngula    386             //nucleuses[i]->CalEnergyAndAngularMomentumInCM();
442                                                   387 
443             if ( nucleuses[i]->GetExcitationEn    388             if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false;  
444                                                   389 
445          }                                        390          } 
446                                                   391 
447 //    Check Collision                             392 //    Check Collision 
448          G4bool withCollision = true;             393          G4bool withCollision = true;
449          if ( system->GetNOCollision() == 0 )     394          if ( system->GetNOCollision() == 0 ) withCollision = false;
450                                                   395 
451 //    Final judegement for Inelasitc or Elasti    396 //    Final judegement for Inelasitc or Elastic;
452 //                                                397 //
453 //       ElasticLike without Collision            398 //       ElasticLike without Collision 
454          //if ( elasticLike_energy == true &&     399          //if ( elasticLike_energy == true && withCollision == false ) elastic = true;  // ielst = 0
455 //       ElasticLike with Collision               400 //       ElasticLike with Collision 
456          //if ( elasticLike_energy == true &&     401          //if ( elasticLike_energy == true && withCollision == true ) elastic = true;   // ielst = 1 
457 //       InelasticLike without Collision          402 //       InelasticLike without Collision 
458          //if ( elasticLike_energy == false )     403          //if ( elasticLike_energy == false ) elastic = false;                          // ielst = 2                
459          if ( frag == true )                      404          if ( frag == true )
460             if ( elasticLike_energy == false )    405             if ( elasticLike_energy == false ) elastic = false;
461 //       InelasticLike with Collision             406 //       InelasticLike with Collision 
462          if ( elasticLike_energy == false && w    407          if ( elasticLike_energy == false && withCollision == true ) elastic = false; // ielst = 3
463                                                   408 
464       }                                           409       }
465                                                   410 
466       }                                           411       }
467       else                                        412       else
468       {                                           413       {
469                                                   414 
470 //       numberOfSecondary != 2                   415 //       numberOfSecondary != 2 
471          elastic = false;                         416          elastic = false;
472                                                   417 
473       }                                           418       }
474                                                   419 
475 //071115                                          420 //071115
476       //G4cout << elastic << G4endl;              421       //G4cout << elastic << G4endl;
477       // if elastic is true try again from sam    422       // if elastic is true try again from sampling of impact parameter 
478                                                   423 
479       if ( elastic == true )                      424       if ( elastic == true )
480       {                                           425       {
481          // delete this nucleues                  426          // delete this nucleues
482          for ( std::vector< G4QMDNucleus* >::i    427          for ( std::vector< G4QMDNucleus* >::iterator
483                it = nucleuses.begin() ; it !=     428                it = nucleuses.begin() ; it != nucleuses.end() ; it++ )
484          {                                        429          {
485             delete *it;                           430             delete *it;
486          }                                        431          }
487          nucleuses.clear();                       432          nucleuses.clear();
488       }                                           433       }
489                                                << 
490    }                                              434    } 
491                                                   435 
492                                                   436 
493 // Statical Decay Phase                           437 // Statical Decay Phase
494                                                   438 
495    for ( std::vector< G4QMDNucleus* >::iterato    439    for ( std::vector< G4QMDNucleus* >::iterator it
496        = nucleuses.begin() ; it != nucleuses.e    440        = nucleuses.begin() ; it != nucleuses.end() ; it++ )
497    {                                              441    {
498                                                   442 
499 /*                                                443 /*
500       G4cout << "G4QMDRESULT "                 << 444       std::cout << "G4QMDRESULT "
501              << (*it)->GetAtomicNumber()       << 445                 << (*it)->GetAtomicNumber() 
502              << " "                            << 446                 << " " 
503              << (*it)->GetMassNumber()         << 447                 << (*it)->GetMassNumber() 
504              << " "                            << 448                 << " " 
505              << (*it)->Get4Momentum()          << 449                 << (*it)->Get4Momentum() 
506              << " "                            << 450                 << " " 
507              << (*it)->Get4Momentum().vect()   << 451                 << (*it)->Get4Momentum().vect() 
508              << " "                            << 452                 << " " 
509              << (*it)->Get4Momentum().restMass << 453                 << (*it)->Get4Momentum().restMass() 
510              << " "                            << 454                 << " " 
511              << (*it)->GetNuclearMass()/GeV    << 455                 << (*it)->GetNuclearMass()/GeV 
512              << G4endl;                        << 456                 << std::endl;
513 */                                                457 */
514                                                   458 
515       meanField->SetNucleus ( *it );              459       meanField->SetNucleus ( *it );
516                                                   460 
517       if ( (*it)->GetAtomicNumber() == 0  // n    461       if ( (*it)->GetAtomicNumber() == 0  // neutron cluster
518         || (*it)->GetAtomicNumber() == (*it)->    462         || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() ) // proton cluster
519       {                                           463       {
520          // push back system                      464          // push back system 
521          for ( G4int i = 0 ; i < (*it)->GetTot    465          for ( G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ )
522          {                                        466          {
523             G4QMDParticipant* aP = new G4QMDPa    467             G4QMDParticipant* aP = new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() );  
524             system->SetParticipant ( aP );        468             system->SetParticipant ( aP );  
525          }                                        469          } 
526          continue;                                470          continue;  
527       }                                           471       }
528                                                   472 
529       G4double nucleus_e = std::sqrt ( G4Pow:: << 473       G4double nucleus_e = std::sqrt ( std::pow ( (*it)->GetNuclearMass()/GeV , 2 ) + std::pow ( (*it)->Get4Momentum().vect().mag() , 2 ) );
530       G4LorentzVector nucleus_p4CM ( (*it)->Ge    474       G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e ); 
531                                                   475 
532 //      std::cout << "G4QMDRESULT nucleus delt    476 //      std::cout << "G4QMDRESULT nucleus deltaQ " << deltaQ << std::endl;
533                                                   477 
534       G4int ia = (*it)->GetMassNumber();          478       G4int ia = (*it)->GetMassNumber();
535       G4int iz = (*it)->GetAtomicNumber();        479       G4int iz = (*it)->GetAtomicNumber();
536                                                   480 
537       G4LorentzVector lv ( G4ThreeVector( 0.0  << 481       G4LorentzVector lv ( G4ThreeVector( 0.0 ) , (*it)->GetExcitationEnergy()*GeV + G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass( iz , ia ) );
538                                                   482 
539       G4Fragment* aFragment = new G4Fragment(     483       G4Fragment* aFragment = new G4Fragment( ia , iz , lv );
540                                                   484 
541       G4ReactionProductVector* rv;                485       G4ReactionProductVector* rv;
542       rv = excitationHandler->BreakItUp( *aFra    486       rv = excitationHandler->BreakItUp( *aFragment );
543       G4bool notBreak = true;                     487       G4bool notBreak = true;
544       for ( G4ReactionProductVector::iterator     488       for ( G4ReactionProductVector::iterator itt
545           = rv->begin() ; itt != rv->end() ; i    489           = rv->begin() ; itt != rv->end() ; itt++ )
546       {                                           490       {
547                                                   491 
548           notBreak = false;                       492           notBreak = false;
549           // Secondary from this nucleus (*it)    493           // Secondary from this nucleus (*it) 
550           const G4ParticleDefinition* pd = (*i << 494           G4ParticleDefinition* pd = (*itt)->GetDefinition();
551                                                   495 
552           G4LorentzVector p4 ( (*itt)->GetMome    496           G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV );  //in nucleus(*it) rest system
553           G4LorentzVector p4_CM = CLHEP::boost    497           G4LorentzVector p4_CM = CLHEP::boostOf( p4 , -nucleus_p4CM.findBoostToCM() );  // Back to CM
554           G4LorentzVector p4_LAB = CLHEP::boos    498           G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB  
555                                                   499 
556                                                   500 
557 //090122                                          501 //090122
558           //theParticleChange.AddSecondary( dp    502           //theParticleChange.AddSecondary( dp ); 
559           if ( !( pd->GetAtomicNumber() == 4 &    503           if ( !( pd->GetAtomicNumber() == 4 && pd->GetAtomicMass() == 8 ) )
560           {                                       504           {
561              //G4cout << "pd out of notBreak l << 
562              G4DynamicParticle* dp = new G4Dyn    505              G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV );  
563              theParticleChange.AddSecondary( d    506              theParticleChange.AddSecondary( dp ); 
564           }                                       507           }
565           else                                    508           else
566           {                                       509           {
567              //Be8 -> Alpha + Alpha + Q           510              //Be8 -> Alpha + Alpha + Q
568              G4ThreeVector randomized_directio    511              G4ThreeVector randomized_direction( G4UniformRand() , G4UniformRand() , G4UniformRand() );
569              randomized_direction = randomized    512              randomized_direction = randomized_direction.unit();
570              G4double q_decay = (*itt)->GetMas    513              G4double q_decay = (*itt)->GetMass() - 2*G4Alpha::Alpha()->GetPDGMass();
571              G4double p_decay = std::sqrt ( G4 << 514              G4double p_decay = std::sqrt ( std::pow(G4Alpha::Alpha()->GetPDGMass()+q_decay/2,2) - std::pow(G4Alpha::Alpha()->GetPDGMass() , 2 ) ); 
572              G4LorentzVector p4_a1 ( p_decay*r    515              G4LorentzVector p4_a1 ( p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 );  //in Be8 rest system
573                                                   516              
574              G4LorentzVector p4_a1_Be8 = CLHEP    517              G4LorentzVector p4_a1_Be8 = CLHEP::boostOf ( p4_a1/GeV , -p4.findBoostToCM() );
575              G4LorentzVector p4_a1_CM = CLHEP:    518              G4LorentzVector p4_a1_CM = CLHEP::boostOf ( p4_a1_Be8 , -nucleus_p4CM.findBoostToCM() );
576              G4LorentzVector p4_a1_LAB = CLHEP    519              G4LorentzVector p4_a1_LAB = CLHEP::boostOf ( p4_a1_CM , boostBackToLAB );
577                                                   520 
578              G4LorentzVector p4_a2 ( -p_decay*    521              G4LorentzVector p4_a2 ( -p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 );  //in Be8 rest system
579                                                   522              
580              G4LorentzVector p4_a2_Be8 = CLHEP    523              G4LorentzVector p4_a2_Be8 = CLHEP::boostOf ( p4_a2/GeV , -p4.findBoostToCM() );
581              G4LorentzVector p4_a2_CM = CLHEP:    524              G4LorentzVector p4_a2_CM = CLHEP::boostOf ( p4_a2_Be8 , -nucleus_p4CM.findBoostToCM() );
582              G4LorentzVector p4_a2_LAB = CLHEP    525              G4LorentzVector p4_a2_LAB = CLHEP::boostOf ( p4_a2_CM , boostBackToLAB );
583                                                   526              
584              G4DynamicParticle* dp1 = new G4Dy    527              G4DynamicParticle* dp1 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a1_LAB*GeV );  
585              G4DynamicParticle* dp2 = new G4Dy    528              G4DynamicParticle* dp2 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a2_LAB*GeV );  
586              theParticleChange.AddSecondary( d    529              theParticleChange.AddSecondary( dp1 ); 
587              theParticleChange.AddSecondary( d    530              theParticleChange.AddSecondary( dp2 ); 
588           }                                       531           }
589 //090122                                          532 //090122
590                                                   533 
591 /*                                                534 /*
592           G4cout                               << 535           std::cout
593                 << "Regist Secondary "            536                 << "Regist Secondary "
594                 << (*itt)->GetDefinition()->Ge    537                 << (*itt)->GetDefinition()->GetParticleName()
595                 << " "                            538                 << " "
596                 << (*itt)->GetMomentum()/GeV      539                 << (*itt)->GetMomentum()/GeV
597                 << " "                            540                 << " "
598                 << (*itt)->GetKineticEnergy()/    541                 << (*itt)->GetKineticEnergy()/GeV
599                 << " "                            542                 << " "
600                 << (*itt)->GetMass()/GeV          543                 << (*itt)->GetMass()/GeV
601                 << " "                            544                 << " "
602                 << (*itt)->GetTotalEnergy()/Ge    545                 << (*itt)->GetTotalEnergy()/GeV
603                 << " "                            546                 << " "
604                 << (*itt)->GetTotalEnergy()/Ge    547                 << (*itt)->GetTotalEnergy()/GeV * (*itt)->GetTotalEnergy()/GeV
605                  - (*itt)->GetMomentum()/GeV *    548                  - (*itt)->GetMomentum()/GeV * (*itt)->GetMomentum()/GeV
606                 << " "                            549                 << " "
607                 << nucleus_p4CM.findBoostToCM(    550                 << nucleus_p4CM.findBoostToCM() 
608                 << " "                            551                 << " "
609                 << p4                             552                 << p4
610                 << " "                            553                 << " "
611                 << p4_CM                          554                 << p4_CM
612                 << " "                            555                 << " "
613                 << p4_LAB                         556                 << p4_LAB
614                 << G4endl;                     << 557                 << std::endl;
615 */                                                558 */
616                                                   559 
617       }                                           560       }
618       if ( notBreak == true )                     561       if ( notBreak == true )
619       {                                           562       {
620                                                   563 
621          const G4ParticleDefinition* pd = G4Io << 564          G4ParticleDefinition* pd = G4ParticleTable::GetParticleTable()->GetIon( (*it)->GetAtomicNumber() , (*it)->GetMassNumber(), (*it)->GetExcitationEnergy()*GeV );
622              //G4cout << "pd in notBreak loop  << 
623          G4LorentzVector p4_CM = nucleus_p4CM;    565          G4LorentzVector p4_CM = nucleus_p4CM;
624          G4LorentzVector p4_LAB = CLHEP::boost    566          G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB  
625          G4DynamicParticle* dp = new G4Dynamic    567          G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV );  
626          theParticleChange.AddSecondary( dp );    568          theParticleChange.AddSecondary( dp ); 
627                                                   569 
628       }                                           570       }
629                                                   571 
630       for ( G4ReactionProductVector::iterator     572       for ( G4ReactionProductVector::iterator itt
631           = rv->begin() ; itt != rv->end() ; i    573           = rv->begin() ; itt != rv->end() ; itt++ )
632       {                                           574       {
633           delete *itt;                            575           delete *itt;
634       }                                           576       }
635       delete rv;                                  577       delete rv;
636                                                   578 
637       delete aFragment;                           579       delete aFragment;
638                                                   580 
639    }                                              581    }
640                                                   582 
641                                                   583 
642                                                   584 
643    for ( G4int i = 0 ; i < system->GetTotalNum    585    for ( G4int i = 0 ; i < system->GetTotalNumberOfParticipant() ; i++ )
644    {                                              586    {
                                                   >> 587 
645       // Secondary particles                      588       // Secondary particles 
646                                                   589 
647       const G4ParticleDefinition* pd = system- << 590       G4ParticleDefinition* pd = system->GetParticipant( i )->GetDefinition();
648       G4LorentzVector p4_CM = system->GetParti    591       G4LorentzVector p4_CM = system->GetParticipant( i )->Get4Momentum();
649       G4LorentzVector p4_LAB = CLHEP::boostOf(    592       G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB );
650       G4DynamicParticle* dp = new G4DynamicPar    593       G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV );  
651       theParticleChange.AddSecondary( dp );       594       theParticleChange.AddSecondary( dp ); 
652       //G4cout << "In the last theParticleChan << 
653                                                   595 
654 /*                                                596 /*
655       G4cout << "G4QMDRESULT "                    597       G4cout << "G4QMDRESULT "
656       << "r" << i << " " << system->GetPartici    598       << "r" << i << " " << system->GetParticipant ( i ) -> GetPosition() << " "
657       << "p" << i << " " << system->GetPartici    599       << "p" << i << " " << system->GetParticipant ( i ) -> Get4Momentum()
658       << G4endl;                                  600       << G4endl;
659 */                                                601 */
660                                                   602 
661    }                                              603    }
662                                                   604 
663    for ( std::vector< G4QMDNucleus* >::iterato    605    for ( std::vector< G4QMDNucleus* >::iterator it
664        = nucleuses.begin() ; it != nucleuses.e    606        = nucleuses.begin() ; it != nucleuses.end() ; it++ )
665    {                                              607    {
666       delete *it;  // delete nulceuse             608       delete *it;  // delete nulceuse 
667    }                                              609    }
668    nucleuses.clear();                             610    nucleuses.clear();
669                                                   611 
670    system->Clear();                               612    system->Clear();
671    delete system;                                 613    delete system; 
672                                                   614 
673    theParticleChange.SetStatusChange( stopAndK    615    theParticleChange.SetStatusChange( stopAndKill );
674                                                   616 
675    for (G4int i = 0; i < G4int(theParticleChan << 
676    {                                           << 
677      //G4cout << "Particle : " << theParticleC << 
678      //G4cout << "KEnergy : " << theParticleCh << 
679      //G4cout << "modelID : " << theParticleCh << 
680      theParticleChange.GetSecondary(i)->SetCre << 
681    }                                           << 
682                                                << 
683    return &theParticleChange;                     617    return &theParticleChange;
684                                                   618 
685 }                                                 619 }
686                                                   620 
687                                                   621 
688                                                   622 
689 void G4QMDReaction::calcOffSetOfCollision( G4d    623 void G4QMDReaction::calcOffSetOfCollision( G4double b , 
690 const G4ParticleDefinition* pd_proj ,          << 624 G4ParticleDefinition* pd_proj , 
691 const G4ParticleDefinition* pd_targ ,          << 625 G4ParticleDefinition* pd_targ , 
692 G4double ptot , G4double etot , G4double bmax     626 G4double ptot , G4double etot , G4double bmax , G4ThreeVector boostToCM )
693 {                                                 627 {
694                                                   628 
695    G4double mass_proj = pd_proj->GetPDGMass()/    629    G4double mass_proj = pd_proj->GetPDGMass()/GeV;
696    G4double mass_targ = pd_targ->GetPDGMass()/    630    G4double mass_targ = pd_targ->GetPDGMass()/GeV;
697                                                   631   
698    G4double stot = std::sqrt ( etot*etot - pto    632    G4double stot = std::sqrt ( etot*etot - ptot*ptot );
699                                                   633 
700    G4double pstt = std::sqrt ( ( stot*stot - (    634    G4double pstt = std::sqrt ( ( stot*stot - ( mass_proj + mass_targ ) * ( mass_proj + mass_targ ) 
701                   ) * ( stot*stot - ( mass_pro    635                   ) * ( stot*stot - ( mass_proj - mass_targ ) * ( mass_proj - mass_targ ) ) ) 
702                  / ( 2.0 * stot );                636                  / ( 2.0 * stot );
703                                                   637 
704    G4double pzcc = pstt;                          638    G4double pzcc = pstt;
705    G4double eccm = stot - ( mass_proj + mass_t    639    G4double eccm = stot - ( mass_proj + mass_targ );
706                                                   640    
707    G4int zp = 1;                                  641    G4int zp = 1;
708    G4int ap = 1;                                  642    G4int ap = 1;
709    if ( pd_proj->GetParticleType() == "nucleus    643    if ( pd_proj->GetParticleType() == "nucleus" )
710    {                                              644    {
711       zp = pd_proj->GetAtomicNumber();            645       zp = pd_proj->GetAtomicNumber();
712       ap = pd_proj->GetAtomicMass();              646       ap = pd_proj->GetAtomicMass();
713    }                                              647    }
714    else                                           648    else 
715    {                                              649    {
716       // proton, neutron, mesons                  650       // proton, neutron, mesons
717       zp = int ( pd_proj->GetPDGCharge()/eplus    651       zp = int ( pd_proj->GetPDGCharge()/eplus + 0.5 );  
718       // ap = 1;                                  652       // ap = 1;
719    }                                              653    }
720                                                   654    
721                                                   655 
722    G4int zt = pd_targ->GetAtomicNumber();         656    G4int zt = pd_targ->GetAtomicNumber();
723    G4int at = pd_targ->GetAtomicMass();           657    G4int at = pd_targ->GetAtomicMass();
724                                                   658 
725                                                   659 
726    // Check the ramx0 value                    << 
727    //G4double rmax0 = 8.0;  // T.K dicide para    660    //G4double rmax0 = 8.0;  // T.K dicide parameter value  // for low energy
728    G4double rmax0 = bmax + 4.0;                   661    G4double rmax0 = bmax + 4.0;
729    G4double rmax = std::sqrt( rmax0*rmax0 + b*    662    G4double rmax = std::sqrt( rmax0*rmax0 + b*b );
730                                                   663 
731    G4double ccoul = 0.001439767;                  664    G4double ccoul = 0.001439767;
732    G4double pcca = 1.0 - double ( zp * zt ) *     665    G4double pcca = 1.0 - double ( zp * zt ) * ccoul / eccm / rmax - ( b / rmax )*( b / rmax );
733                                                   666 
734    G4double pccf = std::sqrt( pcca );             667    G4double pccf = std::sqrt( pcca );
735                                                   668 
736    //Fix for neutral particles                    669    //Fix for neutral particles
737    G4double aas1 = 0.0;                           670    G4double aas1 = 0.0;
738    G4double bbs = 0.0;                            671    G4double bbs = 0.0;
739                                                   672 
740    if ( zp != 0 )                                 673    if ( zp != 0 )
741    {                                              674    {
742       G4double aas = 2.0 * eccm * b / double (    675       G4double aas = 2.0 * eccm * b / double ( zp * zt ) / ccoul;
743       bbs = 1.0 / std::sqrt ( 1.0 + aas*aas );    676       bbs = 1.0 / std::sqrt ( 1.0 + aas*aas );
744       aas1 = ( 1.0 + aas * b / rmax ) * bbs;      677       aas1 = ( 1.0 + aas * b / rmax ) * bbs;
745    }                                              678    }
746                                                   679 
747    G4double cost = 0.0;                           680    G4double cost = 0.0;
748    G4double sint = 0.0;                           681    G4double sint = 0.0;
749    G4double thet1 = 0.0;                          682    G4double thet1 = 0.0;
750    G4double thet2 = 0.0;                          683    G4double thet2 = 0.0;
751    if ( 1.0 - aas1*aas1 <= 0 || 1.0 - bbs*bbs     684    if ( 1.0 - aas1*aas1 <= 0 || 1.0 - bbs*bbs <= 0.0 )   
752    {                                              685    {
753       cost = 1.0;                                 686       cost = 1.0;
754       sint = 0.0;                                 687       sint = 0.0;
755    }                                              688    } 
756    else                                           689    else 
757    {                                              690    {
758       G4double aat1 = aas1 / std::sqrt ( 1.0 -    691       G4double aat1 = aas1 / std::sqrt ( 1.0 - aas1*aas1 );
759       G4double aat2 = bbs / std::sqrt ( 1.0 -     692       G4double aat2 = bbs / std::sqrt ( 1.0 - bbs*bbs );
760                                                   693 
761       thet1 = std::atan ( aat1 );                 694       thet1 = std::atan ( aat1 );
762       thet2 = std::atan ( aat2 );                 695       thet2 = std::atan ( aat2 );
763                                                   696 
764 //    TK enter to else block                      697 //    TK enter to else block  
765       G4double theta = thet1 - thet2;             698       G4double theta = thet1 - thet2;
766       cost = std::cos( theta );                   699       cost = std::cos( theta );
767       sint = std::sin( theta );                   700       sint = std::sin( theta );
768    }                                              701    }
769                                                   702 
770    G4double rzpr = -rmax * cost * ( mass_targ     703    G4double rzpr = -rmax * cost * ( mass_targ ) / ( mass_proj + mass_targ );
771    G4double rzta =  rmax * cost * ( mass_proj     704    G4double rzta =  rmax * cost * ( mass_proj ) / ( mass_proj + mass_targ );
772                                                   705 
773    G4double rxpr = rmax / 2.0 * sint;             706    G4double rxpr = rmax / 2.0 * sint;
774                                                   707 
775    G4double rxta = -rxpr;                         708    G4double rxta = -rxpr;
776                                                   709 
777                                                   710 
778    G4double pzpc = pzcc * (  cost * pccf + sin    711    G4double pzpc = pzcc * (  cost * pccf + sint * b / rmax ); 
779    G4double pxpr = pzcc * ( -sint * pccf + cos    712    G4double pxpr = pzcc * ( -sint * pccf + cost * b / rmax ); 
780                                                   713 
781    G4double pztc = - pzpc;                        714    G4double pztc = - pzpc;
782    G4double pxta = - pxpr;                        715    G4double pxta = - pxpr;
783                                                   716 
784    G4double epc = std::sqrt ( pzpc*pzpc + pxpr    717    G4double epc = std::sqrt ( pzpc*pzpc + pxpr*pxpr + mass_proj*mass_proj );
785    G4double etc = std::sqrt ( pztc*pztc + pxta    718    G4double etc = std::sqrt ( pztc*pztc + pxta*pxta + mass_targ*mass_targ );
786                                                   719 
787    G4double pzpr = pzpc;                          720    G4double pzpr = pzpc;
788    G4double pzta = pztc;                          721    G4double pzta = pztc;
789    G4double epr = epc;                            722    G4double epr = epc;
790    G4double eta = etc;                            723    G4double eta = etc;
791                                                   724 
792 // CM -> NN                                       725 // CM -> NN
793    G4double gammacm = boostToCM.gamma();          726    G4double gammacm = boostToCM.gamma();
794    //G4double betacm = -boostToCM.beta();         727    //G4double betacm = -boostToCM.beta();
795    G4double betacm = boostToCM.z();               728    G4double betacm = boostToCM.z();
796    pzpr = pzpc + betacm * gammacm * ( gammacm     729    pzpr = pzpc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pzpc * betacm + epc );
797    pzta = pztc + betacm * gammacm * ( gammacm     730    pzta = pztc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pztc * betacm + etc );
798    epr = gammacm * ( epc + betacm * pzpc );       731    epr = gammacm * ( epc + betacm * pzpc );
799    eta = gammacm * ( etc + betacm * pztc );       732    eta = gammacm * ( etc + betacm * pztc );
800                                                   733 
801    //G4double betpr = pzpr / epr;                 734    //G4double betpr = pzpr / epr;
802    //G4double betta = pzta / eta;                 735    //G4double betta = pzta / eta;
803                                                   736 
804    G4double gammpr = epr / ( mass_proj );         737    G4double gammpr = epr / ( mass_proj );
805    G4double gammta = eta / ( mass_targ );         738    G4double gammta = eta / ( mass_targ );
806                                                   739       
807    pzta = pzta / double ( at );                   740    pzta = pzta / double ( at );
808    pxta = pxta / double ( at );                   741    pxta = pxta / double ( at );
809                                                   742       
810    pzpr = pzpr / double ( ap );                   743    pzpr = pzpr / double ( ap );
811    pxpr = pxpr / double ( ap );                   744    pxpr = pxpr / double ( ap );
812                                                   745 
813    G4double zeroz = 0.0;                          746    G4double zeroz = 0.0; 
814                                                   747 
815    rzpr = rzpr -zeroz;                            748    rzpr = rzpr -zeroz;
816    rzta = rzta -zeroz;                            749    rzta = rzta -zeroz;
817                                                   750 
818    // Set results                                 751    // Set results 
819    coulomb_collision_gamma_proj = gammpr;         752    coulomb_collision_gamma_proj = gammpr;
820    coulomb_collision_rx_proj = rxpr;              753    coulomb_collision_rx_proj = rxpr;
821    coulomb_collision_rz_proj = rzpr;              754    coulomb_collision_rz_proj = rzpr;
822    coulomb_collision_px_proj = pxpr;              755    coulomb_collision_px_proj = pxpr;
823    coulomb_collision_pz_proj = pzpr;              756    coulomb_collision_pz_proj = pzpr;
824                                                   757 
825    coulomb_collision_gamma_targ = gammta;         758    coulomb_collision_gamma_targ = gammta;
826    coulomb_collision_rx_targ = rxta;              759    coulomb_collision_rx_targ = rxta;
827    coulomb_collision_rz_targ = rzta;              760    coulomb_collision_rz_targ = rzta;
828    coulomb_collision_px_targ = pxta;              761    coulomb_collision_px_targ = pxta;
829    coulomb_collision_pz_targ = pzta;              762    coulomb_collision_pz_targ = pzta;
830                                                   763 
831 }                                                 764 }
832                                                   765 
                                                   >> 766 
                                                   >> 767 
833 void G4QMDReaction::setEvaporationCh()            768 void G4QMDReaction::setEvaporationCh()
834 {                                                 769 {
835   //fEvaporation - 8 default channels          << 
836   //fCombined    - 8 default + 60 GEM          << 
837   //fGEM         - 2 default + 66 GEM          << 
838   G4DeexChannelType ctype = gem ? fGEM : fComb << 
839   excitationHandler->SetDeexChannelsType(ctype << 
840 }                                              << 
841                                                   770 
842 void G4QMDReaction::ModelDescription(std::ostr << 771    if ( gem == true ) 
843 {                                              << 772       evaporation->SetGEMChannel();
844    outFile << "Lorentz covarianted Quantum Mol << 773    else
                                                   >> 774       evaporation->SetDefaultChannel();
                                                   >> 775 
845 }                                                 776 }
846                                                   777