KaliVeda
Toolkit for HIC analysis
Loading...
Searching...
No Matches
KVCalorimetry.cpp
1/*
2$Id: KVCalorimetry.cpp,v 1.4 2009/01/23 15:25:52 franklan Exp $
3$Revision: 1.4 $
4$Date: 2009/01/23 15:25:52 $
5*/
6
7//Created by KVClassFactory on Mon Apr 14 15:01:51 2008
8//Author: eric bonnet,,,
9
10#include "KVCalorimetry.h"
11#include "KVNDTManager.h"
12
14
15
16
17
18
20
22{
23// Createur par default
24
25 init_KVCalorimetry();
26 SetName("KVCalorimetry");
27 SetTitle("A KVCalorimetry");
28
29}
30
31
32
35
37{
38// Constructeur avec un nom
39
41}
42
43
44
47
49{
50// Destructeur
51
52}
53
54
55
60
62{
63 // protected method
64 // Private initialisation method called by all constructors.
65 // All member initialisations should be done here.
66
70
72
73}
74
75
76
79
81{
82 // protected method, set the value of FragmentMinimumCharge parameter
83 SetParameter("FragmentMinimumCharge", value);
84}
85
86
89
91{
92 // protected method, set the value of ParticleFactor parameter
93 SetParameter("ParticleFactor", value);
94}
95
96
99
101{
102 // protected method, set the value of LevelDensityParameter parameter
103 SetParameter("LevelDensityParameter", value);
104}
105
106
109
111{
112 // protected method, set the value of AsurZ parameter
113 SetParameter("AsurZ", value);
114}
115
116
121
123{
124 // protected method, set the value of NeutronMeanEnergyFactor parameter
125 // value = 1.0 : surface emission
126 // value = 1.5 : volume emission
127 SetParameter("NeutronMeanEnergyFactor", value);
128}
129
130
131
145
146void KVCalorimetry::UseChargeDiff(Int_t FragmentMinimumCharge, Double_t ParticleFactor)
147{
148 //Make a difference between particle with a charge (GetZ) greater (fragments)
149 //or smaller (particles) than FragmentMinimumCharge.
150 //
151 //When sum on charge (Zsum), mass (Asum), energy (Eksum), are performed, two partial sums are done,
152 //respect to the previous distinction and particle ones will be multiply by ParticleFactor
153 //
154 //for example, for the kinetic energy, it gives at the end :
155 //Eksum = \Sigma Ek(Z>=[FragmentMinimumCharge]) + [ParticleFactor]*\Sigma Ek(Z<[FragmentMinimumCharge])
156 //this operation is done in the SumUp() method
157 //
158 //NOTE : when this method is called, Reset of the object are called also
159 //it has to be called before the first Fill
160 SetFragmentMinimumCharge(FragmentMinimumCharge);
161 SetParticleFactor(ParticleFactor);
164 Reset();
165
166}
167
168
169
178
180{
181 //The temperature will be computed, the parameter LevelDensityParameter
182 //is needed in the formula : Exci = Asum/[LevelDensityParameter] * T*T (resolved in Calculate() method)
183 //
184 //this method is automaticaly called by the IncludeFreeNeutrons method
185 //
186 //NOTE : when this method is called, Reset of the object are called also
187 //it has to be called before the first Fill
188 SetLevelDensityParameter(LevelDensityParameter);
191 Reset();
192
193}
194
195
196
209
210void KVCalorimetry::IncludeFreeNeutrons(Double_t AsurZ, Double_t NeutronMeanEnergyFactor, Double_t LevelDensityParameter)
211{
212
213 //Free neutrons are taken into account
214 //AsurZ parameter, allow to evaluate the number of free neutrons
215 //Mn = [AsurZ]*Zsum - Asum (done by the method SumUp)
216 //
217 //then the parameters NeutronMeanEnergyFactor, LevelDensityParameter are used
218 //in the formula :
219 //Asum/[LevelDensityParameter] * T*T + Qi - \Sigma Ek - [NeutronMeanEnergyFactor]*Mn*T - \Sigma Q = 0
220 //which is resolved in Calculate() method
221 //
222 //NOTE : when this method is called, Reset of the object are called also
223 //it has to be called before the first Fill
224
225 SetAsurZ(AsurZ);
226 SetNeutronMeanEnergyFactor(NeutronMeanEnergyFactor);
227 DeduceTemperature(LevelDensityParameter);
230 Reset();
231
232}
233
234
235
251
253{
254 // Remplissage des energies, masse, charge et defaut de masse
255 // Pour l'energie cinetique, si l'utilisateur a utilise en amont
256 // la methode KVVarGlob::SetFrame(const Char_t*), c'est dans ce repere que les energies sont sommees
257 // (a condition que chaque KVNucleus possede le repere avec un nom identique)
258 //
259 // Deux modes de remplissages :
260 //----------------------------
261 // - mode par default, somme simple sur les A, Z, Ek, Q sans distinction du type de particules
262 //
263 // - mode avec distinction particules / fragments, actif si la methode
264 // UseChargeDiff(Int_t FragmentMinimumCharge,Double_t ParticleFactor) a ete appelee :
265 // ->Une distinction entre produits avec une
266 // charge strictement inferieur à FragmentMinimumCharge (particules) et superieur ou egale (fragments)
267 // est appliquee
269
270 if (kchargediff) {
271
272 if (n->GetZ() >= GetParameter("FragmentMinimumCharge")) {
273 AddIngValue("Zfrag", n->GetZ());
274 AddIngValue("Afrag", n->GetA());
275 AddIngValue("Ekfrag", n->GetFrame(GetFrame(), kFALSE)->GetKE());
276 AddIngValue("Qfrag", n->GetMassExcess());
277 AddIngValue("Mfrag", 1);
278 }
279 else {
280 AddIngValue("Zpart", n->GetZ());
281 AddIngValue("Apart", n->GetA());
282 AddIngValue("Ekpart", n->GetFrame(GetFrame(), kFALSE)->GetKE());
283 AddIngValue("Qpart", n->GetMassExcess());
284 AddIngValue("Mpart", 1);
285 }
286
287 return;
288
289 }
291
292}
293
294
295
326
328{
329 // protected method
330 // Appele par Calculate pour mettre a jour les differents ingredients
331 // de la calorimetrie :
332 //
333 // Trois modes de sommes:
334 //------------------
335 // - mode normal (par defaut)
336 // determination de l exces de masse de la source recontruite, dernier ingredient de l'equation :
337 // Exci + Qini = \Sigma Ek + \Sigma Q -> Exci = \Sigma Ek + \Sigma Q - Qini
338 //
339 // - mode avec distinction particules / fragments, actif si la methode
340 // UseChargeDiff(Int_t FragmentMinimumCharge,Double_t ParticleFactor) a ete appelee :
341 // -> une distinction entre produits avec une charge strictement inferieur a FragmentMinimumCharge (particules)
342 // et superieur ou egale (fragments) est appliquee
343 // Ainsi dans la methode SumUp() pour les energies cinetiques, par exemple
344 // l'energie cinetique de la source reconstruite sera
345 // Eksum = Ekfrag(Z>=[FragmentMinimumCharge]) + [ParticleFactor]*Ekpart(Z<[FragmentMinimumCharge])
346 // Determination ensuite de l exces de masse de la source
347 //
348 // - mode avec prise en compte des neutrons libres, actif si la methode
349 // IncludeFreeNeutrons(Double_t AsurZ,Double_t NeutronMeanEnergyFactor,Double_t LevelDensityParameter)
350 // L'estimation du nombre neutrons, est fait en utilisant un AsurZ (paramètre de la calorimétrie)
351 // suppose de la source reconstruite :
352 // le nombre de neutrons libres est alors egal :
353 // Mn = [AsurZ]*Zsum - Asum
354 // Pour un Zsou reconstruit, on rajoute des neutrons pour que le Asou corresponde a un AsurZ predefini
355 // On en deduit ensuite l'exces de masse asscoie a ces neutrons
356 // Determination ensuite de l exces de masse de la source
357
358 // Les proprietes de la source sont calculees
359
360 if (kchargediff) {
361 // somme des contributions fragments et particules
362 AddIngValue("Zsum", GetIngValue("Zfrag") + GetParameter("ParticleFactor")*GetIngValue("Zpart"));
363 AddIngValue("Asum", GetIngValue("Afrag") + GetParameter("ParticleFactor")*GetIngValue("Apart"));
364 AddIngValue("Eksum", GetIngValue("Ekfrag") + GetParameter("ParticleFactor")*GetIngValue("Ekpart"));
365 AddIngValue("Qsum", GetIngValue("Qfrag") + GetParameter("ParticleFactor")*GetIngValue("Qpart"));
366 AddIngValue("Msum", GetIngValue("Mfrag") + GetParameter("ParticleFactor")*GetIngValue("Mpart"));
367 }
368
369 //printf("Eksum=%lf avant neutrons \n",GetIngValue("Eksum"));
370
372 // conservation du AsurZ du systeme --> multiplicite moyenne des neutrons
373 Double_t Mneutron = Double_t(TMath::Nint(GetParameter("AsurZ") * GetIngValue("Zsum") - GetIngValue("Asum")));
374 if (Mneutron < 0) {
375 //Warning("SumUp","Nombre de neutrons déduits négatif : %1.0lf -> on le met à zéro",Mneutron);
376 SetIngValue("Aexcess", TMath::Abs(Mneutron));
377 Mneutron = 0;
378 }
379 SetIngValue("Aneu", Mneutron);
380 SetIngValue("Qneu", Mneutron * nn.GetMassExcess(0, 1));
381 SetIngValue("Mneu", Mneutron);
382
383 // prise en compte des neutrons dans la source
384 AddIngValue("Asum", GetIngValue("Mneu"));
385 AddIngValue("Qsum", GetIngValue("Qneu"));
386 AddIngValue("Msum", GetIngValue("Mneu"));
387
388 }
389 //printf("Eksum=%lf apres neutrons \n",GetIngValue("Eksum"));
390 // defaut de masse de la source reconstruite
392
393}
394
395
396
422
424{
425 //Realisation de la calorimétrie
426 //Calcul de l'energie d'excitation, temperature (optionnel), de l'energie moyenne des neutrons (optionnel)
427 //appel de SumUp()
428 //Cette methode retourne kTRUE si tout s'est bien passee, kFALSE si il y a un probleme dans la resolution
429 //du polynome d'ordre 2
430 //
431 // Deux modes de calcul:
432 //------------------
433 // - mode normal (par defaut)
434 // Resolution de l'equation
435 // Exci + Qini = \Sigma Ek + \Sigma Q
436 // -> Exci = \Sigma Ek + \Sigma Q - Qini
437 //
438 // Optionnel :
439 // le calcul de la temperature peut etre egalement fait si la methode DeduceTemperature(Double_t LevelDensityParameter) a ete appelee
440 // elle est obtenue via la formule : Exci = Asum/[LevelDensityParameter] * T*T
441 //
442 // - mode avec prise en compte des neutrons libres, actif si la methode
443 // IncludeFreeNeutrons(Double_t AsurZ,Double_t NeutronMeanEnergyFactor,Double_t LevelDensityParameter)
444 // Resolution de l'equation (polynome deuxieme degree en T (temperature) )
445 // Asum/[LevelDensityParameter] * T*T + Qi - \Sigma Ek - [NeutronMeanEnergyFactor]*Mn*T - \Sigma Q = 0
446 // on y obtient directement la temperature
447 //
448
449 //Info("Calculate","Debut");
450
451 if (!kIsModified) return;
453 // premier calcul depuis le dernier remplissage par Fill
454 SumUp();
455
457
458 Double_t coefA = GetIngValue("Asum") / GetParameter("LevelDensityParameter");
459 Double_t coefB = -1.*GetParameter("NeutronMeanEnergyFactor") * GetIngValue("Mneu");
460 Double_t coefC = GetIngValue("Qini") - GetIngValue("Qsum") - GetIngValue("Eksum");
461
462 // Resolution du polynome de degre 2
463 // Les champs ne sont remplis que si une solution reelle est trouvee
464 if (RootSquare(coefA, coefB, coefC)) {
465 // la solution max donne la temperature
466 SetIngValue("Temp", kracine_max);
467 SetIngValue("Exci", coefA * TMath::Power(GetIngValue("Temp"), 2.));
468
469 // ajout de l'energie des neutrons a l energie totale de la source
470 SetIngValue("Ekneu", GetParameter("NeutronMeanEnergyFactor") * GetIngValue("Mneu")*GetIngValue("Temp"));
471 AddIngValue("Eksum", GetIngValue("Ekneu"));
472
473 //parametre additionnel
474 //SetIngValue("Tmin",kracine_min); // la deuxieme solution de l'eq en T2
475 }
476 else {
477 return;
478 }
479
480 }
481 else {
482
484 if (ktempdeduced) {
486 }
487
488 }
489}
490
491
492
494
496{
497
498 Double_t exci = GetIngValue("Exci");
499 Double_t temp = TMath::Sqrt(GetParameter("LevelDensityParameter") * exci / GetIngValue("Asum"));
500 const_cast<KVCalorimetry*>(this)->SetIngValue("Temp", temp);
501
502}
503
504
505
567
569{
570 // Init() is called by KVGVList::MakeBranches(), so this is the latest they
571 // can be set up. Depending on options chosen by user, list of branches will
572 // be very different.
573 //
574 // Example: with kchargediff=true:
575 // 0 | Zpart | 3.000000000
576 // 1 | Apart | 7.000000000
577 // 2 | Ekpart | 10.0000000
578 // 3 | Qpart | 17.37470000
579 // 4 | Mpart | 2.000000000
580 // 5 | Zfrag | 7.000000000
581 // 6 | Afrag | 16.00000000
582 // 7 | Ekfrag | 40.0000000
583 // 8 | Qfrag | 5.683700000
584 // 9 | Mfrag | 1.000000000
585 // 10 | Zsum* | 13.00000000 *same as KVCaloBase
586 // 11 | Asum* | 30.00000000
587 // 12 | Eksum* | 60.0000000
588 // 13 | Qsum* | 40.43310000
589 // 14 | Msum* | 5.000000000
590 // 15 | Qini* | -15.8724000
591 // 16 | Exci* | 116.3055000
592 // or with kfree_neutrons_included = true:
593 // <Zsum*=55>
594 // <Asum*=130>
595 // <Eksum*=0>
596 // <Qsum*=-81.4084>
597 // <Msum*=2>
598 // <Aexcess=20>
599 // <Aneu=0>
600 // <Qneu=0>
601 // <Mneu=0>
602 // <Qini*=-86.9004>
603 // <Temp=0.64997>
604 // <Exci*=5.492>
605 // <Ekneu=0>
606 // or with both options:
607 // <Zfrag=54>
608 // <Afrag=129>
609 // <Ekfrag=0>
610 // <Qfrag=-88.6974>
611 // <Mfrag=1>
612 // <Zpart=1>
613 // <Apart=1>
614 // <Ekpart=0>
615 // <Qpart=7.289>
616 // <Mpart=1>
617 // <Zsum*=56>
618 // <Asum*=131>
619 // <Eksum*=0>
620 // <Qsum*=-74.1194>
621 // <Msum*=3>
622 // <Aexcess=19>
623 // <Aneu=0>
624 // <Qneu=0>
625 // <Mneu=0>
626 // <Qini*=-86.683>
627 // <Temp=0.979313>
628 // <Exci*=12.5636>
629 // <Ekneu=0>
630
632 int min_index = GetNumberOfValues();
633 if (kchargediff) {
634 KVString fragpart = "frag,part";
635 fragpart.Begin(",");
636 while (!fragpart.End()) {
637 KVString _fragpart = fragpart.Next(kTRUE);
638
639 KVString prefixes = "Z,A,Ek,Q,M";
640 prefixes.Begin(",");
641 while (!prefixes.End()) {
642 KVString name = prefixes.Next(kTRUE) + _fragpart;
643 SetNameIndex(name, min_index++);
644 }
645 }
646 }
648 KVString _fragpart = "neu";
649
650 KVString prefixes = "A,Ek,Q,M";
651 prefixes.Begin(",");
652 while (!prefixes.End()) {
653 KVString name = prefixes.Next(kTRUE) + _fragpart;
654 SetNameIndex(name, min_index++);
655 }
656 SetNameIndex("Aexcess", min_index++);
657 SetNameIndex("Temp", min_index++);
658 }
659}
660
661
int Int_t
char Char_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char name[80]
Calorimetry of hot nuclei.
Definition KVCaloBase.h:63
Bool_t kIsModified
indique les ingredients ont ete modifies
Definition KVCaloBase.h:72
KVNucleus nn
permet d utiliser des methodes de KVNucleus
Definition KVCaloBase.h:69
void Init()
Double_t GetIngValue(Int_t idx) const
void ComputeExcitationEnergy()
void AddIngValue(KVString name, Double_t value)
virtual void SumUp()
virtual void fill(const KVNucleus *)
void SetIngValue(KVString name, Double_t value)
Bool_t RootSquare(Double_t aaa, Double_t bbb, Double_t ccc)
Double_t kracine_max
Definition KVCaloBase.h:76
void Reset()
Improved calorimetry of hot nuclei.
void SetNeutronMeanEnergyFactor(Double_t value)
void fill(const KVNucleus *)
void IncludeFreeNeutrons(Double_t AsurZ, Double_t NeutronMeanEnergyFactor, Double_t LevelDensityParameter)
void SetLevelDensityParameter(Double_t value)
protected method, set the value of LevelDensityParameter parameter
void SetAsurZ(Double_t value)
protected method, set the value of AsurZ parameter
void init_KVCalorimetry()
Bool_t kchargediff
= kTRUE -> distinction entre particule et fragment
void ComputeTemperature() const
void SetFragmentMinimumCharge(Double_t value)
protected method, set the value of FragmentMinimumCharge parameter
void UseChargeDiff(Int_t FragmentMinimumCharge, Double_t ParticleFactor)
virtual ~KVCalorimetry(void)
Destructeur.
void SetParticleFactor(Double_t value)
protected method, set the value of ParticleFactor parameter
Bool_t kfree_neutrons_included
= kTRUE -> Estimation des neutrons libre est faite
void DeduceTemperature(Double_t LevelDensityParameter)
Bool_t ktempdeduced
= kTRUE -> calcul de la temperature
KVCalorimetry(void)
Createur par default.
Description of properties and kinematics of atomic nuclei.
Definition KVNucleus.h:126
Double_t GetMassExcess(Int_t z=-1, Int_t a=-1) const
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 Int_t GetNumberOfValues() const
Definition KVVarGlob.h:638
void SetNameIndex(const Char_t *name, Int_t index)
void SetParameter(const Char_t *par, Double_t value)
Definition KVVarGlob.h:549
Double_t GetParameter(const Char_t *par) const
Definition KVVarGlob.h:580
const TString & GetFrame() const
Definition KVVarGlob.h:516
gr SetName("gr")
const Int_t n
Int_t Nint(T x)
Double_t Power(Double_t x, Double_t y)
Double_t Sqrt(Double_t x)
Double_t Abs(Double_t d)
ClassImp(TPyArg)