diff --git a/Projects/e793s/macro/minimizer.cxx b/Projects/e793s/macro/minimizer.cxx new file mode 100644 index 0000000000000000000000000000000000000000..6fb73246063b27886d28852a0eb0d42d02da7843 --- /dev/null +++ b/Projects/e793s/macro/minimizer.cxx @@ -0,0 +1,92 @@ + +double ref = 0.143; // the energy of the selected states +vector<TVector3*> pos; +vector<double> energy; +NPL::EnergyLoss CD2("proton_CD2.G4table","G4Table",100); +NPL::EnergyLoss Al("proton_Al.G4table","G4Table",100); + +//////////////////////////////////////////////////////////////////////////////// +double devE(const double* parameter){ + + // My reaction at 8A MeV*47A=376 MeV + static NPL::Reaction reaction("47K(d,p)48K@376"); + // Return the standard deviation in Brho + unsigned int size = pos1.size(); + + TVector3 offset(parameter[0],parameter[1],parameter[2]); + + double dE,Theta; + TVector3 dir; + static auto h = new TH1D("h","h", 1000,-0,100); + h->Reset(); + for(unsigned int i = 0 ; i < size ; i++){ + dir=*(pos[i])-o1; + double Theta= dir.Angle(TVector3(0,0,1)); + double Energy = energy[i]; + // do some energy loss correction here: + // This need to take parameter[4]*0.5*micrometer as the target thickness + Energy=CD2.EvaluateInitialEnergy(Energy,0,5*parameter[4]*micrometer,Theta); + + double Ex=reaction->ReconstructRelativistic(Energy,Theta); + //cout << (pB-pM).Mag2() << " " << dR << endl; + h->Fill(Ex-ref); + } + cout << h->GetMean() << " " << h->GetStdDev() << " " << parameter[4] << endl; + h->Draw(); + gPad->Update(); + // adapt the metric as needed + return (h->GetMean()+h->GetStdDev() ); +} +//////////////////////////////////////////////////////////////////////////////// +void LoadFile(){ + + ifstream file("myFile.txt"); + if(!file.is_open()){ + cout << "fail to load file" << endl; + exit(1); + } + else { + cout << "Success opening file" << endl; + } + + double x,y,z,e; + + while(file >> x >> y >> z >> e ){ + auto p1 = new TVector3(x,y,z); + double e; + pos.push_back(p1); + energy.push_back(e); + } + file.close(); +} +//////////////////////////////////////////////////////////////////////////////// +void BDC(){ + + // Data + LoadFile(); + + // Minimizer + auto min=ROOT::Math::Factory::CreateMinimizer("Minuit2", "Migrad"); + // Function with 4 parameter XYZ and Target thickness + auto func=ROOT::Math::Functor(&devE,4); + min->SetFunction(func); + min->SetPrintLevel(0); + min->SetPrecision(1e-10); + // Start value: Center beam (0,0,0) and 4.7um target 0.5mg/cm2 target + double parameter[6]={0,0,0,4.7}; + devR(parameter); + + // min->SetLimitedVariable(0,"AM",parameter[0],1,-90,90); + min->SetLimitedVariable(0,"X",parameter[0],0.1,-10,10); + min->SetLimitedVariable(1,"Y",parameter[1],0.1,-10,10); + min->SetLimitedVariable(2,"Z",parameter[2],0.1,-5,5); + min->SetLimitedVariable(3,"T",parameter[3],0.1,parameter[2]-0.1*parameter[2],parameter[2]+0.1*parameter[2]); + min->Minimize(); + + const double* x = min->X(); + cout << "X =" << x[0]<<endl; + cout << "Y =" << x[1]<<endl; + cout << "Z =" << x[2]<<endl; + cout << "Y =" << x[3]<<endl; + cout << "Minimum: " << devR(x) << endl; +}