File indexing completed on 2025-12-14 10:32:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef ROOT_TGeoElement
0013 #define ROOT_TGeoElement
0014
0015 #include "TNamed.h"
0016
0017 #include "TAttLine.h"
0018
0019 #include "TAttFill.h"
0020
0021 #include "TAttMarker.h"
0022
0023 #include "TObjArray.h"
0024
0025 #include <map>
0026
0027 class TGeoElementTable;
0028 class TGeoIsotope;
0029
0030
0031 class TGeoElement : public TNamed {
0032 protected:
0033 enum EGeoElement { kElemUsed = BIT(17), kElemDefined = BIT(18), kElementChecked = BIT(19) };
0034
0035 Int_t fZ;
0036 Int_t fN;
0037 Int_t fNisotopes;
0038 Double_t fA;
0039 TObjArray *fIsotopes;
0040 Double_t *fAbundances;
0041 Double_t fCoulomb;
0042 Double_t fRadTsai;
0043
0044 private:
0045 TGeoElement(const TGeoElement &other) = delete;
0046 TGeoElement &operator=(const TGeoElement &other) = delete;
0047
0048
0049 void ComputeCoulombFactor();
0050
0051 void ComputeLradTsaiFactor();
0052
0053 public:
0054
0055 TGeoElement();
0056 TGeoElement(const char *name, const char *title, Int_t z, Double_t a);
0057 TGeoElement(const char *name, const char *title, Int_t nisotopes);
0058 TGeoElement(const char *name, const char *title, Int_t z, Int_t n, Double_t a);
0059
0060 ~TGeoElement() override;
0061
0062 virtual Int_t ENDFCode() const { return 0; }
0063 Int_t Z() const { return fZ; }
0064 Int_t N() const { return fN; }
0065 Double_t Neff() const;
0066 Double_t A() const { return fA; }
0067 void AddIsotope(TGeoIsotope *isotope, Double_t relativeAbundance);
0068 Int_t GetNisotopes() const { return fNisotopes; }
0069 TGeoIsotope *GetIsotope(Int_t i) const;
0070 Double_t GetRelativeAbundance(Int_t i) const;
0071
0072 void ComputeDerivedQuantities();
0073
0074 virtual Double_t GetSpecificActivity() const { return 0.; }
0075 Bool_t HasIsotopes() const { return (fNisotopes == 0) ? kFALSE : kTRUE; }
0076 Bool_t IsDefined() const { return TObject::TestBit(kElemDefined); }
0077 virtual Bool_t IsRadioNuclide() const { return kFALSE; }
0078 Bool_t IsUsed() const { return TObject::TestBit(kElemUsed); }
0079 void Print(Option_t *option = "") const override;
0080 void SetDefined(Bool_t flag = kTRUE) { TObject::SetBit(kElemDefined, flag); }
0081 void SetUsed(Bool_t flag = kTRUE) { TObject::SetBit(kElemUsed, flag); }
0082 static TGeoElementTable *GetElementTable();
0083
0084 inline Double_t GetfCoulomb() const { return fCoulomb; }
0085
0086 inline Double_t GetfRadTsai() const { return fRadTsai; }
0087
0088 ClassDefOverride(TGeoElement, 3)
0089 };
0090
0091
0092 class TGeoIsotope : public TNamed {
0093 protected:
0094 Int_t fZ;
0095 Int_t fN;
0096 Double_t fA;
0097
0098 public:
0099 TGeoIsotope();
0100 TGeoIsotope(const char *name, Int_t z, Int_t n, Double_t a);
0101 ~TGeoIsotope() override {}
0102
0103 Int_t GetZ() const { return fZ; }
0104 Int_t GetN() const { return fN; }
0105 Double_t GetA() const { return fA; }
0106 static TGeoIsotope *FindIsotope(const char *name);
0107 void Print(Option_t *option = "") const override;
0108
0109 ClassDefOverride(TGeoIsotope, 1)
0110 };
0111
0112 class TGeoDecayChannel;
0113 class TGeoBatemanSol;
0114
0115
0116 class TGeoElementRN : public TGeoElement {
0117 protected:
0118 Int_t fENDFcode;
0119 Int_t fIso;
0120 Double_t fLevel;
0121 Double_t fDeltaM;
0122 Double_t fHalfLife;
0123 Double_t fNatAbun;
0124
0125 Double_t fTH_F;
0126 Double_t fTG_F;
0127 Double_t fTH_S;
0128 Double_t fTG_S;
0129 Int_t fStatus;
0130 TGeoBatemanSol *fRatio;
0131
0132 TObjArray *fDecays;
0133
0134 void MakeName(Int_t a, Int_t z, Int_t iso);
0135
0136 private:
0137 TGeoElementRN(const TGeoElementRN &elem) = delete;
0138 TGeoElementRN &operator=(const TGeoElementRN &elem) = delete;
0139
0140 public:
0141 TGeoElementRN();
0142 TGeoElementRN(Int_t A, Int_t Z, Int_t iso, Double_t level, Double_t deltaM, Double_t halfLife, const char *JP,
0143 Double_t natAbun, Double_t th_f, Double_t tg_f, Double_t th_s, Double_t tg_s, Int_t status);
0144 ~TGeoElementRN() override;
0145
0146 void AddDecay(Int_t decay, Int_t diso, Double_t branchingRatio, Double_t qValue);
0147 void AddDecay(TGeoDecayChannel *dc);
0148 void AddRatio(TGeoBatemanSol &ratio);
0149 void ResetRatio();
0150 static Int_t ENDF(Int_t a, Int_t z, Int_t iso) { return 10000 * z + 10 * a + iso; }
0151
0152
0153 Int_t ENDFCode() const override { return fENDFcode; }
0154 Double_t GetSpecificActivity() const override;
0155 Bool_t IsRadioNuclide() const override { return kTRUE; }
0156 Int_t MassNo() const { return (Int_t)fA; }
0157 Int_t AtomicNo() const { return fZ; }
0158 Int_t IsoNo() const { return fIso; }
0159 Double_t Level() const { return fLevel; }
0160 Double_t MassEx() const { return fDeltaM; }
0161 Double_t HalfLife() const { return fHalfLife; }
0162 Double_t NatAbun() const { return fNatAbun; }
0163 const char *PJ() const { return fTitle.Data(); }
0164 Double_t TH_F() const { return fTH_F; }
0165 Double_t TG_F() const { return fTG_F; }
0166 Double_t TH_S() const { return fTH_S; }
0167 Double_t TG_S() const { return fTG_S; }
0168 Double_t Status() const { return fStatus; }
0169 Bool_t Stable() const { return !fDecays; }
0170 TObjArray *Decays() const { return fDecays; }
0171 Int_t GetNdecays() const;
0172 TGeoBatemanSol *Ratio() const { return fRatio; }
0173
0174
0175 Bool_t CheckDecays() const;
0176 Int_t DecayResult(TGeoDecayChannel *dc) const;
0177 void FillPopulation(TObjArray *population, Double_t precision = 0.001, Double_t factor = 1.);
0178 void Print(Option_t *option = "") const override;
0179 static TGeoElementRN *ReadElementRN(const char *record, Int_t &ndecays);
0180 void SavePrimitive(std::ostream &out, Option_t *option = "") override;
0181
0182 ClassDefOverride(TGeoElementRN, 2)
0183 };
0184
0185
0186 class TGeoDecayChannel : public TObject {
0187 private:
0188 UInt_t fDecay;
0189 Int_t fDiso;
0190 Double_t fBranchingRatio;
0191 Double_t fQvalue;
0192 TGeoElementRN *fParent;
0193 TGeoElementRN *fDaughter;
0194 public:
0195 enum ENuclearDecayMode {
0196 kBitMask32 = 0xffffffff,
0197 k2BetaMinus = BIT(0),
0198 kBetaMinus = BIT(1),
0199 kNeutronEm = BIT(2),
0200 kProtonEm = BIT(3),
0201 kAlpha = BIT(4),
0202 kECF = BIT(5),
0203 kElecCapt = BIT(6),
0204 kIsoTrans = BIT(7),
0205 kI = BIT(8),
0206 kSpontFiss = BIT(9),
0207 k2P = BIT(10),
0208 k2N = BIT(11),
0209 k2A = BIT(12),
0210 kCarbon12 = BIT(13),
0211 kCarbon14 = BIT(14)
0212 };
0213 TGeoDecayChannel() : fDecay(0), fDiso(0), fBranchingRatio(0), fQvalue(0), fParent(nullptr), fDaughter(nullptr) {}
0214 TGeoDecayChannel(Int_t decay, Int_t diso, Double_t branchingRatio, Double_t qValue)
0215 : fDecay(decay),
0216 fDiso(diso),
0217 fBranchingRatio(branchingRatio),
0218 fQvalue(qValue),
0219 fParent(nullptr),
0220 fDaughter(nullptr)
0221 {
0222 }
0223 TGeoDecayChannel(const TGeoDecayChannel &dc)
0224 : TObject(dc),
0225 fDecay(dc.fDecay),
0226 fDiso(dc.fDiso),
0227 fBranchingRatio(dc.fBranchingRatio),
0228 fQvalue(dc.fQvalue),
0229 fParent(dc.fParent),
0230 fDaughter(dc.fDaughter)
0231 {
0232 }
0233 ~TGeoDecayChannel() override {}
0234
0235 TGeoDecayChannel &operator=(const TGeoDecayChannel &dc);
0236
0237
0238 Int_t GetIndex() const;
0239 const char *GetName() const override;
0240 UInt_t Decay() const { return fDecay; }
0241 Double_t BranchingRatio() const { return fBranchingRatio; }
0242 Double_t Qvalue() const { return fQvalue; }
0243 Int_t DeltaIso() const { return fDiso; }
0244 TGeoElementRN *Daughter() const { return fDaughter; }
0245 TGeoElementRN *Parent() const { return fParent; }
0246 static void DecayName(UInt_t decay, TString &name);
0247
0248 void SetParent(TGeoElementRN *parent) { fParent = parent; }
0249 void SetDaughter(TGeoElementRN *daughter) { fDaughter = daughter; }
0250
0251 void Print(Option_t *opt = " ") const override;
0252 static TGeoDecayChannel *ReadDecay(const char *record);
0253 void SavePrimitive(std::ostream &out, Option_t *option = "") override;
0254 virtual void DecayShift(Int_t &dA, Int_t &dZ, Int_t &dI) const;
0255
0256 ClassDefOverride(TGeoDecayChannel, 1)
0257 };
0258
0259
0260 class TGeoBatemanSol : public TObject, public TAttLine, public TAttFill, public TAttMarker {
0261 private:
0262 typedef struct {
0263 Double_t cn;
0264 Double_t lambda;
0265 } BtCoef_t;
0266 TGeoElementRN *fElem;
0267 TGeoElementRN *fElemTop;
0268 Int_t fCsize;
0269 Int_t fNcoeff;
0270 Double_t fFactor;
0271 Double_t fTmin;
0272 Double_t fTmax;
0273 BtCoef_t *fCoeff;
0274 public:
0275 TGeoBatemanSol()
0276 : TObject(),
0277 TAttLine(),
0278 TAttFill(),
0279 TAttMarker(),
0280 fElem(nullptr),
0281 fElemTop(nullptr),
0282 fCsize(0),
0283 fNcoeff(0),
0284 fFactor(1.),
0285 fTmin(0.),
0286 fTmax(0),
0287 fCoeff(nullptr)
0288 {
0289 }
0290 TGeoBatemanSol(TGeoElementRN *elem);
0291 TGeoBatemanSol(const TObjArray *chain);
0292 TGeoBatemanSol(const TGeoBatemanSol &other);
0293 ~TGeoBatemanSol() override;
0294
0295 TGeoBatemanSol &operator=(const TGeoBatemanSol &other);
0296 TGeoBatemanSol &operator+=(const TGeoBatemanSol &other);
0297
0298 Double_t Concentration(Double_t time) const;
0299 void Draw(Option_t *option = "") override;
0300 void GetCoeff(Int_t i, Double_t &cn, Double_t &lambda) const
0301 {
0302 cn = fCoeff[i].cn;
0303 lambda = fCoeff[i].lambda;
0304 }
0305 void GetRange(Double_t &tmin, Double_t &tmax) const
0306 {
0307 tmin = fTmin;
0308 tmax = fTmax;
0309 }
0310 TGeoElementRN *GetElement() const { return fElem; }
0311 TGeoElementRN *GetTopElement() const { return fElemTop; }
0312 Int_t GetNcoeff() const { return fNcoeff; }
0313 void Print(Option_t *option = "") const override;
0314 void SetRange(Double_t tmin = 0., Double_t tmax = 0.)
0315 {
0316 fTmin = tmin;
0317 fTmax = tmax;
0318 }
0319 void SetFactor(Double_t factor) { fFactor = factor; }
0320 void FindSolution(const TObjArray *array);
0321 void Normalize(Double_t factor);
0322
0323 ClassDefOverride(TGeoBatemanSol, 1)
0324 };
0325
0326
0327 class TGeoElemIter {
0328 private:
0329 const TGeoElementRN *fTop;
0330 const TGeoElementRN *fElem;
0331 TObjArray *fBranch;
0332 Int_t fLevel;
0333 Double_t fLimitRatio;
0334 Double_t fRatio;
0335
0336 protected:
0337 TGeoElemIter() : fTop(nullptr), fElem(nullptr), fBranch(nullptr), fLevel(0), fLimitRatio(0), fRatio(0) {}
0338 TGeoElementRN *Down(Int_t ibranch);
0339 TGeoElementRN *Up();
0340
0341 public:
0342 TGeoElemIter(TGeoElementRN *top, Double_t limit = 1.e-4);
0343 TGeoElemIter(const TGeoElemIter &iter);
0344 virtual ~TGeoElemIter();
0345
0346 TGeoElemIter &operator=(const TGeoElemIter &iter);
0347 TGeoElementRN *operator()();
0348 TGeoElementRN *Next();
0349
0350 TObjArray *GetBranch() const { return fBranch; }
0351 const TGeoElementRN *GetTop() const { return fTop; }
0352 const TGeoElementRN *GetElement() const { return fElem; }
0353 Int_t GetLevel() const { return fLevel; }
0354 Double_t GetRatio() const { return fRatio; }
0355 virtual void Print(Option_t *option = "") const;
0356 void SetLimitRatio(Double_t limit) { fLimitRatio = limit; }
0357
0358 ClassDef(TGeoElemIter, 0)
0359 };
0360
0361
0362 class TGeoElementTable : public TObject {
0363 private:
0364
0365 Int_t fNelements;
0366 Int_t fNelementsRN;
0367 Int_t fNisotopes;
0368 TObjArray *fList;
0369 TObjArray *fListRN;
0370 TObjArray *fIsotopes;
0371
0372 typedef std::map<Int_t, TGeoElementRN *> ElementRNMap_t;
0373 typedef ElementRNMap_t::iterator ElementRNMapIt_t;
0374 ElementRNMap_t fElementsRN;
0375
0376 protected:
0377 TGeoElementTable(const TGeoElementTable &);
0378 TGeoElementTable &operator=(const TGeoElementTable &);
0379
0380 public:
0381
0382 TGeoElementTable();
0383 TGeoElementTable(Int_t nelements);
0384
0385 ~TGeoElementTable() override;
0386
0387
0388 enum EGeoETStatus { kETDefaultElements = BIT(14), kETRNElements = BIT(15) };
0389 void AddElement(const char *name, const char *title, Int_t z, Double_t a);
0390 void AddElement(const char *name, const char *title, Int_t z, Int_t n, Double_t a);
0391 void AddElement(TGeoElement *elem);
0392 void AddElementRN(TGeoElementRN *elem);
0393 void AddIsotope(TGeoIsotope *isotope);
0394 void BuildDefaultElements();
0395 void ImportElementsRN();
0396 Bool_t CheckTable() const;
0397 TGeoElement *FindElement(const char *name) const;
0398 TGeoIsotope *FindIsotope(const char *name) const;
0399 TGeoElement *GetElement(Int_t z) { return (TGeoElement *)fList->At(z); }
0400 TGeoElementRN *GetElementRN(Int_t ENDFcode) const;
0401 TGeoElementRN *GetElementRN(Int_t a, Int_t z, Int_t iso = 0) const;
0402 TObjArray *GetElementsRN() const { return fListRN; }
0403 Bool_t HasDefaultElements() const { return TObject::TestBit(kETDefaultElements); }
0404 Bool_t HasRNElements() const { return TObject::TestBit(kETRNElements); }
0405
0406 Int_t GetNelements() const { return fNelements; }
0407 Int_t GetNelementsRN() const { return fNelementsRN; }
0408 void ExportElementsRN(const char *filename = "");
0409 void Print(Option_t *option = "") const override;
0410
0411 ClassDefOverride(TGeoElementTable, 4)
0412 };
0413
0414 #endif