//________________________________________________________________ void KVCaloBase::ComputeExcitationEnergy() { Double_t exci = GetIngValue("Qsum") + GetIngValue("Eksum") - GetIngValue("Qini"); SetIngValue("Exci",exci); }
//________________________________________________________________ void KVCalorimetry::ComputeTemperature() { Double_t exci = GetIngValue("Exci"); Double_t temp = TMath::Sqrt(GetParValue("LevelDensityParameter") * exci / GetIngValue("Asum")); SetIngValue("Temp", temp); }
//________________________________________________________________ void KVCaloBase::SumUp() { // protected method // Appelé par Calculate pour mettre à jour les différents ingrédients // de la calorimétrie : // // Trois modes de sommes: //------------------ // // détermination de l excès de masse de la source recontruite, dernier ingrédient de l'équation : // Exci + Qini = \Sigma Ek + \Sigma Q -> Exci = \Sigma Ek + \Sigma Q - Qini // // defaut de masse de la source reconstruite SetIngValue("Qini",nn.GetMassExcess(TMath::Nint(GetIngValue("Zsum")),TMath::Nint(GetIngValue("Asum")))); }
//________________________________________________________________ void KVCaloBase::AddIngValue(KVString name,Double_t value) { // protected method, //increment the value of a name given ingredient //if it is not defined, it's created Double_t before = GetIngValue(name); before += value; SetIngValue(name,before); }
//_________________________________________________________________ Double_t KVCaloBase::getvalue_int(Int_t i) { // derived method // protected method // On retourne la ieme valeur du tableau // si i est superieur au nbre de variables definies dans ingredient_list // retourne la valeur par defaut (ie 0) // appel a la methode Calculate pour mettre a jour // les variables avant d effectuer le retour if (i < nvl_ing->GetNpar()) { Calculate(); return GetIngValue(i); } else return 0; }
//________________________________________________________________ Bool_t KVCalorimetry::Calculate(void) { //Réalisation de la calorimétrie //Calcul de l'énergie d'excitation, température (optionnel), de l'énergie moyenne des neutrons (optionnel) //appel de SumUp() //Cette méthore retourne kTRUE si tout s'est bien passée, kFALSE si il y a un problème dans la résolution //du polynome d'ordre 2 // // Deux modes de calcul: //------------------ // - mode normal (par defaut) // Résolution de l'équation // Exci + Qini = \Sigma Ek + \Sigma Q // -> Exci = \Sigma Ek + \Sigma Q - Qini // // Optionnel : // le calcul de la température peut être également fait si la méthode DeduceTemperature(Double_t LevelDensityParameter) a été appelée // elle est obtenue via la formule : Exci = Asum/[LevelDensityParameter] * T*T // // - mode avec prise en compte des neutrons libres, actif si la métode // IncludeFreeNeutrons(Double_t AsurZ,Double_t NeutronMeanEnergyFactor,Double_t LevelDensityParameter) // Résolution de l'équation (polynome deuxième degrée en T (température) ) // Asum/[LevelDensityParameter] * T*T + Qi - \Sigma Ek - [NeutronMeanEnergyFactor]*Mn*T - \Sigma Q = 0 // on y obtient directement la température // //Info("Calculate","Debut"); if (!kIsModified) return kTRUE; kIsModified = kFALSE; // premier calcul depuis le dernier remplissage par Fill SumUp(); if (kfree_neutrons_included) { Double_t coefA = GetIngValue("Asum") / GetParValue("LevelDensityParameter"); Double_t coefB = -1.*GetParValue("NeutronMeanEnergyFactor") * GetIngValue("Mneu"); Double_t coefC = GetIngValue("Qini") - GetIngValue("Qsum") - GetIngValue("Eksum"); // Resolution du polynome de degre 2 // Les champs ne sont remplis que si une solution reelle est trouvee if (RootSquare(coefA, coefB, coefC)) { // la solution max donne la temperature SetIngValue("Temp", kracine_max); SetIngValue("Exci", coefA * TMath::Power(GetIngValue("Temp"), 2.)); // ajout de l'energie des neutrons a l energie totale de la source SetIngValue("Ekneu", GetParValue("NeutronMeanEnergyFactor") * GetIngValue("Mneu")*GetIngValue("Temp")); AddIngValue("Eksum", GetIngValue("Ekneu")); //parametre additionnel //SetIngValue("Tmin",kracine_min); // la deuxieme solution de l'eq en T2 } else { return kFALSE; } } else { ComputeExcitationEnergy(); if (ktempdeduced) { ComputeTemperature(); } } return kTRUE; }
//________________________________________________________________ void KVCalorimetry::SumUp() { // protected method // Appelé par Calculate pour mettre à jour les différents ingrédients // de la calorimétrie : // // Trois modes de sommes: //------------------ // - mode normal (par defaut) // détermination de l excès de masse de la source recontruite, dernier ingrédient de l'équation : // Exci + Qini = \Sigma Ek + \Sigma Q -> Exci = \Sigma Ek + \Sigma Q - Qini // // - mode avec distinction particules / fragments, actif si la méthode // UseChargeDiff(Int_t FragmentMinimumCharge,Double_t ParticleFactor) a été appelée : // -> une distinction entre produits avec une charge strictement inférieur à FragmentMinimumCharge (particules) // et supérieur ou égale (fragments) est appliquée // Ainsi dans la méthode SumUp() pour les énergies cinétiques, par exemple // l'énergie cinétique de la source reconstruite sera // Eksum = Ekfrag(Z>=[FragmentMinimumCharge]) + [ParticleFactor]*Ekpart(Z<[FragmentMinimumCharge]) // Détermination ensuite de l excès de masse de la source // // - mode avec prise en compte des neutrons libres, actif si la métode // IncludeFreeNeutrons(Double_t AsurZ,Double_t NeutronMeanEnergyFactor,Double_t LevelDensityParameter) // L'estimation du nombre neutrons, est fait en utilisant un AsurZ (paramètre de la calorimétrie) // supposé de la source reconstruite : // le nombre de neutrons libres est alors égal : // Mn = [AsurZ]*Zsum - Asum // Pour un Zsou reconstruit, on rajoute des neutrons pour que le Asou corresponde à un AsurZ prédéfini // On en déduit ensuite l'exces de masse asscoié à ces neutrons // Détermination ensuite de l excès de masse de la source // Les proprietes de la source sont calculees if (kchargediff) { // somme des contributions fragments et particules AddIngValue("Zsum", GetIngValue("Zfrag") + GetParValue("ParticleFactor")*GetIngValue("Zpart")); AddIngValue("Asum", GetIngValue("Afrag") + GetParValue("ParticleFactor")*GetIngValue("Apart")); AddIngValue("Eksum", GetIngValue("Ekfrag") + GetParValue("ParticleFactor")*GetIngValue("Ekpart")); AddIngValue("Qsum", GetIngValue("Qfrag") + GetParValue("ParticleFactor")*GetIngValue("Qpart")); AddIngValue("Msum", GetIngValue("Mfrag") + GetParValue("ParticleFactor")*GetIngValue("Mpart")); } //printf("Eksum=%lf avant neutrons \n",GetIngValue("Eksum")); if (kfree_neutrons_included) { // conservation du AsurZ du systeme --> multiplicite moyenne des neutrons Double_t Mneutron = Double_t(TMath::Nint(GetParValue("AsurZ") * GetIngValue("Zsum") - GetIngValue("Asum"))); if (Mneutron < 0) { //Warning("SumUp","Nombre de neutrons déduits négatif : %1.0lf -> on le met à zéro",Mneutron); SetIngValue("Aexcess", TMath::Abs(Mneutron)); Mneutron = 0; } SetIngValue("Aneu", Mneutron); SetIngValue("Qneu", Mneutron * nn.GetMassExcess(0, 1)); SetIngValue("Mneu", Mneutron); // prise en compte des neutrons dans la source AddIngValue("Asum", GetIngValue("Mneu")); AddIngValue("Qsum", GetIngValue("Qneu")); AddIngValue("Msum", GetIngValue("Mneu")); } //printf("Eksum=%lf apres neutrons \n",GetIngValue("Eksum")); // defaut de masse de la source reconstruite KVCaloBase::SumUp(); }