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