24 #include <ecl/digitization/WrapArray2D.h>
31 Double_t glog(Double_t* x, Double_t* par)
39 Double_t cc = TMath::Sqrt(2.*TMath::Log(2.));
40 Double_t sig = TMath::Log(cc * par[3] + TMath::Sqrt(1. + cc * cc * par[3] * par[3])) / cc;
41 Double_t N = par[0] * par[3] / par[2] / TMath::Sqrt(2.*3.1415) / TMath::Exp(sig * sig / 2) / sig;
42 Double_t arg = TMath::Log(1. + (x[0] - par[1]) * par[3] / par[2]) / sig;
45 if (x[0] > par[1] - par[2] / par[3]) {
46 fitval = N * TMath::Exp(-arg * arg / 2);
51 void cut(
const char* inputRootFilename,
const char* outputCutFilename,
52 const char* outputpdfdir,
int crystalMin,
int crystalMax,
53 int ampMin,
int ampMax)
56 int nbins = ampMax - ampMin;
57 TH2F* Box =
new TH2F(
"Box",
"box", 8736, 0., 8736., nbins,
float(ampMin),
float(ampMax));
58 TH1F* Ms =
new TH1F(
"Ms",
"ev", nbins,
float(ampMin),
float(ampMax));
59 TChain fChain(
"m_tree");
61 cout <<
"!!! file for calibration:" << inputRootFilename << endl;
62 fChain.Add(inputRootFilename);
65 string outputpdffile(outputpdfdir);
66 bool doplot = !(outputpdffile ==
"noplot");
67 outputpdffile +=
"/amplitudefits.pdf";
75 fChain.SetBranchAddress(
"nhits", &nhits, &b_nhits);
76 fChain.SetBranchAddress(
"hitA", hitA, &b_hitA);
85 vector<Double_t> Mu(8736, 0);
86 vector<Double_t> Sg(8736, 0);
87 vector<Double_t> As(8736, 0);
88 vector<Double_t> Sr(8736, 0);
89 vector<Double_t> Sl(8736, 0);
90 vector<Double_t> Chi(8736, 0)
92 Double_t cc = TMath::Sqrt(2.*TMath::Log(2.));
94 Int_t nevent = fChain.GetEntries();
95 std::cout <<
"! nevent=" << nevent << std::endl;
99 for (Int_t i = 0; i < nevent; i++) {
101 for (k = 0; k < nhits; k++) {
102 for (u = 0;
u < 31;
u++) {
103 Box->Fill(k, hitA[k][u]);
106 if (i % 100 == 0) {std::cout <<
" event=" << i << std::endl;}
111 TCanvas* plot =
nullptr;
114 plot->SaveAs((outputpdffile +
string(
"[")).c_str());
117 for (k = crystalMin ; k <= crystalMax; k++) {
118 cout <<
"Crystal " << k << endl;
122 for (u = 1;
u < 2901;
u++) {
123 Double_t Ty = Box->GetBinContent(k + 1, u);
125 Ms->SetBinContent(u, Ty);
134 TF1* func =
new TF1(
"glog", glog, 2990., 3500., 4);
135 func->SetParNames(
"Nornamisation",
"Maximum",
"Sigma",
"Assimetry");
136 func->SetParameters(InT, mug, rg, 0.1);
140 if (doplot) plot->SaveAs(outputpdffile.c_str());
142 func->GetParameters(par);
146 Double_t chi2 = func->GetChisquare();
147 Double_t ndf = func->GetNDF();
151 }
else {Chi[k] = -1.;}
153 cout <<
"Chi[ " << k <<
"] = " << Chi[k] <<
"calculated but not used." << endl;
155 Sr[k] = (-1. + As[k] * cc + TMath::Sqrt(1. + cc * cc * As[k] * As[k])) * Sg[k] / As[k] / cc;
156 Sl[k] = (1. - 1. / (As[k] * cc + TMath::Sqrt(1. + cc * cc * As[k] * As[k]))) * Sg[k] / As[k] / cc;
160 if (doplot) plot->SaveAs((outputpdffile +
string(
"]")).c_str());
163 ofstream outputCutFile(outputCutFilename);
164 for (poq = 0; poq < 8736; poq++) {
165 outputCutFile << poq <<
" " << Mu[poq] <<
" "
166 << Sg[poq] <<
" " << Sl[poq] <<
" "
167 << Sr[poq] <<
" " << As[poq] << endl;
170 outputCutFile.close();
173 int main(
int argc,
char** argv)
176 assert(argc > 3 && argc < 7);
183 int crystalMax = 8735;
186 if (argc >= 5) crystalMin = stoi(argv[4]);
187 if (argc >= 6) crystalMax = stoi(argv[5]);
188 if (argc >= 7) ampMin = stoi(argv[6]);
189 if (argc >= 8) ampMax = stoi(argv[7]);
190 cut(argv[1], argv[2], argv[3], crystalMin, crystalMax, ampMin, ampMax);