KaliVeda
Toolkit for HIC analysis
Loading...
Searching...
No Matches
KVNuclearChart.cpp
1//Created by KVClassFactory on Thu Nov 22 15:26:52 2012
2//Author: dgruyer
3
4#include "KVNuclearChart.h"
5#include "KVNucleus.h"
6#include "KVNucleusBox.h"
7#include "KVCanvas.h"
8#include "TStyle.h"
9#include "TBox.h"
10#include "TLine.h"
11#include "TString.h"
12#include "TLatex.h"
13#include "KVLevelScheme.h"
14
16
17
18
19
20KVNuclearChart::KVNuclearChart(Int_t nMin, Int_t nMax, Int_t zMin, Int_t zMax, Double_t life): fNucleusBoxList(kTRUE), fMagicList(kTRUE), fSymbolList(kTRUE)
21{
22 fNmin = nMin;
23 fNmax = nMax;
24 fZmin = zMin;
25 fZmax = zMax;
26
27 if ((fNmax < 0) || (fZmax < 0)) {
28 fNmax = 177;
29 fZmax = 115;
30 }
31
32 fOwnHisto = 0;
33 fHisto = 0;
34 fShownNucleus = 0;
35 fCanvas = nullptr;
36 fPad = nullptr;
37 fShowMagicNumbers = kTRUE;
38 fShowSymbol = kFALSE;
39
40 fSymbol = new TPaveText(0.65, 0.16, 0.75, 0.01, "NDC");
41 fSymbol->SetBorderSize(1);
42 fInfo = new TPaveText(0.76, 0.16, 0.99, 0.01, "NDC");
43 fInfo->SetTextAlign(12);
44 fInfo->SetFillColor(kWhite);
45 fInfo->SetLineColor(kBlack);
46 fInfo->SetTextColor(kBlack);
47 fInfo->SetBorderSize(1);
48
49 KVNucleus nuc;
50 for (int zz = fZmin; zz <= fZmax; zz++) {
51 KVNumberList ll = nuc.GetKnownARange(zz);
52 ll.Begin();
53 while (!ll.End()) {
54 Int_t aa = ll.Next();
55 nuc.SetZandA(zz, aa);
56 Int_t nn = aa - zz;
57 if ((nn >= fNmin) && (nn <= fNmax)) {
58 if (nuc.IsStable() || nuc.GetLifeTime() > life) {
59 KVNucleusBox* nb = new KVNucleusBox(zz, nn);
60 nb->SetNuclearChart(this);
61 fNucleusBoxList.Add(nb);
62 }
63 }
64 }
65 }
66
67 fNm[0] = 2;
68 fNm[1] = 8;
69 fNm[2] = 20;
70 fNm[3] = 28;
71 fNm[4] = 50;
72 fNm[5] = 82;
73 fNm[6] = 126;
74
75 fNmMin[0] = 0.;
76 fNmMin[1] = 1.;
77 fNmMin[2] = 12.;
78 fNmMin[3] = 18.;
79 fNmMin[4] = 46.;
80 fNmMin[5] = 93.;
81 fNmMin[6] = 98.;
82 fNmMax[0] = 10.;
83 fNmMax[1] = 22.;
84 fNmMax[2] = 40.;
85 fNmMax[3] = 52.;
86 fNmMax[4] = 90.;
87 fNmMax[5] = 136.;
88 fNmMax[6] = 126.*3;
89
90 fZmMin[0] = 0.2;
91 fZmMin[1] = 0.2;
92 fZmMin[2] = 6.;
93 fZmMin[3] = 10.;
94 fZmMin[4] = 26.;
95 fZmMin[5] = 44.;
96 fZmMin[6] = 76.;
97 fZmMax[0] = 9.;
98 fZmMax[1] = 17.;
99 fZmMax[2] = 30.;
100 fZmMax[3] = 35.;
101 fZmMax[4] = 53.;
102 fZmMax[5] = 76.;
103 fZmMax[6] = 95.;
104
105 return;
106}
107
108
109
110
117
119{
120 // Copy constructor
121 // This ctor is used to make a copy of an existing object (for example
122 // when a method returns an object), and it is always a good idea to
123 // implement it.
124 // If your class allocates memory in its constructor(s) then it is ESSENTIAL :-)
125
126 obj.Copy(*this);
127}
128
129
130
138
140{
141 // Destructor
142// if(fCanvas)
143// {
144// fCanvas->ResetDisabledClass();
145// fCanvas->ResetDisabledObject();
146// }
147 if ((fHisto) && (fOwnHisto)) delete fHisto;
148 if (fSymbol) delete fSymbol;
149 if (fInfo) delete fInfo;
150}
151
152
153
154
162
164{
165 // This method copies the current state of 'this' object into 'obj'
166 // You should add here any member variables, for example:
167 // (supposing a member variable KVNuclearChart::fToto)
168 // CastedObj.fToto = fToto;
169 // or
170 // CastedObj.SetToto( GetToto() );
171
172 KVBase::Copy(obj);
173 //KVNuclearChart& CastedObj = (KVNuclearChart&)obj;
174}
175
176
177
179
181{
182 gStyle->SetOptStat(0);
183
184 TString opt(option);
185 Bool_t DrawSame = opt.Contains("same");
186
187 if (DrawSame && gPad) {
188 fPad = gPad;
189 TObject* obj = 0;
190 TIter next(gPad->GetListOfPrimitives());
191 while ((obj = next())) {
192 if (obj->InheritsFrom("TH2")) {
193 fHisto = (TH2*) obj;
194 break;
195 }
196 }
197 }
198 else {
199 KVCanvas* cc = new KVCanvas;
200 TPad* pp = (TPad*) cc->cd();
201 fPad = pp;
202
203 Double_t marging = 0.001;
204 pp->SetTopMargin(marging);
205 pp->SetRightMargin(marging);
206 pp->SetBottomMargin(marging);
207 pp->SetLeftMargin(marging);
208
209 fHisto = new TH2F("NuclearChart", "", fNmax - fNmin + 2, fNmin - 1, fNmax + 1, fZmax - fZmin + 2, fZmin - 1, fZmax + 1);
211 TAxis* ax = 0;
212 ax = fHisto->GetXaxis();
213 ax->SetNdivisions(000);
214 ax = fHisto->GetYaxis();
215 ax->SetNdivisions(000);
216
217 fHisto->Draw();
218 }
219
220 if (gPad->GetCanvas()->InheritsFrom("KVCanvas")) {
221 KVCanvas* cc = (KVCanvas*) gPad->GetCanvas();
222 cc->DisableClass("TLine");
223 cc->DisableClass("KVNucleusBox");
224 cc->DisableClass("TLatex");
225 cc->DisableObject(fSymbol);
226 cc->DisableObject(fInfo);
227 fCanvas = cc;
228 }
229
230 fNucleusBoxList.Execute("SetDrawMode", Form("%d", DrawSame));
231 fNucleusBoxList.Execute("EnableToolTip", "");
232 fNucleusBoxList.Execute("Draw", "");
233
235
236 return;
237}
238
239
240
242
244{
245 if ((fShownNucleus) && (fShownNucleus == nuc)) {
246 fSymbol->Clear();
247 fInfo->Clear();
250 update_pad();
251 fShownNucleus = 0;
252 return;
253 }
254
255 fShownNucleus = nuc;
256 fInfo->Clear();
257 fInfo->AddText(Form("Z = %d N = %d", nuc->GetZ(), nuc->GetN()));
258 if (nuc->GetLifeTime() > 1.e+30) fInfo->AddText("T_{1/2} > 1.00e+30 s");
259 else fInfo->AddText(Form("T_{1/2} = %3.2e s", nuc->GetLifeTime()));
260 if (!fOwnHisto && fHisto) {
261 TAxis* ax = fHisto->GetXaxis();
262 Int_t xmin = ax->FindBin(nuc->GetN() - 0.5);
263 Int_t xmax = ax->FindBin(nuc->GetN() + 0.5);
264 ax = fHisto->GetYaxis();
265 Int_t ymin = ax->FindBin(nuc->GetZ() - 0.5);
266 Int_t ymax = ax->FindBin(nuc->GetZ() + 0.5);
268 fInfo->AddText(Form("M = %d", M));
269 }
271 fInfo->Draw("same");
272
273 TString symbText = nuc->GetSymbol();
274 symbText.ReplaceAll(Form("%d", nuc->GetA()), Form("^{%d}", nuc->GetA()));
275// symbText += Form("_{%d}", nuc->GetN());
276
277 if ((!fSymbol) || (!fInfo)) return;
278
279 fSymbol->Clear();
280 fSymbol->AddText(symbText.Data());
285 fSymbol->Draw("same");
286 update_pad();
287
288}
289
290
291
293
294void KVNuclearChart::ShowLevelScheme(const char* decays)
295{
297 lvs->Draw();
298
299 KVString dec = decays;
300 dec.Begin(",");
301 while (!dec.End()) lvs->DrawThreshold(dec.Next());
302}
303
304
305
307
313
314
315
317
319{
320 if (!fShowSymbol) {
322 update_pad();
323 return;
324 }
325
326 KVNucleus nuc;
327 for (int zz = fZmin; zz <= fZmax; zz++) {
328 nuc.SetZ(zz);
329 KVNumberList ll = nuc.GetKnownARange(zz, 1.e-6);
330 if (ll.IsEmpty()) continue;
331 Double_t xx = ll.First() - zz - (zz == 1 ? 1 : 2);
332 Double_t yy = zz;
333
334 TLatex* label = new TLatex(xx, yy, nuc.GetSymbol("EL"));
335 label->SetTextAlign(22);
336 label->SetTextSize(0.025);
337 label->SetTextFont(42);
338
339 TLatex* last = (TLatex*)fSymbolList.Last();
340 if (last && (last->GetX() > label->GetX())) last->SetX(label->GetX());
341
342 fSymbolList.AddLast(label);
343 }
344
345 TObject* obj = 0;
346 TIter it(&fSymbolList);
347 while ((obj = it())) obj->Draw();
348
349 update_pad();
350}
351
352
353
356
358{
359 // draw name of isotope in each box
360
363 while ((box = (KVNucleusBox*)it())) box->SetShowSymbol(on);
364 update_pad();
365}
366
367
368
370
372{
375 while ((box = (KVNucleusBox*)it())) box->SetSymbolSize(size);
376 update_pad();
377}
378
379
380
382
388
389
390
392
394{
395 if (!fShowMagicNumbers) {
397 update_pad();
398 return;
399 }
400
401 for (int i = 0; i < 7; i++) {
402 Int_t num = fNm[i];
403 if ((num >= fNmin + 1) && (num <= fNmax - 1) && (fZmMin[i] < fZmax)) {
404 TLine* ll1 = new TLine(num - 0.5, TMath::Max(fZmin * 1., fZmMin[i]), num - 0.5, TMath::Min(fZmax * 1., fZmMax[i]));
405 TLine* ll2 = new TLine(num + 0.5, TMath::Max(fZmin * 1., fZmMin[i]), num + 0.5, TMath::Min(fZmax * 1., fZmMax[i]));
406 fMagicList.AddLast(ll1);
407 fMagicList.AddLast(ll2);
408 if (num >= 20) {
409 TLatex* label = new TLatex(num * 1., fZmMin[i] - 1.5, Form("N=%d", num));
410 label->SetTextAlign(22);
411 label->SetTextSize(0.025);
412 label->SetTextFont(42);
413 fMagicList.AddLast(label);
414 }
415 }
416 }
417
418 for (int i = 0; i < 7; i++) {
419 Int_t num = fNm[i];
420 if ((num >= fZmin + 1) && (num <= fZmax - 1) && (fNmMin[i] < fNmax)) {
421 TLine* ll1 = new TLine(TMath::Max(fNmin * 1., fNmMin[i]), num - 0.5, TMath::Min(fNmax * 1., fNmMax[i]), num - 0.5);
422 TLine* ll2 = new TLine(TMath::Max(fNmin * 1., fNmMin[i]), num + 0.5, TMath::Min(fNmax * 1., fNmMax[i]), num + 0.5);
423 fMagicList.AddLast(ll1);
424 fMagicList.AddLast(ll2);
425 if (num >= 20) {
426 TLatex* label = new TLatex(fNmMin[i] - 1.5, num * 1., Form("Z=%d", num));
427 label->SetTextAlign(32);
428 label->SetTextSize(0.025);
429 label->SetTextFont(42);
430 fMagicList.AddLast(label);
431 }
432 }
433 }
434
435 fMagicList.Execute("Draw", "");
436
437}
438
439
440
441
442
443
444
445
446
int Int_t
size_t size(const MatrixT &matrix)
bool Bool_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
const char Option_t
kBlack
kWhite
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
float xmin
float ymin
float xmax
float ymax
char * Form(const char *fmt,...)
R__EXTERN TStyle * gStyle
#define gPad
Base class for KaliVeda framework.
Definition KVBase.h:142
virtual void Copy(TObject &) const
Make a copy of this object.
Definition KVBase.cpp:394
TCanvas with mouse-controlled dynamic zoom and pan & scan.
Definition KVCanvas.h:54
Tool to simulate nucleus multi-particle decay.
void DrawThreshold(const char *symb, Option_t *option="", double ex=0.)
void Draw(Option_t *option="")
Used to draw nuclear chart.
virtual ~KVNuclearChart()
TVirtualPad * fPad
void ShowNucleusInfo(KVNucleus *nuc)
TPaveText * fInfo
Double_t fZmMin[7]
KVNucleus * fCurrentNuc
void ShowLevelScheme(const char *decays)
Double_t fNmMax[7]
void SetShowMagicNumbers(Int_t value=1)
void Copy(TObject &) const
KVCanvas * fCanvas
TPaveText * fSymbol
Double_t fNmMin[7]
KVNucleus * fShownNucleus
void SetBoxSymbolSize(Float_t size=0.02)
KVNuclearChart(Int_t nMin=0, Int_t nMax=-1, Int_t zMin=0, Int_t zMax=-1, Double_t life=1.e-06)
KVNuclearChart();.
void ShowBoxSymbols(Bool_t on=kTRUE)
draw name of isotope in each box
void SetShowSymbol(Int_t value=1)
void Draw(Option_t *option="")
Double_t fZmMax[7]
A TBox representing a nucleus in a KVNuclearChart.
void SetNuclearChart(KVNuclearChart *nuclearchart)
Description of properties and kinematics of atomic nuclei.
Definition KVNucleus.h:126
const Char_t * GetSymbol(Option_t *opt="") const
Definition KVNucleus.cpp:81
Int_t GetA() const
void SetZ(Int_t z, Char_t mt=-1)
KVNumberList GetKnownARange(Int_t z=-1, Double_t tmin=0) const
Int_t GetN() const
Return the number of neutron.
void SetZandA(Int_t z, Int_t a)
Set atomic number and mass number.
Bool_t IsStable(Double_t min_lifetime=1.0e+15) const
Int_t GetZ() const
Return the number of proton / atomic number.
Double_t GetLifeTime(Int_t z=-1, Int_t a=-1) const
Strings used to represent a set of ranges of values.
Int_t First() const
Returns smallest number included in list.
Bool_t End(void) const
void Begin(void) const
Bool_t IsEmpty() const
Int_t Next(void) const
virtual void AddLast(TObject *obj)
virtual void Clear(Option_t *option="")
virtual TObject * Last() const
virtual void Execute(const char *method, const char *params, Int_t *error=0)
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition KVString.h:73
void Begin(TString delim) const
Definition KVString.cpp:565
Bool_t End() const
Definition KVString.cpp:634
KVString Next(Bool_t strip_whitespace=kFALSE) const
Definition KVString.cpp:695
virtual void SetNdivisions(Int_t n1, Int_t n2, Int_t n3, Bool_t optim=kTRUE)
virtual void SetFillColor(Color_t fcolor)
virtual void SetLineColor(Color_t lcolor)
virtual void SetBottomMargin(Float_t bottommargin)
virtual void SetLeftMargin(Float_t leftmargin)
virtual void SetRightMargin(Float_t rightmargin)
virtual void SetTopMargin(Float_t topmargin)
virtual void SetTextAlign(Short_t align=11)
virtual void SetTextColor(Color_t tcolor=1)
virtual void SetTextFont(Font_t tfont=62)
virtual void SetTextSize(Float_t tsize=1)
virtual Int_t FindBin(const char *label)
TAxis * GetXaxis()
TAxis * GetYaxis()
void Draw(Option_t *option="") override
virtual Double_t Integral(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Option_t *option="") const
TObject * Remove(const TObjLinkPtr_t &lnk)
virtual Bool_t InheritsFrom(const char *classname) const
virtual void Draw(Option_t *option="")
virtual TText * AddText(const char *label)
void Clear(Option_t *option="") override
void Draw(Option_t *option="") override
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const char *s1, const char *s2)
void SetOptStat(Int_t stat=1)
Double_t GetX() const
virtual void SetX(Double_t x)
virtual TList * GetListOfPrimitives() const=0
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Double_t Min(Double_t a, Double_t b)
Double_t Max(Double_t a, Double_t b)
ClassImp(TPyArg)