00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
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
00062 if ((idxState==1)||(idxState==6)||(idxState==8)||(idxState==9)||(idxState==12) ) {
00063 encoding = GetEncodingOffset(idxState);
00064 if ((iIsoSpin3==3)||(iIsoSpin3==-3)) {
00065
00066 encoding += 1000*GetQuarkContents(0, iIsoSpin3);
00067 encoding += 100*GetQuarkContents(1, iIsoSpin3);
00068 encoding += 10*GetQuarkContents(2, iIsoSpin3);
00069 } else if (iIsoSpin3== +1){
00070
00071 encoding += 1000*GetQuarkContents(0, iIsoSpin3);
00072 encoding += 10*GetQuarkContents(1, iIsoSpin3);
00073 encoding += 100*GetQuarkContents(2, iIsoSpin3);
00074 } else if (iIsoSpin3== -1){
00075
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
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
00152 mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00153 daughterN,"gamma");
00154
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
00170
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
00180 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00181 daughterN,daughterPi);
00182
00183 decayTable->Insert(mode);
00184
00185
00186
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
00205 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00206 daughterN,daughterPi);
00207
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
00222
00223 if (iIso3 == +1) {
00224 daughterN = "proton";
00225 } else {
00226 daughterN = "neutron";
00227 }
00228 if (fAnti) daughterN = "anti_" + daughterN;
00229
00230 mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00231 daughterN, "eta");
00232
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
00247
00248 if (iIso3 == +1) {
00249 daughterN = "proton";
00250 } else {
00251 daughterN = "neutron";
00252 }
00253 if (fAnti) daughterN = "anti_" + daughterN;
00254
00255 mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00256 daughterN, "omega");
00257
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
00273
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
00283 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00284 daughterN,daughterRho);
00285
00286 decayTable->Insert(mode);
00287
00288
00289
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
00308 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00309 daughterN,daughterRho);
00310
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
00321
00322
00323
00324 G4VDecayChannel* mode;
00325
00326 G4String daughterN;
00327 G4String daughterPi1;
00328 G4String daughterPi2;
00329
00330
00331
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
00344 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 3,
00345 daughterN,daughterPi1,daughterPi2);
00346
00347 decayTable->Insert(mode);
00348
00349
00350
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
00363 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 3,
00364 daughterN,daughterPi1,daughterPi2);
00365
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
00381
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
00391 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00392 daughterN,daughterPi);
00393
00394 decayTable->Insert(mode);
00395
00396
00397
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
00416 mode = new G4PhaseSpaceDecayChannel(nameParent, br/2.0, 2,
00417 daughterN,daughterPi);
00418
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
00435
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
00455 mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2,
00456 daughterDelta,daughterPi);
00457
00458 decayTable->Insert(mode);
00459
00460
00461
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
00481 mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2,
00482 daughterDelta,daughterPi);
00483
00484 decayTable->Insert(mode);
00485
00486
00487
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
00499 mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2,
00500 daughterDelta,daughterPi);
00501
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
00518
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
00534 mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2,
00535 lambda, daughterK);
00536
00537 decayTable->Insert(mode);
00538
00539 return decayTable;
00540 }
00541
00542
00543
00544
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