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