From b0b37ce9507bcee203438d9d8da3e126760e55e4 Mon Sep 17 00:00:00 2001 From: "Ryan@WorkStation" Date: Mon, 19 Feb 2024 18:31:27 -0500 Subject: [PATCH] [Major] overhaul the Cleopaatra due to the change of reactionConfig and detectorGeo --- .gitignore | 4 + Armory/ClassReactionConfig.h | 63 +++- Cleopatra/ClassDecay.h | 264 +++++++++-------- Cleopatra/ClassHelios.h | 264 ++++++++++------- Cleopatra/ClassTransfer.h | 78 +++-- Cleopatra/Cleopatra | Bin 0 -> 276616 bytes Cleopatra/Cleopatra.C | 3 +- Cleopatra/ExtractXSec.h | 41 +-- Cleopatra/FindThetaCM.h | 38 +-- Cleopatra/PlotSimulation.C | 31 -- Cleopatra/PlotTGraphTObjArray.h | 2 +- Cleopatra/Transfer.C | 19 +- Cleopatra/Transfer.h | 507 ++++++++++++++------------------ Cleopatra/makefile | 16 +- README.md | 46 ++- working/DWBA | 3 + working/Ex.txt | 6 - working/reactionConfig.txt | 19 +- 18 files changed, 731 insertions(+), 673 deletions(-) create mode 100755 Cleopatra/Cleopatra delete mode 100644 Cleopatra/PlotSimulation.C delete mode 100644 working/Ex.txt diff --git a/.gitignore b/.gitignore index 73ab6e2..71270d2 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,10 @@ data data_raw root_data +*.in +*.out +*.txt + Cleopatra/ExtractXSec Cleopatra/ExtractXSecFromText Cleopatra/FindThetaCM diff --git a/Armory/ClassReactionConfig.h b/Armory/ClassReactionConfig.h index 145b204..b24c02d 100644 --- a/Armory/ClassReactionConfig.h +++ b/Armory/ClassReactionConfig.h @@ -39,6 +39,44 @@ struct Recoil { }; +struct EnergyLevel{ + + float Ex, xsec, SF, sigma; + + EnergyLevel(float Ex, float xsec, float SF, float sigma) { + this->Ex = Ex; + this->xsec = xsec; + this->SF = SF; + this->sigma = sigma; + } + + void Print(std::string str) const { + printf("%11.3f %8.1f %5.1f %5.3f%s", Ex, xsec, SF, sigma, str.c_str() ); + } + +}; + + +struct ExcitedEnergies { + + std::vector ExList; + + void Clear(){ + ExList.clear(); + } + + void Add(float Ex, float xsec, float SF, float sigma){ + ExList.push_back( EnergyLevel(Ex, xsec, SF, sigma)); + } + + void Print() const { + printf("Energy[MeV] Rel.Xsec SF sigma\n"); + for( size_t i = 0; i < ExList.size(); i++){ + ExList[i].Print("\n"); + } + } + +}; class ReactionConfig { @@ -52,8 +90,8 @@ public: float beamEx; ///excitation_energy_of_A[MeV] float beamEnergy; ///MeV/u float beamEnergySigma; ///beam-energy_sigma_in_MeV/u - float beamAngle; ///beam-angle_in_mrad - float beamAngleSigma; ///beam-emittance_in_mrad + float beamTheta; ///beam-angle_in_mrad + float beamThetaSigma; ///beam-emittance_in_mrad float beamX; ///x_offset_of_Beam_in_mm float beamY; ///y_offset_of_Beam_in_mm @@ -64,6 +102,7 @@ public: std::string beamStoppingPowerFile; ///stopping_power_for_beam Recoil recoil[2]; + ExcitedEnergies exList[2]; int numEvents; ///number_of_Event_being_generated bool isRedo; ///isReDo @@ -97,8 +136,8 @@ inline void ReactionConfig::SetReactionSimple(int beamA, int beamZ, beamEnergy = beamEnergy_AMeV; beamEnergySigma = 0; - beamAngle = 0; - beamAngleSigma = 0; + beamTheta = 0; + beamThetaSigma = 0; beamX = 0; beamY = 0; @@ -124,6 +163,9 @@ inline bool ReactionConfig::LoadReactionConfig(TMacro * macro){ if( macro == NULL ) return false; + exList[0].Clear(); + exList[1].Clear(); + int recoilFlag = 0; int recoilLine = 0; @@ -138,6 +180,7 @@ inline bool ReactionConfig::LoadReactionConfig(TMacro * macro){ // printf("%d |%s|%d|%d\n", i, str[0].c_str(), recoilFlag, recoilLine); if( str[0].find("####") != std::string::npos ) break; + if( str[0].find("#---") != std::string::npos ) continue; if( str[0].find("#===") != std::string::npos ) { recoilFlag ++; recoilLine = 0; @@ -151,8 +194,8 @@ inline bool ReactionConfig::LoadReactionConfig(TMacro * macro){ if( recoilLine == 3 ) beamEnergy = atof(str[0].c_str()); if( recoilLine == 4 ) beamEnergySigma = atof(str[0].c_str()); - if( recoilLine == 5 ) beamAngle = atof(str[0].c_str()); - if( recoilLine == 6 ) beamAngleSigma = atof(str[0].c_str()); + if( recoilLine == 5 ) beamTheta = atof(str[0].c_str()); + if( recoilLine == 6 ) beamThetaSigma = atof(str[0].c_str()); if( recoilLine == 7 ) beamX = atof(str[0].c_str()); if( recoilLine == 8 ) beamY = atof(str[0].c_str()); @@ -179,6 +222,8 @@ inline bool ReactionConfig::LoadReactionConfig(TMacro * macro){ if( recoilLine == 5 ) recoil[ID].decayA = atoi(str[0].c_str()); if( recoilLine == 6 ) recoil[ID].decayZ = atoi(str[0].c_str()); + if( recoilLine > 6 && str.size() == 4) exList[ID].Add( atoi(str[0].c_str()), atoi(str[1].c_str()), atoi(str[2].c_str()), atoi(str[3].c_str())); + } recoilLine ++; @@ -202,7 +247,7 @@ inline void ReactionConfig::Print() const{ printf("------------------------------ Beam\n"); printf(" beam : A = %3d, Z = %2d, Ex = %.2f MeV\n", beamA, beamZ, beamEx); printf(" beam Energy : %.2f +- %.2f MeV/u, dE/E = %5.2f %%\n", beamEnergy, beamEnergySigma, beamEnergySigma/beamEnergy); - printf(" Angle : %.2f +- %.2f mrad\n", beamAngle, beamAngleSigma); + printf(" Angle : %.2f +- %.2f mrad\n", beamTheta, beamThetaSigma); printf(" offset : (x,y) = (%.2f, %.2f) mmm \n", beamX, beamY); printf("------------------------------ Target\n"); @@ -215,7 +260,9 @@ inline void ReactionConfig::Print() const{ } for( int i = 0; i < 2; i ++ ){ - printf("------------------------------ Recoil-%d\n", i); recoil[i].Print(); + printf("------------------------------ Recoil-%d\n", i); + recoil[i].Print(); + exList[i].Print(); } diff --git a/Cleopatra/ClassDecay.h b/Cleopatra/ClassDecay.h index b313ae3..47bb6dd 100644 --- a/Cleopatra/ClassDecay.h +++ b/Cleopatra/ClassDecay.h @@ -4,6 +4,7 @@ #include "TVector3.h" #include "../Cleopatra/ClassIsotope.h" +#include "../Armory/ClassReactionConfig.h" //======================================================= //####################################################### @@ -14,133 +15,164 @@ //======================================================= class Decay{ public: - Decay(); - ~Decay(); - - double GetQValue() { return Q;} - - double GetAngleChange(){ - TVector3 vD = PD.Vect(); - TVector3 vB = PB.Vect(); - vD.SetMag(1); - vB.SetMag(1); - double dot = vD.Dot(vB); - return TMath::ACos(dot)*TMath::RadToDeg() ; - } - - double GetThetaCM() { return theta * TMath::RadToDeg();} + Decay(); + ~Decay(); + + double GetQValue() { return Q;} + + double GetAngleChange(){ + TVector3 vD = PD.Vect(); + TVector3 vB = PB.Vect(); + vD.SetMag(1); + vB.SetMag(1); + double dot = vD.Dot(vB); + return TMath::ACos(dot)*TMath::RadToDeg() ; + } + + double GetThetaCM() { return theta * TMath::RadToDeg();} + + double GetCMMomentum(){ return k;} + TLorentzVector GetDaugther_d() {return Pd;} + TLorentzVector GetDaugther_D() {return PD;} + + void SetMotherDaugther(Recoil recoil){ - double GetCMMomentum(){ return k;} - TLorentzVector GetDaugther_d() {return Pd;} - TLorentzVector GetDaugther_D() {return PD;} - - void SetMotherDaugther(int AB, int zB, int AD, int zD){ - Isotope Mother(AB, zB); - Isotope Daugther_D(AD, zD); - Isotope Daugther_d(AB-AD, zB-zD); + Isotope Mother(recoil.heavyA, recoil.heavyZ); + Isotope Daugther_D(recoil.decayA, recoil.decayZ); + Isotope Daugther_d(recoil.heavyA - recoil.decayA, recoil.heavyZ - recoil.decayZ); - mB = Mother.Mass; - mD = Daugther_D.Mass; - md = Daugther_d.Mass; - - double Q = mB - mD - md; - - printf("====== decay mode : %s --> %s + %s, Q = %.3f MeV \n", Mother.Name.c_str(), Daugther_d.Name.c_str(), Daugther_D.Name.c_str(), Q); - - isMotherSet = true; - } - - int CalDecay(TLorentzVector P_mother, double ExB, double ExD, double normOfReactionPlane = 0){ - if( !isMotherSet ) { - return -1; - } - this->PB = P_mother; - - double MB = mB + ExB; ///mother - double MD = mD + ExD; ///Big_Daugther - Q = MB - MD - md; - if( Q < 0 ) { - this->PD = this->PB; - dTheta = TMath::QuietNaN(); - k = TMath::QuietNaN(); - return -2; - } - - //clear - TLorentzVector temp(0,0,0,0); - PD = temp; - Pd = temp; - - k = TMath::Sqrt((MB+MD+md)*(MB+MD-md)*(MB-MD+md)*(MB-MD-md))/2./MB; - - //in mother's frame, assume isotropic decay - theta = TMath::ACos(2 * gRandom->Rndm() - 1) ; - - //for non isotropic decay, edit f1. - //theta = TMath::ACos(f1->GetRandom()); - - double phi = TMath::TwoPi() * gRandom->Rndm(); - PD.SetE(TMath::Sqrt(mD * mD + k * k )); - PD.SetPz(k); - PD.SetTheta(theta); - PD.SetPhi(phi); - - Pd.SetE(TMath::Sqrt(md * md + k * k )); - Pd.SetPz(k); - Pd.SetTheta(theta + TMath::Pi()); - Pd.SetPhi(phi + TMath::Pi()); - - PD.RotateY(TMath::Pi()/2.); - PD.RotateZ(normOfReactionPlane); + zB = recoil.heavyZ; + zD = recoil.decayZ; + zd = recoil.heavyZ - recoil.decayZ; - Pd.RotateY(TMath::Pi()/2.); - Pd.RotateZ(normOfReactionPlane); - - //Transform to Lab frame; - TVector3 boost = PB.BoostVector(); - - PD.Boost(boost); - Pd.Boost(boost); - - return 1; - } - + mB = Mother.Mass; + mD = Daugther_D.Mass; + md = Daugther_d.Mass; + + double Q = mB - mD - md; + + printf("====== decay mode : %s --> %s + %s, Q = %.3f MeV \n", Mother.Name.c_str(), Daugther_d.Name.c_str(), Daugther_D.Name.c_str(), Q); + + isMotherSet = true; + + } + + void SetMotherDaugther(int AB, int zB, int AD, int zD){ + Isotope Mother(AB, zB); + Isotope Daugther_D(AD, zD); + Isotope Daugther_d(AB-AD, zB-zD); + + mB = Mother.Mass; + mD = Daugther_D.Mass; + md = Daugther_d.Mass; + + double Q = mB - mD - md; + + printf("====== decay mode : %s --> %s + %s, Q = %.3f MeV \n", Mother.Name.c_str(), Daugther_d.Name.c_str(), Daugther_D.Name.c_str(), Q); + + isMotherSet = true; + } + + int CalDecay(TLorentzVector P_mother, double ExB, double ExD, double normOfReactionPlane = 0){ + if( !isMotherSet ) { + return -1; + } + this->PB = P_mother; + + double MB = mB + ExB; ///mother + double MD = mD + ExD; ///Big_Daugther + Q = MB - MD - md; + if( Q < 0 ) { + this->PD = this->PB; + dTheta = TMath::QuietNaN(); + k = TMath::QuietNaN(); + return -2; + } + + //clear + TLorentzVector temp(0,0,0,0); + PD = temp; + Pd = temp; + + PD.SetUniqueID(zD); + Pd.SetUniqueID(zd); + + k = TMath::Sqrt((MB+MD+md)*(MB+MD-md)*(MB-MD+md)*(MB-MD-md))/2./MB; + + //in mother's frame, assume isotropic decay + theta = TMath::ACos(2 * gRandom->Rndm() - 1) ; + + //for non isotropic decay, edit f1. + //theta = TMath::ACos(f1->GetRandom()); + + double phi = TMath::TwoPi() * gRandom->Rndm(); + PD.SetE(TMath::Sqrt(mD * mD + k * k )); + PD.SetPz(k); + PD.SetTheta(theta); + PD.SetPhi(phi); + + Pd.SetE(TMath::Sqrt(md * md + k * k )); + Pd.SetPz(k); + Pd.SetTheta(theta + TMath::Pi()); + Pd.SetPhi(phi + TMath::Pi()); + + PD.RotateY(TMath::Pi()/2.); + PD.RotateZ(normOfReactionPlane); + + Pd.RotateY(TMath::Pi()/2.); + Pd.RotateZ(normOfReactionPlane); + + //Transform to Lab frame; + TVector3 boost = PB.BoostVector(); + + PD.Boost(boost); + Pd.Boost(boost); + + return 1; + } + private: - TLorentzVector PB, Pd, PD; - - double mB, mD, md; - double theta; - - TF1 * f1; - - bool isMotherSet; - double Q; - double k; // momentum in B-frame - double dTheta; // change of angle + TLorentzVector PB, Pd, PD; + + double mB, mD, md; + double zB, zD, zd; + double theta; + + TF1 * f1; + + bool isMotherSet; + double Q; + double k; // momentum in B-frame + double dTheta; // change of angle }; Decay::Decay(){ - TLorentzVector temp(0,0,0,0); - PB = temp; - Pd = temp; - PD = temp; + TLorentzVector temp(0,0,0,0); + PB = temp; + Pd = temp; + PD = temp; + + mB = TMath::QuietNaN(); + mD = TMath::QuietNaN(); + md = TMath::QuietNaN(); + + zB = 0; + zD = 0; + zd = 0; + + theta = TMath::QuietNaN(); - mB = TMath::QuietNaN(); - mD = TMath::QuietNaN(); - md = TMath::QuietNaN(); - theta = TMath::QuietNaN(); - - k = TMath::QuietNaN(); - - Q = TMath::QuietNaN(); - dTheta = TMath::QuietNaN(); - isMotherSet = false; - - f1 = new TF1("f1", "(1+ROOT::Math::legendre(2,x))/2.", -1, 1); + k = TMath::QuietNaN(); + + Q = TMath::QuietNaN(); + dTheta = TMath::QuietNaN(); + isMotherSet = false; + + f1 = new TF1("f1", "(1+ROOT::Math::legendre(2,x))/2.", -1, 1); } Decay::~Decay(){ - delete f1; + delete f1; } diff --git a/Cleopatra/ClassHelios.h b/Cleopatra/ClassHelios.h index 30ea62b..ed1a908 100644 --- a/Cleopatra/ClassHelios.h +++ b/Cleopatra/ClassHelios.h @@ -133,34 +133,40 @@ public: trajectory GetTrajectory_B() const {return orbitB;} DetGeo GetDetectorGeometry() const {return detGeo;} + Array GetArrayGeometry() const {return array;} - TString GetHitMessage() const {return hitMessage;} - TString GetAcceptanceMessage() const {return accMessage;} + TString GetHitMessage() {return hitMessage;} + TString GetAcceptanceMessage() { AcceptanceCodeToMsg(acceptanceCode); return acceptanceMsg;} + TString AcceptanceCodeToMsg(short code ); + private: - DetGeo detGeo; - Array array; - - trajectory orbitb, orbitB; - - double e,detX ; ///energy of light recoil, position X - double rhoHit; /// radius of particle-b hit on recoil detector - - double eB; ///energy of heavy recoil - - bool isDetReady; + DetGeo detGeo; + Array array; + + trajectory orbitb, orbitB; + + double e,detX ; ///energy of light recoil, position X + double rhoHit; /// radius of particle-b hit on recoil detector + + double eB; ///energy of heavy recoil + + bool isDetReady; + + TString hitMessage; + TString acceptanceMsg; //acceptance check + short acceptanceCode; + + double xOff, yOff; // beam position + + bool overrideDetDistance; + bool overrideFirstPos; + bool isCoincidentWithRecoil; + + const double c = 299.792458; //mm/ns - TString hitMessage; - TString accMessage; //acceptance check - - double xOff, yOff; // beam position - bool overrideDetDistance; - bool overrideFirstPos; - bool isCoincidentWithRecoil; - - const double c = 299.792458; //mm/ns }; HELIOS::HELIOS(){ @@ -179,7 +185,8 @@ HELIOS::HELIOS(){ isDetReady = false; hitMessage = ""; - accMessage = ""; + acceptanceMsg = ""; + acceptanceCode = 0; overrideDetDistance = false; overrideFirstPos = false; @@ -257,108 +264,137 @@ void HELIOS::PrintGeometry() const{ } +TString HELIOS::AcceptanceCodeToMsg(short code ){ + + switch(code){ + case 3 : acceptanceMsg = "try one more loop"; break; + case 2 : acceptanceMsg = "hit less than the nearest array. increase loop"; break; + case 1 : acceptanceMsg = "GOOD!! hit Array"; break; + + case 0 : acceptanceMsg = "detector geometry incomplete."; break; + case -1 : acceptanceMsg = "array at upstream, z is downstream."; break; + case -2 : acceptanceMsg = "array at downstream, z is upstream."; break; + case -3 : acceptanceMsg = "hit at the XY gap."; break; + case -4 : acceptanceMsg = "hit more upstream than the array length"; break; + case -5 : acceptanceMsg = "hit more downstream than the array length"; break; + case -6 : acceptanceMsg = "hit blocker"; break; + case -7 : acceptanceMsg = "hit array Z-gap"; break; + + case -10 : acceptanceMsg = "rho is too big"; break; + case -11 : acceptanceMsg = "rho is too small"; break; + case -12 : acceptanceMsg = "light recoil blocked by recoil detector"; break; + case -13 : acceptanceMsg = "more than 3 loops."; break; + case -14 : acceptanceMsg = "heavy recoil does not hit recoil detector"; break; + case -15 : acceptanceMsg = "det Row ID == -1"; break; + default : acceptanceMsg = "unknown error."; break; + } + + return acceptanceMsg; + +} + int HELIOS::CheckDetAcceptance(){ - //CalArrayHit and CalRecoilHit must be done before. - - if( isDetReady == false ) return 0; + //CalArrayHit and CalRecoilHit must be done before. + + if( isDetReady == false ) { acceptanceCode = 0; return acceptanceCode; } - // -1 ========= when recoil direction is not same side of array - if( array.firstPos < 0 && orbitb.z > 0 ) {accMessage = "array at upstream, z is downstream."; return -1;} - if( array.firstPos > 0 && orbitb.z < 0 ) {accMessage = "array at downstream, z is upstream."; return -1;} + // -1 ========= when recoil direction is not same side of array + if( array.firstPos < 0 && orbitb.z > 0 ) {acceptanceCode = -1; return acceptanceCode;} + + // -2 ========= when recoil direction is not same side of array + if( array.firstPos > 0 && orbitb.z < 0 ) {acceptanceCode = -2; return acceptanceCode;} - // -11 ======== rho is too small - if( 2 * orbitb.rho < array.detPerpDist ) { accMessage = "rho is too small"; return -11;} - - // -15 ========= if detRowID == -1, should be (2 * orbitb.rho < perpDist) - if( orbitb.detRowID == -1 ) {accMessage = "det Row ID == -1"; return -15;} - - // -10 =========== when rho is too big . - if( detGeo.bore < 2 * orbitb.rho) { accMessage = "rho is too big"; return -10;} - - // -14 ========== check particle-B hit radius on recoil dectector - if( isCoincidentWithRecoil && orbitB.R > detGeo.recoilOuterRadius ) { - accMessage = "heavy recoil does not hit recoil detector"; - return -14; - } - //if( isCoincidentWithRecoil && (orbitB.R > rhoRecoilout || orbitB.R < rhoRecoilin) ) return -14; - - // -12 ========= check is particle-b was blocked by recoil detector - rhoHit = GetR(detGeo.recoilPos); - if( orbitb.z > 0 && detGeo.recoilPos > 0 && orbitb.z > detGeo.recoilPos && rhoHit < detGeo.recoilOuterRadius ) { accMessage = "light recoil blocked by recoil detector"; return -12;} - if( orbitb.z < 0 && detGeo.recoilPos < 0 && orbitb.z < detGeo.recoilPos && rhoHit < detGeo.recoilOuterRadius ) { accMessage = "light recoil blocked by recoil detector"; return -12;} - - // -13 ========= not more than 3 loops - if( orbitb.loop > 3 ) {accMessage = "more than 3 loops."; return -13;} - - // -2 ========= calculate the "y"-distance from detector center - if( sqrt(orbitb.R*orbitb.R - array.detPerpDist * array.detPerpDist)> array.detWidth/2 ) { accMessage = "hit at the XY gap."; return -2;} - - // -3 ==== when zPos further the range of whole array, more loop would not save - if( array.firstPos < 0 && orbitb.z < array.detPos[0] - array.detLength ) { accMessage = "hit more upstream than the array length"; return -3; } - if( array.firstPos > 0 && orbitb.z > array.detPos[array.nDet-1] + array.detLength ) { accMessage = "hit more downstream than the array length"; return -3;} + // -11 ======== rho is too small + if( 2 * orbitb.rho < array.detPerpDist ) { acceptanceCode = -11; return acceptanceCode;} + + // -15 ========= if detRowID == -1, should be (2 * orbitb.rho < perpDist) + if( orbitb.detRowID == -1 ) {acceptanceCode = -15; return acceptanceCode;} + + // -10 =========== when rho is too big . + if( detGeo.bore < 2 * orbitb.rho) { acceptanceCode = -10; return acceptanceCode;} + + // -14 ========== check particle-B hit radius on recoil dectector + if( isCoincidentWithRecoil && orbitB.R > detGeo.recoilOuterRadius ) {acceptanceCode = -14; return acceptanceCode;} - // -4 ======== Hit on blacker - if( array.blocker != 0 && array.firstPos > 0 && array.detPos[0] - array.blocker < orbitb.z && orbitb.z < array.detPos[0] ) { accMessage = "hit blocker"; return -4;} - if( array.blocker != 0 && array.firstPos < 0 && array.detPos[array.nDet-1] < orbitb.z && orbitb.z < array.detPos[array.nDet-1] + array.blocker ) { accMessage = "hit blocker"; return -4;} + //if( isCoincidentWithRecoil && (orbitB.R > rhoRecoilout || orbitB.R < rhoRecoilin) ) return -14; + + // -12 ========= check is particle-b was blocked by recoil detector + rhoHit = GetR(detGeo.recoilPos); + if( orbitb.z > 0 && detGeo.recoilPos > 0 && orbitb.z > detGeo.recoilPos && rhoHit < detGeo.recoilOuterRadius ) { acceptanceCode = -12; return acceptanceCode;} + if( orbitb.z < 0 && detGeo.recoilPos < 0 && orbitb.z < detGeo.recoilPos && rhoHit < detGeo.recoilOuterRadius ) { acceptanceCode = -12; return acceptanceCode;} + + // -13 ========= not more than 3 loops + if( orbitb.loop > 3 ) {acceptanceCode = -13; return acceptanceCode;} + + // -3 ========= calculate the "y"-distance from detector center + if( sqrt(orbitb.R*orbitb.R - array.detPerpDist * array.detPerpDist)> array.detWidth/2 ) { acceptanceCode = -3; return acceptanceCode;} + + // -4, -5 ==== when zPos further the range of whole array, more loop would not save + if( array.firstPos < 0 && orbitb.z < array.detPos[0] - array.detLength ) { acceptanceCode = -4; return acceptanceCode;} + if( array.firstPos > 0 && orbitb.z > array.detPos[array.nDet-1] + array.detLength ) { acceptanceCode = -5; return acceptanceCode;} - // 2 ====== when zPos less then the nearest position, more loop may hit - int increaseLoopFlag = 0; - if( array.firstPos < 0 && array.detPos[array.nDet-1] < orbitb.z ) increaseLoopFlag = 2; - if( array.firstPos > 0 && array.detPos[0] > orbitb.z ) increaseLoopFlag = 2; - if (increaseLoopFlag == 2 ) { - orbitb.z += orbitb.z0; - orbitb.effLoop += 1.0; - orbitb.loop += 1; - orbitb.t = orbitb.t0 * orbitb.effLoop; - accMessage = " hit less than the nearest array. increase loop "; - return 2; - } + // -6 ======== Hit on blacker + if( array.blocker != 0 && array.firstPos > 0 && array.detPos[0] - array.blocker < orbitb.z && orbitb.z < array.detPos[0] ) {acceptanceCode = -6; return acceptanceCode;} + if( array.blocker != 0 && array.firstPos < 0 && array.detPos[array.nDet-1] < orbitb.z && orbitb.z < array.detPos[array.nDet-1] + array.blocker ) { acceptanceCode = -6; return acceptanceCode;} + + // 2 ====== when zPos less then the nearest position, more loop may hit + int increaseLoopFlag = 0; + if( array.firstPos < 0 && array.detPos[array.nDet-1] < orbitb.z ) increaseLoopFlag = 2; + if( array.firstPos > 0 && array.detPos[0] > orbitb.z ) increaseLoopFlag = 2; + if (increaseLoopFlag == 2 ) { + orbitb.z += orbitb.z0; + orbitb.effLoop += 1.0; + orbitb.loop += 1; + orbitb.t = orbitb.t0 * orbitb.effLoop; + acceptanceCode = 2; + return acceptanceCode; + } - // 1 ======= check hit array z- position - if( array.firstPos < 0 ){ - for( int i = 0; i < array.nDet; i++){ - if( array.detPos[i] - array.detLength <= orbitb.z && orbitb.z <= array.detPos[i]) { - orbitb.detID = i; - detX = ( orbitb.z - (array.detPos[i] + array.detLength/2 ))/ array.detLength * 2 ;// range from -1 , 1 - accMessage = "hit array"; - return 1; - } - } - }else{ - for( int i = 0; i < array.nDet ; i++){ - if( array.detPos[i] <= orbitb.z && orbitb.z <= array.detPos[i] + array.detLength) { - ///printf(" %d | %f < z = %f < %f \n", i, array.detPos[i], orbitb.z, array.detPos[i]+length); - orbitb.detID = i; - detX = ( orbitb.z - (array.detPos[i] - array.detLength/2 ))/ array.detLength*2 ;// range from -1 , 1 - accMessage = "hit array"; - return 1; - } + // 1 ======= check hit array z- position + if( array.firstPos < 0 ){ + for( int i = 0; i < array.nDet; i++){ + if( array.detPos[i] - array.detLength <= orbitb.z && orbitb.z <= array.detPos[i]) { + orbitb.detID = i; + detX = ( orbitb.z - (array.detPos[i] + array.detLength/2 ))/ array.detLength * 2 ;// range from -1 , 1 + acceptanceCode = 1; + return acceptanceCode; } - } + } + }else{ + for( int i = 0; i < array.nDet ; i++){ + if( array.detPos[i] <= orbitb.z && orbitb.z <= array.detPos[i] + array.detLength) { + ///printf(" %d | %f < z = %f < %f \n", i, array.detPos[i], orbitb.z, array.detPos[i]+length); + orbitb.detID = i; + detX = ( orbitb.z - (array.detPos[i] - array.detLength/2 ))/ array.detLength*2 ;// range from -1 , 1 + acceptanceCode = 1; + return acceptanceCode; + } + } + } - // -5 ======== check hit array gap - if( array.firstPos < 0 ){ - for( int i = 0; i < array.nDet-1 ; i++){ - if( array.detPos[i] < orbitb.z && orbitb.z < array.detPos[i+1] - array.detLength ) { accMessage = "hit array Z-gap"; return -5; }//increaseLoopFlag = 3; - } - }else{ - for( int i = 0; i < array.nDet-1 ; i++){ - if( array.detPos[i] + array.detLength < orbitb.z && orbitb.z < array.detPos[i+1] ) { accMessage = "hit array Z-gap"; return -5; }//increaseLoopFlag = 3; - } - } - if (increaseLoopFlag == 3 ) { - orbitb.z += orbitb.z0; - orbitb.effLoop += 1.0; - orbitb.loop += 1; - orbitb.t = orbitb.t0 * orbitb.effLoop; - accMessage = " try one more loop. "; - return 3; - } + // -7 ======== check hit array gap + if( array.firstPos < 0 ){ + for( int i = 0; i < array.nDet-1 ; i++){ + if( array.detPos[i] < orbitb.z && orbitb.z < array.detPos[i+1] - array.detLength ) { acceptanceCode = -7; return acceptanceCode; }//increaseLoopFlag = 3; + } + }else{ + for( int i = 0; i < array.nDet-1 ; i++){ + if( array.detPos[i] + array.detLength < orbitb.z && orbitb.z < array.detPos[i+1] ) { acceptanceCode = -7; return acceptanceCode; }//increaseLoopFlag = 3; + } + } + if (increaseLoopFlag == 3 ) { + orbitb.z += orbitb.z0; + orbitb.effLoop += 1.0; + orbitb.loop += 1; + orbitb.t = orbitb.t0 * orbitb.effLoop; + acceptanceCode = 3; + return acceptanceCode; + } - accMessage = " unknown reason "; - return -20; // for unknown reason + acceptanceCode = -20 ; + return acceptanceCode; // for unknown reason } void HELIOS::CalTrajectoryPara(TLorentzVector P, bool isLightRecoil){ diff --git a/Cleopatra/ClassTransfer.h b/Cleopatra/ClassTransfer.h index c4c38d5..3578e66 100644 --- a/Cleopatra/ClassTransfer.h +++ b/Cleopatra/ClassTransfer.h @@ -22,18 +22,10 @@ class TransferReaction { public: TransferReaction(){Inititization();}; - TransferReaction(int beamA, int beamZ, - int targetA, int targetZ, - int recoilA, int recoilZ, float beamEnergy_AMeV){ - Inititization(); - SetReactionSimple(beamA, beamZ, - targetA, targetZ, - recoilA, recoilZ, beamEnergy_AMeV); - } - TransferReaction(string configFile, unsigned short ID = 0){ - Inititization(); - SetReactionFromFile(configFile, ID); - } + TransferReaction(string configFile, unsigned short ID = 0); + TransferReaction(int beamA, int beamZ, + int targetA, int targetZ, + int recoilA, int recoilZ, float beamEnergy_AMeV); ~TransferReaction(); @@ -43,18 +35,20 @@ public: void SetB(int A, int Z); void SetIncidentEnergyAngle(double KEA, double theta, double phi); + void SetReactionFromFile(std::string configFile, unsigned short ID = 0); void SetReactionSimple(int beamA, int beamZ, int targetA, int targetZ, int recoilA, int recoilZ, float beamEnergy_AMeV); void SetExA(double Ex); void SetExB(double Ex); - void SetReactionFromFile(string configFile, unsigned short ID = 0); - + TString GetReactionName(); TString GetReactionName_Latex(); - ReactionConfig GetRectionConfig() { return config;} + ReactionConfig GetRectionConfig() { return config;} + Recoil GetRecoil() { return recoil;} + ExcitedEnergies GetExList() { return exList;} double GetMass_A() const {return mA + ExA;} double GetMass_a() const {return ma;} @@ -65,27 +59,28 @@ public: double GetQValue() {return mA + ExA + ma - mb - mB - ExB;} double GetMaxExB() {return Etot - mb - mB;} - TLorentzVector GetPA(){return PA;} - TLorentzVector GetPa(){return Pa;} - TLorentzVector GetPb(){return Pb;} - TLorentzVector GetPB(){return PB;} + TLorentzVector GetPA() const {return PA;} + TLorentzVector GetPa() const {return Pa;} + TLorentzVector GetPb() const {return Pb;} + TLorentzVector GetPB() const {return PB;} void PrintFourVectors() const; void PrintReaction() const; + double CalkCM(double ExB); //momentum at CM frame void CalReactionConstant(); - + std::pair CalExThetaCM(double e, double z, double Bfield, double a); void Event(double thetaCM_rad, double phiCM_rad); double GetMomentumbCM() {return p;} double GetReactionBeta() {return beta;} double GetReactionGamma() {return gamma;} double GetCMTotalEnergy() {return Etot;} - - std::pair CalExThetaCM(double e, double z, double Bfield, double a); + double GetEZSlope(double BField) {return 299.792458 * recoil.lightZ * abs(BField) / TMath::TwoPi() * beta / 1000.;} // MeV/mm private: + ExcitedEnergies exList; Recoil recoil; ReactionConfig config; @@ -103,6 +98,7 @@ private: double beta, gamma; //CM boost beta double Etot; double p; // CM frame momentum of b, B + double slope; // slope of the TLorentzVector PA, Pa, Pb, PB; @@ -112,6 +108,20 @@ private: }; +TransferReaction::TransferReaction(string configFile, unsigned short ID){ + Inititization(); + SetReactionFromFile(configFile, ID); +} + +TransferReaction::TransferReaction(int beamA, int beamZ, + int targetA, int targetZ, + int recoilA, int recoilZ, float beamEnergy_AMeV){ + Inititization(); + SetReactionSimple(beamA, beamZ, + targetA, targetZ, + recoilA, recoilZ, beamEnergy_AMeV); +} + void TransferReaction::Inititization(){ thetaIN = 0.; @@ -224,7 +234,10 @@ void TransferReaction::SetReactionFromFile(string configFile, unsigned short ID) SetA(config.beamA, config.beamZ); Seta(config.targetA, config.targetZ); + SetExA(config.beamEx); + recoil = config.recoil[ID]; + exList = config.exList[ID]; Setb(recoil.lightA, recoil.lightZ); SetB(recoil.heavyA, recoil.heavyZ); @@ -261,10 +274,15 @@ TString TransferReaction::format(TString name){ } TString TransferReaction::GetReactionName_Latex(){ TString rName; - rName.Form("%s(%s,%s)%s", format(nameA).Data(), format(namea).Data(), format(nameb).Data(), format(nameB).Data()); + rName.Form("%s(%s,%s)%s @ %.2f MeV/u", format(nameA).Data(), format(namea).Data(), format(nameb).Data(), format(nameB).Data(), config.beamEnergy); return rName; } +double TransferReaction::CalkCM(double ExB){ + if( !isBSet || !isReady) return TMath::QuietNaN(); + return TMath::Sqrt( (Etot*Etot - TMath::Power(mb + mB + ExB,2)) * (Etot*Etot - TMath::Power(mb - mB - ExB,2)) ) / 2 / Etot; +} + void TransferReaction::CalReactionConstant(){ if( !isBSet){ recoil.heavyA = config.beamA + config.targetA - recoil.lightA; @@ -278,12 +296,10 @@ void TransferReaction::CalReactionConstant(){ beta = k / (mA + ExA + ma + T); gamma = 1 / TMath::Sqrt(1- beta * beta); Etot = TMath::Sqrt(TMath::Power(mA + ExA + ma + T,2) - k * k); - p = TMath::Sqrt( (Etot*Etot - TMath::Power(mb + mB + ExB,2)) * (Etot*Etot - TMath::Power(mb - mB - ExB,2)) ) / 2 / Etot; PA.SetXYZM(0, 0, k, mA + ExA); PA.RotateY(thetaIN); - PA.RotateZ(phiIN); - + PA.RotateZ(phiIN); Pa.SetXYZM(0,0,0,ma); PA.SetUniqueID(config.beamZ); @@ -292,6 +308,8 @@ void TransferReaction::CalReactionConstant(){ PB.SetUniqueID(recoil.heavyZ); isReady = true; + p = CalkCM(ExB); + } void TransferReaction::PrintFourVectors() const { @@ -315,7 +333,7 @@ void TransferReaction::PrintReaction() const { printf("------------------------------ Beam\n"); printf(" beam : A = %3d, Z = %2d, Ex = %.2f MeV\n", config.beamA, config.beamZ, config.beamEx); printf(" beam Energy : %.2f +- %.2f MeV/u, dE/E = %5.2f %%\n", config.beamEnergy, config.beamEnergySigma, config.beamEnergySigma/config.beamEnergy); - printf(" Angle : %.2f +- %.2f mrad\n", config.beamAngle, config.beamAngleSigma); + printf(" Angle : %.2f +- %.2f mrad\n", config.beamTheta, config.beamThetaSigma); printf(" offset : (x,y) = (%.2f, %.2f) mmm \n", config.beamX, config.beamY); printf("------------------------------ Target\n"); @@ -325,14 +343,14 @@ void TransferReaction::PrintReaction() const { printf(" light : A = %3d, Z = %2d \n", recoil.lightA, recoil.lightZ); printf(" heavy : A = %3d, Z = %2d \n", recoil.heavyA, recoil.heavyZ); printf("=====================================================\n"); + exList.Print(); + printf("=====================================================\n"); } void TransferReaction::Event(double thetaCM_rad, double phiCM_rad){ - if( isReady == false ){ - CalReactionConstant(); - } + if( !isReady ) CalReactionConstant(); //---- to CM frame TLorentzVector Pc = PA + Pa; diff --git a/Cleopatra/Cleopatra b/Cleopatra/Cleopatra new file mode 100755 index 0000000000000000000000000000000000000000..7dea56f4c197b1f3adf9f5b4ae2066e8a9be6658 GIT binary patch literal 276616 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
v_=&{dw(yIH|H;DdBK{W(f0+1Y3;#Xw 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

|?zg{`fGtg5*I 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 Ry+7g*UGP(_7pz<7{{g=Ls&D`R literal 0 HcmV?d00001 diff --git a/Cleopatra/Cleopatra.C b/Cleopatra/Cleopatra.C index 40133ae..f20b83b 100644 --- a/Cleopatra/Cleopatra.C +++ b/Cleopatra/Cleopatra.C @@ -78,11 +78,10 @@ int main (int argc, char *argv[]) { //TODO add angle range InFileCreator( readFile, ptolemyInFileName, angMin, angMax, angStep); //================= run ptolemy - char command[200]; string ptolemyOutFileName = argv[1]; ptolemyOutFileName += ".out"; - sprintf(command, "./ptolemy <%s> %s", ptolemyInFileName.c_str(), ptolemyOutFileName.c_str()); + sprintf(command, "../Cleopatra/ptolemy <%s> %s", ptolemyInFileName.c_str(), ptolemyOutFileName.c_str()); printf("=================== Run Ptolemy\n"); printf("%s \n", command); system(command); diff --git a/Cleopatra/ExtractXSec.h b/Cleopatra/ExtractXSec.h index 668de9b..ae85cf9 100644 --- a/Cleopatra/ExtractXSec.h +++ b/Cleopatra/ExtractXSec.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include "../Armory/AnalysisLib.h" @@ -293,26 +294,9 @@ int ExtractXSec (string readFile, int indexForElastic=1) { } printf("---------------------------------------------------\n"); - //================================== save *.Ex.txt - string saveExName = readFile; - int len = saveExName.length(); - saveExName = saveExName.substr(0, len - 4); - saveExName += ".Ex.txt"; - printf("Output : %s \n", saveExName.c_str()); - FILE * file_Ex; - file_Ex = fopen(saveExName.c_str(), "w+"); - - fprintf(file_Ex, "//generated_by_ExtractXSec.h____Ex____Xsec(4pi)____SF____sigma\n"); - - for( int i = 0; i < numCal ; i++){ - fprintf(file_Ex, "%9.5f %9.5f 1.0 0.000\n", Ex[i], partialXsec[i]); - } - fprintf(file_Ex, "#=====End_of_File\n"); - fclose(file_Ex); - //================================== save file.Xsec.txt string saveFileName = readFile; - len = saveFileName.length(); + int len = saveFileName.length(); saveFileName = saveFileName.substr(0, len - 4); saveFileName += ".Xsec.txt"; printf("Output : %s \n", saveFileName.c_str()); @@ -324,7 +308,7 @@ int ExtractXSec (string readFile, int indexForElastic=1) { } int space = 19; - fprintf(file_out, "%8s\t", "Angel"); + fprintf(file_out, "%8s\t", "Angle"); for( int i = 0; i < numCal ; i++){ fprintf(file_out, "%*s", space, title[i].c_str()); } @@ -338,6 +322,14 @@ int ExtractXSec (string readFile, int indexForElastic=1) { fprintf(file_out, "\n"); } fclose(file_out); + + //================================== Make TMacro for ExList + + TMacro ExList; + ExList.AddLine("#---Ex relative_xsec SF sigma_in_MeV"); + for( int i = 0; i < numCal ; i++){ + ExList.AddLine(Form("%9.5f %9.5f 1.0 0.000", Ex[i], partialXsec[i])); + } //================================== Save in ROOT len = saveFileName.length(); @@ -345,8 +337,8 @@ int ExtractXSec (string readFile, int indexForElastic=1) { TString fileName = saveFileName; fileName += ".root"; printf("Output : %s \n", fileName.Data()); + TFile * fileOut = new TFile(fileName, "RECREATE" ); - gList = new TObjArray(); ///no SetTitle() method for TObjArray gList->SetName("TGraph of d.s.c"); TObjArray * fList = new TObjArray(); @@ -372,12 +364,11 @@ int ExtractXSec (string readFile, int indexForElastic=1) { fList->Add(dist[i]); - //delete tempFunc; - } - gList->Write("qList", 1); - fList->Write("pList", 1); - + gList->Write("thetaCM_TGraph", 1); + fList->Write("thetaCM_TF1", 1); + + ExList.Write("ExList"); fileOut->Write(); fileOut->Close(); diff --git a/Cleopatra/FindThetaCM.h b/Cleopatra/FindThetaCM.h index 3e124df..6d74cd4 100644 --- a/Cleopatra/FindThetaCM.h +++ b/Cleopatra/FindThetaCM.h @@ -21,7 +21,7 @@ void FindThetaCM(double Ex, int nDivision=1, double XRATION = 0.95, std::string basicConfig="reactionConfig.txt", - std::string detGeoFileName = "detectorGeo.txt"){ + std::string detGeoFileName = "detectorGeo.txt", unsigned short ID = 0){ //---- reaction int AA, zA; //beam @@ -35,24 +35,24 @@ void FindThetaCM(double Ex, int nDivision=1, double XRATION = 0.95, double xBeam, yBeam; // mm /**///========================================================= load files - ReactionConfig reactionConfig; + ReactionConfig reConfig; DetGeo detGeo; - if( reactionConfig.LoadReactionConfig(basicConfig) ){ + if( reConfig.LoadReactionConfig(basicConfig) ){ - KEAmean = reactionConfig.beamEnergy; - KEAsigma = reactionConfig.beamEnergySigma; + KEAmean = reConfig.beamEnergy; + KEAsigma = reConfig.beamEnergySigma; - thetaMean = reactionConfig.beamAngle; - thetaSigma = reactionConfig.beamAngleSigma; + thetaMean = reConfig.beamTheta; + thetaSigma = reConfig.beamThetaSigma; - xBeam = reactionConfig.beamX; - yBeam = reactionConfig.beamY; + xBeam = reConfig.beamX; + yBeam = reConfig.beamY; - AA = reactionConfig.beamA; zA = reactionConfig.beamZ; - Aa = reactionConfig.targetA; za = reactionConfig.targetZ; - Ab = reactionConfig.recoilLightA; zb = reactionConfig.recoilLightZ; + AA = reConfig.beamA; zA = reConfig.beamZ; + Aa = reConfig.targetA; za = reConfig.targetZ; + Ab = reConfig.recoil[ID].lightA; zb = reConfig.recoil[ID].lightZ; - ExA = reactionConfig.beamEx[0]; + ExA = reConfig.beamEx; }else{ printf("cannot load %s \n", basicConfig.c_str()); @@ -97,12 +97,12 @@ void FindThetaCM(double Ex, int nDivision=1, double XRATION = 0.95, printf("----- loading detector geometery : %s.", detGeoFileName.c_str()); if(detGeo.LoadDetectorGeo(detGeoFileName) ){ - pos = detGeo.array1.detPos; - a = detGeo.array1.detPerpDist; - length = detGeo.array1.detLength; - firstPos = detGeo.array1.firstPos; - iDet = detGeo.array1.nDet; - jDet = detGeo.array1.mDet; + pos = detGeo.array[ID].detPos; + a = detGeo.array[ID].detPerpDist; + length = detGeo.array[ID].detLength; + firstPos = detGeo.array[ID].firstPos; + iDet = detGeo.array[ID].nDet; + jDet = detGeo.array[ID].mDet; BField = detGeo.Bfield; printf("... done.\n"); diff --git a/Cleopatra/PlotSimulation.C b/Cleopatra/PlotSimulation.C deleted file mode 100644 index e3080c1..0000000 --- a/Cleopatra/PlotSimulation.C +++ /dev/null @@ -1,31 +0,0 @@ - -#include -#include -#include "Check_Simulation.C" - -using namespace std; - -int main (int argc, char *argv[]) { - - printf("=================================================================\n"); - printf("=================== Plot Simulation Canvas ======================\n"); - printf("=================================================================\n"); - - if(argc < 2 ) { - printf("Usage: ./PlotSimulation input_root_file [config]\n"); - exit(0); - }else{ - printf("ROOT file : %s \n", argv[1]); - } - - string rootFile = argv[1]; - string config = "../Armory/Check_Simulation_Config.txt"; - if( argc >= 3 ) config = argv[2]; - - printf("Config File : %s \n", config.c_str()); - - Int_t padSize = 500; - - Check_Simulation(rootFile, config, padSize, true); - -} diff --git a/Cleopatra/PlotTGraphTObjArray.h b/Cleopatra/PlotTGraphTObjArray.h index f6d3403..d646f5b 100644 --- a/Cleopatra/PlotTGraphTObjArray.h +++ b/Cleopatra/PlotTGraphTObjArray.h @@ -30,7 +30,7 @@ void PlotTGraphTObjArray(TString rootFileName, bool isSavePNG = false){ TFile * file = new TFile(rootFileName, "READ"); - TObjArray * gList = (TObjArray *) file->FindObjectAny("qList"); + TObjArray * gList = (TObjArray *) file->FindObjectAny("thetaCM_TGraph"); if( gList == NULL ) { printf("No Result was found.\n"); diff --git a/Cleopatra/Transfer.C b/Cleopatra/Transfer.C index ffe99cb..3f851e3 100644 --- a/Cleopatra/Transfer.C +++ b/Cleopatra/Transfer.C @@ -24,16 +24,15 @@ int main (int argc, char *argv[]) { printf("========== Simulate Transfer reaction in HELIOS ==========\n"); printf("=================================================================\n"); - if(argc == 2 || argc > 8) { - printf("Usage: ./Transfer [1] [2] [3] [4] [5] [6] [7]\n"); + if(argc == 2 || argc > 7) { + printf("Usage: ./Transfer [1] [2] [3] [4] [5] [6]\n"); printf(" default file name \n"); printf(" [1] reactionConfig.txt (input) reaction Setting \n"); printf(" [2] detectorGeo.txt (input) detector Setting \n"); - printf(" [3] Ex.txt (input) Excitation energies \n"); + printf(" [3] ID (input) detector & reaction ID (default = 0 ) \n"); printf(" [4] DWBA.root (input) thetaCM distribution from DWBA \n"); printf(" [5] transfer.root (output) rootFile name for output \n"); - printf(" [6] reaction.dat (output) Key reaction parameters \n"); - printf(" [7] plot (input) will it plot stuffs [1/0] \n"); + printf(" [6] plot (input) will it plot stuffs [1/0] \n"); printf("------------------------------------------------------\n"); return 0 ; @@ -41,21 +40,19 @@ int main (int argc, char *argv[]) { string basicConfig = "reactionConfig.txt"; string heliosDetGeoFile = "detectorGeo.txt"; - string excitationFile = "Ex.txt"; //when no file, only ground state + int ID = 0; TString ptolemyRoot = "DWBA.root"; // when no file, use isotropic distribution of thetaCM TString saveFileName = "transfer.root"; - TString filename = "reaction.dat"; //when no file, no output bool isPlot = false; if( argc >= 2) basicConfig = argv[1]; if( argc >= 3) heliosDetGeoFile = argv[2]; - if( argc >= 4) excitationFile = argv[3]; + if( argc >= 4) ID = atoi(argv[3]); if( argc >= 5) ptolemyRoot = argv[4]; if( argc >= 6) saveFileName = argv[5]; - if( argc >= 7) filename = argv[6]; - if( argc >= 8) isPlot = atoi(argv[7]); + if( argc >= 7) isPlot = atoi(argv[7]); - Transfer( basicConfig, heliosDetGeoFile, excitationFile, ptolemyRoot, saveFileName, filename); + Transfer( basicConfig, heliosDetGeoFile, ID, ptolemyRoot, saveFileName); //run Armory/Check_Simulation if( isPlot ){ diff --git a/Cleopatra/Transfer.h b/Cleopatra/Transfer.h index 861b15b..ef98d46 100644 --- a/Cleopatra/Transfer.h +++ b/Cleopatra/Transfer.h @@ -23,185 +23,159 @@ double exDistFunc(Double_t *x, Double_t * par){ return par[(int) x[0]]; } +void PrintEZPlotPara(TransferReaction tran, HELIOS helios){ + + printf("==================================== E-Z plot slope\n"); + double betaRect = tran.GetReactionBeta() ; + double gamma = tran.GetReactionGamma(); + double mb = tran.GetMass_b(); + double pCM = tran.GetMomentumbCM(); + double q = TMath::Sqrt(mb*mb + pCM*pCM); ///energy of light recoil in center of mass + double slope = tran.GetEZSlope(helios.GetBField()); /// MeV/mm + printf(" e-z slope : %f MeV/mm\n", slope); + double intercept = q/gamma - mb; // MeV + printf(" e-z intercept (ground state) : %f MeV\n", intercept); + +} + void Transfer( - string basicConfig = "reactionConfig.txt", - string heliosDetGeoFile = "detectorGeo.txt", - string excitationFile = "Ex.txt", ///when no file, only ground state - TString ptolemyRoot = "DWBA.root", /// when no file, use isotropic distribution of thetaCM - TString saveFileName = "transfer.root", - TString filename = "reaction.dat"){ /// when no file, no output. + std::string basicConfig = "reactionConfig.txt", + std::string heliosDetGeoFile = "detectorGeo.txt", + unsigned short ID = 0, // this is the ID for the array + TString ptolemyRoot = "DWBA.root", + TString saveFileName = "transfer.root"){ //############################################# Set Reaction + TransferReaction transfer; - transfer.SetReactionFromFile(basicConfig); + HELIOS helios; + Decay decay; + + std::vector kbCM; /// momentum of b in CM frame + TF1 * exDist = nullptr; + + transfer.SetReactionFromFile(basicConfig, ID); + helios.SetDetectorGeometry(heliosDetGeoFile, ID); printf("*****************************************************************\n"); printf("*\e[1m\e[33m %27s \e[0m*\n", transfer.GetReactionName().Data()); printf("*****************************************************************\n"); printf("----- loading reaction setting from %s. \n", basicConfig.c_str()); - printf("\e[32m#################################### Beam \e[0m\n"); + printf("----- loading geometry setting from %s. \n", heliosDetGeoFile.c_str()); + + printf("\e[32m#################################### Reaction & HELIOS configuration\e[0m\n"); - const ReactionConfig reactionConfig = transfer.GetRectionConfig(); + transfer.PrintReaction(); - reactionConfig.PrintReactionConfig(); + if(transfer.GetRecoil().isDecay) { + decay.SetMotherDaugther(transfer.GetRecoil()); + } - vector ExAList = reactionConfig.beamEx; - int nExA = (int) ExAList.size(); + helios.PrintGeometry(); + PrintEZPlotPara(transfer, helios); - //############################################# Set HELIOS - printf("\e[32m#################################### HELIOS configuration\e[0m\n"); - HELIOS helios; - helios.SetDetectorGeometry(heliosDetGeoFile); - const DetGeo detGeo = helios.GetDetectorGeometry(); + DetGeo detGeo = helios.GetDetectorGeometry(); + Array array = helios.GetArrayGeometry(); + ReactionConfig reactConfig = transfer.GetRectionConfig(); + Recoil recoil = transfer.GetRecoil(); - printf("==================================== E-Z plot slope\n"); - double betaRect = transfer.GetReactionBeta() ; - double gamma = transfer.GetReactionGamma(); - double mb = transfer.GetMass_b(); - double pCM = transfer.GetMomentumbCM(); - double q = TMath::Sqrt(mb*mb + pCM*pCM); ///energy of light recoil in center of mass - double slope = 299.792458 * reactionConfig.recoilLightZ * abs(helios.GetBField()) / TMath::TwoPi() * betaRect / 1000.; /// MeV/mm - printf(" e-z slope : %f MeV/mm\n", slope); - double intercept = q/gamma - mb; // MeV - printf(" e-z intercept (ground state) : %f MeV\n", intercept); + //*############################################# save reaction.dat + // if( filename != "" ) { + // FILE * keyParaOut; + // keyParaOut = fopen (filename.Data(), "w+"); - //############################################# save reaction.dat - if( filename != "" ) { - FILE * keyParaOut; - keyParaOut = fopen (filename.Data(), "w+"); + // printf("=========== save key reaction constants to %s \n", filename.Data()); + // fprintf(keyParaOut, "%-15.4f //%s\n", transfer.GetMass_b(), "mass_b"); + // fprintf(keyParaOut, "%-15d //%s\n", reactConfig.recoilLightZ, "charge_b"); + // fprintf(keyParaOut, "%-15.8f //%s\n", transfer.GetReactionBeta(), "betaCM"); + // fprintf(keyParaOut, "%-15.4f //%s\n", transfer.GetCMTotalEnergy(), "Ecm"); + // fprintf(keyParaOut, "%-15.4f //%s\n", transfer.GetMass_B(), "mass_B"); + // fprintf(keyParaOut, "%-15.4f //%s\n", slope/betaRect, "alpha=slope/betaRect"); - printf("=========== save key reaction constants to %s \n", filename.Data()); - fprintf(keyParaOut, "%-15.4f //%s\n", transfer.GetMass_b(), "mass_b"); - fprintf(keyParaOut, "%-15d //%s\n", reactionConfig.recoilLightZ, "charge_b"); - fprintf(keyParaOut, "%-15.8f //%s\n", transfer.GetReactionBeta(), "betaCM"); - fprintf(keyParaOut, "%-15.4f //%s\n", transfer.GetCMTotalEnergy(), "Ecm"); - fprintf(keyParaOut, "%-15.4f //%s\n", transfer.GetMass_B(), "mass_B"); - fprintf(keyParaOut, "%-15.4f //%s\n", slope/betaRect, "alpha=slope/betaRect"); - - fflush(keyParaOut); - fclose(keyParaOut); - } + // fflush(keyParaOut); + // fclose(keyParaOut); + // } - //############################################# Target scattering, only energy loss - bool isTargetScattering = reactionConfig.isTargetScattering; - float density = reactionConfig.targetDensity; - float targetThickness = reactionConfig.targetThickness; + //*############################################# Target scattering, only energy loss + // bool isTargetScattering = reactConfig.isTargetScattering; + // float density = reactConfig.targetDensity; + // float targetThickness = reactConfig.targetThickness; - if(isTargetScattering) printf("\e[32m#################################### Target Scattering\e[0m\n"); - TargetScattering msA; - TargetScattering msB; - TargetScattering msb; + // if(isTargetScattering) printf("\e[32m#################################### Target Scattering\e[0m\n"); + // TargetScattering msA; + // TargetScattering msB; + // TargetScattering msb; - if(reactionConfig.isTargetScattering) printf("======== Target : (thickness : %6.2f um) x (density : %6.2f g/cm3) = %6.2f ug/cm2\n", - targetThickness * 1e+4, - density, - targetThickness * density * 1e+6); + // if(reactConfig.isTargetScattering) printf("======== Target : (thickness : %6.2f um) x (density : %6.2f g/cm3) = %6.2f ug/cm2\n", + // targetThickness * 1e+4, + // density, + // targetThickness * density * 1e+6); - if( reactionConfig.isTargetScattering ){ - msA.LoadStoppingPower(reactionConfig.beamStoppingPowerFile); - msb.LoadStoppingPower(reactionConfig.recoilLightStoppingPowerFile); - msB.LoadStoppingPower(reactionConfig.recoilHeavyStoppingPowerFile); - } + // if( reactConfig.isTargetScattering ){ + // msA.LoadStoppingPower(reactConfig.beamStoppingPowerFile); + // msb.LoadStoppingPower(reactConfig.recoilLightStoppingPowerFile); + // msB.LoadStoppingPower(reactConfig.recoilHeavyStoppingPowerFile); + // } - //############################################# Decay of particle-B - Decay decay; - if(reactionConfig.isDecay) { - printf("\e[32m#################################### Decay\e[0m\n"); - decay.SetMotherDaugther(reactionConfig.recoilHeavyA, - reactionConfig.recoilHeavyZ, - reactionConfig.heavyDecayA, - reactionConfig.heavyDecayZ); - } - //############################################# loading excitation energy - printf("\e[32m#################################### excitation energies\e[0m\n"); - vector ExKnown; - vector ExStrength; - vector ExWidth; - vector SF; - vector y0; /// intercept of e-z plot - vector kCM; /// momentum of b in CM frame - printf("----- loading excitation energy levels (%s).", excitationFile.c_str()); - ifstream file; - file.open(excitationFile.c_str()); - string isotopeName; - if( file.is_open() ){ - string line; - while( getline(file, line) ){ - ///printf("%s \n", line.c_str()); - if( line.substr(0,2) == "//" ) continue; - if( line.substr(0,2) == "#=" ) break; + //*############################################# Decay of particle-B + // Decay decay[2]; + // if(reactConfig.isDecay) { + // printf("\e[32m#################################### Decay\e[0m\n"); + // decay.SetMotherDaugther(reactConfig.recoilHeavyA, + // reactConfig.recoilHeavyZ, + // reactConfig.heavyDecayA, + // reactConfig.heavyDecayZ); + // } - vector str = AnalysisLib::SplitStr(line, " "); - - ExKnown.push_back(atof(str[0].c_str())); - ExStrength.push_back(atof(str[1].c_str())); - SF.push_back(atof(str[2].c_str())); - ExWidth.push_back(atof(str[3].c_str())); - - } - file.close(); - printf("... done.\n"); - int n = (int) ExKnown.size(); - - printf("%3s | %7s | %5s | %3s | %10s | %5s \n", "", "Ex[MeV]", "Xsec", "SF", "sigma[MeV]", "y0[MeV]"); - printf("----+---------+------+-----+------------+--------\n"); - for(int i = 0; i < n ; i++){ - transfer.SetExB(ExKnown[i]); - transfer.CalReactionConstant(); - kCM.push_back(transfer.GetMomentumbCM()); - y0.push_back(TMath::Sqrt(mb*mb + kCM[i]*kCM[i])/gamma - mb); - if( reactionConfig.isDecay ) { - TLorentzVector temp(0,0,0,0); - int decayID = decay.CalDecay(temp, ExKnown[i], 0); - if( decayID == 1) { - printf("%3d | %7.2f | %5.2f | %3.1f | %5.3f | %5.2f --> Decay. \n", i, ExKnown[i], ExStrength[i], SF[i], ExWidth[i], y0[i]); - }else{ - printf("%3d | %7.2f | %5.2f | %3.1f | %5.3f | %5.2f \n", i, ExKnown[i], ExStrength[i], SF[i], ExWidth[i], y0[i]); - } - }else{ - printf("%3d | %7.2f | %5.2f | %3.1f | %5.3f | %5.2f \n", i, ExKnown[i], ExStrength[i], SF[i], ExWidth[i], y0[i]); - } - } - printf("----+---------+-------+-----+------------+--------\n"); - }else{ - printf("... fail ------> only ground state.\n"); - ExKnown.push_back(0.0); - ExStrength.push_back(1.0); - ExWidth.push_back(0.0); - transfer.SetExB(ExKnown[0]); - transfer.CalReactionConstant(); - kCM.push_back(transfer.GetMomentumbCM()); - y0.push_back(TMath::Sqrt(mb*mb + kCM[0]*kCM[0])/gamma - mb); - } - - //---- create Ex-distribution - TF1 * exDist = NULL; - if( ExKnown.size() > 1 ) { - printf("---- creating Ex-distribution \n"); - int exSize = ExKnown.size(); - exDist = new TF1("exDist", exDistFunc, 0, exSize, exSize); - for(int i = 0; i < exSize; i++){ - exDist->SetParameter(i, ExStrength[i]*SF[i]); - } - } + ExcitedEnergies exList = transfer.GetRectionConfig().exList[ID]; //############################################# Load DWBAroot for thetaCM distribution printf("\e[32m#################################### Load DWBA input : %s \e[0m\n", ptolemyRoot.Data()); TF1 * dist = NULL; TFile * distFile = new TFile(ptolemyRoot, "read"); - TObjArray * distList = NULL; + TObjArray * distList = nullptr; + TMacro * dwbaExList = nullptr; if( distFile->IsOpen() ) { - distList = (TObjArray *) distFile->FindObjectAny("pList"); // the function List - int distSize = distList->GetLast() + 1; - if( distSize != ExKnown.size() ) { - printf(" The number of distribution from Ptolmey Calculation is not equal to number of Ex input \n"); - printf(" --> the Ptolmey calculation is probably not matched with Ex input.\n"); - printf(" .... not use DWBA input. \n"); - distFile->Close(); + printf("--------- Found DWBA thetaCM distributions. Use the ExList from DWBA.\n"); + + distList = (TObjArray *) distFile->FindObjectAny("thetaCM_TF1"); // the function List + + exList.Clear(); + + dwbaExList = (TMacro *) distFile->FindObjectAny("ExList"); + int numEx = dwbaExList->GetListOfLines()->GetSize() - 1 ; + for(int i = 1; i <= numEx ; i++){ + string temp = dwbaExList->GetListOfLines()->At(i)->GetName(); + if( temp[0] == '/' ) continue; + vector tempStr = AnalysisLib::SplitStr(temp, " "); + exList.Add( atof(tempStr[0].c_str()), atof(tempStr[1].c_str()), 1.0, 0.00); } + }else{ - printf("------- no DWBA input. \n"); + printf("------- no DWBA input. Use the ExList from %s\n", basicConfig.c_str()); + } + + + printf("------------------------------ Heavy Recoil excitation\n"); + printf("Energy[MeV] Rel.Xsec SF sigma\n"); + + int numEx = exList.ExList.size(); + + for( int j = 0; j < numEx; j++){ + double ex = exList.ExList[j].Ex; + kbCM.push_back(transfer.CalkCM(ex)); + int decayID = decay.CalDecay(TLorentzVector (0,0,0,0), ex, 0); + exList.ExList[j].Print(decayID == 1 ? "-->Decay" : "\n"); + } + + //---- create Ex-distribution + if( exList.ExList.size() > 1 ) { + printf("---- creating Ex-distribution \n"); + exDist = new TF1("exDist", exDistFunc, 0, numEx, numEx); + for(int q = 0; q < numEx; q++){ + exDist->SetParameter(q, exList.ExList[q].xsec*exList.ExList[q].SF); + } } //############################################# build tree @@ -211,36 +185,21 @@ void Transfer( TMacro config(basicConfig.c_str()); TMacro detGeoTxt(heliosDetGeoFile.c_str()); - TMacro exList(excitationFile.c_str()); - TMacro reactionData(filename.Data()); - double KEAmean = reactionConfig.beamEnergy; - TString str; - str.Form("%s @ %.2f MeV/u", transfer.GetReactionName_Latex().Data(), KEAmean); - config.SetName(str.Data()); + config.SetName(transfer.GetReactionName_Latex().Data()); config.Write("reactionConfig"); detGeoTxt.Write("detGeo"); - exList.Write("ExList"); - reactionData.Write("reactionData"); - + if( distList != NULL ) distList->Write("DWBA", 1); + if( dwbaExList != NULL ) dwbaExList->Write("DWBA_ExList", 1); + TMacro hitMeaning; - str = "=======================meaning of Hit ID\n"; hitMeaning.AddLine(str.Data()); - str = " 1 = light recoil hit array & heavy recoil hit recoil\n"; hitMeaning.AddLine(str.Data()); - str = " 0 = no detector\n"; hitMeaning.AddLine(str.Data()); - str = " -1 = light recoil go opposite side of array\n"; hitMeaning.AddLine(str.Data()); - str = " -2 = light recoil hit > det width\n"; hitMeaning.AddLine(str.Data()); - str = " -3 = light recoil hit > array \n"; hitMeaning.AddLine(str.Data()); - str = " -4 = light recoil hit blocker \n"; hitMeaning.AddLine(str.Data()); - str = " -10 = light recoil orbit radius too big \n"; hitMeaning.AddLine(str.Data()); - str = " -11 = light recoil orbit radius too small\n"; hitMeaning.AddLine(str.Data()); - str = " -12 = when reocol at the same side of array, light recoil blocked by recoil detector\n"; hitMeaning.AddLine(str.Data()); - str = " -13 = more than 3 loops\n"; hitMeaning.AddLine(str.Data()); - str = " -14 = heavy recoil did not hit recoil \n"; hitMeaning.AddLine(str.Data()); - str = " -15 = cannot find hit on array\n"; hitMeaning.AddLine(str.Data()); - str = " -20 = unknown\n"; hitMeaning.AddLine(str.Data()); - str = "===========================================\n"; hitMeaning.AddLine(str.Data()); - + hitMeaning.AddLine("======================= meaning of Hit\n"); + for( int code = -15 ; code <= 1; code ++ ){ + hitMeaning.AddLine( Form( "%4d = %s", code, helios.AcceptanceCodeToMsg(code).Data() )); + } + hitMeaning.AddLine(" other = unknown\n"); + hitMeaning.AddLine("===========================================\n"); hitMeaning.Write("hitMeaning"); int hit; /// the output of Helios.CalHit @@ -274,11 +233,6 @@ void Transfer( double rho, rhoB; ///orbit radius tree->Branch("rho", &rho, "orbit_radius_light/D"); tree->Branch("rhoB", &rhoB, "orbit_radius_heavy/D"); - - int ExAID; - double ExA; - tree->Branch("ExAID", &ExAID, "ExAID/I"); - tree->Branch("ExA", &ExA, "ExA/D"); int ExID; double Ex; @@ -288,26 +242,21 @@ void Transfer( double ExCal, thetaCMCal; tree->Branch("ExCal", &ExCal, "ExCal/D"); tree->Branch("thetaCMCal", &thetaCMCal, "thetaCMCal/D"); - - double KEA, theta, phi; - tree->Branch("beamTheta", &theta, "beamTheta/D"); - tree->Branch("beamPhi", &phi, "beamPhi/D"); - tree->Branch("beamKEA", &KEA, "beamKEA/D"); - double TbLoss; /// energy loss of particle-b from target scattering - double KEAnew; ///beam energy after target scattering - double depth; /// reaction depth; - double Ecm; - if( reactionConfig.isTargetScattering ){ - tree->Branch("depth", &depth, "depth/D"); - tree->Branch("TbLoss", &TbLoss, "TbLoss/D"); - tree->Branch("KEAnew", &KEAnew, "KEAnew/D"); - tree->Branch("Ecm", &Ecm, "Ecm/D"); - } + // double TbLoss; /// energy loss of particle-b from target scattering + // double KEAnew; ///beam energy after target scattering + // double depth; /// reaction depth; + // double Ecm; + // if( reactConfig.isTargetScattering ){ + // tree->Branch("depth", &depth, "depth/D"); + // tree->Branch("TbLoss", &TbLoss, "TbLoss/D"); + // tree->Branch("KEAnew", &KEAnew, "KEAnew/D"); + // tree->Branch("Ecm", &Ecm, "Ecm/D"); + // } double decayTheta; /// the change of thetaB due to decay double xRecoil_d, yRecoil_d, rhoRecoil_d, Td; - if( reactionConfig.isDecay ) { + if( recoil.isDecay ) { tree->Branch("decayTheta", &decayTheta, "decayTheta/D"); tree->Branch("xRecoil_d", &xRecoil_d, "xRecoil_d/D"); tree->Branch("yRecoil_d", &yRecoil_d, "yRecoil_d/D"); @@ -325,6 +274,7 @@ void Transfer( tree->Branch("yRecoil", &yRecoil, "yRecoil/D"); tree->Branch("rhoRecoil", &rhoRecoil, "rhoRecoil/D"); + ///in case need ELUM double xElum1, yElum1, rhoElum1; if( detGeo.elumPos1 != 0 ) { @@ -360,6 +310,12 @@ void Transfer( const int gxSize = 50; TF1 ** gx = new TF1*[gxSize]; TString name; + + double mb = transfer.GetMass_b(); + double betaRect = transfer.GetReactionBeta(); + double gamma = transfer.GetReactionGamma(); + double slope = transfer.GetEZSlope(helios.GetBField()); /// MeV/mm + for( int i = 0; i < gxSize; i++){ name.Form("g%d", i); gx[i] = new TF1(name, "([0]*TMath::Sqrt([1]+[2]*x*x)+[5]*x)/([3]) - [4]", -1000, 1000); @@ -376,40 +332,25 @@ void Transfer( printf("/"); if( i > 1 && i % 40 == 0 ) printf("\n"); } - gList->Write("gList", TObject::kSingleKey); + gList->Write("EZ_thetaCM", TObject::kSingleKey); printf(" %d constant thetaCM functions\n", gxSize); - int n = ExKnown.size(); - TObjArray * fList = new TObjArray(); - TF1** f = new TF1*[n]; - for( int i = 0; i< n ; i++){ - name.Form("f%d", i); - f[i] = new TF1(name, "[0] + [1] * x", -1000, 1000); - f[i]->SetParameter(0, y0[i]); - f[i]->SetParameter(1, slope); - f[i]->SetNpx(1000); - fList->Add(f[i]); - printf("."); - } - fList->Write("fList", TObject::kSingleKey); - printf(" %d e-z infinte-small detector functions\n", n); - //--- cal modified f TObjArray * fxList = new TObjArray(); - TGraph ** fx = new TGraph*[n]; + TGraph ** fx = new TGraph*[numEx]; vector px, py; int countfx = 0; - for( int j = 0 ; j < n; j++){ + for( int j = 0 ; j < numEx; j++){ double a = helios.GetDetRadius(); - double q = TMath::Sqrt(mb*mb + kCM[j] * kCM[j] ); + double q = TMath::Sqrt(mb*mb + kbCM[j] * kbCM[j] ); px.clear(); py.clear(); countfx = 0; for(int i = 0; i < 100; i++){ double thetacm = TMath::Pi()/TMath::Log(100) * (TMath::Log(100) - TMath::Log(100-i)) ;//using log scale, for more point in small angle. - double temp = TMath::TwoPi() * slope / betaRect / kCM[j] * a / TMath::Sin(thetacm); - double pxTemp = betaRect /slope * (gamma * betaRect * q - gamma * kCM[j] * TMath::Cos(thetacm)) * (1 - TMath::ASin(temp)/TMath::TwoPi()) ; - double pyTemp = gamma * q - mb - gamma * betaRect * kCM[j] * TMath::Cos(thetacm); + double temp = TMath::TwoPi() * slope / betaRect / kbCM[j] * a / TMath::Sin(thetacm); + double pxTemp = betaRect /slope * (gamma * betaRect * q - gamma * kbCM[j] * TMath::Cos(thetacm)) * (1 - TMath::ASin(temp)/TMath::TwoPi()) ; + double pyTemp = gamma * q - mb - gamma * betaRect * kbCM[j] * TMath::Cos(thetacm); if( TMath::IsNaN(pxTemp) || TMath::IsNaN(pyTemp) ) continue; px.push_back(pxTemp); py.push_back(pyTemp); @@ -423,22 +364,22 @@ void Transfer( fxList->Add(fx[j]); printf(","); } - fxList->Write("fxList", TObject::kSingleKey); - printf(" %d e-z finite-size detector functions\n", n); + fxList->Write("EZCurve", TObject::kSingleKey); + printf(" %d e-z finite-size detector functions\n", numEx); //--- cal modified thetaCM vs z TObjArray * txList = new TObjArray(); - TGraph ** tx = new TGraph*[n]; - for( int j = 0 ; j < n; j++){ + TGraph ** tx = new TGraph*[numEx]; + for( int j = 0 ; j < numEx; j++){ double a = helios.GetDetRadius(); - double q = TMath::Sqrt(mb*mb + kCM[j] * kCM[j] ); + double q = TMath::Sqrt(mb*mb + kbCM[j] * kbCM[j] ); px.clear(); py.clear(); countfx = 0; for(int i = 0; i < 100; i++){ double thetacm = (i + 8.) * TMath::DegToRad(); - double temp = TMath::TwoPi() * slope / betaRect / kCM[j] * a / TMath::Sin(thetacm); - double pxTemp = betaRect /slope * (gamma * betaRect * q - gamma * kCM[j] * TMath::Cos(thetacm)) * (1 - TMath::ASin(temp)/TMath::TwoPi()); + double temp = TMath::TwoPi() * slope / betaRect / kbCM[j] * a / TMath::Sin(thetacm); + double pxTemp = betaRect /slope * (gamma * betaRect * q - gamma * kbCM[j] * TMath::Cos(thetacm)) * (1 - TMath::ASin(temp)/TMath::TwoPi()); double pyTemp = thetacm * TMath::RadToDeg(); if( TMath::IsNaN(pxTemp) || TMath::IsNaN(pyTemp) ) continue; px.push_back(pxTemp); @@ -453,8 +394,8 @@ void Transfer( txList->Add(tx[j]); printf("*"); } - txList->Write("txList", TObject::kSingleKey); - printf(" %d thetaCM-z for finite-size detector functions\n", n); + txList->Write("thetaCM_Z", TObject::kSingleKey); + printf(" %d thetaCM-z for finite-size detector functions\n", numEx); //========timer TBenchmark clock; @@ -464,7 +405,7 @@ void Transfer( shown = false; //change the number of event into human easy-to-read form - int numEvent = reactionConfig.numEvents; + int numEvent = reactConfig.numEvents; int digitLen = TMath::Floor(TMath::Log10(numEvent)); TString numEventStr; if( 3 <= digitLen && digitLen < 6 ){ @@ -476,59 +417,51 @@ void Transfer( } printf("\e[32m#################################### generating %s events \e[0m\n", numEventStr.Data()); + double KEA = reactConfig.beamEnergy; + double theta = reactConfig.beamTheta; + double phi = 0.0; + //====================================================== calculate event int count = 0; for( int i = 0; i < numEvent; i++){ bool redoFlag = true; - if( !reactionConfig.isRedo ) redoFlag = false; + if( !reactConfig.isRedo ) redoFlag = false; do{ - - //==== Set Ex of A - ExAID = gRandom->Integer(nExA); - ExA = ExAList[ExAID]; - transfer.SetExA(ExA); - + //==== Set Ex of B - if( ExKnown.size() == 1 ) { + if( numEx == 1 ) { ExID = 0; - Ex = ExKnown[0] + (ExWidth[0] == 0 ? 0 : gRandom->Gaus(0, ExWidth[0])); + Ex = exList.ExList[0].Ex + (exList.ExList[0].sigma == 0 ? 0 : gRandom->Gaus(0, exList.ExList[0].sigma)); }else{ ExID = exDist->GetRandom(); - Ex = ExKnown[ExID]+ (ExWidth[ExID] == 0 ? 0 : gRandom->Gaus(0, ExWidth[ExID])); + Ex = exList.ExList[ExID].Ex + (exList.ExList[ExID].sigma == 0 ? 0 : gRandom->Gaus(0, exList.ExList[ExID].sigma)); } transfer.SetExB(Ex); //==== Set incident beam - KEA = reactionConfig.beamEnergy; - if( reactionConfig.beamEnergySigma == 0 ){ - KEA = reactionConfig.beamEnergy; - }else{ - KEA = gRandom->Gaus(reactionConfig.beamEnergy, reactionConfig.beamEnergySigma); + if( reactConfig.beamEnergySigma != 0 ){ + KEA = gRandom->Gaus(reactConfig.beamEnergy, reactConfig.beamEnergySigma); } - theta = 0.0; - if( reactionConfig.beamAngleSigma == 0 ){ - theta = reactionConfig.beamAngle; - }else{ - theta = gRandom->Gaus(reactionConfig.beamAngle, reactionConfig.beamAngleSigma); + if( reactConfig.beamThetaSigma != 0 ){ + theta = gRandom->Gaus(reactConfig.beamTheta, reactConfig.beamThetaSigma); } - phi = 0.0; - + //==== for taregt scattering transfer.SetIncidentEnergyAngle(KEA, theta, 0.); transfer.CalReactionConstant(); - TLorentzVector PA = transfer.GetPA(); + // TLorentzVector PA = transfer.GetPA(); //depth = 0; - if( isTargetScattering ){ - //==== Target scattering, only energy loss - depth = targetThickness * gRandom->Rndm(); - msA.SetTarget(density, depth); - TLorentzVector PAnew = msA.Scattering(PA); - KEAnew = msA.GetKE()/reactionConfig.beamA; - transfer.SetIncidentEnergyAngle(KEAnew, theta, phi); - transfer.CalReactionConstant(); - Ecm = transfer.GetCMTotalKE(); - } + // if( isTargetScattering ){ + // //==== Target scattering, only energy loss + // depth = targetThickness * gRandom->Rndm(); + // msA.SetTarget(density, depth); + // TLorentzVector PAnew = msA.Scattering(PA); + // KEAnew = msA.GetKE()/reactConfig.beamA; + // transfer.SetIncidentEnergyAngle(KEAnew, theta, phi); + // transfer.CalReactionConstant(); + // Ecm = transfer.GetCMTotalKE(); + // } //==== Calculate thetaCM, phiCM if( distFile->IsOpen()){ @@ -545,25 +478,24 @@ void Transfer( TLorentzVector Pb = transfer.GetPb(); TLorentzVector PB = transfer.GetPB(); - //==== Calculate energy loss of scattered and recoil in target - if( isTargetScattering ){ - if( Pb.Theta() < TMath::PiOver2() ){ - msb.SetTarget(density, targetThickness - depth); - }else{ - msb.SetTarget(density, depth); - } - Pb = msb.Scattering(Pb); - TbLoss = msb.GetKELoss(); - msB.SetTarget(density, targetThickness - depth); - PB = msB.Scattering(PB); - }else{ - TbLoss = 0; - } + // //==== Calculate energy loss of scattered and recoil in target + // if( isTargetScattering ){ + // if( Pb.Theta() < TMath::PiOver2() ){ + // msb.SetTarget(density, targetThickness - depth); + // }else{ + // msb.SetTarget(density, depth); + // } + // Pb = msb.Scattering(Pb); + // TbLoss = msb.GetKELoss(); + // msB.SetTarget(density, targetThickness - depth); + // PB = msB.Scattering(PB); + // }else{ + // TbLoss = 0; + // } //======= Decay of particle-B int decayID = 0; - int new_zB = reactionConfig.recoilHeavyZ; - if( reactionConfig.isDecay){ + if( recoil.isDecay){ //decayID = decay.CalDecay(PB, Ex, 0, phiCM + TMath::Pi()/2.); // decay to ground state decayID = decay.CalDecay(PB, Ex, 0, phiCM + TMath::Pi()/2); // decay to ground state @@ -571,7 +503,7 @@ void Transfer( PB = decay.GetDaugther_D(); //decayTheta = decay.GetAngleChange(); decayTheta = decay.GetThetaCM(); - new_zB = reactionConfig.heavyDecayZ; + PB.SetUniqueID(recoil.decayZ); }else{ decayTheta = TMath::QuietNaN(); } @@ -590,20 +522,21 @@ void Transfer( //==== Helios - ///printf(" thetaCM : %f \n", thetaCM * TMath::RadToDeg()); + // printf(" thetaCM : %f, Tb : %f\n", thetaCM * TMath::RadToDeg(), Pb.M()); if( Tb > 0 || TB > 0 ){ - helios.CalArrayHit(Pb, reactionConfig.recoilLightZ); - helios.CalRecoilHit(PB, new_zB); + + helios.CalArrayHit(Pb); + helios.CalRecoilHit(PB); hit = 2; - while( hit > 1 ){ hit = helios.DetAcceptance(); } /// while hit > 1, goto next loop; + while( hit > 1 ){ hit = helios.CheckDetAcceptance(); } /// while hit > 1, goto next loop; trajectory orb_b = helios.GetTrajectory_b(); trajectory orb_B = helios.GetTrajectory_B(); - e = helios.GetEnergy() + gRandom->Gaus(0, detGeo.array1.eSigma); + e = helios.GetEnergy() + gRandom->Gaus(0, array.eSigma ); - double ranX = gRandom->Gaus(0, detGeo.array1.zSigma); + double ranX = gRandom->Gaus(0, array.zSigma); z = orb_b.z + ranX; detX = helios.GetDetX() + ranX; @@ -658,13 +591,13 @@ void Transfer( thetaCM = thetaCM * TMath::RadToDeg(); //if decay, get the light decay particle on the recoil; - if( reactionConfig.isDecay ){ + if( recoil.isDecay ){ if( decayID == 1 ){ TLorentzVector Pd = decay.GetDaugther_d(); Td = Pd.E() - Pd.M(); - helios.CalRecoilHit(Pd, reactionConfig.heavyDecayZ); + helios.CalRecoilHit(Pd); trajectory orb_d = helios.GetTrajectory_B(); rhoRecoil_d = orb_d.R; @@ -684,7 +617,7 @@ void Transfer( if( hit == 1) count ++; - if( reactionConfig.isRedo ){ + if( reactConfig.isRedo ){ if( hit == 1) { redoFlag = false; }else{ @@ -720,7 +653,11 @@ void Transfer( saveFile->Close(); distFile->Close(); + delete exDist; printf("=============== done. saved as %s. count(hit==1) : %d\n", saveFileName.Data(), count); //gROOT->ProcessLine(".q"); + + return; + } diff --git a/Cleopatra/makefile b/Cleopatra/makefile index 26ce40c..f253b1e 100644 --- a/Cleopatra/makefile +++ b/Cleopatra/makefile @@ -1,9 +1,12 @@ CC=g++ -ALL = Isotope InFileCreator ExtractXSec ExtractXSecFromText PlotTGraphTObjArray FindThetaCM Transfer PlotSimulation +ALL = Isotope InFileCreator ExtractXSec ExtractXSecFromText PlotTGraphTObjArray Cleopatra FindThetaCM Transfer all: $(ALL) +Isotope: ../Cleopatra/ClassIsotope.h ../Cleopatra/Isotope.C + $(CC) Isotope.C -o Isotope + InFileCreator: InFileCreator.C InFileCreator.h ../Cleopatra/ClassIsotope.h ../Cleopatra/constant.h potentials.h $(CC) InFileCreator.C -o InFileCreator `root-config --cflags --glibs` @@ -16,17 +19,14 @@ ExtractXSecFromText: ExtractXSecFromText.C ExtractXSec.h PlotTGraphTObjArray: PlotTGraphTObjArray.C PlotTGraphTObjArray.h $(CC) PlotTGraphTObjArray.C -o PlotTGraphTObjArray `root-config --cflags --glibs` +Cleopatra: Cleopatra.C + $(CC) Cleopatra.C -o Cleopatra `root-config --cflags --glibs` + FindThetaCM: FindThetaCM.C FindThetaCM.h ../Cleopatra/ClassHelios.h ../Cleopatra/ClassIsotope.h ../Cleopatra/constant.h $(CC) FindThetaCM.C -o FindThetaCM `root-config --cflags --glibs` -Transfer: Transfer.C Transfer.h ../Cleopatra/ClassHelios.h ../Cleopatra/ClassIsotope.h ../Cleopatra/constant.h +Transfer: Transfer.C Transfer.h ../Cleopatra/ClassTransfer.h ../Cleopatra/ClassHelios.h ../Cleopatra/ClassIsotope.h ../Cleopatra/constant.h $(CC) Transfer.C -o Transfer `root-config --cflags --glibs` -PlotSimulation: PlotSimulation.C Check_Simulation.C - $(CC) PlotSimulation.C -o PlotSimulation `root-config --cflags --glibs` - -Isotope: ../Cleopatra/ClassIsotope.h ../Cleopatra/Isotope.C - $(CC) Isotope.C -o Isotope - clean: /bin/rm -f $(ALL) \ No newline at end of file diff --git a/README.md b/README.md index 6ee3403..5207adf 100644 --- a/README.md +++ b/README.md @@ -4,24 +4,38 @@ This is the analysis package for the SOLARIS DAQ. It is supposed to be the analy The folder struture is -Analysis - -├── README.md - -├── SetupNewExp // bash script to create new branch and raw data folder - -├── SOLARIS.sh // bash script to define some env variable and functions - -├── Armory // analysis codes, independent from experiment. - -├── Cleopatra // Swaper for DWBA code Ptolomey and simulation - -├── data_raw // should be the symbolic link to the raw data, created by SetUpNewExp - -├── root_data // symbolic link to converted root file, created by SetUpNewExp - +Analysis +├── README.md +├── SetupNewExp // bash script to create new branch and raw data folder +├── SOLARIS.sh // bash script to define some env variable and functions +├── Armory // analysis codes, independent from experiment. +├── Cleopatra // Swaper for DWBA code Ptolomey and simulation +├── data_raw // should be the symbolic link to the raw data, created by SetUpNewExp +├── root_data // symbolic link to converted root file, created by SetUpNewExp └── working // working directory, depends on experiment. +# Analysis & Simulation + +The Armory/AnalysisLib.h constains many small but handy functions. + +All class headers are started with Class*.h + +The classes **DetGeo**** and **ReactionConfig** are fundamental for loading the detectorGeo.txt and reactionConfig.txt. + +Both txt file support empty lines, and up to 2 settings. The reason for that is for dual-array configuration. It has potentail to extend and include more settings. But it is two now, one for upstream array (reaction) and downstream array (reaction). + +The **TransferReaction** class is only use one of the reaction from the reactionConfig.txt. + +```C++ + TransferReaction::SetReactionFromFile("reactionConfig.txt", ID); // ID = 0 or 1 +``` +Same for the **Helios** class + +```C++ + HELIOS::SetDetectorGeometry("detectorGeo.txt", ID); // ID = 0 or 1 +``` + + # Event Builder The EventBuilder is at the armory. It depends on the Hit.h and SolReader.h. diff --git a/working/DWBA b/working/DWBA index c94977f..f380e7a 100644 --- a/working/DWBA +++ b/working/DWBA @@ -44,3 +44,6 @@ #32Si(t,p)34Si 0 0L=0 0+ 0.000 8MeV/u lA #two-nucleon_transfer #36Ar(d,a)34Cl 0 4L=2 3+ 0.000 8MeV/u As # (d,a) reaction + +20F(d,t)19F 2 1s1/2 3/2+ 0.000 10MeV/u Vl +20F(d,t)19F 2 0d5/2 5/2+ 0.197 10MeV/u Vl \ No newline at end of file diff --git a/working/Ex.txt b/working/Ex.txt deleted file mode 100644 index 160e6c1..0000000 --- a/working/Ex.txt +++ /dev/null @@ -1,6 +0,0 @@ -//Ex relative_xsec SF sigma_in_MeV -//<--- use "//" for line comment -0.000 1.0 1.0 0.0100 -//4.400 1.0 1.0 0.0100 -//4.600 1.0 1.0 0.0100 -#============_End_of_file diff --git a/working/reactionConfig.txt b/working/reactionConfig.txt index 5f0662d..cd9fa6c 100644 --- a/working/reactionConfig.txt +++ b/working/reactionConfig.txt @@ -1,3 +1,5 @@ +#--- '#---' comment line identifier +#--- beam 32 //beam_A 14 //beam_Z 0.0 //excitation_energy_of_beam[MeV] @@ -8,6 +10,7 @@ 0.00 //x_offset_of_Beam_in_mm 0.00 //y_offset_of_Beam_in_mm +#--- target 2 //target_A 1 //target_Z false //isTargetScattering @@ -15,7 +18,8 @@ false //isTargetScattering 2.2e-4 //targetThickness_in_cm ../SRIM/20F_in_CD2.txt //stopping_power_for_beam -100000 //number_of_Event_being_generated +#--- Monte Carlo Setting +1000000 //number_of_Event_being_generated false //Redo_until_hit_array=all_events_hit_array #=====reaction_for_1st_Array @@ -26,6 +30,11 @@ false //Redo_until_hit_array=all_events_hit_array false //isDacay 32 //decayNucleus_A 14 //decayNucleus_Z +#--- List of Ex of heavy recoil +#---Ex relative_xsec SF sigma_in_MeV +0.000 1.0 1.0 0.01 +1.000 1.0 1.0 0.01 +2.000 1.0 1.0 0.01 #=====_reaction_for_2nd_Array_use_ony_when_2nd_array_used 3 //recoil_light_A @@ -36,4 +45,12 @@ false //isDacay 32 //decayNucleus_A 14 //decayNucleus_Z +#--- List of Ex of heavy recoil +#---Ex relative_xsec SF sigma_in_MeV + +0.000 1.0 1.0 0.01 +1.000 1.0 1.0 0.01 +2.000 1.0 1.0 0.01 + + ################## end of file \ No newline at end of file