diff --git a/NPLib/Detectors/Minos/TMinosPhysics.h b/NPLib/Detectors/Minos/TMinosPhysics.h index 8139e7536f65b548dd3249205db2722ea3c5459f..f9ce20ac5fb8f8261674c2cb3f9d6f89a8b55741 100644 --- a/NPLib/Detectors/Minos/TMinosPhysics.h +++ b/NPLib/Detectors/Minos/TMinosPhysics.h @@ -160,6 +160,9 @@ class TMinosPhysics : public TObject, public NPL::VDetector { double GetVertexX() {return X_Vertex;} //! double GetVertexY() {return Y_Vertex;} //! double GetVertexZ() {return Z_Vertex;} //! + + double GetDeltaVertex() {return Delta_Vertex;} //! + double GetTheta12() {return Theta_12;} //! int GetNbrOfTracks(){return Tracks_P0.size();} diff --git a/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h b/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h index 542198b365f50e80f2772585114fceccc41ba771..bacf5ceaff354383ef7500b2414577ec71a3eac7 100644 --- a/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h +++ b/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h @@ -156,6 +156,11 @@ class TSamuraiHodoscopePhysics : public TObject, public NPL::VDetector { // clear the pre-treated object void ClearPreTreatedData() {m_PreTreatedData->Clear();} + + + vector <double> GetCharge() {return Charge;} + vector <double> GetTime() {return Time;} + vector<int> GetID() {return ID;} // give and external TSamuraiHodoscopeData object to TSamuraiHodoscopePhysics. // needed for online analysis for example diff --git a/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.cxx b/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.cxx old mode 100644 new mode 100755 index a89711353f530ab9e7352f448d580bba1890d714..26d119ac77efcb47c6020b7254afe83576c1d22d --- a/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.cxx +++ b/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.cxx @@ -6,8 +6,10 @@ double devE(const double* parameter){ //Beam spot offset TVector3 offset(parameter[0],parameter[1],parameter[2]); - unsigned int size = pos.size(); + //Other variable initilizations + unsigned int size = pos.size(); + TVector3 MugastNormal; double dE,Theta; TVector3 dir; @@ -25,24 +27,53 @@ double devE(const double* parameter){ //Particle path vector dir=*(pos[i])-offset; - //Detected energy, and angle of particle leaving target - double Theta= dir.Angle(TVector3(0,0,1)); + //Define normal vector for the MG# of detection + //[[[[ UPDATE WITH NEW MG POSITIONS FROM SURVEY ]]]] + switch(detnum[i]){ + case 1: + MugastNormal.SetXYZ(-0.453915, +0.455463, -0.765842); + break; + case 2: + MugastNormal.SetXYZ(-0.642828, +0.000000, -0.766010); + break; + case 3: + MugastNormal.SetXYZ(-0.454594, -0.450670, -0.768271); + break; + case 4: + MugastNormal.SetXYZ(-0.002437, -0.638751, -0.769409); + break; + case 5: + MugastNormal.SetXYZ(+0.452429, -0.454575, -0.767248); + break; + case 7: + MugastNormal.SetXYZ(+0.443072, +0.443265, -0.779232); + break; + default: + cout << "ERROR:: Invalid DetNum " << detnum[i] << " at event " << i << endl; + return 1; // Exit code + } + + //Angle leaving target, angle entering MUGAST & energy deposited in MUGAST + double ThetaTarget = dir.Angle(TVector3(0,0,1)); + double ThetaMugast = dir.Angle(MugastNormal); double Energy = energy[i]; - //NOTE!!! Not calucualting energy loss in Al??? + //Energy loss in Al + Energy=Al.EvaluateInitialEnergy( + Energy, //energy after Al + 0.4*micrometer, //thickness of Al + ThetaMugast); //angle impinging on MUGAST //Energy loss in target Energy=CD2.EvaluateInitialEnergy( - Energy, //energy after leaving target - 0.5*parameter[4]*micrometer, //pass through half target - Theta); //angle leaving target + Energy, //energy after leaving target + 0.5*parameter[3]*micrometer, //pass through half target + ThetaTarget); //angle leaving target //Final value of Ex - double Ex = reaction.ReconstructRelativistic(Energy,Theta); + double Ex = reaction.ReconstructRelativistic(Energy,ThetaTarget); - //Fill histogram with ERROR in Ex! - //h->Fill(Ex-refE); - h->Fill(Ex); - + //Fill histograms with Ex + h->Fill(Ex); switch(detnum[i]){ case 1: h1->Fill(Ex); @@ -63,70 +94,76 @@ double devE(const double* parameter){ h7->Fill(Ex); break; default: - cout << "ERROR! Invalid detnum: " << detnum[i] << " @" << i << endl; + cout << "ERROR:: Invalid DetNum " << detnum[i] << " at event " << i << endl; return 1; // Exit code } - } //End loop over events //Write vals to screen cout << "Mean: " << h->GetMean() << "\t StdDev: " << h->GetStdDev() - << "\t Thickness??: " << parameter[4] + << "\t Thickness: " << parameter[3] << " um" << endl; //Draw histogram(s) h->Draw(); if(flagDraw){ InitiliseCanvas(); } + /* + cout << pow(h->GetMean()-refE,2) << " + " + << pow(0.1*h->GetStdDev(),2) << " = " + << pow(h->GetMean()-refE,2) + pow(0.1*h->GetStdDev(),2) + << endl; + */ + //Adapt the metric as needed return sqrt( pow(h->GetMean()-refE,2) + pow(0.1*h->GetStdDev(),2) ); } //////////////////////////////////////////////////////////////////////////////// void MinimizeBeamSpot(){ - // Read data in + //Read data in LoadFile(); - // Start with beam (0,0,0) and 4.7um 0.5mg/c2 target - double parameter[4] = {0.0, 0.0, 0.0, 4.7}; + //Start with beam (0,0,0) and 4.76um 0.5mg/c2 target + double parameter[4] = {0.0, 0.0, 0.0, 4.76}; devE(parameter); - // Function with 4 parameter XYZ and Target thickness + //Function with 4 parameter XYZ and Target thickness auto func = ROOT::Math::Functor(&devE,4); - // Minimizer + //Minimizer auto minim = ROOT::Math::Factory::CreateMinimizer("Minuit2","Migrad"); minim->SetPrintLevel(0); minim->SetPrecision(1e-10); - // Set minimizer function + //Set minimizer function minim->SetFunction(func); - // Assign variable limits + //Assign variable limits minim->SetLimitedVariable(0,"X",parameter[0],0.01,-10,10); minim->SetLimitedVariable(1,"Y",parameter[1],0.01,-10,10); minim->SetLimitedVariable(2,"Z",parameter[2],0.01,-5,5); - minim->SetLimitedVariable(3,"T",parameter[3],0.01, 4.7-3.0, 4.7+3.0); + minim->SetLimitedVariable(3,"T",parameter[3],0.01,4.76*0.5,4.76*1.5); - // Don't draw iterations of minimizer + //Don't draw iterations of minimizer flagDraw = 0; - // Shrink it, babeyyy + //Shrink it, babeyyy minim->Minimize(); - // Draw minimal value + //Draw minimal value flagDraw = 1; - // Pull values from minimizer + //Pull values from minimizer const double* x = minim->X(); cout << "========================================" << endl; cout << "\t\tX =" << x[0] << endl; cout << "\t\tY =" << x[1] << endl; cout << "\t\tZ =" << x[2] << endl; cout << "\t\tT =" << x[3] << endl; - cout << "Minimum: " << devE(x) << endl; + devE(x); cout << "========================================" << endl; } diff --git a/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.h b/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.h old mode 100644 new mode 100755 index 932bc8eadf5916f3b0ec0e4c1f97ec1c867e5c62..5994406553c00aa43a6cce6ec12b5a62b08ea547 --- a/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.h +++ b/Projects/e793s/macro/BeamSpot/MinimizeBeamSpot.h @@ -14,8 +14,8 @@ NPL::EnergyLoss Al("proton_Al.G4table","G4Table",100); using namespace std; bool flagDraw = 0; -static auto h = new TH1D("h","h", 80,-1.,1.); -static auto h1 = new TH1D("h1","h1", 40,-1.,1.); +static auto h = new TH1D("h","All MG#'s", 60,-1.,1.); +static auto h1 = new TH1D("h1","Individual MG#'s", 40,-1.,1.); static auto h2 = new TH1D("h2","h2", 40,-1.,1.); static auto h3 = new TH1D("h3","h3", 40,-1.,1.); static auto h4 = new TH1D("h4","h4", 40,-1.,1.); @@ -125,6 +125,7 @@ void InitiliseCanvas(){ // ----- ALL ----- canv->cd(2); h->SetStats(0); + h->SetLineColor(kBlack); h->GetXaxis()->SetTitle("Ex [MeV]"); h->GetYaxis()->SetTitle("Counts"); h->Draw();