00001 Double_t gausBack (Double_t *x, Double_t *par)
00002 {
00003 Double_t sigma = par[3];
00004 Double_t mean = par[2];
00005 Double_t sigfrac = par[1];
00006 Double_t backfrac = 1.-sigfrac;
00007 Double_t amp = par[0];
00008
00009
00010 Double_t gaus = 1./(sqrt(2.*3.14159265)*sigma*TMath::Erf(sqrt(2)))*
00011 exp(-0.5*(x[0]-mean)*(x[0]-mean)/(sigma*sigma));
00012 Double_t back = 1./(4.*sigma);
00013
00014 Double_t fitval = amp*(backfrac*back + sigfrac*gaus);
00015 return fitval;
00016 }
00017 Double_t erfBack (Double_t *x, Double_t *par)
00018 {
00019 Double_t sigma = par[3];
00020 Double_t mean = par[2];
00021 Double_t sigfrac = par[1];
00022 Double_t backfrac = 1.-sigfrac;
00023 Double_t amp = par[0];
00024 Double_t blah1 = TMath::Erf(-(x[0]-0.4-mean)/sigma);
00025 Double_t blah2 = TMath::Erf((x[0]+0.4-mean)/sigma);
00026 Double_t gaus = 0.5*(blah1+blah2);
00027
00028 Double_t fitval =amp*(backfrac + sigfrac*gaus);
00029 return fitval;
00030 }
00031
00032 TGraphErrors**
00033 fitSlice (void* func,TH2D* hist, Int_t nhists)
00034 {
00035 TGraphErrors** retGraphs = new TGraphErrors*[5];
00036 TH1D** hists = new TH1D*[nhists];
00037 Int_t nbins = hist->GetNbinsX();
00038 Double_t* x = new Double_t[nhists];
00039 Double_t* ex = new Double_t[nhists];
00040
00041 for (Int_t i=0; i< nhists; ++i) {
00042 Int_t low = i*(nbins/nhists)+1;
00043 Int_t high = (i+1)*(nbins/nhists);
00044 Double_t xlow = hist->GetXaxis()->GetBinLowEdge(low);
00045 Double_t xhigh = hist->GetXaxis()->GetBinUpEdge(high);
00046 x[i] = (xlow + xhigh)/2.;
00047 ex[i] = (xhigh-xlow)/2.;
00048
00049 Char_t* blah = new Char_t[100];
00050 Char_t* blah2 = hist->GetName();
00051
00052 sprintf(blah,"%s_proj%d",blah2,i);
00053
00054 hists[i] = hist->ProjectionY(blah,low,high,"E");
00055 }
00056
00057 TF1* gausBack = new TF1("gausBack",func,-3,3,4);
00058 gausBack->SetParNames("2 Sigma Sum","2 Sigma Signal Fraction","Mean","Sigma");
00059 Double_t* amp = new Double_t[nhists];
00060 Double_t* sigfrac = new Double_t[nhists];
00061 Double_t* mean = new Double_t[nhists];
00062 Double_t* sigma = new Double_t[nhists];
00063 Double_t* chisq = new Double_t[nhists];
00064
00065 Double_t* eamp = new Double_t[nhists];
00066 Double_t* esigfrac = new Double_t[nhists];
00067 Double_t* emean = new Double_t[nhists];
00068 Double_t* esigma = new Double_t[nhists];
00069 Double_t* echisq = new Double_t[nhists];
00070
00071 for (Int_t i=0; i< nhists; ++i) {
00072 TH1D* histslice = hists[i];
00073 gausBack->SetParameters(histslice->GetMaximum()*histslice->GetRMS(),1,
00074 histslice->GetMean(),histslice->GetRMS());
00075 printf("Original parameters: %f %f %f %f",histslice->GetMaximum()*histslice->GetRMS(),
00076 1,histslice->GetMean(),histslice->GetRMS());
00077
00078 if (histslice->GetMaximum()>4.) {
00079
00080 histslice->Fit("gausBack","EL");
00081 amp[i] = gausBack->GetParameter(0);
00082 sigfrac[i] = gausBack->GetParameter(1);
00083 mean[i] = gausBack->GetParameter(2);
00084 sigma[i] = gausBack->GetParameter(3);
00085 chisq[i] = gausBack->GetChisquare();
00086
00087 eamp[i] = gausBack->GetParError(0);
00088 esigfrac[i] = gausBack->GetParError(1);
00089 emean[i] = gausBack->GetParError(2);
00090 esigma[i] = gausBack->GetParError(3);
00091 echisq[i] = 0;
00092 }
00093 else {
00094 amp[i] = 0;
00095 sigfrac[i] = 0;
00096 mean[i] = 0;
00097 sigma[i] = 0;
00098 chisq[i] = 0;
00099
00100 eamp[i] = 0;
00101 esigfrac[i] = 0;
00102 emean[i] = 0;
00103 esigma[i] = 0;
00104 echisq[i] = 0;
00105 }
00106
00107
00108 }
00109 retGraphs[0] = new TGraphErrors(nhists,x,amp,ex,eamp);
00110 retGraphs[1] = new TGraphErrors(nhists,x,sigfrac,ex,esigfrac);
00111 retGraphs[2] = new TGraphErrors(nhists,x,mean,ex,emean);
00112 retGraphs[3] = new TGraphErrors(nhists,x,sigma,ex,esigma);
00113 retGraphs[4] = new TGraphErrors(nhists,x,chisq,ex,echisq);
00114 retGraphs[0]->SetTitle("2 Sigma Sum");
00115 retGraphs[1]->SetTitle("2 Sigma Signal Fraction");
00116 retGraphs[2]->SetTitle("Mean");
00117 retGraphs[3]->SetTitle("Sigma");
00118 retGraphs[4]->SetTitle("Chi-squared");
00119
00120 return retGraphs;
00121
00122
00123 }
00124 TGraphErrors**
00125 gausSlice (TH2D* hist, Int_t nhists)
00126 {
00127
00128 TGraphErrors** retval = fitSlice(gausBack,hist,nhists);
00129 return retval;
00130 }
00131 TGraphErrors**
00132 erfSlice (TH2D* hist, Int_t nhists)
00133 {
00134
00135 TGraphErrors** retval = fitSlice(erfBack,hist,nhists);
00136 return retval;
00137 }
00138
00139 TGraphErrors**
00140 funcFit (void* func,TH1D* histslice)
00141 {
00142 TGraphErrors** retGraphs = new TGraphErrors*[5];
00143 Int_t nhists=1;
00144 Int_t i=1;
00145
00146 TF1* gausBack = new TF1("gausBack",func,-3,3,4);
00147 gausBack->SetParNames("2 Sigma Sum","2 Sigma Signal Fraction","Mean","Sigma");
00148 Double_t* amp = new Double_t[nhists];
00149 Double_t* sigfrac = new Double_t[nhists];
00150 Double_t* mean = new Double_t[nhists];
00151 Double_t* sigma = new Double_t[nhists];
00152 Double_t* chisq = new Double_t[nhists];
00153
00154 Double_t* eamp = new Double_t[nhists];
00155 Double_t* esigfrac = new Double_t[nhists];
00156 Double_t* emean = new Double_t[nhists];
00157 Double_t* esigma = new Double_t[nhists];
00158 Double_t* echisq = new Double_t[nhists];
00159 gausBack->SetParameters(histslice->GetMaximum()*histslice->GetRMS(),1,
00160 histslice->GetMean(),histslice->GetRMS());
00161
00162 printf("Original parameters: %f %f %f %f",histslice->GetMaximum(),
00163 1,histslice->GetMean(),histslice->GetRMS());
00164
00165 if (histslice->GetMaximum()) {
00166
00167 histslice->Fit("gausBack");
00168 amp[i] = gausBack->GetParameter(0);
00169 sigfrac[i] = gausBack->GetParameter(1);
00170 mean[i] = gausBack->GetParameter(2);
00171 sigma[i] = gausBack->GetParameter(3);
00172 chisq[i] = gausBack->GetChisquare();
00173
00174 eamp[i] = gausBack->GetParError(0);
00175 esigfrac[i] = gausBack->GetParError(1);
00176 emean[i] = gausBack->GetParError(2);
00177 esigma[i] = gausBack->GetParError(3);
00178 echisq[i] = 0;
00179 }
00180 else {
00181 amp[i] = 0;
00182 sigfrac[i] = 0;
00183 mean[i] = 0;
00184 sigma[i] = 0;
00185 chisq[i] = 0;
00186
00187 eamp[i] = 0;
00188 esigfrac[i] = 0;
00189 emean[i] = 0;
00190 esigma[i] = 0;
00191 echisq[i] = 0;
00192 }
00193
00194 return 0;
00195
00196
00197
00198 }
00199
00200 TGraphErrors**
00201 erfFit(TH1D* hist)
00202 {
00203 TGraphErrors** retval = funcFit(erfBack,hist);
00204 return retval;
00205
00206 }
00207 TGraphErrors**
00208 gausFit(TH1D* hist)
00209 {
00210 TGraphErrors** retval = funcFit(gausBack,hist);
00211 return retval;
00212
00213 }
00214
00215
00216
00217
00218