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
00038 #ifndef G4VDecayChannel_h
00039 #define G4VDecayChannel_h 1
00040
00041 #include "G4ios.hh"
00042 #include "globals.hh"
00043 #include <cmath>
00044
00045 class G4ParticleDefinition;
00046 class G4DecayProducts;
00047 class G4ParticleTable;
00048
00049 class G4VDecayChannel
00050 {
00051
00052
00053
00054
00055 public:
00056
00057 G4VDecayChannel(const G4String &aName, G4int Verbose = 1);
00058 G4VDecayChannel(const G4String &aName,
00059 const G4String& theParentName,
00060 G4double theBR,
00061 G4int theNumberOfDaughters,
00062 const G4String& theDaughterName1,
00063 const G4String& theDaughterName2 = "",
00064 const G4String& theDaughterName3 = "",
00065 const G4String& theDaughterName4 = "" );
00066
00067
00068 virtual ~G4VDecayChannel();
00069
00070 protected:
00071
00072 G4VDecayChannel();
00073
00074 G4VDecayChannel(const G4VDecayChannel &);
00075 G4VDecayChannel & operator=(const G4VDecayChannel &);
00076
00077 public:
00078
00079 G4int operator==(const G4VDecayChannel &right) const {return (this == &right);};
00080 G4int operator!=(const G4VDecayChannel &right) const {return (this != &right);};
00081
00082
00083 G4int operator<(const G4VDecayChannel &right) const;
00084
00085 public:
00086 virtual G4DecayProducts* DecayIt(G4double parentMass = -1.0) = 0;
00087
00088 public:
00089
00090 const G4String& GetKinematicsName() const;
00091
00092 G4double GetBR() const;
00093
00094 G4int GetNumberOfDaughters() const;
00095
00096
00097 G4ParticleDefinition * GetParent();
00098
00099 G4ParticleDefinition * GetDaughter(G4int anIndex);
00100
00101
00102 G4int GetAngularMomentum();
00103
00104 const G4String& GetParentName() const;
00105
00106 const G4String& GetDaughterName(G4int anIndex) const;
00107
00108
00109 G4double GetParentMass() const;
00110 G4double GetDaughterMass(G4int anIndex) const;
00111
00112
00113 void SetParent(const G4ParticleDefinition * particle_type);
00114 void SetParent(const G4String &particle_name);
00115
00116 void SetBR(G4double value);
00117
00118 void SetNumberOfDaughters(G4int value);
00119
00120 void SetDaughter(G4int anIndex,
00121 const G4ParticleDefinition * particle_type);
00122 void SetDaughter(G4int anIndex,
00123 const G4String &particle_name);
00124
00125 protected:
00126
00127 G4String kinematics_name;
00128
00129 G4double rbranch;
00130
00131 G4int numberOfDaughters;
00132
00133 G4String* parent_name;
00134
00135 G4String** daughters_name;
00136
00137 protected:
00138
00139 void ClearDaughtersName();
00140
00141 protected:
00142
00143 G4ParticleTable* particletable;
00144
00145
00146 G4ParticleDefinition* parent;
00147 G4ParticleDefinition** daughters;
00148
00149
00150 G4double parent_mass;
00151 G4double* daughters_mass;
00152
00153
00154
00155 void FillDaughters();
00156
00157 void FillParent();
00158
00159 public:
00160 void SetVerboseLevel(G4int value);
00161 G4int GetVerboseLevel() const;
00162 void DumpInfo();
00163
00164 private:
00165 const G4String& GetNoName() const;
00166
00167 protected:
00168
00169 G4int verboseLevel;
00170
00171
00172
00173
00174 static const G4String noName;
00175 };
00176
00177 inline
00178 G4int G4VDecayChannel::operator<(const G4VDecayChannel &right) const
00179 {
00180 return (this->rbranch < right.rbranch);
00181 }
00182
00183 inline
00184 G4ParticleDefinition* G4VDecayChannel::GetDaughter(G4int anIndex)
00185 {
00186
00187 if (daughters == 0) FillDaughters();
00188
00189
00190 if ( (anIndex>=0) && (anIndex<numberOfDaughters) ) {
00191 return daughters[anIndex];
00192 } else {
00193 if (verboseLevel>0)
00194 G4cout << "G4VDecayChannel::GetDaughter index out of range "<<anIndex<<G4endl;
00195 return 0;
00196 }
00197 }
00198
00199 inline
00200 const G4String& G4VDecayChannel::GetDaughterName(G4int anIndex) const
00201 {
00202 if ( (anIndex>=0) && (anIndex<numberOfDaughters) ) {
00203 return *daughters_name[anIndex];
00204 } else {
00205 if (verboseLevel>0){
00206 G4cout << "G4VDecayChannel::GetDaughterName ";
00207 G4cout << "index out of range " << anIndex << G4endl;
00208 }
00209 return GetNoName();
00210 }
00211 }
00212
00213 inline
00214 G4double G4VDecayChannel::GetDaughterMass(G4int anIndex) const
00215 {
00216 if ( (anIndex>=0) && (anIndex<numberOfDaughters) ) {
00217 return daughters_mass[anIndex];
00218 } else {
00219 if (verboseLevel>0){
00220 G4cout << "G4VDecayChannel::GetDaughterMass ";
00221 G4cout << "index out of range " << anIndex << G4endl;
00222 }
00223 return 0.0;
00224 }
00225 }
00226
00227 inline
00228 G4ParticleDefinition* G4VDecayChannel::GetParent()
00229 {
00230
00231 if (parent == 0) FillParent();
00232
00233 return parent;
00234 }
00235
00236 inline
00237 const G4String& G4VDecayChannel::GetParentName() const
00238 {
00239 return *parent_name;
00240 }
00241
00242 inline
00243 G4double G4VDecayChannel::GetParentMass() const
00244 {
00245 return parent_mass;
00246 }
00247
00248
00249 inline
00250 void G4VDecayChannel::SetParent(const G4String &particle_name)
00251 {
00252 if (parent_name != 0) delete parent_name;
00253 parent_name = new G4String(particle_name);
00254 parent = 0;
00255 }
00256
00257 inline
00258 G4int G4VDecayChannel::GetNumberOfDaughters() const
00259 {
00260 return numberOfDaughters;
00261 }
00262
00263 inline
00264 const G4String& G4VDecayChannel::GetKinematicsName() const { return kinematics_name; }
00265
00266 inline
00267 void G4VDecayChannel::SetBR(G4double value){ rbranch = value; }
00268
00269 inline
00270 G4double G4VDecayChannel::GetBR() const { return rbranch; }
00271
00272 inline
00273 void G4VDecayChannel::SetVerboseLevel(G4int value){ verboseLevel = value; }
00274
00275 inline
00276 G4int G4VDecayChannel::GetVerboseLevel() const { return verboseLevel; }
00277
00278
00279
00280 #endif
00281
00282
00283
00284
00285
00286