G4ExcitedNucleonConstructor.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 //
00027 // $Id$
00028 //
00029 // 
00030 // --------------------------------------------------------------
00031 //      GEANT 4 class implementation file 
00032 //      History: first implementation, based on object model of
00033 //      10 oct 1998  H.Kurashige
00034 // ---------------------------------------------------------------
00035 
00036 
00037 #include "G4ExcitedNucleonConstructor.hh"
00038 
00039 #include "G4SystemOfUnits.hh"
00040 #include "G4ParticleDefinition.hh"
00041 #include "G4ParticleTable.hh"
00042 #include "G4ShortLivedTable.hh"
00043 #include "G4PhaseSpaceDecayChannel.hh"
00044 #include "G4VDecayChannel.hh"
00045 #include "G4DecayTable.hh"
00046 
00047 
00048 G4ExcitedNucleonConstructor::G4ExcitedNucleonConstructor():
00049     G4ExcitedBaryonConstructor(NStates, NucleonIsoSpin)
00050 {
00051 
00052 }
00053 
00054 G4ExcitedNucleonConstructor::~G4ExcitedNucleonConstructor()
00055 {
00056 }
00057 
00058 G4int G4ExcitedNucleonConstructor::GetEncoding(G4int iIsoSpin3, G4int idxState)
00059 {
00060   G4int encoding;
00061   // Delta has exceptinal encoding
00062   if ((idxState==1)||(idxState==6)||(idxState==8)||(idxState==9)||(idxState==12) )  {
00063     encoding = GetEncodingOffset(idxState);
00064     if ((iIsoSpin3==3)||(iIsoSpin3==-3)) {
00065       // normal encoding 
00066       encoding += 1000*GetQuarkContents(0, iIsoSpin3);
00067       encoding +=  100*GetQuarkContents(1, iIsoSpin3);
00068       encoding +=   10*GetQuarkContents(2, iIsoSpin3);
00069     } else if (iIsoSpin3== +1){
00070       // 1st <--> 2nd quark 
00071       encoding += 1000*GetQuarkContents(0, iIsoSpin3);
00072       encoding +=   10*GetQuarkContents(1, iIsoSpin3);
00073       encoding +=  100*GetQuarkContents(2, iIsoSpin3);
00074     } else if (iIsoSpin3== -1){
00075       // 1st <--> 0th quark 
00076       encoding +=  100*GetQuarkContents(0, iIsoSpin3);
00077       encoding += 1000*GetQuarkContents(1, iIsoSpin3);
00078       encoding +=   10*GetQuarkContents(2, iIsoSpin3);
00079     }
00080     encoding += GetiSpin(idxState) +1;
00081   } else {
00082     encoding = G4ExcitedBaryonConstructor::GetEncoding(iIsoSpin3, idxState);
00083   }
00084   return encoding;
00085 }
00086 
00087 G4DecayTable* G4ExcitedNucleonConstructor::CreateDecayTable(
00088                                                  const G4String&  parentName,  
00089                                                  G4int iIso3, 
00090                                                  G4int iState,
00091                                                  G4bool fAnti)
00092 {
00093   // create decay table
00094   G4DecayTable* decayTable =  new G4DecayTable();
00095 
00096   G4double br;
00097   if ( (br=bRatio[iState][NGamma]) >0.0) {
00098     AddNGammaMode( decayTable, parentName, br, iIso3, fAnti);
00099   }
00100 
00101   if ( (br=bRatio[iState][NPi]) >0.0) {
00102     AddNPiMode( decayTable, parentName, br, iIso3, fAnti);
00103   }
00104 
00105   if ( (br=bRatio[iState][NEta]) >0.0) {
00106     AddNEtaMode( decayTable, parentName, br, iIso3, fAnti);
00107   }
00108 
00109   if ( (br=bRatio[iState][NOmega]) >0.0) {
00110     AddNOmegaMode( decayTable, parentName, br, iIso3, fAnti);
00111   }
00112 
00113   if ( (br=bRatio[iState][NRho]) >0.0) {
00114     AddNRhoMode( decayTable, parentName, br, iIso3, fAnti);
00115   }
00116 
00117   if ( (br=bRatio[iState][N2Pi]) >0.0) {
00118     AddN2PiMode( decayTable, parentName, br, iIso3, fAnti);
00119   }
00120 
00121   if ( (br=bRatio[iState][DeltaPi]) >0.0) {
00122     AddDeltaPiMode( decayTable, parentName, br, iIso3, fAnti);
00123   }
00124 
00125   if ( (br=bRatio[iState][NStarPi]) >0.0) {
00126     AddNStarPiMode( decayTable, parentName, br, iIso3, fAnti);
00127   }
00128 
00129   if ( (br=bRatio[iState][LambdaK]) >0.0) {
00130     AddLambdaKMode( decayTable, parentName, br, iIso3, fAnti);
00131   }
00132 
00133   return  decayTable;
00134 }
00135 
00136 G4DecayTable*  G4ExcitedNucleonConstructor::AddNGammaMode( 
00137                                    G4DecayTable* decayTable, const G4String& nameParent,
00138                                     G4double br, G4int iIso3, G4bool fAnti)
00139 {
00140   G4VDecayChannel* mode;
00141 
00142   // 
00143   G4String daughterN;
00144   if (iIso3 == +1) { 
00145     daughterN = "proton";  
00146   } else {
00147     daughterN = "neutron"; 
00148   } 
00149   if (fAnti) daughterN = "anti_" + daughterN;
00150 
00151   // create decay channel  [parent    BR     #daughters]
00152   mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00153                                            daughterN,"gamma");
00154   // add decay table
00155   decayTable->Insert(mode);
00156 
00157   return decayTable;
00158 }
00159 
00160 G4DecayTable*  G4ExcitedNucleonConstructor::AddNPiMode( 
00161                                     G4DecayTable* decayTable, const G4String& nameParent,
00162                                     G4double br, G4int iIso3, G4bool fAnti)
00163 {
00164   G4VDecayChannel* mode;
00165 
00166   G4String daughterN;
00167   G4String daughterPi;
00168 
00169   // ------------ N pi0 ------------ 
00170   // determine daughters
00171   if (iIso3 == +1) {
00172     daughterN  = "proton";
00173     daughterPi = "pi0";
00174   } else {
00175     daughterN  = "neutron";
00176     daughterPi = "pi0";
00177   }
00178   if (fAnti) daughterN = "anti_" + daughterN;
00179   // create decay channel  [parent    BR     #daughters]
00180   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00181                                            daughterN,daughterPi);
00182   // add decay table
00183   decayTable->Insert(mode);
00184 
00185   // -------------N pi +/- -------------- 
00186   // determine daughters
00187   if (iIso3 == +1) {
00188     daughterN  = "neutron";
00189     if (!fAnti) {
00190       daughterPi = "pi+";
00191     } else {
00192       daughterPi = "pi-";
00193     }
00194   } else {
00195     daughterN  = "proton";
00196     if (!fAnti) {
00197       daughterPi = "pi-";
00198     } else {
00199       daughterPi = "pi+";
00200     }
00201   }
00202   if (fAnti) daughterN = "anti_" + daughterN;
00203 
00204   // create decay channel  [parent    BR     #daughters]
00205   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00206                                            daughterN,daughterPi);
00207   // add decay table
00208   decayTable->Insert(mode);
00209 
00210   return decayTable;
00211 }
00212 
00213 G4DecayTable*  G4ExcitedNucleonConstructor::AddNEtaMode( 
00214                                     G4DecayTable* decayTable, const G4String& nameParent,
00215                                     G4double br, G4int iIso3, G4bool fAnti)
00216 {
00217   G4VDecayChannel* mode;
00218 
00219   G4String daughterN;
00220 
00221   // ------------ N eta------------ 
00222   // determine daughters
00223   if (iIso3 == +1) {
00224     daughterN  = "proton";
00225   } else {
00226     daughterN  = "neutron";
00227   }
00228   if (fAnti) daughterN = "anti_" + daughterN;
00229   // create decay channel  [parent    BR     #daughters]
00230   mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00231                                            daughterN, "eta");
00232   // add decay table
00233   decayTable->Insert(mode);
00234 
00235   return decayTable;
00236 }
00237 
00238 G4DecayTable*  G4ExcitedNucleonConstructor::AddNOmegaMode( 
00239                                     G4DecayTable* decayTable, const G4String& nameParent,
00240                                     G4double br, G4int iIso3, G4bool fAnti)
00241 {
00242   G4VDecayChannel* mode;
00243 
00244   G4String daughterN;
00245 
00246   // ------------ N omega------------ 
00247   // determine daughters
00248   if (iIso3 == +1) {
00249     daughterN  = "proton";
00250   } else {
00251     daughterN  = "neutron";
00252   }
00253   if (fAnti) daughterN = "anti_" + daughterN;
00254   // create decay channel  [parent    BR     #daughters]
00255   mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00256                                            daughterN, "omega");
00257   // add decay table
00258   decayTable->Insert(mode);
00259 
00260   return decayTable;
00261 }
00262 
00263 G4DecayTable*  G4ExcitedNucleonConstructor::AddNRhoMode( 
00264                                     G4DecayTable* decayTable, const G4String& nameParent,
00265                                     G4double br, G4int iIso3, G4bool fAnti)
00266 {
00267   G4VDecayChannel* mode;
00268 
00269   G4String daughterN;
00270   G4String daughterRho;
00271 
00272   // ------------ N rho0 ------------ 
00273   // determine daughters
00274   if (iIso3 == +1) {
00275     daughterN  = "proton";
00276     daughterRho = "rho0";
00277   } else {
00278     daughterN  = "neutron";
00279     daughterRho = "rho0";
00280   }
00281   if (fAnti) daughterN = "anti_" + daughterN;
00282   // create decay channel  [parent    BR     #daughters]
00283   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00284                                            daughterN,daughterRho);
00285   // add decay table
00286   decayTable->Insert(mode);
00287 
00288   // -------------N rho+/- -------------- 
00289   // determine daughters
00290   if (iIso3 == +1) {
00291     daughterN  = "neutron";
00292     if (!fAnti) {
00293       daughterRho = "rho+";
00294     } else {
00295       daughterRho = "rho-";
00296     }
00297   } else {
00298     daughterN  = "proton";
00299     if (!fAnti) {
00300       daughterRho = "rho-";
00301     } else {
00302       daughterRho = "rho+";
00303     }
00304   }
00305   if (fAnti) daughterN = "anti_" + daughterN;
00306 
00307   // create decay channel  [parent    BR     #daughters]
00308   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00309                                            daughterN,daughterRho);
00310   // add decay table
00311   decayTable->Insert(mode);
00312 
00313   return decayTable;
00314 }
00315 
00316 G4DecayTable*  G4ExcitedNucleonConstructor::AddN2PiMode( 
00317                                     G4DecayTable* decayTable, const G4String& nameParent,
00318                                     G4double br, G4int iIso3, G4bool fAnti)
00319 {
00320   // Decay Modes
00321   //   N* --> N + pi + pi
00322   //     Only I=0 states are included for 2-pi system 
00323   
00324   G4VDecayChannel* mode;
00325 
00326   G4String daughterN;
00327   G4String daughterPi1;
00328   G4String daughterPi2;
00329 
00330   // -------------N pi+ pi- -------------- 
00331   // determine daughters
00332   if (iIso3 == +1) {
00333     daughterN  = "proton";
00334     daughterPi1 = "pi+";
00335     daughterPi2 = "pi-";
00336   } else {
00337     daughterN  = "neutron";
00338     daughterPi1 = "pi+";
00339     daughterPi2 = "pi-";
00340   }
00341   if (fAnti) daughterN = "anti_" + daughterN;
00342 
00343   // create decay channel  [parent    BR     #daughters]
00344   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 3,
00345                                            daughterN,daughterPi1,daughterPi2);
00346   // add decay table
00347   decayTable->Insert(mode);
00348 
00349   // -------------N pi0 pi0 --------------  
00350   // determine daughters
00351   if (iIso3 == +1) {
00352     daughterN  = "proton";
00353     daughterPi1 = "pi0";
00354     daughterPi2 = "pi0";
00355   } else {
00356     daughterN  = "neutron";
00357     daughterPi1 = "pi0";
00358     daughterPi2 = "pi0";
00359   }
00360   if (fAnti) daughterN = "anti_" + daughterN;
00361 
00362   // create decay channel  [parent    BR     #daughters]
00363   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 3,
00364                                            daughterN,daughterPi1,daughterPi2);
00365   // add decay table
00366   decayTable->Insert(mode);
00367 
00368   return decayTable;
00369 }
00370 
00371 G4DecayTable*  G4ExcitedNucleonConstructor::AddNStarPiMode( 
00372                                     G4DecayTable* decayTable, const G4String& nameParent,
00373                                     G4double br, G4int iIso3, G4bool fAnti)
00374 {
00375   G4VDecayChannel* mode;
00376 
00377   G4String daughterN;
00378   G4String daughterPi;
00379 
00380   // ------------ N pi0 ------------ 
00381   // determine daughters
00382   if (iIso3 == +1) {
00383     daughterN  = "N(1440)+";
00384     daughterPi = "pi0";
00385   } else {
00386     daughterN  = "N(1440)0";
00387     daughterPi = "pi0";
00388   }
00389   if (fAnti) daughterN = "anti_" + daughterN;
00390   // create decay channel  [parent    BR     #daughters]
00391   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00392                                            daughterN,daughterPi);
00393   // add decay table
00394   decayTable->Insert(mode);
00395 
00396   // -------------N pi +/- -------------- 
00397   // determine daughters
00398   if (iIso3 == +1) {
00399     daughterN  = "N(1440)0";
00400     if (!fAnti) {
00401       daughterPi = "pi+";
00402     } else {
00403       daughterPi = "pi-";
00404     }
00405   } else {
00406     daughterN  = "N(1440)+";
00407     if (!fAnti) {
00408       daughterPi = "pi-";
00409     } else {
00410       daughterPi = "pi+";
00411     }
00412   }
00413   if (fAnti) daughterN = "anti_" + daughterN;
00414 
00415   // create decay channel  [parent    BR     #daughters]
00416   mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00417                                            daughterN,daughterPi);
00418   // add decay table
00419   decayTable->Insert(mode);
00420 
00421   return decayTable;
00422 }
00423 
00424 G4DecayTable*  G4ExcitedNucleonConstructor::AddDeltaPiMode( 
00425                                     G4DecayTable* decayTable, const G4String& nameParent,
00426                                     G4double br, G4int iIso3, G4bool fAnti)
00427 {
00428   G4VDecayChannel* mode;
00429 
00430   G4String daughterDelta;
00431   G4String daughterPi;
00432   G4double r;
00433 
00434   // ------------ Delta pi+/- ------------ 
00435   // determine daughters
00436   if (iIso3 == +1) {
00437     daughterDelta  = "delta0";
00438     if (!fAnti) {
00439       daughterPi = "pi+";
00440     } else {
00441       daughterPi = "pi-";
00442     }
00443     r = br/6.0;
00444   } else {
00445     daughterDelta  = "delta+";
00446     if (!fAnti) {
00447       daughterPi = "pi-";
00448     } else {
00449       daughterPi = "pi+";
00450     }
00451     r = br/6.0;
00452   }
00453   if (fAnti) daughterDelta = "anti_" + daughterDelta;
00454   // create decay channel  [parent    BR     #daughters]
00455   mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2,
00456                                            daughterDelta,daughterPi);
00457   // add decay table
00458   decayTable->Insert(mode);
00459 
00460   // ------------ Delta pi+/- ------------ 
00461   // determine daughters
00462   if (iIso3 == +1) {
00463     daughterDelta  = "delta++";
00464     if (!fAnti) {
00465       daughterPi = "pi-";
00466     } else {
00467       daughterPi = "pi+";
00468     }
00469     r = br/2.0;
00470   } else {
00471     daughterDelta  = "delta-";
00472     if (!fAnti) {
00473       daughterPi = "pi+";
00474     } else {
00475       daughterPi = "pi-";
00476     }
00477     r = br/2.0;
00478   }
00479   if (fAnti) daughterDelta = "anti_" + daughterDelta;
00480   // create decay channel  [parent    BR     #daughters]
00481   mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2,
00482                                            daughterDelta,daughterPi);
00483   // add decay table
00484   decayTable->Insert(mode);
00485 
00486   // ------------ Delta pi0 ------------ 
00487   // determine daughters
00488   if (iIso3 == +1) {
00489     daughterDelta  = "delta+";
00490     daughterPi = "pi0";
00491     r = br/3.0;
00492   } else {
00493     daughterDelta  = "delta0";
00494     daughterPi = "pi0";
00495     r = br/3.0;
00496   }
00497   if (fAnti) daughterDelta = "anti_" + daughterDelta;
00498   // create decay channel  [parent    BR     #daughters]
00499   mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2,
00500                                            daughterDelta,daughterPi);
00501   // add decay table
00502   decayTable->Insert(mode);
00503 
00504 
00505   return decayTable;
00506 }
00507 
00508 G4DecayTable*  G4ExcitedNucleonConstructor::AddLambdaKMode( 
00509                                     G4DecayTable* decayTable, const G4String& nameParent,
00510                                     G4double br, G4int iIso3, G4bool fAnti)
00511 {
00512   G4VDecayChannel* mode;
00513 
00514   G4String lambda = "lambda";
00515   G4String daughterK;
00516 
00517   // ------------ N pi0 ------------ 
00518   // determine daughters
00519   if (iIso3 == +1) {
00520     if (!fAnti) {
00521       daughterK = "kaon+";
00522     } else {
00523       daughterK = "kaon-";
00524     }
00525   } else {
00526     if (!fAnti) {
00527       daughterK = "kaon0";
00528     } else {
00529       daughterK = "anti_kaon0";
00530     }
00531   }
00532   if (fAnti) lambda = "anti_" + lambda;
00533   // create decay channel  [parent    BR     #daughters]
00534   mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00535                                            lambda, daughterK);
00536   // add decay table
00537   decayTable->Insert(mode);
00538 
00539   return decayTable;
00540 }
00541 
00542 // PDG2005
00543 //  N(2090) is renamed to N(2080) 
00544 //   but keep unchanged temporalily Apr 06
00545 
00546 const char* G4ExcitedNucleonConstructor::name[] = {
00547    "N(1440)", "N(1520)", "N(1535)", "N(1650)", "N(1675)",
00548    "N(1680)", "N(1700)", "N(1710)", "N(1720)", "N(1900)", 
00549    "N(1990)", "N(2090)", "N(2190)", "N(2220)", "N(2250)"
00550 };
00551 
00552 const G4double G4ExcitedNucleonConstructor::mass[] = {
00553   1.440*GeV, 1.520*GeV, 1.535*GeV, 1.655*GeV,  1.675*GeV, 
00554   1.685*GeV, 1.700*GeV, 1.710*GeV, 1.720*GeV,  1.900*GeV, 
00555   1.950*GeV, 2.080*GeV, 2.190*GeV, 2.250*GeV,  2.275*GeV
00556 };
00557 
00558 const G4double G4ExcitedNucleonConstructor::width[] = {
00559   300.0*MeV, 115.0*MeV, 150.0*MeV, 165.0*MeV, 150.0*MeV,
00560   130.0*MeV, 100.0*MeV, 100.0*MeV, 200.0*MeV, 500.0*MeV,
00561   555.0*MeV, 350.0*MeV, 500.0*MeV, 400.0*MeV, 500.0*MeV
00562 };
00563 
00564 const G4int G4ExcitedNucleonConstructor::iSpin[] = {
00565     1,   3,   1,   1,   5,
00566     5,   3,   1,   3,   3,
00567     7,   3,   7,   9,   9
00568 };
00569 
00570 const G4int G4ExcitedNucleonConstructor::iParity[] = {
00571   +1,  -1,   -1,  -1,  -1,
00572   +1,  -1,   +1,  +1,  +1,
00573   +1,  -1,   +1,  -1,  -1 
00574 };
00575 
00576 const G4int G4ExcitedNucleonConstructor::encodingOffset[] = {
00577    10000,       0,  20000,  30000,       0,
00578    10000,   20000,  40000,  30000,   40000, 
00579    10000,   50000,       0,     0,   10000
00580 };
00581 
00582 const G4double G4ExcitedNucleonConstructor::bRatio[ G4ExcitedNucleonConstructor::NStates ][ G4ExcitedNucleonConstructor::NumberOfDecayModes] = 
00583 {
00584    {  0.0, 0.70,  0.0,  0.0,  0.0,  0.05,  0.25,  0.0,  0.0}, 
00585    {  0.0, 0.60,  0.0,  0.0,  0.0,  0.15,  0.25,  0.0,  0.0}, 
00586    {0.001, 0.55, 0.35,  0.0,  0.0,  0.05,  0.00, 0.05,  0.0},
00587    {  0.0, 0.65, 0.05,  0.0,  0.0,  0.05,  0.10, 0.05, 0.10},
00588    {  0.0, 0.45,  0.0,  0.0,  0.0,  0.00,  0.55,  0.0,  0.0},
00589    {  0.0, 0.65,  0.0,  0.0,  0.0,  0.20,  0.15,  0.0,  0.0},
00590    {  0.0, 0.10, 0.05,  0.0, 0.05,  0.45,  0.35,  0.0,  0.0},
00591    {  0.0, 0.15, 0.20,  0.0, 0.05,  0.20,  0.20, 0.10, 0.10},
00592    {  0.0, 0.15, 0.00,  0.0, 0.25,  0.45,  0.10, 0.00, 0.05},
00593    {  0.0, 0.35,  0.0, 0.55, 0.05,  0.00,  0.05,  0.0,  0.0},
00594    {  0.0, 0.05,  0.0,  0.0, 0.15,  0.25,  0.30, 0.15, 0.10},
00595    {  0.0, 0.60, 0.05,  0.0, 0.25,  0.05,  0.05,  0.0,  0.0},
00596    {  0.0, 0.35,  0.0, 0.00, 0.30,  0.15,  0.15, 0.05,  0.0},
00597    {  0.0, 0.35,  0.0,  0.0, 0.25,  0.20,  0.20,  0.0,  0.0},
00598    {  0.0, 0.30,  0.0, 0.00, 0.25,  0.20,  0.20, 0.05,  0.0}
00599 };
00600 
00601 
00602 
00603 
00604 
00605 
00606 
00607 
00608 
00609 
00610 
00611 
00612 
00613 
00614 
00615 

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