G4UnstableFragmentBreakUp.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 // $Id$
00027 //
00028 // -------------------------------------------------------------------
00029 //      GEANT 4 class file 
00030 //
00031 //      CERN, Geneva, Switzerland
00032 //
00033 //      File name:     G4UnstableFragmentBreakUp
00034 //
00035 //      Author:        V.Ivanchenko
00036 // 
00037 //      Creation date: 11 May 2010
00038 //
00039 //Modifications: 
00040 //      
00041 // -------------------------------------------------------------------
00042 //
00043 
00044 #include "G4UnstableFragmentBreakUp.hh"
00045 #include "Randomize.hh"
00046 #include "G4PhysicalConstants.hh"
00047 #include "G4LorentzVector.hh"
00048 #include "G4Fragment.hh"
00049 #include "G4FragmentVector.hh"
00050 #include "G4NucleiProperties.hh"
00051 #include "G4NistManager.hh"
00052 
00053 G4int G4UnstableFragmentBreakUp::Zfr[6] = {0};
00054 G4int G4UnstableFragmentBreakUp::Afr[6] = {0};
00055 G4double G4UnstableFragmentBreakUp::masses[6] = {0.0};
00056 
00057 G4UnstableFragmentBreakUp::G4UnstableFragmentBreakUp()
00058   :verbose(0)
00059 { 
00060   fNistManager = G4NistManager::Instance();
00061   if(0 == Afr[0]) {
00062     G4int z[6] = {0, 1, 1, 1, 2, 2};
00063     G4int a[6] = {1, 1, 2, 3, 3, 4};
00064     for(G4int i=0; i<6; ++i) {
00065       Zfr[i] = z[i];
00066       Afr[i] = a[i];
00067       masses[i] = G4NucleiProperties::GetNuclearMass(a[i], z[i]);
00068     }
00069   }
00070 }
00071 
00072 G4UnstableFragmentBreakUp::~G4UnstableFragmentBreakUp()
00073 {}
00074 
00075 G4Fragment* G4UnstableFragmentBreakUp::EmittedFragment(G4Fragment*)
00076 {
00077   return 0;
00078 }
00079 
00080 G4FragmentVector* G4UnstableFragmentBreakUp::BreakUpFragment(G4Fragment* nucleus)
00081 {
00082   //G4cout << "G4UnstableFragmentBreakUp::BreakUpFragment" << G4endl;
00083   G4FragmentVector * theResult = new G4FragmentVector();
00084 
00085   G4int Z = nucleus->GetZ_asInt();
00086   G4int A = nucleus->GetA_asInt();
00087   G4int Amax = A;
00088   G4LorentzVector lv = nucleus->GetMomentum();
00089   G4double time = nucleus->GetCreationTime();
00090 
00091   G4double deltaE, mass, mass1(0.0), mass2(0.0);
00092   G4int i, index;
00093 
00094   // Starts loop over evaporated particles, loop is limited by number
00095   // of nucleons
00096   for(G4int ia=0; ia<Amax; ++ia) {
00097  
00098     mass = lv.mag();
00099     deltaE = 0.0;
00100     index  = -1;
00101     for(i=0; i<6; ++i) {
00102       G4int Zres = Z - Zfr[i];
00103       G4int Ares = A - Afr[i];
00104       if(Zres >= 0 && Ares >= Zres && Ares > 0) {
00105         G4double m1 = G4NucleiProperties::GetNuclearMass(Ares, Zres);
00106         G4double de = mass - m1 - masses[i];
00107         if(de > deltaE) {
00108           mass1 = m1;
00109           mass2 = masses[i];
00110           deltaE= de;
00111           index = i;
00112         }
00113       }
00114     }
00115 
00116     // no decay channels
00117     if(index < 0) { break; }
00118 
00119     // compute energy of light fragment
00120     G4double e2 = 0.5*((mass - mass1)*(mass + mass1) + mass2*mass2)/mass;
00121     if(e2 < mass2) { break; }
00122 
00123     // sample decay
00124     G4ThreeVector bst  = lv.boostVector();
00125 
00126     G4double cosTheta = 1. - 2. * G4UniformRand(); 
00127     G4double sinTheta = std::sqrt(1. - cosTheta * cosTheta);
00128     G4double phi = twopi * G4UniformRand();
00129     G4double mom = std::sqrt((e2 - mass2)*(e2 + mass2));
00130     G4LorentzVector mom2(mom * sinTheta * std::cos(phi),
00131                          mom * sinTheta * std::sin(phi),
00132                          mom * cosTheta,
00133                          e2);
00134     mom2.boost(bst);  
00135     G4Fragment* fr = new G4Fragment(Afr[index], Zfr[index], mom2);
00136     fr->SetCreationTime(time);
00137     theResult->push_back(fr);
00138 
00139     // residual
00140     lv -= mom2;
00141     Z  -= Zfr[index];
00142     A  -= Afr[index];
00143   }
00144 
00145   // updated fragment
00146   if( theResult->size() > 0) {
00147     nucleus->SetZandA_asInt(Z, A);
00148     nucleus->SetMomentum(lv);
00149   }
00150 
00151   return theResult;
00152 }
00153 
00154 G4FragmentVector* G4UnstableFragmentBreakUp::BreakUp(const G4Fragment&)
00155 {
00156   return 0;
00157 }
00158 
00159 G4double G4UnstableFragmentBreakUp::GetEmissionProbability(G4Fragment*)
00160 {
00161   return 0.0;
00162 }

Generated on Mon May 27 17:50:07 2013 for Geant4 by  doxygen 1.4.7