G4FermiFragmentsPool.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: G4VFermiBreakUp.cc,v 1.5 2006-06-29 20:13:13 gunter Exp $
00027 // GEANT4 tag $Name: not supported by cvs2svn $
00028 //
00029 // Hadronic Process: Nuclear De-excitations
00030 // by V. Lara
00031 //
00032 // Modifications:
00033 // J.M.Quesada,  July 2009, bug fixed in excitation energies: 
00034 // ALL of them are in MeV instead of keV (as they were expressed previously)
00035 // source:  http://www.nndc.bnl.gov/chart
00036 // Unknown excitation energies in He5  and Li5 have been suppressed
00037 // Long lived levels (half-lives of the order ps-fs have been included)   
00038 //
00039 // J. M. Quesada,  April 2010: excitation energies according to tabulated values 
00040 // in PhotonEvaporatoion2.0. Fake photons eliminated. 
00041 //
00042 // 01.04.2011 General cleanup by V.Ivanchenko - more clean usage of static
00043 //
00044 // 04.05.2011 J. M. Quesada: added detailed printout for testing
00045 
00046 #include "G4FermiFragmentsPool.hh"
00047 #include "G4PhysicalConstants.hh"
00048 #include "G4SystemOfUnits.hh"
00049 #include "G4StableFermiFragment.hh"
00050 #include "G4B9FermiFragment.hh"
00051 #include "G4Be8FermiFragment.hh"
00052 #include "G4He5FermiFragment.hh"
00053 #include "G4Li5FermiFragment.hh"
00054 
00055 G4FermiFragmentsPool* G4FermiFragmentsPool::theInstance = 0;
00056  
00057 G4FermiFragmentsPool* G4FermiFragmentsPool::Instance()
00058 {
00059   if(0 == theInstance) {
00060     static G4FermiFragmentsPool pool;
00061     theInstance = &pool;
00062   }
00063   return theInstance;
00064 }
00065 
00066 G4FermiFragmentsPool::G4FermiFragmentsPool()
00067 {
00068   maxZ = 9;
00069   maxA = 17;
00070   verbose = 0;
00071   Initialise();
00072 }
00073 
00074 G4FermiFragmentsPool::~G4FermiFragmentsPool()
00075 {
00076   for(size_t i=0; i<17; ++i) {
00077     size_t nn = list1[i].size();
00078     if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list1[i])[j]; }}
00079     nn = list2[i].size();
00080     if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list2[i])[j]; }}
00081     nn = list3[i].size();
00082     if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list3[i])[j]; }}
00083     nn = list4[i].size();
00084     if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list4[i])[j]; }}
00085   }
00086   size_t nn = listextra.size();
00087   if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete listextra[j]; }}
00088   nn = fragment_pool.size();
00089   if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete fragment_pool[j]; }}
00090 }
00091 
00092 void G4FermiFragmentsPool::Initialise()
00093 {
00094   // JMQ 30/06/09 unknown levels have been supressed
00095   // JMQ 01/07/09 corrected excitation energies for 64-66, according to 
00096   // http://www.nndc.bnl.gov/chart
00097   // JMQ 19/04/10 new level, fragment numbering shifted accordingly from here onwards
00098   //                                                 A  Z  Pol  ExcitE
00099   fragment_pool.push_back(new G4StableFermiFragment(  1, 0,  2,  0.00*MeV )); 
00100   fragment_pool.push_back(new G4StableFermiFragment(  1, 1,  2,  0.00*MeV )); 
00101   fragment_pool.push_back(new G4StableFermiFragment(  2, 1,  3,  0.00*MeV )); 
00102   fragment_pool.push_back(new G4StableFermiFragment(  3, 1,  2,  0.00*MeV )); 
00103   fragment_pool.push_back(new G4StableFermiFragment(  3, 2,  2,  0.00*MeV )); 
00104   fragment_pool.push_back(new G4StableFermiFragment(  4, 2,  1,  0.00*MeV )); 
00105   fragment_pool.push_back(new G4He5FermiFragment   (  5, 2,  4,  0.00*MeV )); 
00106   fragment_pool.push_back(new G4Li5FermiFragment   (  5, 3,  4,  0.00*MeV )); 
00107   fragment_pool.push_back(new G4StableFermiFragment(  6, 2,  1,  0.00*MeV )); 
00108   fragment_pool.push_back(new G4StableFermiFragment(  6, 3,  3,  0.00*MeV )); 
00109   fragment_pool.push_back(new G4StableFermiFragment(  6, 3,  1,  3.562880*MeV )); 
00110   fragment_pool.push_back(new G4StableFermiFragment(  7, 3,  4,  0.00*MeV )); 
00111   fragment_pool.push_back(new G4StableFermiFragment(  7, 3,  2,  0.4776120*MeV )); 
00112   fragment_pool.push_back(new G4StableFermiFragment(  7, 4,  4,  0.00*MeV )); 
00113   fragment_pool.push_back(new G4StableFermiFragment(  7, 4,  2,  0.4290800*MeV )); 
00114   fragment_pool.push_back(new G4StableFermiFragment(  8, 3,  5,  0.00*MeV )); 
00115   fragment_pool.push_back(new G4StableFermiFragment(  8, 3,  3,  0.9808000*MeV )); 
00116   fragment_pool.push_back(new G4Be8FermiFragment   (  8, 4,  1,  0.00*MeV )); 
00117   fragment_pool.push_back(new G4StableFermiFragment(  9, 4,  4,  0.00*MeV )); 
00118   fragment_pool.push_back(new G4B9FermiFragment    (  9, 5,  4,  0.00*MeV )); 
00119   fragment_pool.push_back(new G4StableFermiFragment( 10, 4,  1,  0.00*MeV )); 
00120   fragment_pool.push_back(new G4StableFermiFragment( 10, 4,  5,  3.368030*MeV )); 
00121   fragment_pool.push_back(new G4StableFermiFragment( 10, 4,  8,  5.958390*MeV )); 
00122   fragment_pool.push_back(new G4StableFermiFragment( 10, 4,  1,  6.179300*MeV )); 
00123   fragment_pool.push_back(new G4StableFermiFragment( 10, 4,  5,  6.263300*MeV )); 
00124   fragment_pool.push_back(new G4StableFermiFragment( 10, 5,  7,  0.00*MeV )); 
00125   fragment_pool.push_back(new G4StableFermiFragment( 10, 5,  3,  0.7183500*MeV )); 
00126   fragment_pool.push_back(new G4StableFermiFragment( 10, 5,  1,  1.740150*MeV )); 
00127   fragment_pool.push_back(new G4StableFermiFragment( 10, 5,  3,  2.154300*MeV )); 
00128   fragment_pool.push_back(new G4StableFermiFragment( 10, 5,  5,  3.587100*MeV )); 
00129   fragment_pool.push_back(new G4StableFermiFragment( 10, 6,  3,  0.00*MeV )); 
00130   fragment_pool.push_back(new G4StableFermiFragment( 10, 6,  5,  3.353600*MeV )); 
00131   fragment_pool.push_back(new G4StableFermiFragment( 11, 5,  4,  0.00*MeV )); 
00132   fragment_pool.push_back(new G4StableFermiFragment( 11, 5,  2,  2.124693*MeV )); 
00133   fragment_pool.push_back(new G4StableFermiFragment( 11, 5,  6,  4.444890*MeV )); 
00134   fragment_pool.push_back(new G4StableFermiFragment( 11, 5,  4,  5.020310*MeV )); 
00135   fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 8,  6.742900*MeV )); 
00136   fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 2,  6.791800*MeV )); 
00137   fragment_pool.push_back(new G4StableFermiFragment( 11, 5,  6,  7.285510*MeV )); 
00138   fragment_pool.push_back(new G4StableFermiFragment( 11, 5,  4,  7.977840*MeV )); 
00139   fragment_pool.push_back(new G4StableFermiFragment( 11, 5,  6,  8.560300*MeV )); 
00140   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  4,  0.00*MeV )); 
00141   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  2,  2.00*MeV )); 
00142   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  6,  4.318800*MeV )); 
00143   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  4,  4.804200*MeV )); 
00144   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  2,  6.339200*MeV )); 
00145   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  8,  6.478200*MeV )); 
00146   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  6,  6.904800*MeV )); 
00147   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  4,  7.499700*MeV )); 
00148   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  4,  8.104500*MeV )); 
00149   fragment_pool.push_back(new G4StableFermiFragment( 11, 6,  6,  8.420000*MeV )); 
00150   fragment_pool.push_back(new G4StableFermiFragment( 12, 5,  3,  0.00*MeV )); 
00151   fragment_pool.push_back(new G4StableFermiFragment( 12, 5,  5,  0.9531400*MeV )); 
00152   fragment_pool.push_back(new G4StableFermiFragment( 12, 5,  5,  1.673650*MeV )); 
00153   fragment_pool.push_back(new G4StableFermiFragment( 12, 5,  3,  2.620800*MeV )); 
00154   fragment_pool.push_back(new G4StableFermiFragment( 12, 6,  1,  0.00*MeV )); 
00155   fragment_pool.push_back(new G4StableFermiFragment( 12, 6,  5,  4.438910*MeV )); 
00156   fragment_pool.push_back(new G4StableFermiFragment( 13, 6,  2,  0.00*MeV )); 
00157   fragment_pool.push_back(new G4StableFermiFragment( 13, 6,  2,  3.089443*MeV )); 
00158   fragment_pool.push_back(new G4StableFermiFragment( 13, 6,  4,  3.684507*MeV )); 
00159   fragment_pool.push_back(new G4StableFermiFragment( 13, 6,  6,  3.853807*MeV )); 
00160   fragment_pool.push_back(new G4StableFermiFragment( 13, 7,  2,  0.00*MeV )); 
00161   fragment_pool.push_back(new G4StableFermiFragment( 14, 6,  1,  0.00*MeV )); 
00162   fragment_pool.push_back(new G4StableFermiFragment( 14, 6,  3,  6.093800*MeV )); 
00163   fragment_pool.push_back(new G4StableFermiFragment( 14, 6,  1,  6.589400*MeV )); 
00164   fragment_pool.push_back(new G4StableFermiFragment( 14, 6,  7,  6.728200*MeV )); 
00165   fragment_pool.push_back(new G4StableFermiFragment( 14, 6,  1,  6.902600*MeV )); 
00166   fragment_pool.push_back(new G4StableFermiFragment( 14, 6,  5,  7.012000*MeV )); 
00167   fragment_pool.push_back(new G4StableFermiFragment( 14, 6,  5,  7.341000*MeV )); 
00168   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  3,  0.00*MeV )); 
00169   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  1,  2.312798*MeV )); 
00170   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  3,  3.948100*MeV )); 
00171   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  1,  4.915100*MeV )); 
00172   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  5,  5.105890*MeV )); 
00173   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  3,  5.691440*MeV )); 
00174   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  7,  5.834250*MeV )); 
00175   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  3,  6.203500*MeV )); 
00176   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  7,  6.446170*MeV )); 
00177   fragment_pool.push_back(new G4StableFermiFragment( 14, 7,  5,  7.029120*MeV )); 
00178   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  2,  0.00*MeV )); 
00179   // JMQ 010709 two very close levels instead of only one, with their own spins
00180   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  6,  5.270155*MeV )); 
00181   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  2,  5.298822*MeV )); 
00182   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  4,  6.323780*MeV )); 
00183   //JMQ 010709 new level and corrected energy and spins
00184   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  6,  7.155050*MeV )); 
00185   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  4,  7.300830*MeV )); 
00186   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  8,  7.567100*MeV )); 
00187   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  2,  8.312620*MeV )); 
00188   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  4,  8.571400*MeV )); 
00189   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  2,  9.049710*MeV )); 
00190   //JMQ 010709 new levels for N15
00191   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  4,  9.151900*MeV )); 
00192   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  6,  9.154900*MeV )); 
00193   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  2,  9.222100*MeV )); 
00194   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  6,  9.760000*MeV )); 
00195   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  8,  9.829000*MeV )); 
00196   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  4,  9.925000*MeV )); 
00197   fragment_pool.push_back(new G4StableFermiFragment( 15, 7,  4, 10.06600*MeV )); 
00198   fragment_pool.push_back(new G4StableFermiFragment( 15, 8,  2,  0.00*MeV )); 
00199   //JMQ 010709 new level and spins
00200   fragment_pool.push_back(new G4StableFermiFragment( 15, 8,  2,  5.183000*MeV )); 
00201   fragment_pool.push_back(new G4StableFermiFragment( 15, 8,  6,  5.240900*MeV )); 
00202   fragment_pool.push_back(new G4StableFermiFragment( 15, 8,  4,  6.176300*MeV )); 
00203   fragment_pool.push_back(new G4StableFermiFragment( 15, 8,  4,  6.793100*MeV )); 
00204   fragment_pool.push_back(new G4StableFermiFragment( 15, 8,  6,  6.859400*MeV )); 
00205   fragment_pool.push_back(new G4StableFermiFragment( 15, 8,  8,  7.275900*MeV )); 
00206   fragment_pool.push_back(new G4StableFermiFragment( 16, 7,  5,  0.00*MeV )); 
00207   fragment_pool.push_back(new G4StableFermiFragment( 16, 7,  1,  0.1204200*MeV )); 
00208   fragment_pool.push_back(new G4StableFermiFragment( 16, 7,  7,  0.2982200*MeV )); 
00209   fragment_pool.push_back(new G4StableFermiFragment( 16, 7,  3,  0.3972700*MeV )); 
00210   //JMQ 010709   some energies and spins have been changed 
00211   fragment_pool.push_back(new G4StableFermiFragment( 16, 8,  1,  0.00*MeV )); 
00212   fragment_pool.push_back(new G4StableFermiFragment( 16, 8,  1,  6.049400*MeV )); 
00213   fragment_pool.push_back(new G4StableFermiFragment( 16, 8,  7,  6.129890*MeV )); 
00214   fragment_pool.push_back(new G4StableFermiFragment( 16, 8,  5,  6.917100*MeV )); 
00215   //JMQ 180510 fixed fragment 111
00216   fragment_pool.push_back(new G4StableFermiFragment( 16, 8,  3,  7.116850*MeV )); 
00217 
00218   G4int nfrag = fragment_pool.size();
00219 
00220   // list of fragments ordered by A
00221   for(G4int i=0; i<nfrag; ++i) {
00222     std::vector<const G4VFermiFragment*> newvec;
00223     newvec.push_back(fragment_pool[i]);
00224     G4FermiConfiguration* conf = new G4FermiConfiguration(newvec);
00225     G4int A = fragment_pool[i]->GetA();
00226     list1[A].push_back(conf);
00227   }
00228   if(verbose > 0) { 
00229     G4cout << "### G4FermiFragmentPool: " << nfrag 
00230            << " fragments" << G4endl;
00231     for(G4int A=1; A<maxA; ++A) {
00232       G4cout << "  A= " << A << " : Z= ";
00233       for(size_t j=0; j<list1[A].size(); ++j) { 
00234         G4cout << (list1[A])[j]->GetZ() << "  "; 
00235       }
00236       G4cout << G4endl;
00237     }
00238   }
00239 
00240   // list of fragment pairs ordered by A
00241   G4int counter = 0;
00242   G4int tot = 0;
00243   for(G4int i=0; i<nfrag; ++i) {
00244     G4int Z1 = fragment_pool[i]->GetZ();
00245     G4int A1 = fragment_pool[i]->GetA();
00246     for(G4int j=0; j<nfrag; ++j) {
00247       G4int Z2 = fragment_pool[j]->GetZ();
00248       G4int A2 = fragment_pool[j]->GetA();
00249       G4int Z = Z1 + Z2;
00250       G4int A = A1 + A2;
00251       if(Z < maxZ && A < maxA) {
00252         if(IsAvailable(Z, A)){
00253           std::vector<const G4VFermiFragment*> newvec;
00254           newvec.push_back(fragment_pool[i]);
00255           newvec.push_back(fragment_pool[j]);
00256           if(!IsExist(Z, A, newvec)) { 
00257             G4FermiConfiguration* conf = new G4FermiConfiguration(newvec);
00258             list2[A].push_back(conf); 
00259             ++counter;
00260           }
00261         }
00262       }
00263     }
00264   }
00265   if(verbose > 0) { 
00266     G4cout << G4endl;
00267     G4cout << "### Pairs of fragments: " << counter << G4endl;
00268     for(G4int A=2; A<maxA; ++A) {
00269       G4cout << "  A= " << A<<G4endl; 
00270       for(size_t j=0; j<list2[A].size(); ++j) {
00271         std::vector<const G4VFermiFragment*> vector = (list2[A])[j]->GetFragmentList(); 
00272         G4int a1=vector[0]->GetA();
00273         G4int z1=vector[0]->GetZ();
00274         G4int a2=vector[1]->GetA();
00275         G4int z2=vector[1]->GetZ();
00276         G4cout << "("<<a1<<","<<z1<<")("<<a2<<","<<z2<<") % "; 
00277       }
00278       G4cout<<G4endl;
00279       G4cout<<"---------------------------------------------------------------------------------"
00280             << G4endl;
00281     }
00282   }
00283 
00284   // list of fragment triples ordered by A
00285   tot += counter;
00286   counter = 0;
00287   for(G4int A1=2; A1<maxA; ++A1) {
00288     size_t nz = list2[A1].size();
00289     for(size_t idx=0; idx<nz; ++idx) {
00290       G4FermiConfiguration* conf2 = (list2[A1])[idx];
00291       G4int Z1 = conf2->GetZ();
00292       std::vector<const G4VFermiFragment*> vec2 = conf2->GetFragmentList(); 
00293       //G4int a1 = vec2[0]->GetA();
00294       // G4int z1 = vec2[0]->GetZ();
00295       //G4int a2 = vec2[1]->GetA();
00296       //G4int z2 = vec2[1]->GetZ();
00297       for(G4int j=0; j<nfrag; ++j) {
00298         G4int Z2 = fragment_pool[j]->GetZ();
00299         G4int A2 = fragment_pool[j]->GetA();
00300         G4int Z = Z1 + Z2;
00301         G4int A = A1 + A2;
00302         if(Z < maxZ && A < maxA) {
00303           //if(IsAvailable(Z, A) && IsAvailable(z1+Z2, a1+A2)
00304           //   && IsAvailable(z2+Z2, a2+A2)) {
00305           std::vector<const G4VFermiFragment*>  newvec;
00306           newvec.push_back(vec2[0]);
00307           newvec.push_back(vec2[1]);
00308           newvec.push_back(fragment_pool[j]);
00309           if(!IsExist(Z, A, newvec)) { 
00310             G4FermiConfiguration* conf3 = new G4FermiConfiguration(newvec);
00311             list3[A].push_back(conf3);
00312             ++counter;
00313             //}
00314           }
00315         }
00316       }
00317     }
00318   }
00319   if(verbose > 0) { 
00320     G4cout << G4endl;
00321     G4cout << "### Triples of fragments: " << counter << G4endl;
00322     for(G4int A=3; A<maxA; ++A) {
00323       G4cout << "  A= " << A<<G4endl;
00324       for(size_t j=0; j<list3[A].size(); ++j) { 
00325         std::vector<const G4VFermiFragment*> vector = (list3[A])[j]->GetFragmentList(); 
00326         G4int a1=vector[0]->GetA();
00327         G4int z1=vector[0]->GetZ();
00328         G4int a2=vector[1]->GetA();
00329         G4int z2=vector[1]->GetZ();
00330         G4int a3=vector[2]->GetA();
00331         G4int z3=vector[2]->GetZ();
00332         G4cout << "("<<a1<<","<<z1<<")("<<a2<<","<<z2<<")("<<a3<<","<<z3<<") % "; 
00333       }
00334       G4cout<<G4endl;
00335       G4cout<<"---------------------------------------------------------------------------------"
00336             << G4endl;
00337     }
00338   }
00339 
00340   // list of fragment quartets (3 + 1) ordered by A
00341   tot += counter;
00342   counter = 0;
00343   for(G4int A1=3; A1<maxA; ++A1) {
00344     size_t nz = list3[A1].size();
00345     for(size_t idx=0; idx<nz; ++idx) {
00346       G4FermiConfiguration* conf3 = (list3[A1])[idx];
00347       G4int Z1 = conf3->GetZ();
00348       std::vector<const G4VFermiFragment*> vec3 = conf3->GetFragmentList(); 
00349       //G4int a1 = vec3[0]->GetA();
00350       //G4int z1 = vec3[0]->GetZ();
00351       //G4int a2 = vec3[1]->GetA();
00352       //G4int z2 = vec3[1]->GetZ();
00353       //G4int a3 = vec3[2]->GetA();
00354       //G4int z3 = vec3[2]->GetZ();
00355       for(G4int j=0; j<nfrag; ++j) {
00356         G4int Z2 = fragment_pool[j]->GetZ();
00357         G4int A2 = fragment_pool[j]->GetA();
00358         G4int Z = Z1 + Z2;
00359         G4int A = A1 + A2;
00360         if(Z < maxZ && A < maxA) {
00361           //if(IsAvailable(Z, A) && IsAvailable(z1+Z2, a1+A2)
00362           //   && IsAvailable(z2+Z2, a2+A2) && IsAvailable(z3+Z2, a3+A2)) {
00363           std::vector<const G4VFermiFragment*>  newvec;
00364           newvec.push_back(vec3[0]);
00365           newvec.push_back(vec3[1]);
00366           newvec.push_back(vec3[2]);
00367           newvec.push_back(fragment_pool[j]);
00368           if(!IsExist(Z, A, newvec)) { 
00369             G4FermiConfiguration* conf4 = new G4FermiConfiguration(newvec);
00370             list4[A].push_back(conf4);
00371             ++counter;
00372           }
00373           //}
00374         }
00375       }
00376     }
00377   }
00378   // list of fragment quartets (2 + 2) ordered by A
00379   for(G4int A1=2; A1<maxA; ++A1) {
00380     size_t nz1 = list2[A1].size();
00381     for(size_t id1=0; id1<nz1; ++id1) {
00382       G4FermiConfiguration* conf1 = (list2[A1])[id1];
00383       G4int Z1 = conf1->GetZ();
00384       std::vector<const G4VFermiFragment*> vec1 = conf1->GetFragmentList(); 
00385       //G4int a1 = vec1[0]->GetA();
00386       //G4int z1 = vec1[0]->GetZ();
00387       //G4int a2 = vec1[1]->GetA();
00388       //G4int z2 = vec1[1]->GetZ();
00389       for(G4int A2=2; A2<maxA; ++A2) {
00390         size_t nz2 = list2[A2].size();
00391         for(size_t id2=0; id2<nz2; ++id2) {
00392           G4FermiConfiguration* conf2 = (list2[A2])[id2];
00393           G4int Z2 = conf2->GetZ();
00394           std::vector<const G4VFermiFragment*> vec2 = conf2->GetFragmentList(); 
00395           //G4int a3 = vec2[0]->GetA();
00396           //G4int z3 = vec2[0]->GetZ();
00397           //G4int a4 = vec2[1]->GetA();
00398           //G4int z4 = vec2[1]->GetZ();
00399           G4int Z = Z1 + Z2;
00400           G4int A = A1 + A2;
00401           if(Z < maxZ && A < maxA) {
00402             //if(IsAvailable(Z, A) && IsAvailable(z1+z3, a1+a3)
00403             //   && IsAvailable(z1+z4, a1+a4) && IsAvailable(z2+z3, a2+a3) 
00404             //   && IsAvailable(z2+z4, a2+a4) && IsAvailable(Z-z1, A-a1)
00405             //   && IsAvailable(Z-z2, A-a2) && IsAvailable(Z-z3, A-a3)) {
00406             std::vector<const G4VFermiFragment*>  newvec;
00407             newvec.push_back(vec1[0]);
00408             newvec.push_back(vec1[1]);
00409             newvec.push_back(vec2[0]);
00410             newvec.push_back(vec2[1]);
00411             if(!IsExist(Z, A, newvec)) { 
00412               G4FermiConfiguration* conf4 = new G4FermiConfiguration(newvec);
00413               list4[A].push_back(conf4);
00414               ++counter;
00415             }
00416             //}
00417           }
00418         }
00419       }
00420     }
00421   }
00422   if(verbose > 0) { 
00423     tot += counter;
00424     G4cout << G4endl;
00425     G4cout << "### Quartets of fragments: " << counter << G4endl;
00426     for(G4int A=4; A<maxA; ++A) {
00427       G4cout << "  A= " << A<<G4endl;
00428       for(size_t j=0; j<list4[A].size(); ++j) { 
00429         std::vector<const G4VFermiFragment*> vector = (list4[A])[j]->GetFragmentList(); 
00430         G4int a1=vector[0]->GetA();
00431         G4int z1=vector[0]->GetZ();
00432         G4int a2=vector[1]->GetA();
00433         G4int z2=vector[1]->GetZ();
00434         G4int a3=vector[2]->GetA();
00435         G4int z3=vector[2]->GetZ();
00436         G4int a4=vector[3]->GetA();
00437         G4int z4=vector[3]->GetZ();
00438 
00439         G4cout << "("<<a1<<","<<z1<<")("<<a2<<","<<z2<<")("<<a3<<","<<z3<<")("<<a4<<","<<z4<<") % "; 
00440       }
00441       G4cout<<G4endl;
00442       G4cout<<"---------------------------------------------------------------------------------"
00443             << G4endl;
00444     }
00445     G4cout << "Total number: " << tot << G4endl;
00446   }
00447 }
00448 
00449 const std::vector<G4FermiConfiguration*>* 
00450 G4FermiFragmentsPool::GetConfigurationList(G4int Z, G4int A, G4double mass)
00451 {
00452   //JMQ 040511 for printing the total number of configurations for a given A
00453   G4int nconf=0;
00454 
00455   std::vector<G4FermiConfiguration*>* v = new std::vector<G4FermiConfiguration*>;
00456   if(Z >= maxZ || A >= maxA) { return v; }
00457 
00458   //G4cout << "G4FermiFragmentsPool::GetConfigurationList:"
00459   // << " Z= " << Z << " A= " << A << " Mass(GeV)= " << mass/GeV<< G4endl;
00460 
00461   // look into pair list
00462   size_t nz = list2[A].size();
00463   if(0 < nz) {
00464     for(size_t j=0; j<nz; ++j) {
00465       G4FermiConfiguration* conf = (list2[A])[j];
00466       if(Z == conf->GetZ() && mass >= conf->GetMass()) { 
00467         v->push_back(conf); 
00468          ++nconf;
00469       }
00470       //if(Z == conf->GetZ()) { 
00471       //G4cout << "Pair dM(MeV)= " << mass - conf->GetMass() << G4endl; }
00472     }
00473   }
00474   // look into triple list
00475   nz = list3[A].size();
00476   if(0 < nz) {
00477     for(size_t j=0; j<nz; ++j) {
00478       G4FermiConfiguration* conf = (list3[A])[j];
00479       if(Z == conf->GetZ() && mass >= conf->GetMass()) { 
00480         v->push_back(conf); 
00481         ++nconf;
00482       }
00483       //if(Z == conf->GetZ()) { 
00484       //G4cout << "Triple dM(MeV)= " << mass - conf->GetMass() << G4endl; }
00485     }
00486   }
00487   // look into quartet list
00488   nz = list4[A].size();
00489   if(0 < nz) {
00490     for(size_t j=0; j<nz; ++j) {
00491       G4FermiConfiguration* conf = (list4[A])[j];
00492       if(Z == conf->GetZ() && mass >= conf->GetMass()) { 
00493         v->push_back(conf);
00494         ++nconf; 
00495       }
00496       //if(Z == conf->GetZ()) { 
00497       //  G4cout << "Quartet dM(MeV)= " << mass - conf->GetMass() << G4endl; }
00498     }
00499   }
00500   // return if vector not empty
00501   if(0 < v->size()) { 
00502     if(verbose > 0) { 
00503       G4double ExEn= mass - G4NucleiProperties::GetNuclearMass(A,Z);
00504       G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00505             <<A<<"   Z= "<<Z<<"   E*= "<< ExEn<<" MeV"<<G4endl;
00506       size_t size_vector_conf = v->size();
00507       for(size_t jc=0; jc<size_vector_conf; ++jc) {     
00508         std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00509         size_t size_vector_fragments = v_frag.size();
00510         G4cout<<size_vector_fragments<<"-body configuration "<<jc+1<<": ";
00511         for(size_t jf=0;jf<size_vector_fragments;++jf){
00512           G4int af= v_frag[jf]->GetA();
00513           G4int zf= v_frag[jf]->GetZ();
00514           G4double ex=v_frag[jf]->GetExcitationEnergy();
00515           G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<")  ";
00516         }
00517         G4cout<<G4endl;
00518         G4cout<<"-----------------------------------------------------"<<G4endl;    
00519       }
00520     }
00521     return v; 
00522   }
00523 
00524   // search in the pool and if found then return vector with one element
00525   nz = list1[A].size();
00526   G4FermiConfiguration* conf1 = 0; 
00527   if(0 < nz) {
00528     for(size_t j=0; j<nz; ++j) {
00529       G4FermiConfiguration* conf = (list1[A])[j];
00530       //if(Z == conf->GetZ()) { 
00531       //  G4cout << "Single dM(MeV)= " << mass - conf->GetMass() << G4endl; }
00532 
00533       if(Z == conf->GetZ() && mass >= conf->GetMass()) {
00534         if(!(conf->GetFragmentList())[0]->IsStable()) {
00535           ++nconf;
00536           v->push_back(conf);
00537           if(verbose > 0) { 
00538             G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00539             G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00540                   <<A<<"   Z= "<<Z<<"   E*= "<< ExEn<<" MeV"<<G4endl;
00541             size_t size_vector_conf=v->size();
00542             for(size_t jc=0; jc<size_vector_conf; ++jc) {     
00543               std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00544               size_t size_vector_fragments=v_frag.size();
00545               G4cout<<"1 Fragment configuration "<<jc+1<<": ";
00546               for(size_t jf=0;jf<size_vector_fragments;++jf){
00547                 G4int af= v_frag[jf]->GetA();
00548                 G4int zf= v_frag[jf]->GetZ();
00549                 G4double ex=v_frag[jf]->GetExcitationEnergy();
00550                 G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<")  ";
00551               }
00552               G4cout<<G4endl;
00553               G4cout<<"-----------------------------------------------------"<<G4endl;    
00554             }
00555           }
00556           return v;
00557         } else {
00558           conf1 = conf;
00559           break;
00560         }
00561       }
00562     }
00563   }
00564     
00565   // search in the list of exotic configurations
00566   nz = listextra.size();
00567   if(0 < nz) {
00568     for(size_t j=0; j<nz; ++j) {
00569       G4FermiConfiguration* conf = listextra[j];
00570       if(Z == conf->GetZ() && A == conf->GetA() && 
00571          mass >= conf->GetMass()) { 
00572         ++nconf;
00573         v->push_back(conf); 
00574         if(verbose > 0) { 
00575           G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00576           G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00577                 <<A<<"   Z= "<<Z<<"   E*= "<< ExEn<<" MeV"<<G4endl;
00578           size_t size_vector_conf=v->size();
00579           for(size_t jc=0; jc<size_vector_conf; ++jc) {     
00580             std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00581             size_t size_vector_fragments=v_frag.size();
00582             G4cout<<"Found exotic configuration -> configuration "<<jc+1<<": ";
00583             for(size_t jf=0;jf<size_vector_fragments;++jf){
00584               G4int af= v_frag[jf]->GetA();
00585               G4int zf= v_frag[jf]->GetZ();
00586               G4double ex=v_frag[jf]->GetExcitationEnergy();
00587               G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<")  ";
00588             }
00589             G4cout<<G4endl;
00590             G4cout<<"-----------------------------------------------------"<<G4endl;    
00591           }
00592         }
00593         return v;
00594       }
00595     }
00596   }
00597   //G4cout << "Explore dM(MeV)= " 
00598   //     << mass - Z*proton_mass_c2 - (A-Z)*neutron_mass_c2 << G4endl; 
00599 
00600   // add new exotic configuration
00601   if(mass > Z*proton_mass_c2 + (A-Z)*neutron_mass_c2) {
00602     std::vector<const G4VFermiFragment*>  newvec;
00603     G4int idx = 1;
00604     for(G4int i=0; i<A; ++i) {
00605       if(i == Z) { idx = 0; }
00606       newvec.push_back(fragment_pool[idx]);
00607     }
00608     G4FermiConfiguration* conf = new G4FermiConfiguration(newvec);
00609     listextra.push_back(conf);
00610     v->push_back(conf);
00611     ++nconf;
00612     if(verbose > 0) { 
00613       G4cout<<"Total number of configurations = "<<nconf<<G4cout;
00614       G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00615       G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00616             <<A<<"   Z= "<<Z<<"   E*= "<< ExEn<<" MeV"<<G4endl;
00617       size_t size_vector_conf=v->size();
00618       for(size_t jc=0; jc<size_vector_conf; ++jc) {     
00619         std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00620         size_t size_vector_fragments=v_frag.size();
00621         G4cout<<"New exotic configuration -> configuration "<<jc+1<<": ";
00622         for(size_t jf=0;jf<size_vector_fragments;++jf){
00623           G4int af= v_frag[jf]->GetA();
00624           G4int zf= v_frag[jf]->GetZ();
00625           G4double ex=v_frag[jf]->GetExcitationEnergy();
00626           G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<")  ";
00627         }
00628         G4cout<<G4endl;
00629         G4cout<<"-----------------------------------------------------"<<G4endl;    
00630       }
00631     }
00632     return v;
00633   }
00634 
00635   // only photon evaporation is possible
00636   if(conf1) {
00637     v->push_back(conf1); 
00638     ++nconf;
00639     if(verbose > 0) { 
00640       G4cout<<"Total number of configurations = "<<nconf<<G4endl;
00641       G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00642       G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00643             <<A<<"   Z= "<<Z<<"   E*= "<< ExEn<<" MeV"<<G4endl;
00644       size_t size_vector_conf=v->size();
00645       for(size_t jc=0; jc<size_vector_conf; ++jc) {     
00646         std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00647         size_t size_vector_fragments=v_frag.size();
00648         G4cout<<"Only evaporation is possible -> configuration  "<<jc+1<<": ";
00649         for(size_t jf=0;jf<size_vector_fragments;++jf){
00650           G4int af= v_frag[jf]->GetA();
00651           G4int zf= v_frag[jf]->GetZ();
00652           G4double ex=v_frag[jf]->GetExcitationEnergy();
00653           G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<")  ";
00654         }
00655         G4cout<<G4endl;
00656         G4cout<<"-----------------------------------------------------"<<G4endl;    
00657       }
00658     }
00659     return v;   
00660   }
00661 
00662   //failer
00663   if(verbose > 0) { 
00664     G4cout << "G4FermiFragmentsPool::GetConfigurationList: WARNING: not "
00665            << "able decay fragment Z= " << Z << " A= " << A
00666            << " Mass(GeV)= " << mass/GeV<< G4endl;
00667   }
00668   return v;
00669 }
00670 
00671 G4bool 
00672 G4FermiFragmentsPool::IsExist(G4int Z, G4int A, 
00673                               std::vector<const G4VFermiFragment*>& newconf)
00674 {
00675   size_t nn = newconf.size();
00676   G4double mass = 0.0;
00677   for(size_t i=0; i<nn; ++i) { mass +=  newconf[i]->GetTotalEnergy(); }
00678   // look into pair list
00679   if(2 == nn) {
00680     size_t nz = list2[A].size();
00681     if(0 < nz) {
00682       for(size_t j=0; j<nz; ++j) {
00683         G4FermiConfiguration* conf = (list2[A])[j];
00684         if(Z == conf->GetZ() && A == conf->GetA() && 
00685            std::fabs(mass - conf->GetMass()) < keV) {return true; }
00686       }
00687     }
00688     return false;
00689   }
00690   // look into triple list
00691   if(3 == nn) {
00692     size_t nz = list3[A].size();
00693     if(0 < nz) {
00694       for(size_t j=0; j<nz; ++j) {
00695         G4FermiConfiguration* conf = (list3[A])[j];
00696         if(Z == conf->GetZ() && A == conf->GetA() && 
00697            std::fabs(mass - conf->GetMass()) < keV) { return true; }
00698       }
00699     }
00700     return false;
00701   }
00702   // look into quartet list
00703   if(4 == nn) {
00704     size_t nz = list4[A].size();
00705     if(0 < nz) {
00706       for(size_t j=0; j<nz; ++j) {
00707         G4FermiConfiguration* conf = (list4[A])[j];
00708         if(Z == conf->GetZ() && A == conf->GetA() && 
00709            std::fabs(mass - conf->GetMass()) < keV) { return true; }
00710       }
00711     }
00712     return false;
00713   }
00714   return false;
00715 }
00716 
00717 const G4VFermiFragment* 
00718 G4FermiFragmentsPool::GetFragment(G4int Z, G4int A)
00719 {
00720   const G4VFermiFragment* f = 0;
00721   if(Z >= maxZ || A >= maxA) { return f; }
00722   size_t nz = list1[A].size();
00723   if(0 < nz) {
00724     for(size_t j=0; j<nz; ++j) {
00725       G4FermiConfiguration* conf = (list1[A])[j];
00726       if(Z == conf->GetZ()) { return (conf->GetFragmentList())[0]; }
00727     }
00728   }
00729   return f;
00730 }

Generated on Mon May 27 17:48:16 2013 for Geant4 by  doxygen 1.4.7