240 lines
8.5 KiB
C
240 lines
8.5 KiB
C
#include "TString.h"
|
|
#include "TFile.h"
|
|
#include "TTree.h"
|
|
#include "TH2.h"
|
|
#include "TStyle.h"
|
|
#include "TCanvas.h"
|
|
#include "TArc.h"
|
|
#include "TLine.h"
|
|
#include "TLatex.h"
|
|
#include "TMacro.h"
|
|
|
|
#include "../Armory/AnalysisLib.h"
|
|
#include "../Armory/ClassDetGeo.h"
|
|
#include "../Armory/ClassReactionConfig.h"
|
|
#include "../Cleopatra/ClassIsotope.h"
|
|
#include "../Cleopatra/ClassTransfer.h"
|
|
|
|
void SimulationChecker(TString transferRoot = "transfer.root"){
|
|
|
|
gStyle->SetOptStat("");
|
|
gStyle->SetStatY(0.9);
|
|
gStyle->SetStatX(0.9);
|
|
gStyle->SetStatW(0.4);
|
|
gStyle->SetStatH(0.2);
|
|
gStyle->SetLabelSize(0.05, "XY");
|
|
gStyle->SetTitleFontSize(0.1);
|
|
|
|
TFile * file = new TFile(transferRoot, "read");
|
|
TTree * tree = (TTree*) file->Get("tree");
|
|
|
|
TObjArray * fxList = (TObjArray *) file->FindObjectAny("EZCurve");
|
|
|
|
//*================================== List Of Reactions
|
|
TMacro * listOfReaction = (TMacro *) file->FindObjectAny("ListOfReactions");
|
|
|
|
int numReaction = listOfReaction->GetListOfLines()->GetSize();
|
|
|
|
std::vector<int> reactionIDList(numReaction, -1);
|
|
std::vector<TString> reactionNameList(numReaction, "");
|
|
for( int i = 0; i < numReaction; i++){
|
|
std::vector<std::string> tempStr = AnalysisLib::SplitStr(listOfReaction->GetListOfLines()->At(i)->GetName(), "|");
|
|
reactionIDList[i] = atoi(tempStr[0].c_str());
|
|
reactionNameList[i] = tempStr[1];
|
|
}
|
|
|
|
// for( int i = 0; i < numReaction; i++) printf("%2d | %s\n", reactionIDList[i], reactionNameList[i].Data());
|
|
|
|
//*================================== DWBA, if any
|
|
TMacro * dwbaReaction = (TMacro *) file->FindObjectAny("DWBA_ReactionList");
|
|
TMacro * dwbaExList = (TMacro *) file->FindObjectAny("DWBA_ExList");
|
|
// dwbaReaction->Print();
|
|
// dwbaExList->Print();
|
|
|
|
|
|
//*================================== reactionConfig
|
|
TMacro * reactionConfigTxt = (TMacro *) file->FindObjectAny("reactionConfig");
|
|
|
|
ReactionConfig reactionConfig(reactionConfigTxt);
|
|
|
|
int nEvent = reactionConfig.numEvents;
|
|
printf("number of events generated : %d \n", nEvent);
|
|
|
|
//=== clear the Ex in reactionCondig if DWBA_ReactionList
|
|
if( dwbaReaction || listOfReaction ){
|
|
for( int i = 0; i < numReaction; i ++){
|
|
reactionConfig.exList[reactionIDList[i]].Clear();
|
|
|
|
for( int j = 0; j < dwbaReaction->GetListOfLines()->GetSize(); j++){
|
|
std::vector<std::string> haha = AnalysisLib::SplitStr(dwbaReaction->GetListOfLines()->At(j)->GetName(), "|");
|
|
|
|
if( atoi(haha[1].c_str()) == reactionIDList[i] ) {
|
|
std::vector<std::string> dudu = AnalysisLib::SplitStr(dwbaExList->GetListOfLines()->At(j+1)->GetName(), " ");
|
|
|
|
reactionConfig.exList[reactionIDList[i]].Add(atof(dudu[0].c_str()), atof(dudu[1].c_str()), 1.0, 0.00);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reactionConfig.Print(reactionIDList[i]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//*================================== detector Geometry
|
|
printf("=================================\n");
|
|
printf(" loading detector Geometry.\n");
|
|
TMacro * detGeoTxt = (TMacro *) file->FindObjectAny("detGeo");
|
|
|
|
DetGeo detGeo(detGeoTxt);
|
|
|
|
detGeo.Print(true);
|
|
|
|
printf("%f %f \n", detGeo.array[0].zMin, detGeo.array[0].zMax);
|
|
|
|
printf("=================================\n");
|
|
|
|
//*==================================
|
|
|
|
int padSize = 500;
|
|
int Div[2] = {5, numReaction};
|
|
Int_t size[2] = {padSize,padSize}; ///x,y, single Canvas size
|
|
TCanvas * cCheck = new TCanvas("cCheck", "Check For Simulation", 0, 0, size[0]*Div[0], size[1]*Div[1]);
|
|
if(cCheck->GetShowEditor() )cCheck->ToggleEditor();
|
|
if(cCheck->GetShowToolBar() )cCheck->ToggleToolBar();
|
|
cCheck->Divide(Div[0],Div[1]);
|
|
|
|
bool shownKELines = true;
|
|
TString gate = "hit == 1 && loop <= 1 && thetaCM > 10";
|
|
|
|
//^-------------------------------
|
|
cCheck->cd(1);
|
|
{
|
|
TH2F * hez = new TH2F("hez", Form("e-z [gated] @ %5.0f mm; z [mm]; e [MeV]", detGeo.array[0].firstPos),
|
|
400, detGeo.array[0].zMin, detGeo.array[0].zMax,
|
|
400, 0, 10);
|
|
|
|
tree->Draw("e:z>>hez", gate + " && rID == 0", "colz");
|
|
}
|
|
|
|
//^-------------------------------
|
|
cCheck->cd(2);
|
|
{
|
|
TH2F * hRecoilXY = new TH2F("hRecoilXY", Form("RecoilXY [gated] @ %4.0f mm; X [mm]; Y [mm]", detGeo.aux[0].detPos ),
|
|
400, -detGeo.aux[0].outerRadius, detGeo.aux[0].outerRadius,
|
|
400, -detGeo.aux[0].outerRadius, detGeo.aux[0].outerRadius);
|
|
tree->Draw("yRecoil:xRecoil>>hRecoilXY", gate + " && rID == 0", "colz");
|
|
TArc * detArc1 = new TArc(0,0, detGeo.aux[0].outerRadius);
|
|
detArc1->SetLineColor(kBlue-8);
|
|
detArc1->SetFillStyle(0);
|
|
detArc1->Draw("same");
|
|
TArc * detArc2 = new TArc(0,0, detGeo.aux[0].innerRadius);
|
|
detArc2->SetLineColor(kBlue-8);
|
|
detArc2->SetFillStyle(0);
|
|
detArc2->Draw("same");
|
|
|
|
if( reactionConfig.beamX != 0. || reactionConfig.beamY != 0. ){
|
|
TArc * arc = new TArc(reactionConfig.beamX, reactionConfig.beamY, 1);
|
|
arc->SetLineColor(2);
|
|
detArc1->SetFillStyle(0);
|
|
arc->Draw("same");
|
|
}
|
|
}
|
|
//^-------------------------------
|
|
cCheck->cd(3);
|
|
{
|
|
// TH1F * hThetaCM[numEx];
|
|
// TLegend * legend = new TLegend(0.8,0.2,0.99,0.8);
|
|
// double maxCount = 0;
|
|
// int startID = 0; // set the start ExID
|
|
// for( int i = startID; i < numEx; i++){
|
|
// hThetaCM[i] = new TH1F(Form("hThetaCM%d", i), Form("thetaCM [gated] (ExID=%d); thetaCM [deg]; count", i), 200, thetaCMRange[0], thetaCMRange[1]);
|
|
// hThetaCM[i]->SetLineColor(i+1-startID);
|
|
// hThetaCM[i]->SetFillColor(i+1-startID);
|
|
// hThetaCM[i]->SetFillStyle(3000+i-startID);
|
|
// tree->Draw(Form("thetaCM>>hThetaCM%d", i), gate + Form("&& ExID==%d", i), "");
|
|
// legend->AddEntry(hThetaCM[i], Form("Ex=%5.1f MeV", exList.ExList[i].Ex));
|
|
// double max = hThetaCM[i]->GetMaximum();
|
|
// if( max > maxCount ) maxCount = max;
|
|
// }
|
|
|
|
// for( int i = startID; i < numEx; i++){
|
|
// hThetaCM[i]->GetYaxis()->SetRangeUser(1, maxCount * 1.2);
|
|
// if( i == startID ) {
|
|
// hThetaCM[i]->Draw();
|
|
// }else{
|
|
// hThetaCM[i]->Draw("same");
|
|
// }
|
|
// }
|
|
// legend->Draw();
|
|
}
|
|
|
|
//^-------------------------------
|
|
cCheck->cd(4);
|
|
{
|
|
TLatex text;
|
|
text.SetNDC();
|
|
text.SetTextFont(82);
|
|
text.SetTextSize(0.06);
|
|
text.SetTextColor(2);
|
|
|
|
text.DrawLatex(0., 0.9, reactionNameList[0]);
|
|
text.DrawLatex(0., 0.8, detGeo.Bfield > 0 ? "out of plan" : "into plan");
|
|
text.SetTextColor(1);
|
|
text.DrawLatex(0., 0.7, "gate:");
|
|
|
|
text.SetTextColor(2);
|
|
//check gate text length, if > 30, break by "&&"
|
|
int ll = gate.Length();
|
|
if( ll > 30 ) {
|
|
std::vector<string> strList = AnalysisLib::SplitStr( (std::string) gate.Data(), "&&");
|
|
for( int i = 0; i < strList.size(); i++){
|
|
text.DrawLatex(0., 0.6 - 0.05*i, (TString) strList[i]);
|
|
}
|
|
}else{
|
|
text.DrawLatex(0., 0.6, gate);
|
|
}
|
|
|
|
if( reactionConfig.beamX != 0.0 || reactionConfig.beamY != 0.0 ){
|
|
text.DrawLatex(0.0, 0.1, Form("Bema pos: (%4.1f, %4.1f) mm", reactionConfig.beamX, reactionConfig.beamY));
|
|
}
|
|
}
|
|
//^-------------------------------
|
|
cCheck->cd(5);
|
|
{
|
|
TH1F * hExCal = new TH1F("hExCal", Form("calculated Ex [gated]; Ex [MeV]; count / %.2f keV", 10.), 400, -1, 3);
|
|
tree->Draw("ExCal>>hExCal", gate + " && rID == 0", "");
|
|
Isotope hRecoil(reactionConfig.recoil[0].heavyA, reactionConfig.recoil[0].heavyZ);
|
|
double Sn = hRecoil.CalSp(0,1);
|
|
double Sp = hRecoil.CalSp(1,0);
|
|
double Sa = hRecoil.CalSp2(4,2);
|
|
double S2n = hRecoil.CalSp(0, 2);
|
|
|
|
printf("Heavy recoil: %s \n", hRecoil.Name.c_str());
|
|
printf("Sn : %f MeV/u \n", Sn);
|
|
printf("Sp : %f MeV/u \n", Sp);
|
|
printf("Sa : %f MeV/u \n", Sa);
|
|
printf("S2n : %f MeV/u \n", S2n);
|
|
|
|
double yMax = hExCal->GetMaximum();
|
|
TLine * lineSn = new TLine(Sn, 0, Sn, yMax); lineSn->SetLineColor(2); lineSn->Draw("");
|
|
TLine * lineSp = new TLine(Sp, 0, Sp, yMax); lineSp->SetLineColor(4); lineSp->Draw("same");
|
|
TLine * lineSa = new TLine(Sa, 0, Sa, yMax); lineSa->SetLineColor(6); lineSa->Draw("same");
|
|
TLine * lineS2n = new TLine(S2n, 0, S2n, yMax); lineS2n->SetLineColor(8); lineS2n->Draw("same");
|
|
|
|
TLatex * text = new TLatex();
|
|
text->SetTextFont(82);
|
|
text->SetTextSize(0.06);
|
|
text->SetTextColor(2); text->DrawLatex(Sn, yMax*0.9, "S_{n}");
|
|
text->SetTextColor(4); text->DrawLatex(Sp, yMax*0.9, "S_{p}");
|
|
text->SetTextColor(6); text->DrawLatex(Sa, yMax*0.9, "S_{a}");
|
|
text->SetTextColor(8); text->DrawLatex(S2n, yMax*0.9, "S_{2n}");
|
|
|
|
}
|
|
|
|
cCheck->Modified();
|
|
cCheck->Update();
|
|
|
|
} |