Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/particles/shortlived/src/G4ExcitedDeltaConstructor.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 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 // --------------------------------------------------------------
 27 //  GEANT 4 class implementation file
 28 //
 29 //      History: first implementation, based on object model of
 30 //      10 oct 1998  H.Kurashige
 31 //
 32 //      Update mass and width following PDG 2023
 33 //        4 nov 2023 S.Okada
 34 // ---------------------------------------------------------------
 35 
 36 #include "G4ExcitedDeltaConstructor.hh"
 37 
 38 #include "G4DecayTable.hh"
 39 #include "G4PhaseSpaceDecayChannel.hh"
 40 #include "G4SystemOfUnits.hh"
 41 #include "G4VDecayChannel.hh"
 42 
 43 G4ExcitedDeltaConstructor::G4ExcitedDeltaConstructor()
 44   : G4ExcitedBaryonConstructor(NStates, DeltaIsoSpin)
 45 {}
 46 
 47 G4int G4ExcitedDeltaConstructor::GetEncoding(G4int iIsoSpin3, G4int idxState)
 48 {
 49   G4int encoding;
 50   // Delta has exceptinal encoding
 51   if ((idxState == 1) || (idxState == 3) || (idxState == 4) || (idxState == 5) || (idxState == 7)) {
 52     encoding = GetEncodingOffset(idxState);
 53     if ((iIsoSpin3 == 3) || (iIsoSpin3 == -3)) {
 54       // normal encoding
 55       encoding += 1000 * GetQuarkContents(0, iIsoSpin3);
 56       encoding += 100 * GetQuarkContents(1, iIsoSpin3);
 57       encoding += 10 * GetQuarkContents(2, iIsoSpin3);
 58     }
 59     else if (iIsoSpin3 == +1) {
 60       // 1st <--> 2nd quark
 61       encoding += 1000 * GetQuarkContents(0, iIsoSpin3);
 62       encoding += 10 * GetQuarkContents(1, iIsoSpin3);
 63       encoding += 100 * GetQuarkContents(2, iIsoSpin3);
 64     }
 65     else if (iIsoSpin3 == -1) {
 66       // 1st <--> 0th quark
 67       encoding += 100 * GetQuarkContents(0, iIsoSpin3);
 68       encoding += 1000 * GetQuarkContents(1, iIsoSpin3);
 69       encoding += 10 * GetQuarkContents(2, iIsoSpin3);
 70     }
 71     encoding += GetiSpin(idxState) + 1;
 72   }
 73   else {
 74     encoding = G4ExcitedBaryonConstructor::GetEncoding(iIsoSpin3, idxState);
 75   }
 76   return encoding;
 77 }
 78 
 79 G4DecayTable* G4ExcitedDeltaConstructor::CreateDecayTable(const G4String& parentName, G4int iIso3,
 80                                                           G4int iState, G4bool fAnti)
 81 {
 82   // create decay table
 83   auto decayTable = new G4DecayTable();
 84 
 85   G4double br;
 86   if ((br = bRatio[iState][NGamma]) > 0.0) {
 87     AddNGammaMode(decayTable, parentName, br, iIso3, fAnti);
 88   }
 89 
 90   if ((br = bRatio[iState][NPi]) > 0.0) {
 91     AddNPiMode(decayTable, parentName, br, iIso3, fAnti);
 92   }
 93 
 94   if ((br = bRatio[iState][NRho]) > 0.0) {
 95     AddNRhoMode(decayTable, parentName, br, iIso3, fAnti);
 96   }
 97 
 98   if ((br = bRatio[iState][DeltaPi]) > 0.0) {
 99     AddDeltaPiMode(decayTable, parentName, br, iIso3, fAnti);
100   }
101 
102   if ((br = bRatio[iState][NStarPi]) > 0.0) {
103     AddNStarPiMode(decayTable, parentName, br, iIso3, fAnti);
104   }
105 
106   return decayTable;
107 }
108 
109 G4DecayTable* G4ExcitedDeltaConstructor::AddNGammaMode(G4DecayTable* decayTable,
110                                                        const G4String& nameParent, G4double br,
111                                                        G4int iIso3, G4bool fAnti)
112 {
113   G4VDecayChannel* mode;
114 
115   //
116   G4String daughterN;
117   if (iIso3 == +1) {
118     daughterN = "proton";
119   }
120   else if (iIso3 == -1) {
121     daughterN = "neutron";
122   }
123   else {
124     // can not decay into N+gamma
125     return decayTable;
126   }
127 
128   if (fAnti) daughterN = "anti_" + daughterN;
129 
130   // create decay channel  [parent    BR     #daughters]
131   mode = new G4PhaseSpaceDecayChannel(nameParent, br, 2, daughterN, "gamma");
132   // add decay table
133   decayTable->Insert(mode);
134 
135   return decayTable;
136 }
137 
138 G4DecayTable* G4ExcitedDeltaConstructor::AddNPiMode(G4DecayTable* decayTable,
139                                                     const G4String& nameParent, G4double br,
140                                                     G4int iIso3, G4bool fAnti)
141 {
142   G4VDecayChannel* mode;
143 
144   G4String daughterN;
145   G4String daughterPi;
146   G4double r = 0.;
147 
148   // ------------ N pi0 ------------
149   // determine daughters
150   if ((iIso3 == +1) || (iIso3 == -1)) {
151     if (iIso3 == +1) {
152       daughterN = "proton";
153       daughterPi = "pi0";
154       r = br * 2. / 3.;
155     }
156     else if (iIso3 == -1) {
157       daughterN = "neutron";
158       daughterPi = "pi0";
159       r = br / 3.;
160     }
161     if (fAnti) daughterN = "anti_" + daughterN;
162     // create decay channel  [parent    BR     #daughters]
163     mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterN, daughterPi);
164     // add decay table
165     decayTable->Insert(mode);
166   }
167 
168   // -------------N pi +/- --------------
169   // determine daughters
170   if (iIso3 == +3) {
171     daughterN = "proton";
172     if (!fAnti) {
173       daughterPi = "pi+";
174     }
175     else {
176       daughterPi = "pi-";
177     }
178     r = br;
179   }
180   else if (iIso3 == +1) {
181     daughterN = "neutron";
182     if (!fAnti) {
183       daughterPi = "pi+";
184     }
185     else {
186       daughterPi = "pi-";
187     }
188     r = br / 3.;
189   }
190   else if (iIso3 == -1) {
191     daughterN = "proton";
192     if (!fAnti) {
193       daughterPi = "pi-";
194     }
195     else {
196       daughterPi = "pi+";
197     }
198     r = br * 2. / 3.;
199   }
200   else if (iIso3 == -3) {
201     daughterN = "neutron";
202     if (!fAnti) {
203       daughterPi = "pi-";
204     }
205     else {
206       daughterPi = "pi+";
207     }
208     r = br;
209   }
210   if (fAnti) daughterN = "anti_" + daughterN;
211 
212   // create decay channel  [parent    BR     #daughters]
213   mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterN, daughterPi);
214   // add decay table
215   decayTable->Insert(mode);
216 
217   return decayTable;
218 }
219 
220 G4DecayTable* G4ExcitedDeltaConstructor::AddNRhoMode(G4DecayTable* decayTable,
221                                                      const G4String& nameParent, G4double br,
222                                                      G4int iIso3, G4bool fAnti)
223 {
224   G4VDecayChannel* mode;
225 
226   G4String daughterN;
227   G4String daughterRho;
228   G4double r = 0.;
229 
230   // ------------ N Rho0 ------------
231   // determine daughters
232   if ((iIso3 == +1) || (iIso3 == -1)) {
233     if (iIso3 == +1) {
234       daughterN = "proton";
235       daughterRho = "rho0";
236       r = br * 2. / 3.;
237     }
238     else if (iIso3 == -1) {
239       daughterN = "neutron";
240       daughterRho = "rho0";
241       r = br / 3.;
242     }
243     if (fAnti) daughterN = "anti_" + daughterN;
244     // create decay channel  [parent    BR     #daughters]
245     mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterN, daughterRho);
246     // add decay table
247     decayTable->Insert(mode);
248   }
249 
250   // -------------N Rho +/- --------------
251   // determine daughters
252   if (iIso3 == +3) {
253     daughterN = "proton";
254     if (!fAnti) {
255       daughterRho = "rho+";
256     }
257     else {
258       daughterRho = "rho-";
259     }
260     r = br;
261   }
262   else if (iIso3 == +1) {
263     daughterN = "neutron";
264     if (!fAnti) {
265       daughterRho = "rho+";
266     }
267     else {
268       daughterRho = "rho-";
269     }
270     r = br / 3.;
271   }
272   else if (iIso3 == -1) {
273     daughterN = "proton";
274     if (!fAnti) {
275       daughterRho = "rho-";
276     }
277     else {
278       daughterRho = "rho+";
279     }
280     r = br * 2. / 3.;
281   }
282   else if (iIso3 == -3) {
283     daughterN = "neutron";
284     if (!fAnti) {
285       daughterRho = "rho-";
286     }
287     else {
288       daughterRho = "rho+";
289     }
290     r = br;
291   }
292   if (fAnti) daughterN = "anti_" + daughterN;
293 
294   // create decay channel  [parent    BR     #daughters]
295   mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterN, daughterRho);
296   // add decay table
297   decayTable->Insert(mode);
298 
299   return decayTable;
300 }
301 
302 G4DecayTable* G4ExcitedDeltaConstructor::AddNStarPiMode(G4DecayTable* decayTable,
303                                                         const G4String& nameParent, G4double br,
304                                                         G4int iIso3, G4bool fAnti)
305 {
306   G4VDecayChannel* mode;
307 
308   G4String daughterN;
309   G4String daughterPi;
310   G4double r = 0.;
311 
312   // ------------ N pi0 ------------
313   // determine daughters
314   if ((iIso3 == +1) || (iIso3 == -1)) {
315     if (iIso3 == +1) {
316       daughterN = "N(1440)+";
317       daughterPi = "pi0";
318       r = br * 2. / 3.;
319     }
320     else if (iIso3 == -1) {
321       daughterN = "N(1440)0";
322       daughterPi = "pi0";
323       r = br / 3.;
324     }
325     if (fAnti) daughterN = "anti_" + daughterN;
326     // create decay channel  [parent    BR     #daughters]
327     mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterN, daughterPi);
328     // add decay table
329     decayTable->Insert(mode);
330   }
331 
332   // -------------N pi +/- --------------
333   // determine daughters
334   if (iIso3 == +3) {
335     daughterN = "N(1440)+";
336     if (!fAnti) {
337       daughterPi = "pi+";
338     }
339     else {
340       daughterPi = "pi-";
341     }
342     r = br;
343   }
344   else if (iIso3 == +1) {
345     daughterN = "N(1440)0";
346     if (!fAnti) {
347       daughterPi = "pi+";
348     }
349     else {
350       daughterPi = "pi-";
351     }
352     r = br / 3.;
353   }
354   else if (iIso3 == -1) {
355     daughterN = "N(1440)+";
356     if (!fAnti) {
357       daughterPi = "pi-";
358     }
359     else {
360       daughterPi = "pi+";
361     }
362     r = br * 2. / 3.;
363   }
364   else if (iIso3 == -3) {
365     daughterN = "N(1440)0";
366     if (!fAnti) {
367       daughterPi = "pi-";
368     }
369     else {
370       daughterPi = "pi+";
371     }
372     r = br;
373   }
374   if (fAnti) daughterN = "anti_" + daughterN;
375 
376   // create decay channel  [parent    BR     #daughters]
377   mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterN, daughterPi);
378   // add decay table
379   decayTable->Insert(mode);
380 
381   return decayTable;
382 }
383 
384 G4DecayTable* G4ExcitedDeltaConstructor::AddDeltaPiMode(G4DecayTable* decayTable,
385                                                         const G4String& nameParent, G4double br,
386                                                         G4int iIso3, G4bool fAnti)
387 {
388   G4VDecayChannel* mode;
389 
390   G4String daughterDelta;
391   G4String daughterPi;
392   G4double r;
393 
394   // ------------ Delta pi +------------
395   // determine daughters
396   if (iIso3 == +3) {
397     daughterDelta = "delta+";
398     r = br * 0.4;
399   }
400   else if (iIso3 == +1) {
401     daughterDelta = "delta0";
402     r = br * 8. / 15.0;
403   }
404   else if (iIso3 == -1) {
405     daughterDelta = "delta-";
406     r = br * 6. / 15.;
407   }
408   else {
409     r = 0.;
410   }
411   if (!fAnti) {
412     daughterPi = "pi+";
413   }
414   else {
415     daughterPi = "pi-";
416   }
417   if (fAnti) daughterDelta = "anti_" + daughterDelta;
418   if (r > 0.0) {
419     // create decay channel  [parent    BR     #daughters]
420     mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterDelta, daughterPi);
421     // add decay table
422     decayTable->Insert(mode);
423   }
424 
425   // ------------ Delta pi0 ------------
426   // determine daughters
427   if (iIso3 == +3) {
428     daughterDelta = "delta++";
429     r = br * 0.6;
430   }
431   else if (iIso3 == +1) {
432     daughterDelta = "delta+";
433     r = br * 1. / 15.0;
434   }
435   else if (iIso3 == -1) {
436     daughterDelta = "delta0";
437     r = br * 1. / 15.;
438   }
439   else {
440     daughterDelta = "delta-";
441     r = br * 0.6;
442   }
443   daughterPi = "pi0";
444   if (fAnti) daughterDelta = "anti_" + daughterDelta;
445 
446   // create decay channel  [parent    BR     #daughters]
447   mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterDelta, daughterPi);
448   // add decay table
449   decayTable->Insert(mode);
450 
451   // ------------ Delta pi - -------------
452   // determine daughters
453   if (iIso3 == +3) {
454     r = 0.;
455   }
456   else if (iIso3 == +1) {
457     daughterDelta = "delta++";
458     r = br * 6. / 15.0;
459   }
460   else if (iIso3 == -1) {
461     daughterDelta = "delta+";
462     r = br * 8. / 15.;
463   }
464   else {
465     daughterDelta = "delta0";
466     r = br * 0.4;
467   }
468   if (!fAnti) {
469     daughterPi = "pi-";
470   }
471   else {
472     daughterPi = "pi+";
473   }
474   if (fAnti) daughterDelta = "anti_" + daughterDelta;
475   if (r > 0.0) {
476     // create decay channel  [parent    BR     #daughters]
477     mode = new G4PhaseSpaceDecayChannel(nameParent, r, 2, daughterDelta, daughterPi);
478     // add decay table
479     decayTable->Insert(mode);
480   }
481 
482   return decayTable;
483 }
484 
485 // clang-format off
486 const char* G4ExcitedDeltaConstructor::name[] =
487 {
488   "delta(1600)", "delta(1620)", "delta(1700)", "delta(1900)", "delta(1905)",
489   "delta(1910)", "delta(1920)", "delta(1930)", "delta(1950)"
490 };
491 
492 const G4double G4ExcitedDeltaConstructor::mass[] =
493 {
494   1.570*GeV, 1.610*GeV, 1.710*GeV, 1.860*GeV,  1.880*GeV,
495   1.900*GeV, 1.920*GeV, 1.950*GeV, 1.930*GeV
496 };
497 
498 const G4double G4ExcitedDeltaConstructor::width[] = {
499   250.0*MeV, 130.0*MeV, 300.0*MeV, 250.0*MeV, 330.0*MeV,
500   300.0*MeV, 300.0*MeV, 300.0*MeV, 285.0*MeV
501 };
502 
503 const G4int G4ExcitedDeltaConstructor::iSpin[] =
504 {
505     3,   1,   3,   1,   5,
506     1,   3,   5,   7
507 };
508 
509 const G4int G4ExcitedDeltaConstructor::iParity[] = {
510   +1,  -1,   -1,  -1,  +1,
511   +1,  +1,   -1,  +1
512 };
513 
514 const G4int G4ExcitedDeltaConstructor::encodingOffset[] = {
515   30000,     0, 10000, 10000,     0,
516   20000, 20000, 10000,     0
517 };
518 
519 const G4double G4ExcitedDeltaConstructor::bRatio[ G4ExcitedDeltaConstructor::NStates ][ G4ExcitedDeltaConstructor::NumberOfDecayModes] =
520 {
521 //   NGamma    Npi     NRho DeltaPi    N*Pi
522    {    0.0,   0.15,    0.0,   0.55,   0.30 },
523    {    0.0,   0.25,    0.0,   0.60,   0.15 },
524    {    0.0,   0.20,   0.10,   0.55,   0.15 },
525    {    0.0,   0.30,   0.15,   0.30,   0.25 },
526    {    0.0,   0.20,   0.60,   0.10,   0.10 },
527    {    0.0,   0.35,   0.40,   0.15,   0.10 },
528    {    0.0,   0.15,   0.30,   0.30,   0.25 },
529    {    0.0,   0.20,   0.25,   0.25,   0.30 },
530    {   0.01,   0.44,   0.15,   0.20,   0.20 }
531 };
532