//________________________________________________________________ void KVCaloBase::AddNeutrons(Int_t mult, Double_t mke) { //Add extra neutrons // multiplicity (number) and mean kinetic energy kIsModified = kTRUE; //AddIngValue("Zsum",n->GetZ()); AddIngValue("Asum", mult); AddIngValue("Eksum", mult * mke); AddIngValue("Qsum", nn.GetMassExcess(0, 1)); AddIngValue("Msum", mult); }
//________________________________________________________________ void KVCaloBase::Fill (KVNucleus* n) { // Remplissage des energies, masse, charge et defaut de masse // Pour l'énergie cinétique, si l'utilisateur a utilisé en amont // la méthode KVVarGlob::SetFrame(const Char_t*), c'est dans ce repère que les énergies sont sommées // (à condition que chaque KVNucleus possede le repere avec un nom identique) // // somme simple sur les A, Z, Ek, Q sans distinction du type de particules kIsModified=kTRUE; AddIngValue("Zsum",n->GetZ()); AddIngValue("Asum",n->GetA()); AddIngValue("Eksum",n->GetFrame(fFrame.Data())->GetKE()); AddIngValue("Qsum",n->GetMassExcess()); AddIngValue("Msum",1); }
//________________________________________________________________ void KVCalorimetry::Fill(KVNucleus* n) { // Remplissage des energies, masse, charge et defaut de masse // Pour l'énergie cinétique, si l'utilisateur a utilisé en amont // la méthode KVVarGlob::SetFrame(const Char_t*), c'est dans ce repère que les énergies sont sommées // (à condition que chaque KVNucleus possede le repere avec un nom identique) // // Deux modes de remplissages : //---------------------------- // - mode par défault, somme simple sur les A, Z, Ek, Q sans distinction du type de particules // // - mode avec distinction particules / fragments, actif si la méthode // UseChargeDiff(Int_t FragmentMinimumCharge,Double_t ParticleFactor) a été appelée : // ->Uune distinction entre produits avec une // charge strictement inférieur à FragmentMinimumCharge (particules) et supérieur ou égale (fragments) // est appliquée kIsModified = kTRUE; if (kchargediff) { if (n->GetZ() >= GetParValue("FragmentMinimumCharge")) { AddIngValue("Zfrag", n->GetZ()); AddIngValue("Afrag", n->GetA()); AddIngValue("Ekfrag", n->GetFrame(fFrame.Data())->GetKE()); AddIngValue("Qfrag", n->GetMassExcess()); AddIngValue("Mfrag", 1); } else { AddIngValue("Zpart", n->GetZ()); AddIngValue("Apart", n->GetA()); AddIngValue("Ekpart", n->GetFrame(fFrame.Data())->GetKE()); AddIngValue("Qpart", n->GetMassExcess()); AddIngValue("Mpart", 1); } return; } KVCaloBase::Fill(n); }
//________________________________________________________________ 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(); }