2 #include "TFitResultPtr.h" 3 #include "TFitResult.h" 8 #include "TMatrixDSym.h" 20 fFunctionComponents.resize(0);
60 for (UInt_t iPlot = 0; iPlot != NumPlots; ++iPlot) {
75 tempProfile =
new TProfile(tempName +
"prof", tempName +
"prof", NumXBins, XBins);
79 tempProfile =
new TH1F(tempName +
"prof", tempName +
"prof", NumXBins, XBins);
81 for (Int_t iBin = 0; iBin != NumXBins; ++iBin) {
82 tempProfile->SetBinContent(iBin + 1, XBins[iBin + addBin]);
83 tempProfile->SetBinError(iBin + 1, 0);
87 fMeans.push_back(tempProfile);
94 TF1**& fitHolder, TMatrixDSym**& covHolder)
98 Message(
eDebug,
"Going to fit hist with %f events", histToFit->GetEntries());
100 Int_t NumXBins = histToFit->GetXaxis()->GetNbins();
101 const Double_t *XBins = histToFit->GetXaxis()->GetXbins()->GetArray();
103 TString tempName = histToFit->GetName();
108 Double_t MinY = histToFit->GetYaxis()->GetBinLowEdge(1);
109 Double_t MaxY = histToFit->GetYaxis()->GetBinUpEdge(histToFit->GetYaxis()->GetNbins());
111 fitHolder =
new TF1*[NumXBins];
112 covHolder =
new TMatrixDSym*[NumXBins];
114 for (Int_t iXBin = 0; iXBin != NumXBins; ++iXBin) {
117 TCanvas *tempCanvas =
new TCanvas();
118 for (UInt_t iParam = 0; iParam !=
fGuessParams.size(); ++iParam)
126 lowerBin = iXBin + 1;
127 upperBin = iXBin + 1;
131 upperBin = iXBin + 1;
134 lowerBin = iXBin + 1;
138 std::cout <<
"What case is that?" << std::endl;
141 TH1D *projection = histToFit->ProjectionY(tempName+
"_py", lowerBin, upperBin);
143 Message(
eDebug,
"Projection has integral %f", projection->GetEntries());
146 Message(
eDebug,
"Using loose function: %s", looseFunc->GetTitle());
148 projection->Fit(looseFunc,
fFitOptions,
"", MinY, MaxY);
149 MapTo(fitFunc, looseFunc);
151 TFitResultPtr fitResult = projection->Fit(fitFunc,
fFitOptions +
"S",
"", MinY, MaxY);
154 Double_t lower = XBins[lowerBin - 1];
155 Double_t upper = XBins[upperBin];
156 dumpName.Form(
"DumpFit_%04d_%.2fTo%.2f",
fNumFitDumps, lower, upper);
157 std::vector<TF1*> components;
160 for (Int_t iParam = 0; iParam != tempComponent->GetNpar(); ++iParam)
161 tempComponent->SetParameter(tempComponent->GetParName(iParam),
162 fitFunc->GetParameter(tempComponent->GetParName(iParam)));
163 tempComponent->Draw(
"SAME");
164 components.push_back(tempComponent);
170 tempCanvas->SaveAs(dumpName+
".C");
172 tempCanvas->SaveAs(dumpName+
".png");
174 tempCanvas->SaveAs(dumpName+
".pdf");
175 for (UInt_t iComp = 0; iComp < components.size(); iComp++)
176 delete components[iComp];
180 fitHolder[iXBin] = (TF1*) fitFunc->Clone();
181 covHolder[iXBin] =
new TMatrixDSym(fitFunc->GetNpar());
182 *covHolder[iXBin] = fitResult->GetCovarianceMatrix();
187 std::vector<TGraphErrors*>
192 Double_t epsilon = 0.001;
194 TGraphErrors *tempGraph;
195 std::vector<TGraphErrors*> theGraphs;
197 TF1 parameterHolder(
"parameterHolder",ParameterExpr);
199 for (UInt_t iLine = 0; iLine !=
fFits.size(); ++iLine) {
202 for (Int_t iXBin = 0; iXBin !=
fFitXBins; ++iXBin) {
205 for (Int_t iParam = 0; iParam != parameterHolder.GetNpar(); ++iParam) {
206 Int_t parNumInFit =
fFits[iLine][iXBin]->GetParNumber(parameterHolder.GetParName(iParam));
207 parameterHolder.SetParameter(iParam,
fFits[iLine][iXBin]->GetParameter(parNumInFit));
208 parameterHolder.SetParError(iParam,
fFits[iLine][iXBin]->GetParError(parNumInFit));
211 tempGraph->SetPoint(iXBin,
fMeans[iLine]->GetBinContent(iXBin + 1), parameterHolder.Eval(0));
216 for (Int_t iParam = 0; iParam != parameterHolder.GetNpar(); ++iParam) {
218 ParameterExpr.ReplaceAll(TString(
"[") + TString(parameterHolder.GetParName(iParam)).Strip(TString::kLeading,
'p') + TString(
"]"),
'x');
219 TF1 errorFunc(
"errorFunc",ParameterExpr);
220 for (Int_t jParam = 0; jParam != errorFunc.GetNpar(); ++jParam)
221 errorFunc.SetParameter(jParam,parameterHolder.GetParameter(errorFunc.GetParName(jParam)));
222 Double_t iDerivative = errorFunc.Derivative(parameterHolder.GetParameter(iParam));
223 Double_t error = iDerivative * parameterHolder.GetParError(iParam);
224 error2 += error*error;
225 ParameterExpr.ReplaceAll(
'x', TString(
"[") + TString(parameterHolder.GetParName(iParam)).Strip(TString::kLeading,
'p') + TString(
"]"));
227 for (Int_t jParam = iParam + 1; jParam != parameterHolder.GetNpar(); ++jParam) {
229 ParameterExpr.ReplaceAll(TString(
"[") + TString(parameterHolder.GetParName(jParam)).Strip(TString::kLeading,
'p') + TString(
"]"),
'x');
231 TF1 errorFunc2(
"errorFunc2",ParameterExpr);
232 for (Int_t kParam = 0; kParam != errorFunc2.GetNpar(); ++kParam)
233 errorFunc2.SetParameter(kParam,parameterHolder.GetParameter(errorFunc.GetParName(kParam)));
234 Double_t jDerivative = errorFunc2.Derivative(parameterHolder.GetParameter(jParam));
237 error2 += 2 * iDerivative * jDerivative *
238 (*
fCovs[iLine][iXBin])(
fFits[iLine][iXBin]->GetParNumber(parameterHolder.GetParName(iParam)),
239 fFits[iLine][iXBin]->GetParNumber(parameterHolder.GetParName(jParam)));
241 ParameterExpr.ReplaceAll(
'x', TString(
"[") + TString(parameterHolder.GetParName(jParam)).Strip(TString::kLeading,
'p') + TString(
"]"));
245 tempGraph->SetPointError(iXBin,
fMeans[iLine]->GetBinError(iXBin + 1), TMath::Sqrt(error2));
247 theGraphs.push_back(tempGraph);
254 std::vector<TGraphErrors*>
257 TString ParameterExpr =
"";
258 ParameterExpr.Form(
"[%d]", ParameterNum);