<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?action=history&amp;feed=atom&amp;title=KADD_2021_Laboratorium_12_zdalne</id>
		<title>KADD 2021 Laboratorium 12 zdalne - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?action=history&amp;feed=atom&amp;title=KADD_2021_Laboratorium_12_zdalne"/>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2021_Laboratorium_12_zdalne&amp;action=history"/>
		<updated>2026-04-05T20:17:14Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2021_Laboratorium_12_zdalne&amp;diff=2777&amp;oldid=prev</id>
		<title>Lgraczyk: Created page with &quot;== Zadanie == '''Dopasowanie funkcji za pomocą paietu &lt;code&gt;MINUIT&lt;/code&gt;''' (5 pkt.)  Chcemy wykonać dopasowanie do danych doświadczalnych (wczytywanych z pliku) '''nie''' u...&quot;</title>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2021_Laboratorium_12_zdalne&amp;diff=2777&amp;oldid=prev"/>
				<updated>2021-05-20T06:13:51Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;== Zadanie == &amp;#39;&amp;#39;&amp;#39;Dopasowanie funkcji za pomocą paietu &amp;lt;code&amp;gt;MINUIT&amp;lt;/code&amp;gt;&amp;#39;&amp;#39;&amp;#39; (5 pkt.)  Chcemy wykonać dopasowanie do danych doświadczalnych (wczytywanych z pliku) &amp;#39;&amp;#39;&amp;#39;nie&amp;#39;&amp;#39;&amp;#39; u...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Zadanie ==&lt;br /&gt;
'''Dopasowanie funkcji za pomocą paietu &amp;lt;code&amp;gt;MINUIT&amp;lt;/code&amp;gt;''' (5 pkt.)&lt;br /&gt;
&lt;br /&gt;
Chcemy wykonać dopasowanie do danych doświadczalnych (wczytywanych z pliku) '''nie''' używając funkci &amp;lt;code&amp;gt;Fit&amp;lt;/code&amp;gt;, tylko za pomocą pakietu  &amp;lt;code&amp;gt;MINUIT&amp;lt;/code&amp;gt; ([https://root.cern.ch/root/html534/TMinuit.html dokumentacja]), który daje nam zdecydowanie większą kontrolę nad procesem dopasowania funkcji. Przede wszystkim pakiet &amp;lt;code&amp;gt;MINUIT&amp;lt;/code&amp;gt; pozwala na zdefiniowanie przez nas minimalizowanej wielkości (może to być chi-kwadrat, funkcja wiarygodności, lub cokolwiek innego co wymyślimy), i na podstawie tej minimalizacji pakiet dostarcza nam finalne parametry dopasowania.&lt;br /&gt;
&lt;br /&gt;
== Kroki postępowania ==&lt;br /&gt;
&lt;br /&gt;
1. Ściągamy plik z danymi: [http://www.if.pw.edu.pl/~lgraczyk/KADD2020/lab12/example_data.root example_data.root] i wczytujemy go w funkcji głównej makra.&amp;lt;br&amp;gt;&lt;br /&gt;
Wczytywanie pliku:&lt;br /&gt;
  TFile *ifile = new TFile(&amp;quot;file.root&amp;quot;);&lt;br /&gt;
  TH1D *hist = (TH1D*)ifile-&amp;gt;Get(&amp;quot;hist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
2. Do naszych danych dopasujemy taką oto funkcję zdefiniowaną jako funkcja globalna (nasz model opisujący dane doświadczalne):&lt;br /&gt;
 double model(double x, double *par) &lt;br /&gt;
 { &lt;br /&gt;
  double mu    = par[3]; &lt;br /&gt;
  double sigma = par[4]; &lt;br /&gt;
  double norm  = 1./sqrt(2.*TMath::Pi())/sigma; &lt;br /&gt;
  double G     = norm*exp(-0.5 *pow((x-mu)/sigma,2));  //unormowana funkcja Gaussa&lt;br /&gt;
  double BinWidth = hist-&amp;gt;GetBinWidth(1); &lt;br /&gt;
  return par[0] + par[1]*x + par[2] * BinWidth * G; &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
3. W funkcji głównej makra tworzymy obiekt TMinuit, przykładowo:&lt;br /&gt;
  TMinuit *gMinuit = new TMinuit(liczba_parametrow_fitu); //liczba parametrów wynika z definicji funkcji teoretycznej&lt;br /&gt;
&lt;br /&gt;
4. Musimy stworzyć funkcję globalną (definiujemy ją przed funkcją główną), którą &amp;lt;code&amp;gt;MINUIT&amp;lt;/code&amp;gt; będzie starał się zminimalizować manipulując naszymi parametrami. Musi ona mieć postać typu:&lt;br /&gt;
 void fcn(int &amp;amp;npar, double *gin, double &amp;amp;f, double *par, int iflag)&lt;br /&gt;
'''Uwaga 1!''' Nie przerażamy się parametrami (to są automatyczne parametry, które muszą być i które potrzebuje &amp;lt;code&amp;gt;MINUIT&amp;lt;/code&amp;gt;, my ich w ogóle nie użyjemy).&amp;lt;br&amp;gt;&lt;br /&gt;
'''Uwaga 2!''' Jedynym parametrem, który nas interesuje to &amp;lt;code&amp;gt;double &amp;amp;f&amp;lt;/code&amp;gt; - to jest minimalizowana wielkość. W naszym przypadku chcemy, by &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; było po prostu tożsame z chi-kwadrat. To oznacza, że '''wewnątrz''' funkcji &amp;lt;code&amp;gt;fcn&amp;lt;/code&amp;gt; musimy wykonać iterację bin po binie z wczytanego pliku i dla każdego binu policzyć kwadrat różnic ( (model-wartosc_binu)^2/niepwnosc_binu^2 ). Ostateczna wartość &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;, zgodnie z definicją chi-kwadrat, to po prostu suma  kwadratów różnic dla wszystkich binów.&lt;br /&gt;
&lt;br /&gt;
5. W funkcji głównej, mówimy naszemu obiektowi &amp;lt;code&amp;gt;gMinuit&amp;lt;/code&amp;gt;, że ma skorzystać z funkcji FCN zdefiniowanej powyżej:&lt;br /&gt;
  gMinuit-&amp;gt;SetFCN(fcn);&lt;br /&gt;
&lt;br /&gt;
6. Następnie ustawiamy parametry funkcji, np.:&lt;br /&gt;
  gMinuit-&amp;gt;DefineParameter(0, &amp;quot;p0&amp;quot;,    100., 1.,    0.,  200.);&lt;br /&gt;
&lt;br /&gt;
7. Główna część, gdzie dokonuje się  zadania to wykonanie dwóch komend:&lt;br /&gt;
  gMinuit-&amp;gt;Command(&amp;quot;MIGRAD&amp;quot;);        &lt;br /&gt;
  gMinuit-&amp;gt;Command(&amp;quot;MINOS&amp;quot;);&lt;br /&gt;
&amp;lt;code&amp;gt;MIGRAD&amp;lt;/code&amp;gt; to algorytm szukający minimum funkcji &amp;lt;code&amp;gt;fcn&amp;lt;/code&amp;gt; (czyli szuka najniższej wartości liczby &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;, którą definiujemy w określony przez nas sposób).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;MINOS&amp;lt;/code&amp;gt; to algorytm używany po zminimalizowaniu &amp;lt;code&amp;gt;fcn&amp;lt;/code&amp;gt;, który pozwala na dokładną estymację niepwności (w tym asymetrycznych).&amp;lt;br&amp;gt;&lt;br /&gt;
'''Uwaga!''' Nie musimy znać szczegółów obu algorytmów. Dla zainteresowanych można poczytać [https://root.cern.ch/root/htmldoc/guides/minuit2/Minuit2Letter.pdf Minuit2Letter.pdf]&lt;br /&gt;
&lt;br /&gt;
8. Za pomocą:&lt;br /&gt;
 gMinuit-&amp;gt;GetParameter(...)&lt;br /&gt;
wyciągamy otrzymane parametry dopasowania, tworzymy funkcję &amp;lt;code&amp;gt;TF1&amp;lt;/code&amp;gt; z tymi parametrami i rysujemy wszystko na wykresie.&lt;br /&gt;
&lt;br /&gt;
== Wynik ==&lt;br /&gt;
Przykłądowy histogram z dopasowaniem:&lt;br /&gt;
[[File:Minuit1.png]]&lt;br /&gt;
&lt;br /&gt;
Ostateczny output:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 FCN=93.6468 FROM MINOS     STATUS=SUCCESSFUL    217 CALLS         364 TOTAL&lt;br /&gt;
                      EDM=3.79962e-17    STRATEGY= 1  ERROR MATRIX UNCERTAINTY   0.0 per cent&lt;br /&gt;
   EXT PARAMETER                  PARABOLIC         MINOS ERRORS        &lt;br /&gt;
   NO.   NAME      VALUE            ERROR      NEGATIVE      POSITIVE   &lt;br /&gt;
    1  p0           1.12163e+02   2.00576e+00  -2.00605e+00   2.00576e+00&lt;br /&gt;
    2  p1          -3.33062e+01   1.52150e+00  -1.52151e+00   1.52153e+00&lt;br /&gt;
    3  area         2.02070e+03   5.83151e+01  -5.82593e+01   5.83721e+01&lt;br /&gt;
    4  mean         1.00031e+00   1.70385e-03  -1.70425e-03   1.70425e-03&lt;br /&gt;
    5  width        5.34156e-02   1.50983e-03  -1.49782e-03   1.52309e-03&lt;br /&gt;
 Info in &amp;lt;TCanvas::MakeDefCanvas&amp;gt;:  created default TCanvas with name c1&lt;/div&gt;</summary>
		<author><name>Lgraczyk</name></author>	</entry>

	</feed>