138 std::string firstKey;
140 for (
auto &mPeak : Peaks) {
141 auto peakKey = mPeak.first;
142 auto peak = mPeak.second;
144 fPeakParamInds[peakKey]={};
146 int iAmpParam = iParamCount;
148 fPeakParamInds[peakKey].iAmplitude = iAmpParam;
149 int iCentParam = iParamCount;
151 fPeakParamInds[peakKey].iCentroid = iCentParam;
157 int iSkewWidthParam2;
158 if (parameters.iFixWidthsFile) {
161 else if (parameters.iFixWidths) {
163 iWidthParam = iParamCount;
167 iWidthParam = fPeakParamInds[firstKey].iWidth;
170 iWidthParam = iParamCount;
173 fPeakParamInds[peakKey].iWidth = iWidthParam;
177 if (parameters.iFixWidthsFile) {
180 else if (parameters.iFixWidths) {
182 iStepAmpParam = iParamCount;
186 iStepAmpParam = fPeakParamInds[firstKey].iStepAmplitude;
189 iStepAmpParam = iParamCount;
192 fPeakParamInds[peakKey].iStepAmplitude = iStepAmpParam;
200 if (parameters.iFixWidthsFile) {
202 iSkewWidthParam = -1;
204 else if (parameters.iFixWidths ) {
206 iSkewAmpParam = iParamCount;
208 iSkewWidthParam = iParamCount;
211 iSkewAmpParam = fPeakParamInds[firstKey].iSkewAmplitude;
212 iSkewWidthParam = fPeakParamInds[firstKey].iSkewWidth;
215 iSkewAmpParam = iParamCount;
217 iSkewWidthParam = iParamCount;
220 fPeakParamInds[peakKey].iSkewAmplitude = iSkewAmpParam;
221 fPeakParamInds[peakKey].iSkewWidth = iSkewWidthParam;
226 if (parameters.iFixWidthsFile) {
228 iSkewWidthParam2 = -1;
230 else if (parameters.iFixWidths) {
232 iSkewAmpParam2 = iParamCount;
234 iSkewWidthParam2 = iParamCount;
237 iSkewAmpParam2 = fPeakParamInds[firstKey].iSkewAmplitude2;
238 iSkewWidthParam2 = fPeakParamInds[firstKey].iSkewWidth2;
241 iSkewAmpParam2 = iParamCount;
243 iSkewWidthParam2 = iParamCount;
246 fPeakParamInds[peakKey].iSkewAmplitude2 = iSkewAmpParam2;
247 fPeakParamInds[peakKey].iSkewWidth2 = iSkewWidthParam2;
258 fTotal->SetParName(0,
"c");
259 if (!parameters.iConstantBack) {
260 fTotal->SetParName(1,
"b");
262 if (parameters.iQuadBack) {
263 fTotal->SetParName(2,
"a");
267 for (
auto &mpp : fPeakParamInds) {
268 auto peakKey = mpp.first;
269 auto pp = mpp.second;
270 fTotal->SetParName(pp.iAmplitude, (
"Amp" + std::to_string(i)).c_str());
271 fTotal->SetParName(pp.iCentroid, (
"Cent" + std::to_string(i)).c_str());
272 if (parameters.iFixWidths && !parameters.iFixWidthsFile) {
273 fTotal->SetParName(pp.iWidth,
"Sigma");
275 fTotal->SetParName(pp.iWidth, (
"Sigma" + std::to_string(i)).c_str());
280 if (parameters.iFixWidths && !parameters.iFixWidthsFile) {
281 fTotal->SetParName(pp.iStepAmplitude,
"H");
284 fTotal->SetParName(pp.iStepAmplitude, (
"H" + std::to_string(i)).c_str());
293 if (parameters.iFixWidths && !parameters.iFixWidthsFile) {
294 fTotal->SetParName(pp.iSkewAmplitude,
"R");
295 fTotal->SetParName(pp.iSkewWidth,
"Beta");
297 fTotal->SetParName(pp.iSkewAmplitude, (
"R" + std::to_string(i)).c_str());
298 fTotal->SetParName(pp.iSkewWidth, (
"Beta" + std::to_string(i)).c_str());
303 if (parameters.iFixWidths && !parameters.iFixWidthsFile) {
304 fTotal->SetParName(pp.iSkewAmplitude2,
"R2");
305 fTotal->SetParName(pp.iSkewWidth2,
"Beta2");
307 fTotal->SetParName(pp.iSkewAmplitude2, (
"R2_" + std::to_string(i)).c_str());
308 fTotal->SetParName(pp.iSkewWidth2, (
"Beta2_" + std::to_string(i)).c_str());
437 std::string fopts(foption);
438 fopts = fopts +
" R";
440 fFitGuesses->fScale.val = 1./(hist->GetBinCenter(2)-hist->GetBinCenter(1));
443 if (parameters.iFixWidthsFile) {
444 FILE *file = fopen(
"FitWidths.dat",
"ra");
445 if (!file) { std::cerr <<
"Error! file FitWidths.dat not opened" << std::endl;
return;}
446 std::stringstream
ss;
449 gWidth =
new TGraph();
450 gStep =
new TGraph();
451 gSkew =
new TGraph();
452 gSkewAmp =
new TGraph();
453 gSkew2 =
new TGraph();
454 gSkewAmp2 =
new TGraph();
456 while(std::fgets(cline,
sizeof cline, file)!=NULL) {
457 std::string line(cline);
458 if (line.size() == 0) {
continue; }
459 if (line[0] ==
'#') {
continue; }
460 if (line[0] ==
';') {
continue; }
461 if (line[0] ==
'!') {
continue; }
466 double energy, width, step, skew, skewamp, skew2, skewamp2;
467 ss >> energy >> width >> step >> skew >> skewamp >> skew2 >> skewamp2;
469 gWidth->AddPoint(energy, width);
470 gStep->AddPoint(energy,step);
471 gSkew->AddPoint(energy,skew);
472 gSkewAmp->AddPoint(energy,skewamp);
473 gSkew2->AddPoint(energy,skew2);
474 gSkewAmp2->AddPoint(energy,skewamp2);
481 if (!parameters.iNoFit) {
482 hist->Fit(fTotal, fopts.c_str());
490 for (
auto &mpp : fPeakParamInds) {
491 auto peakKey = mpp.first;
492 auto pp = mpp.second;
493 if (!parameters.iFixWidthsFile) {
494 fTotal->SetParameter(pp.iStepAmplitude,
fFitGuesses->fStepAmp.val);
507 if (!parameters.iNoFit) {
508 hist->Fit(fTotal, fopts.c_str());
517 for (
auto &mpp : fPeakParamInds) {
518 auto peakKey = mpp.first;
519 auto pp = mpp.second;
520 if (!parameters.iFixWidthsFile) {
521 fTotal->SetParameter(pp.iSkewWidth,
fFitGuesses->fSkewWidth.val);
523 fTotal->SetParameter(pp.iSkewAmplitude,
fFitGuesses->fSkewAmp.val);
527 if (!parameters.iNoFit) {
528 hist->Fit(fTotal, fopts.c_str());
534 for (
auto &mpp : fPeakParamInds) {
535 auto peakKey = mpp.first;
536 auto pp = mpp.second;
537 if (!parameters.iFixWidthsFile) {
538 fTotal->SetParameter(pp.iSkewWidth2,
fFitGuesses->fSkewWidth2.val);
540 fTotal->SetParameter(pp.iSkewAmplitude2,
fFitGuesses->fSkewAmp2.val);
544 if (!parameters.iNoFit) {
545 hist->Fit(fTotal, fopts.c_str());
555 if (!parameters.iConstantBack) {
558 if (parameters.iQuadBack) {
561 SetChi2(hist->Chisquare(fTotal,
"R"));
562 for (
auto &mpeak : fPeaks) {
563 auto peakKey = mpeak.first;
564 auto peak = mpeak.second;
565 auto pp = fPeakParamInds[peakKey];
568 if (parameters.iFixWidthsFile) {
569 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
570 fTotal->GetParameter(pp.iCentroid),
571 gWidth->Eval(fTotal->GetParameter(pp.iCentroid))/2.3548});
572 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
573 fTotal->GetParError(pp.iCentroid),
577 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
578 fTotal->GetParameter(pp.iCentroid),
579 fTotal->GetParameter(pp.iWidth)});
580 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
581 fTotal->GetParError(pp.iCentroid),
587 if (parameters.iFixWidthsFile) {
588 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
589 fTotal->GetParameter(pp.iCentroid),
590 gWidth->Eval(fTotal->GetParameter(pp.iCentroid))/2.3548,
591 gStep->Eval(fTotal->GetParameter(pp.iCentroid))});
592 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
593 fTotal->GetParError(pp.iCentroid),
598 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
599 fTotal->GetParameter(pp.iCentroid),
600 fTotal->GetParameter(pp.iWidth),
601 fTotal->GetParameter(pp.iStepAmplitude)});
602 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
603 fTotal->GetParError(pp.iCentroid),
604 fTotal->GetParError(pp.iWidth),
605 fTotal->GetParError(pp.iStepAmplitude)});
610 if (parameters.iFixWidthsFile) {
611 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
612 fTotal->GetParameter(pp.iCentroid),
613 gWidth->Eval(fTotal->GetParameter(pp.iCentroid))/2.3548,
614 gSkewAmp->Eval(fTotal->GetParameter(pp.iCentroid)),
615 gSkew->Eval(fTotal->GetParameter(pp.iCentroid))});
616 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
617 fTotal->GetParError(pp.iCentroid),
623 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
624 fTotal->GetParameter(pp.iCentroid),
625 fTotal->GetParameter(pp.iWidth),
626 fTotal->GetParameter(pp.iSkewAmplitude),
627 fTotal->GetParameter(pp.iSkewWidth)});
628 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
629 fTotal->GetParError(pp.iCentroid),
630 fTotal->GetParError(pp.iWidth),
631 fTotal->GetParError(pp.iSkewAmplitude),
632 fTotal->GetParError(pp.iSkewWidth)});
637 if (parameters.iFixWidthsFile) {
638 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
639 fTotal->GetParameter(pp.iCentroid),
640 gWidth->Eval(fTotal->GetParameter(pp.iCentroid))/2.3548,
641 gSkewAmp->Eval(fTotal->GetParameter(pp.iCentroid)),
642 gSkew->Eval(fTotal->GetParameter(pp.iCentroid)),
643 gSkewAmp2->Eval(fTotal->GetParameter(pp.iCentroid)),
644 gSkew2->Eval(fTotal->GetParameter(pp.iCentroid))});
645 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
646 fTotal->GetParError(pp.iCentroid),
654 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
655 fTotal->GetParameter(pp.iCentroid),
656 fTotal->GetParameter(pp.iWidth),
657 fTotal->GetParameter(pp.iSkewAmplitude),
658 fTotal->GetParameter(pp.iSkewWidth),
659 fTotal->GetParameter(pp.iSkewAmplitude2),
660 fTotal->GetParameter(pp.iSkewWidth2)});
661 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
662 fTotal->GetParError(pp.iCentroid),
663 fTotal->GetParError(pp.iWidth),
664 fTotal->GetParError(pp.iSkewAmplitude),
665 fTotal->GetParError(pp.iSkewWidth),
666 fTotal->GetParError(pp.iSkewAmplitude2),
667 fTotal->GetParError(pp.iSkewWidth2)});
672 if (parameters.iFixWidthsFile) {
673 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
674 fTotal->GetParameter(pp.iCentroid),
675 gWidth->Eval(fTotal->GetParameter(pp.iCentroid))/2.3548,
676 gSkewAmp->Eval(fTotal->GetParameter(pp.iCentroid)),
677 gSkew->Eval(fTotal->GetParameter(pp.iCentroid)),
678 gStep->Eval(fTotal->GetParameter(pp.iCentroid))});
679 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
680 fTotal->GetParError(pp.iCentroid),
688 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
689 fTotal->GetParameter(pp.iCentroid),
690 fTotal->GetParameter(pp.iWidth),
691 fTotal->GetParameter(pp.iSkewAmplitude),
692 fTotal->GetParameter(pp.iSkewWidth),
693 fTotal->GetParameter(pp.iStepAmplitude)});
694 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
695 fTotal->GetParError(pp.iCentroid),
696 fTotal->GetParError(pp.iWidth),
697 fTotal->GetParError(pp.iSkewAmplitude),
698 fTotal->GetParError(pp.iSkewWidth),
699 fTotal->GetParError(pp.iStepAmplitude)});
704 if (parameters.iFixWidthsFile) {
705 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
706 fTotal->GetParameter(pp.iCentroid),
707 gWidth->Eval(fTotal->GetParameter(pp.iCentroid))/2.3548,
708 gSkewAmp->Eval(fTotal->GetParameter(pp.iCentroid)),
709 gSkew->Eval(fTotal->GetParameter(pp.iCentroid)),
710 gSkewAmp2->Eval(fTotal->GetParameter(pp.iCentroid)),
711 gSkew2->Eval(fTotal->GetParameter(pp.iCentroid)),
712 gStep->Eval(fTotal->GetParameter(pp.iCentroid))});
713 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
714 fTotal->GetParError(pp.iCentroid),
723 peak->SetParameters({fTotal->GetParameter(pp.iAmplitude),
724 fTotal->GetParameter(pp.iCentroid),
725 fTotal->GetParameter(pp.iWidth),
726 fTotal->GetParameter(pp.iSkewAmplitude),
727 fTotal->GetParameter(pp.iSkewWidth),
728 fTotal->GetParameter(pp.iSkewAmplitude2),
729 fTotal->GetParameter(pp.iSkewWidth2),
730 fTotal->GetParameter(pp.iStepAmplitude)});
731 peak->SetParErrors({fTotal->GetParError(pp.iAmplitude),
732 fTotal->GetParError(pp.iCentroid),
733 fTotal->GetParError(pp.iWidth),
734 fTotal->GetParError(pp.iSkewAmplitude),
735 fTotal->GetParError(pp.iSkewWidth),
736 fTotal->GetParError(pp.iSkewAmplitude2),
737 fTotal->GetParError(pp.iSkewWidth2),
738 fTotal->GetParError(pp.iStepAmplitude)});
839 if (!hist) {
return NULL; }
841 TString opts(option);
846 if (opts.Contains(
"z")) {
859 std::vector<double> centroids;
860 std::vector<TArrow *> arrows;
861 std::vector<TText *> labels;
862 std::vector<TLine *> bounds;
864 canvas->SetCrosshair();
868 std::string canvasname = canvas->GetName();
871 canvas->Connect(
"ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
"GamR::Utils::Clicker", &click,
"GetClick(Int_t,Int_t,Int_t,TObject*)");
876 std::cout <<
"Click for lower bound of region..." << std::endl;
878 }
else if (peaks == -1) {
880 std::cout <<
"Click for upper bound of region..." << std::endl;
884 std::cout <<
"Click for peak centroid, press any key to fit..." << std::endl;
888 obj = canvas->WaitPrimitive();
891 if (strncmp(obj->ClassName(),
"TMarker", 7) == 0) {
892 marker = (TMarker *)obj;
894 low = marker->GetX();
896 std::cout <<
"Lower bound: " << low << std::endl;
898 double low_y = canvas->GetUymin();
899 if (canvas->GetLogy()) {
900 low_y = std::pow(10, low_y);
902 TLine *line =
new TLine(marker->GetX(), hist->GetBinContent(hist->FindBin(marker->GetX())), marker->GetX(),
905 bounds.push_back(line);
906 }
else if (peaks == -1) {
907 high = marker->GetX();
909 std::cout <<
"Upper bound: " << high << std::endl;
911 double low_y = canvas->GetUymin();
912 if (canvas->GetLogy()) {
913 low_y = std::pow(10, low_y);
915 TLine *line =
new TLine(marker->GetX(), hist->GetBinContent(hist->FindBin(marker->GetX())), marker->GetX(),
918 bounds.push_back(line);
920 centroids.push_back(marker->GetX());
922 std::cout <<
"Centroid: " << marker->GetX() << std::endl;
924 TArrow *arrow =
new TArrow(marker->GetX(), 0.8 * hist->GetBinContent(hist->FindBin(marker->GetX())),
925 marker->GetX(), 0.95 * hist->GetBinContent(hist->FindBin(marker->GetX())), 0.01);
929 new TText(marker->GetX(), 0.75 * hist->GetBinContent(hist->FindBin(marker->GetX())), s.Data());
930 text->SetTextSize(0.03);
931 text->SetTextAlign(21);
936 arrows.push_back(arrow);
937 labels.push_back(text);
944 canvas->Disconnect(
"ProcessedEvent(Int_t,Int_t,Int_t,TObject*)", &click,
"GetClick(Int_t,Int_t,Int_t,TObject*)");
948 std::cout <<
"defined no peaks!" << std::endl;
950 canvas->SetCrosshair(0);
955 std::vector<std::string> FixEnergies;
956 if (opts.Contains(
"e")) {
957 std::cout <<
"Fixing peak energies: " << std::endl;
960 for (
auto ¢ : centroids) {
962 std::cout <<
"Peak " << index <<
" [ " << cent <<
" ] : ";
964 std::getline(std::cin, line);
966 if (line.empty()) { index += 1;
continue; }
967 std::stringstream
ss;
972 centroids[index] = energy;
973 FixEnergies.push_back(
"Peak"+std::to_string(index));
986 background->Draw(
"same");
988 if ((
int)centroids.size() >= 1) {
991 for (
auto &mpeak : retval->
GetPeaks()) {
992 auto peakKey = mpeak.first;
993 auto peak = mpeak.second;
996 TF1 *single = retval->
GetPeakBG(peakKey);
998 single->SetLineColor(kBlue+1);
999 single->SetLineWidth(2);
1000 single->Draw(
"same");
1005 step->SetLineColor(kBlack);
1006 step->SetLineWidth(1);
1013 if (gauss != NULL) {
1015 gauss->SetLineWidth(1);
1016 gauss->SetLineColor(kGreen+2);
1017 gauss->Draw(
"same");
1021 TArrow *arrow = arrows[i];
1022 canvas->GetListOfPrimitives()->Remove(arrow);
1023 arrow->SetX1(peak->GetCent());
1025 single->Eval(peak->GetCent()));
1026 arrow->SetX2(peak->GetCent());
1028 single->Eval(peak->GetCent()));
1032 TText *text = labels[i];
1033 canvas->GetListOfPrimitives()->Remove(text);
1034 text->SetX(peak->GetCent());
1036 single->Eval(peak->GetCent()));
1037 text->SetTextSize(0.03);
1038 text->SetTextAlign(21);
1056 int iLowBin = hist->FindBin(low);
1057 int iHighBin = hist->FindBin(high);
1058 double min = canvas->GetUymin();
1059 double offset = min + (std::min(hist->GetBinContent(iLowBin), hist->GetBinContent(iHighBin)) - min) / 2.0;
1061 TH1D *residuals =
new TH1D(
"residuals",
"residuals", iHighBin - iLowBin + 1,
1062 hist->GetBinCenter(iLowBin) - hist->GetBinWidth(iLowBin) / 2.0,
1063 hist->GetBinCenter(iHighBin) + hist->GetBinWidth(iHighBin) / 2.0);
1064 for (
int i = 1; i <= iHighBin - iLowBin + 1; i++) {
1065 residuals->SetBinContent(i, hist->GetBinContent(i + iLowBin - 1) -
1066 func->Eval(hist->GetBinCenter(i + iLowBin - 1)) + offset);
1067 residuals->SetBinError(i, hist->GetBinError(i + iLowBin - 1));
1070 TF1 *zeroFunc =
new TF1(
"zero",
"[0]", low, high);
1071 zeroFunc->SetParameter(0, offset);
1072 residuals->SetMarkerSize(0.5);
1073 residuals->Draw(
"hist E1 same");
1074 zeroFunc->Draw(
"same");
1080 std::cout <<
"Press any key to exit" << std::endl;
1083 canvas->WaitPrimitive();
1087 residuals->Delete();
1090 canvas->SetCrosshair(0);
1199 fTotal =
new TF1(
"func",
1200 [&](
double *x,
double *p){
1202 fBackground->SetParameter(0, p[0]);
1203 if (!parameters.iConstantBack) {
1204 fBackground->SetParameter(1, p[1]);
1206 if (parameters.iQuadBack) {
1207 fBackground->SetParameter(2, p[2]);
1209 ret += fBackground->Eval(x[0]);
1211 for (
auto &mpp : fPeakParamInds) {
1212 auto peakKey = mpp.first;
1213 auto pp = mpp.second;
1216 if (parameters.iFixWidthsFile) {
1217 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1219 gWidth->Eval(p[pp.iCentroid])/2.3548});
1222 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1229 if (parameters.iFixWidthsFile) {
1230 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1232 gWidth->Eval(p[pp.iCentroid])/2.3548,
1233 gStep->Eval(p[pp.iCentroid])});
1236 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1239 p[pp.iStepAmplitude]});
1244 if (parameters.iFixWidthsFile) {
1245 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1247 gWidth->Eval(p[pp.iCentroid])/2.3548,
1248 gSkewAmp->Eval(p[pp.iCentroid]),
1249 gSkew->Eval(p[pp.iCentroid])});
1252 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1255 p[pp.iSkewAmplitude],
1261 if (parameters.iFixWidthsFile) {
1262 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1264 gWidth->Eval(p[pp.iCentroid])/2.3548,
1265 gSkewAmp->Eval(p[pp.iCentroid]),
1266 gSkew->Eval(p[pp.iCentroid]),
1267 gSkewAmp2->Eval(p[pp.iCentroid]),
1268 gSkew2->Eval(p[pp.iCentroid])});
1271 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1274 p[pp.iSkewAmplitude],
1276 p[pp.iSkewAmplitude2],
1277 p[pp.iSkewWidth2]});
1282 if (parameters.iFixWidthsFile) {
1283 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1285 gWidth->Eval(p[pp.iCentroid])/2.3548,
1286 gSkewAmp->Eval(p[pp.iCentroid]),
1287 gSkew->Eval(p[pp.iCentroid]),
1288 gStep->Eval(p[pp.iCentroid])});
1291 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1294 p[pp.iSkewAmplitude],
1296 p[pp.iStepAmplitude]});
1301 if (parameters.iFixWidthsFile) {
1302 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1304 gWidth->Eval(p[pp.iCentroid])/2.3548,
1305 gSkewAmp->Eval(p[pp.iCentroid]),
1306 gSkew->Eval(p[pp.iCentroid]),
1307 gSkewAmp2->Eval(p[pp.iCentroid]),
1308 gSkew2->Eval(p[pp.iCentroid]),
1309 gStep->Eval(p[pp.iCentroid])});
1312 fPeaks[peakKey]->SetParameters({p[pp.iAmplitude],
1315 p[pp.iSkewAmplitude],
1317 p[pp.iSkewAmplitude2],
1319 p[pp.iStepAmplitude]});
1325 ret += fPeaks[peakKey]->GetFunc()->Eval(x[0]);
1328 }, fLow, fHigh, iParamCount);
1330 for (
auto & mPeak : fPeaks) {
1331 auto peakKey = mPeak.first;
1332 auto peak = mPeak.second;
1333 auto func = peak->GetFunc();
1334 auto pp = fPeakParamInds[peakKey];
1339 func->GetParLimits(0,low,high);
1341 fTotal->SetParLimits(pp.iAmplitude, low, high);
1343 func->GetParLimits(1,low,high);
1345 fTotal->SetParLimits(pp.iCentroid, low, high);
1347 func->GetParLimits(2,low,high);
1349 fTotal->SetParLimits(pp.iWidth, low, high);
1356 func->GetParLimits(0,low,high);
1358 fTotal->SetParLimits(pp.iAmplitude, low, high);
1360 func->GetParLimits(1,low,high);
1362 fTotal->SetParLimits(pp.iCentroid, low, high);
1364 if (!parameters.iFixWidthsFile) {
1365 func->GetParLimits(2,low,high);
1367 fTotal->SetParLimits(pp.iWidth, low, high);
1369 func->GetParLimits(3,low,high);
1371 fTotal->SetParLimits(pp.iStepAmplitude, low, high);
1379 func->GetParLimits(0,low,high);
1381 fTotal->SetParLimits(pp.iAmplitude, low, high);
1383 func->GetParLimits(1,low,high);
1385 fTotal->SetParLimits(pp.iCentroid, low, high);
1387 if (!parameters.iFixWidthsFile) {
1388 func->GetParLimits(2,low,high);
1390 fTotal->SetParLimits(pp.iWidth, low, high);
1392 func->GetParLimits(3,low,high);
1394 fTotal->SetParLimits(pp.iSkewAmplitude, low, high);
1396 func->GetParLimits(4,low,high);
1398 fTotal->SetParLimits(pp.iSkewWidth, low, high);
1406 func->GetParLimits(0,low,high);
1408 fTotal->SetParLimits(pp.iAmplitude, low, high);
1410 func->GetParLimits(1,low,high);
1412 fTotal->SetParLimits(pp.iCentroid, low, high);
1414 if (!parameters.iFixWidthsFile) {
1415 func->GetParLimits(2,low,high);
1417 fTotal->SetParLimits(pp.iWidth, low, high);
1419 func->GetParLimits(3,low,high);
1421 fTotal->SetParLimits(pp.iSkewAmplitude, low, high);
1423 func->GetParLimits(4,low,high);
1425 fTotal->SetParLimits(pp.iSkewWidth, low, high);
1427 func->GetParLimits(5,low,high);
1429 fTotal->SetParLimits(pp.iSkewAmplitude2, low, high);
1431 func->GetParLimits(6,low,high);
1433 fTotal->SetParLimits(pp.iSkewWidth2, low, high);
1441 func->GetParLimits(0,low,high);
1443 fTotal->SetParLimits(pp.iAmplitude, low, high);
1445 func->GetParLimits(1,low,high);
1447 fTotal->SetParLimits(pp.iCentroid, low, high);
1449 if (!parameters.iFixWidthsFile) {
1450 func->GetParLimits(2,low,high);
1452 fTotal->SetParLimits(pp.iWidth, low, high);
1454 func->GetParLimits(3,low,high);
1456 fTotal->SetParLimits(pp.iSkewAmplitude, low, high);
1458 func->GetParLimits(4,low,high);
1460 fTotal->SetParLimits(pp.iSkewWidth, low, high);
1462 func->GetParLimits(5,low,high);
1464 fTotal->SetParLimits(pp.iStepAmplitude, low, high);
1472 func->GetParLimits(0,low,high);
1474 fTotal->SetParLimits(pp.iAmplitude, low, high);
1476 func->GetParLimits(1,low,high);
1478 fTotal->SetParLimits(pp.iCentroid, low, high);
1480 if (!parameters.iFixWidthsFile) {
1481 func->GetParLimits(2,low,high);
1483 fTotal->SetParLimits(pp.iWidth, low, high);
1485 func->GetParLimits(3,low,high);
1487 fTotal->SetParLimits(pp.iSkewAmplitude, low, high);
1489 func->GetParLimits(4,low,high);
1491 fTotal->SetParLimits(pp.iSkewWidth, low, high);
1493 func->GetParLimits(5,low,high);
1495 fTotal->SetParLimits(pp.iSkewAmplitude2, low, high);
1497 func->GetParLimits(6,low,high);
1499 fTotal->SetParLimits(pp.iSkewWidth2, low, high);
1501 func->GetParLimits(7,low,high);
1503 fTotal->SetParLimits(pp.iStepAmplitude, low, high);
1511 fNPars = fTotal->GetNpar();