StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
fitTower.C
1 TCanvas *c;
2 double par[6];
3 double *epar;
4 TFile *fdA[12];
5 FILE *wfd=stdout; // output web page
6 FILE *gfd;
7 
8 
9 //========================
10 void openAll(char cT) {
11  int i;
12  char txt[200];
13  for(i=0;i<12;i++) {
14  sprintf(txt,"iter5-pp/sect%02d/sum-sect%d.hist.root",i+1,i+1);
15  fdA[i]=new TFile(txt);
16  assert(fdA[i]->IsOpen());
17  }
18  sprintf(txt,"/star/u/wissink/cal2006/iter5-pp/gains%c-allSect.dat",cT);
19  gfd=fopen(txt,"w");
20  assert(gfd);
21  fprintf(gfd,"# final %c-gains from MIP using UxV\n",cT);
22  fprintf(gfd,"# format: gain (ch/GeV) & errGain, GausLandauFit: MPV(ADC) & errMPV, pedFit: means(ADC) & err \n");
23 
24 
25  sprintf(txt,"/star/u/wissink/cal2006/iter5-pp/gains%c.html",cT);
26 
27  wfd=fopen(txt,"w");
28  assert(wfd);
29 
30  fprintf(wfd,"MIP -- > <a href=\"gains%c-allSect.dat\"> final %c-gains</a> table \n",cT,cT);
31  fprintf(wfd,"<table border=1>\n");
32  fprintf(wfd,"<tr> <th> etaBin <th> problems <th> # of good<th> # of errors <br> +warn <th> spectra <br> (60 tiles)<th> MPV range <br>(ADC) <th> summary <br> plot\n");
33 
34 
35 }
36 
37 
38 //======================================
39 fitTower() {
40  gStyle->SetStatW(0.22);
41  gStyle->SetStatH(0.22);
42 
43  // f=new TFile("/star/data05/scratch/balewski/2005-eemcCal/day49-hist/iter2-out/sum-sect5.hist.root");
44 
45  TH1F *h1=new TH1F("mpv","MPV gated w/ MIP ; MPV of ADC-ped",40,-5,35);
46  TH1F *h2=new TH1F("mpvE","relative error of MPV , MIP gated; err(MPV)/MPV ",50,0,0.3);
47 
48 
49  // stupid root tricks:
50  hDum=new TH1F("aa","bb",10,1,9);
51  hDum->Fill(5);
52 
53 
54  char cT='T';
55  openAll(cT);
56 
57  int sec=5;
58  char core[100];
59 
60  int eta;
61  char sub='C';
62 
63  for(eta=1;eta<=12;eta++) {
64  int nErr=0, nOK=0;
65  float mpvL=999, mpvH=0;
66  h1->Reset(); h2->Reset();
67  fprintf(wfd," <tr> <th> %d <td> \n",eta);
68  gStyle->SetOptStat(1001111);
69 
70  for(sec=1; sec<=12;sec++) {
71  TFile *f=fdA[sec-1];
72  for(sub='A';sub<='E';sub++) {
73  sprintf(core,"%02d%c%c%02d",sec,cT,sub,eta);
74  TString coreT=core;
75  ha=(TH1F*)f->Get("a"+coreT);
76  hd=(TH1F*)f->Get("d"+coreT);
77 
78  // special case of stuck low bits - sww - modified to include 06TA07
79  if( (eta==7 && sub=='B' && (sec==4 || sec==8)) || (eta==7 && sub=='A' && sec==6)) {
80  ha->Rebin(4);
81  hd->Rebin(4);
82  printf("tower=%s rebinned\n",core);
83  }
84 
85  c=new TCanvas("aa","aa",400,400);
86  c->Divide(1,2); c->cd(1);
87  hDum->Draw(); gPad->SetLogy();
88  float mpv, mpvEr;
89  TString errS=plotOne(ha,hd, mpv, mpvEr);
90  printf("errS=%s=\n",errS.Data());
91 
92  bool isBad=errS.Sizeof()>1;
93  if(isBad) { // report error channel
94  fprintf(wfd," %s ,\n",(coreT+"-"+errS).Data());
95  nErr++;
96  }
97  if(errS.Contains("mask")) continue;
98  nOK++;
99  //return;
100 
101  if(mpvL>mpv) mpvL=mpv;
102  if(mpvH<mpv) mpvH=mpv;
103 
104  h1->Fill(mpv);
105  if(mpv>0) {
106  h2->Fill(mpvEr/mpv);
107  }
108 
109  } // end of eta bin
110 
111  }// end of sector loop
112  fprintf(wfd," <td> %d <td> %d\n",nOK,nErr);
113 
114  char txt[100],sumN[100], pdfN[100];
115  sprintf(pdfN,"%cfitEta%02d.pdf",cT,eta);
116  sprintf(txt,"cat *%02d.ps | ps2pdf - %s",eta,pdfN);
117  printf("%s\n",txt);
118  system(txt);
119  sprintf(txt,"mv %s /star/u/wissink/cal2006/tmp/",pdfN);
120  printf("%s\n",txt);
121  system(txt);
122  fprintf(wfd," <td> <a href=\"%s\"> PDF </a>\n",pdfN);
123  fprintf(wfd," <td> %.1f to %.1f \n",mpvL,mpvH);
124 
125  gStyle->SetOptStat(1111111);
126 
127  sprintf(sumN,"mpv%c-eta%02d",cT,eta);
128  c=new TCanvas(sumN,sumN,600,600);
129  c->Divide(1,3);
130  c->cd(1); h1->Draw();
131  c->cd(2); h2->Draw();
132  c->Print();
133 
134  sprintf(txt,"ps2pdf %s.ps %s.pdf",sumN,sumN);
135  printf("%s\n",txt);
136  system(txt);
137  sprintf(txt,"mv %s.pdf /star/u/wissink/cal2006/tmp/",sumN);
138  printf("%s\n",txt);
139  system(txt);
140  fprintf(wfd," <td> <a href=\"%s.pdf\"> PDF </a>\n",sumN);
141 
142  fflush(wfd);
143  }// end of loop over eta bins
144 
145  if(wfd!=stdout)fclose(wfd);
146  fclose(gfd);
147  return;
148 }
149 
150 //=================================
151 TString plotOne(TH1F *ha, TH1F *hd, float &MPV, float &MPVerr) {
152  assert(ha);
153  assert(hd);
154  const float feta[]=
155  {1.95,1.855,1.765,1.675,1.59,1.51,1.435,1.365,1.3,1.235,1.17,1.115};
156 
157  char *core =ha->GetName()+1;
158  TString coreT=core;
159  float xMax=120;
160  ha->SetAxisRange(-10,xMax);
161  hd->SetAxisRange(-10,xMax/2.);
162 
163 
164  int maxbina=ha->GetMaximumBin();
165  float xcenta=ha->GetBinCenter(maxbina);
166  printf("\n============================\n working on %s\n",ha->GetName());
167 
168  c->cd(1);
169  ha->SetLineColor(4);
170  ha->SetMinimum(0.9);
171  char *func="gaus";
172  ha->Fit(func,"RQI","",xcenta-5,xcenta+5);
173  gPad->SetLogy();
174  TF1* gausa=ha->GetFunction(func);
175  gausa->SetLineWidth(1);
176  gausa->SetLineColor(2);
177  float meanA=gausa->GetParameter(1);
178  float errorA=gausa->GetParError(1);
179 
180  hx=hd->Clone(); // memory leak
181  hx->Draw("same");
182 
183  c->cd(2);
184 
185  TF1 *f1 = new TF1("myfunc",myfunction,-10,100,5);
186  f1->SetParNames("x0","aL","aG","sigL","sigG");
187  f1->SetLineColor(kRed);
188  f1->SetLineWidth(1);
189  hd->Fit("gaus","RQ","",0,30);
190  TF1 *ff=hd->GetFunction("gaus");
191  f1->SetParameter(0,ff->GetParameter(1));
192  f1->SetParameter(1,ff->GetParameter(0));
193  f1->FixParameter(2,0);
194 
195  fitGausLand(hd); // do fitting
196  c->Print(coreT+".ps"); // draw before QA on results changing axis limits
197 
198  //....... retrieve components
199  f1->GetParameters(par);
200  epar= f1->GetParErrors();
201 
202  ha->SetAxisRange(-3,3);
203  // printf("RR=%f\n",ha->Integral()/ha->GetEntries());
204  if(ha->Integral()/ha->GetEntries()>0.999) return "mask";
205 
206  float meanD=par[0];
207  float errorD=epar[0];
208  //printf("ss=%s=\n",ha->GetName()+5);
209  int ieta=atoi(core+4) -1;
210  // printf("ssieta=%d\n",ieta);
211 
212  MPV=(meanD-meanA);
213  MPVerr=sqrt(errorA*errorA+errorD*errorD+0.09);
214  float gain=2.89*TMath::TanH(feta[ieta])*MPV;
215  float sig=2.89*TMath::TanH(feta[ieta])*MPVerr;
216  fprintf(gfd,"%s %.2f %.2f %5.1f %5.2f %5.2f %5.2f\n",core,gain,sig,meanD,errorD,meanA,errorA);
217 
218  if(fabs(meanA)>1.) return "pedOff";
219  if(ha->GetEntries() <=5) return "noPed";
220  ha->SetAxisRange(-3.,3.);
221  if(ha->Integral()<0.9*ha->GetEntries()) return "Multped";
222 
223  if(hd->GetEntries() <=5) return "noMip";
224 
225  // deviation of gain from the goal
226  TListIter it(hd->GetListOfFunctions());
227  TLine *w=(TLine*)it.Next() ;
228  w->Print();
229  float del=MPV-w->GetX1();
230  printf(" %s MPV=%f, del=%f goal=%f\n",hd->GetName(),MPV,del,w->GetX1());
231  float eps=0.30;
232  if(MPV<(1-eps)*w->GetX1()) return "lowG";
233  if(MPV>(1+eps)*w->GetX1()) return "highG";
234 
235  if(par[1]<0 || par[2]<0) return "amplNeg";
236  if(gain<10.) return "gainNeg";
237 
238  if(fabs(epar[0])<0.05) return "singF"; // single bin pathology
239  if(par[4]/par[0]>0.60) return "wideG";
240  hd->SetAxisRange(3,50);
241  float sum=hd->Integral();
242  if(sum<20) return "lowS"; // was 150 for CuCu
243 
244 
245  return "";
246 }
247 
248 
249 
250 //---------------------------------------
251 Double_t myfunction(Double_t *x, Double_t *par)
252 {
253  Float_t xx =x[0];
254  float mpv=par[0];
255  float aL=par[1]*fabs(par[3]);
256  float aG=par[1];
257  float sigL=2*par[3];
258  float sigG=par[4];
259  Double_t fland = TMath::Landau(xx,mpv,sigL);
260  if(sigL!=0) fland/=sigL;
261  Double_t fgaus = TMath::Gaus(xx,mpv,sigG);
262  double f=aL*fland + aG*fgaus;
263  return f;
264 }
265 //
266 float fitGausLand(TH1F *h) {
267  char *funcd="myfunc";
268  int maxbind=h->GetMaximumBin();
269  float sig=h->GetRMS();
270  float sum=h->Integral();
271  float xcentd=h->GetBinCenter(maxbind);
272  float eta=atoi(h->GetName()+5);
273  //printf("eta=%f sum=%f\n",eta,sum);
274  TF1 *f1=(TF1 *)gROOT->GetFunction(funcd);
275  f1->SetParameters(xcentd,0,0,sig,sig);
276  float x1=xcentd-10;
277  float x2=xcentd*2.;
278  if(x1<0) x1=0;
279  if(x2<xcentd) x2=xcentd+10;
280 
281  h->Fit(funcd,"R","",x1,x2);
282  //h->Fit(funcd,"R","",20,70);
283 
284 }