modified: GainMatchSX3.C
modified: GainMatchSX3Front.C
This commit is contained in:
parent
b44ffd7fdf
commit
06fbc1afd9
|
@ -207,14 +207,14 @@ Bool_t GainMatchSX3::Process(Long64_t entry)
|
|||
{
|
||||
auto key = std::make_tuple(sx3.id[i], sx3ChBk, sx3ChUp, sx3ChDn);
|
||||
comboCounts[key]++;
|
||||
}
|
||||
|
||||
// If we have a valid front and back channel, fill the histograms
|
||||
hSX3->Fill(sx3ChDn, sx3ChBk);
|
||||
hSX3->Fill(sx3ChDn+4, sx3ChBk);
|
||||
hSX3->Fill(sx3ChUp, sx3ChBk);
|
||||
|
||||
// Fill the histogram for the front vs back
|
||||
hSX3FvsB->Fill(sx3EUp + sx3EDn, sx3EBk);
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < sx3.multi; i++)
|
||||
{
|
||||
|
@ -322,7 +322,7 @@ void GainMatchSX3::Terminate()
|
|||
// if (TMath::Abs(f.GetParameter(0) - 1) > 3.0)
|
||||
// continue;
|
||||
|
||||
const double fixedError = 20.0; // in ADC channels
|
||||
const double fixedError = 10.0; // in ADC channels
|
||||
|
||||
std::vector<double> xVals, yVals, exVals, eyVals;
|
||||
|
||||
|
@ -334,7 +334,7 @@ void GainMatchSX3::Terminate()
|
|||
|
||||
xVals.push_back(x);
|
||||
yVals.push_back(y);
|
||||
// exVals.push_back(fixedError); // error in front energy
|
||||
exVals.push_back(fixedError); // error in front energy
|
||||
eyVals.push_back(fixedError); // error in back energy
|
||||
}
|
||||
|
||||
|
@ -382,13 +382,23 @@ void GainMatchSX3::Terminate()
|
|||
|
||||
gainArray[id][bk][u][d] = f.GetParameter(0);
|
||||
gainValid[id][bk][u][d] = true;
|
||||
// }
|
||||
|
||||
// Check if the gain is valid for this detector, back, up, and down
|
||||
if (gainValid[id][bk][u][d])
|
||||
{
|
||||
// // Output results
|
||||
// for (int id = 0; id < MAX_DET; ++id)
|
||||
// {
|
||||
// for (int bk = 0; bk < MAX_BK; ++bk)
|
||||
// {
|
||||
// for (int u = 0; u < MAX_UP; ++u)
|
||||
// {
|
||||
// for (int d = 0; d < MAX_DOWN; ++d)
|
||||
// {
|
||||
// // Check if the gain is valid for this detector, back, up, and down
|
||||
// if (gainValid[id][bk][u][d])
|
||||
// {
|
||||
if (TMath::Abs(gainArray[id][u][d][bk] - 1) < 0.3)
|
||||
{
|
||||
printf("Gain match Det%d Up%dDn%d Back%d → %.4f \n", id, u, d, bk, gainArray[id][u][d][bk]);
|
||||
printf("Gain match Det%d Up%dDn%d Backs%d → %.4f \n", id, u, d, bk, gainArray[id][u][d][bk]);
|
||||
outFile << id << " " << bk << " " << u << " " << d << " " << gainArray[id][u][d][bk] << std::endl;
|
||||
}
|
||||
else if (gainArray[id][u][d][bk] != 0)
|
||||
|
@ -397,7 +407,11 @@ void GainMatchSX3::Terminate()
|
|||
<< gainArray[id][u][d][bk] << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// for (int bk = 0; bk < MAX_BK; ++bk)
|
||||
// {
|
||||
|
@ -411,7 +425,7 @@ void GainMatchSX3::Terminate()
|
|||
|
||||
// === Create histograms ===
|
||||
TH2F *hFVB = new TH2F("hFVB", "Corrected Up+Dn vs Corrected Back;Corrected Back E;Up+Dn E",
|
||||
400, 0, 16000, 400, 0, 16000);
|
||||
600, 0, 16000, 600, 0, 16000);
|
||||
TH2F *hAsym = new TH2F("hAsym", "Up vs Dn dvide corrected back;Up/Back E;Dn/Back E",
|
||||
400, 0.0, 1.0, 400, 0.0, 1.0);
|
||||
|
||||
|
|
|
@ -41,11 +41,13 @@ double backGain[MAX_DET][MAX_BK][MAX_UP][MAX_DOWN] = {{{{0}}}};
|
|||
bool backGainValid[MAX_DET][MAX_BK][MAX_UP][MAX_DOWN] = {{{{false}}}};
|
||||
double frontGain[MAX_DET][MAX_BK][MAX_UP][MAX_DOWN] = {{{{0}}}};
|
||||
bool frontGainValid[MAX_DET][MAX_BK][MAX_UP][MAX_DOWN] = {{{{false}}}};
|
||||
|
||||
double uvdslope[MAX_DET][MAX_BK][MAX_UP][MAX_DOWN] = {{{{0}}}};
|
||||
// ==== Configuration Flags ====
|
||||
const bool interactiveMode = false; // If true: show canvas + wait for user
|
||||
const bool interactiveMode1 = true; // If true: show canvas + wait for user
|
||||
const bool verboseFit = true; // If true: print fit summary and chi²
|
||||
const bool drawCanvases = true; // If false: canvases won't be drawn at all
|
||||
const bool drawCanvases = false; // If false: canvases won't be drawn at all
|
||||
const bool drawCanvases1 = true; // If false: canvases won't be drawn at all
|
||||
|
||||
void GainMatchSX3Front::Begin(TTree * /*tree*/)
|
||||
{
|
||||
|
@ -195,6 +197,9 @@ Bool_t GainMatchSX3Front::Process(Long64_t entry)
|
|||
sx3EBk = sx3.e[index];
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < sx3.multi; i++)
|
||||
{
|
||||
// If we have a valid front and back channel, fill the histograms
|
||||
hSX3->Fill(sx3ChDn + 4, sx3ChBk);
|
||||
hSX3->Fill(sx3ChUp, sx3ChBk);
|
||||
|
@ -202,8 +207,6 @@ Bool_t GainMatchSX3Front::Process(Long64_t entry)
|
|||
// Fill the histogram for the front vs back
|
||||
hSX3FvsB->Fill(sx3EUp + sx3EDn, sx3EBk);
|
||||
|
||||
for (int i = 0; i < sx3.multi; i++)
|
||||
{
|
||||
if (sx3.e[i] > 100) // && sx3.id[i] == 4)
|
||||
{
|
||||
// back gain correction
|
||||
|
@ -330,9 +333,9 @@ void GainMatchSX3Front::Terminate()
|
|||
int ndf = f.GetNDF();
|
||||
double reducedChi2 = (ndf != 0) ? chi2 / ndf : -1;
|
||||
|
||||
std::cout << Form("Det%d U%d D%d B%d → Gain: %.4f | χ²/ndf = %.2f/%d = %.2f",
|
||||
id, u, d, bk, f.GetParameter(0), chi2, ndf, reducedChi2)
|
||||
<< std::endl;
|
||||
// std::cout << Form("Det%d U%d D%d B%d → Gain: %.4f | χ²/ndf = %.2f/%d = %.2f",
|
||||
// id, u, d, bk, f.GetParameter(0), chi2, ndf, reducedChi2)
|
||||
// << std::endl;
|
||||
}
|
||||
|
||||
if (interactiveMode)
|
||||
|
@ -354,7 +357,87 @@ void GainMatchSX3Front::Terminate()
|
|||
frontGainValid[id][bk][u][d] = true;
|
||||
|
||||
outFile << id << " " << bk << " " << u << " " << d << " " << frontGain[id][bk][u][d] << std::endl;
|
||||
printf("Front gain Det%d Back%d Up%dDn%d → %.4f\n", id, bk, u, d, frontGain[id][bk][u][d]);
|
||||
// printf("Front gain Det%d Back%d Up%dDn%d → %.4f\n", id, bk, u, d, frontGain[id][bk][u][d]);
|
||||
}
|
||||
|
||||
for (const auto &kv : dataPoints)
|
||||
{
|
||||
auto [id, bk, u, d] = kv.first;
|
||||
const auto &pts = kv.second;
|
||||
std::vector<double> uvals, dvals;
|
||||
|
||||
if (pts.size() < 5)
|
||||
continue;
|
||||
|
||||
std::vector<double> uE, dE, udE, corrBkE;
|
||||
|
||||
for (const auto &pr : pts)
|
||||
{
|
||||
double eBkCorr, eUp, eDn;
|
||||
std::tie(eBkCorr, eUp, eDn) = pr;
|
||||
if ((eBkCorr < 100) || (eUp < 100) || (eDn < 100))
|
||||
continue; // Skip if any energy is zero
|
||||
eUp *= frontGain[id][bk][u][d];
|
||||
eDn *= frontGain[id][bk][u][d];
|
||||
|
||||
uE.push_back(eUp / eBkCorr);
|
||||
dE.push_back(eDn / eBkCorr);
|
||||
corrBkE.push_back(eBkCorr);
|
||||
}
|
||||
for (size_t i = 0; i < uE.size(); ++i)
|
||||
{
|
||||
uvals.push_back(uE[i]);
|
||||
dvals.push_back(dE[i]);
|
||||
}
|
||||
|
||||
TGraph g1(uvals.size(), uvals.data(), dvals.data());
|
||||
g1.SetMarkerStyle(20);
|
||||
g1.SetMarkerColor(kBlue);
|
||||
g1.SetTitle(Form("Det %d: U%d D%d B%d", id, u, d, bk));
|
||||
|
||||
// Fit function (straight line through origin)
|
||||
TF1 f1("f1", "[0]*x", 0, 16000);
|
||||
f1.SetParameter(0, -1.0);
|
||||
|
||||
if (drawCanvases1)
|
||||
{
|
||||
TCanvas *c1 = new TCanvas(Form("c_%d_%d_%d_%d", id, bk, u, d), "Fit", 800, 600);
|
||||
g1.SetTitle(Form("Detector %d: U%d D%d B%d", id, u, d, bk));
|
||||
g1.SetMarkerStyle(20);
|
||||
g1.SetMarkerColor(kBlue);
|
||||
g1.Draw("AP");
|
||||
|
||||
g1.Fit(&f1, interactiveMode ? "Q" : "QNR"); // 'R' avoids refit, 'N' skips drawing
|
||||
|
||||
if (verboseFit)
|
||||
{
|
||||
double chi2 = f1.GetChisquare();
|
||||
int ndf1 = f1.GetNDF();
|
||||
double reducedChi2 = (ndf1 != 0) ? chi2 / ndf1 : -1;
|
||||
|
||||
std::cout << Form("Det%d U%d D%d B%d → Gain: %.4f | χ²/ndf = %.2f/%d = %.2f",
|
||||
id, u, d, bk, f1.GetParameter(0), chi2, ndf1, reducedChi2)
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
if (interactiveMode1)
|
||||
{
|
||||
c1->Update();
|
||||
gPad->WaitPrimitive();
|
||||
}
|
||||
else
|
||||
{
|
||||
c1->Close(); // Optionally avoid clutter in batch
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g1.Fit(&f1, "QNR");
|
||||
}
|
||||
|
||||
// Save slope
|
||||
uvdslope[id][bk][u][d] = f1.GetParameter(0);
|
||||
printf("UvD slope Det%d Back%d Up%dDn%d → %.4f\n", id, bk, u, d, uvdslope[id][bk][u][d]);
|
||||
}
|
||||
|
||||
outFile.close();
|
||||
|
|
Loading…
Reference in New Issue
Block a user