KaliVeda
Toolkit for HIC analysis
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 
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 
146 void 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);
162  kchargediff = kTRUE;
163  kIsModified = kTRUE;
164  Reset();
165 
166 }
167 
168 
169 
178 
179 void KVCalorimetry::DeduceTemperature(Double_t LevelDensityParameter)
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);
190  kIsModified = kTRUE;
191  Reset();
192 
193 }
194 
195 
196 
209 
210 void 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);
229  kIsModified = kTRUE;
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
268  kIsModified = kTRUE;
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()
Definition: KVCaloBase.cpp:32
Double_t GetIngValue(Int_t idx) const
Definition: KVCaloBase.cpp:242
void ComputeExcitationEnergy()
Definition: KVCaloBase.cpp:341
void AddIngValue(KVString name, Double_t value)
Definition: KVCaloBase.cpp:267
virtual void SumUp()
Definition: KVCaloBase.cpp:319
virtual void fill(const KVNucleus *)
Definition: KVCaloBase.cpp:287
void SetIngValue(KVString name, Double_t value)
Definition: KVCaloBase.cpp:254
Bool_t RootSquare(Double_t aaa, Double_t bbb, Double_t ccc)
Definition: KVCaloBase.cpp:417
Double_t kracine_max
Definition: KVCaloBase.h:76
void Reset()
Definition: KVCaloBase.cpp:51
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
Definition: KVNucleus.cpp:886
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)
Definition: KVVarGlob.cpp:223
const TString & GetFrame() const
Definition: KVVarGlob.h:516
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
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)