StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
doRatio.C
1 TFile *outH, *inpH;
2 const int mxR=3;
3 
4 
5 doRatio(TString fill="F2201x", TString wrkDir="./") {
6  // wrkDir="/star/data04/sim/balewski/LcpRun2/maxEta1.4/";
7  // wrkDir="./wrkLcp";
8 
9  gStyle->SetPalette(1,0);
10  gStyle->SetOptStat(0);
11 
12  TString fname=wrkDir+"/"+fill+".hist.root";
13 
14  inpH=new TFile(fname);
15 
16  if(!inpH->IsOpen()) {
17  printf(" %s not exits \n",fname.Data());
18  return;
19  }
20  printf(" %s opened \n",fname.Data());
21 
22  // inpH->ls();
23 
24 
25  fname.ReplaceAll("F","rF");
26  outH=new TFile(fname,"recreate");
27  if(outH->IsZombie()==kTRUE) {
28  printf("WARN file %s not created\n",fname.Data());
29  return;
30  }
31 
32  // just trig func expansion
33  double PI=3.141592654;
34  TF1 *ff;
35  ff = new TF1("fCos012",Cos012,-PI ,PI,3);
36  ff->SetParameters(0,0,0); ff->SetParNames("a0","a1","a2");
37 
38  //ff = new TF1("fCos012",Cos012,-PI ,PI,4);
39  //ff->SetParameters(0,0,0,0); ff->SetParNames("a0","a1","a2","phi0");
40 
41  ff->SetLineColor(kGreen);
42 
43  char *cut="xxx";
44  TH1F *hr[mxR];
45  char *cutL="All Pt1 Pt2 Pt3 Pt4 Pt5 Pt6 PtL PtM PtH EtaBB EtaBc EtaFc EtaFF Qpos Qneg";
46 
47  //char *cutL="All ";
48 
49  char *cut=strtok(cutL," ");
50 
51  do {
52  int err=calcRatio(cut,hr);
53  if(err) continue;
54  fitRatio(hr);
55  plotRatio(fill,hr);
56  } while(cut=strtok(0," "));
57  outH->Write();
58  outH->ls();
59 
60 }
61 
62 //--------------------------------------------------------
63 //--------------------------------------------------------
64 //--------------------------------------------------------
65 void plotRatio(TString fill1, TH1F **hr){
66  c=new TCanvas(fill1,fill1);
67  c->Divide(2,2);
68  int k;
69 
70  TLine *ln1=new TLine(-3.14,0.,3.14,0.);
71 
72  TGraphErrors *gr=new TGraphErrors;
73 
74  for(k=0;k<mxR;k++) {
75  c->cd(k+1);
76  hr[k]-> Draw();
77  ln1->Draw();
78 
79  TF1 *ff=hr[k]->GetFunction("fCos012");
80  int i;
81  int npar=3;
82  for(i=0;i<npar;i++) {
83  double val=ff->GetParameter(i);
84  double err=ff->GetParError(i);
85  int n=gr->GetN();
86  gr->SetPoint(n,i+1+5*k,val);
87  gr->SetPointError(n,.0,err);
88  }
89  }
90 
91  c->cd(4);
92  gr->Draw("AP");
93 
94  gr->SetMarkerSize(1.3);
95  gr->SetMarkerColor(4);
96  gr->SetMarkerStyle(21);
97  gr->SetTitle("Fit params: #2=Ay*P #7=-Ay*Q #11=A#Sigma*P*Q #13=A#Delta*P*Q");
98 
99  TAxis *ax;
100  ax=gr->GetXaxis();
101  float x1=0,x2=15;
102  ax->SetLimits(x1,x2);
103  TLine *ln0=new TLine(x1,0.,x2,0.);
104  ln0->SetLineColor(kBlue);
105  ln0->Draw();
106 
107  gr->Print();
108 
109 
110 }
111 
112 //--------------------------------------------------------
113 //--------------------------------------------------------
114 //--------------------------------------------------------
115 void fitRatio( TH1F **hr){
116  c=new TCanvas("aa","aa",50,100);
117 
118  int k;
119  for(k=0;k<mxR;k++) {
120  hr[k]-> Fit("fCos012");
121  TF1 *ff=hr[k]->GetFunction("fCos012");
122  assert(ff);
123  if(k==0) ff->SetParNames("a0","a1","a2");
124  if(k==1) ff->SetParNames("b0","b1","b2");
125  if(k==2) ff->SetParNames("c0","c1","c2");
126  }
127 }
128 
129 //--------------------------------------------------------
130 //--------------------------------------------------------
131 //--------------------------------------------------------
132 int calcRatio( char *cut, TH1F **hr){
133  int minContent=4; // abort ratio if any bin has less
134  printf("doRatio for cut='%s'\n",cut);
135 
136  const int mxPol=4;
137  char *cpolBY[mxPol]={"B+Y+","B+Y-","B-Y+","B-Y-"};
138 
139  TH1F * h[mxPol];
140 
141  // fetch proper 1D histo
142  int k;
143  double sum1=0;
144  double min=10000;
145  for(k=0;k<mxPol;k++) {
146  char name[100];
147  sprintf(name,"Phi%2s%s",cpolBY[k],cut);
148  h[k]=(TH1F *)inpH->Get(name);
149  assert(h[k]);
150  sum1+=h[k]->Integral();
151  printf("%s int=%f min=%f\n",name,h[k]->Integral(),h[k]->GetMinimum());
152  if(h[k]->GetMinimum()<minContent) return -1;
153  }
154 
155  TAxis *phiAx=h[0]->GetXaxis();
156 
157  // create hitos with ratio
158  outH->cd();
159  int k;
160 
161  for(k=0;k<mxR;k++) {
162  char name[100];
163  sprintf(name,"r%d*%s",k+1,cut);
164  char tit2[100]={"aaa bbb"};
165  sprintf(tit2,"R%d(#phi), LCP cut=%s, Neve=%.0f",k+1,cut,sum1);
166  hr[k]=new TH1F(name,tit2,phiAx->GetNbins(),phiAx->GetXmin(), phiAx->GetXmax());
167  hr[k]->Sumw2();
168  }
169 
170  // do ratio bin by bin
171  double sum=0;
172  int iph;
173  for(iph=1;iph<=phiAx->GetNbins();iph++) {// bins are counted from 1 !
174  float m[mxPol], v[mxPol];
175 
176  //assumption: ==={k}== Y.B=={++,+-,-+,--}; Y=>Q=-Z B=>P=+Z
177  for(k=0;k<mxPol;k++){
178  m[k]=h[k]->GetBinContent(iph);
179  v[k]=h[k]->GetBinError(iph);
180  v[k]*=v[k]; // now it is variance
181  }
182 
183  for(int ir=0;ir<mxR;ir++) {
184  TH1F * h3=hr[ir];
185  assert(h3);
186  double s,s1,s2,r=900.,vs1,vs2;
187  switch(ir) {
188  case 0:
189  s1 =m[0]+m[2]; s2=m[1]+m[3]; // AN*P
190  vs1=v[0]+v[2]; vs2=v[1]+v[3];
191  break;
192  case 1:
193  s1 =m[0]+m[1]; s2=m[2]+m[3]; // -AN*Q
194  vs1=v[0]+v[1]; vs2=v[2]+v[3];
195  break;
196  case 2:
197  s1 =m[0]+m[3]; s2=m[1]+m[2]; // ... *P*Q
198  vs1=v[0]+v[3]; vs2=v[1]+v[2];
199  break;
200  default:
201  printf("wrong ir=%d\n",ir); assert(1==2);
202  }
203 
204  s=s1+s2;
205  if(s1<=0 || s2<=0) {
206  printf("iph=%d s1=%f s2=%f s=%f \n",iph,s1,s2,s);
207  assert(2==3);
208  }
209 
210  r=(s1-s2)/s;
211  //if(ir==0) printf("iph=%d s1=%f s2=%f ir=%d %d\n",iph,s1,s2,ir,sum);
212  double vr = 4*( s2*s2*vs1 + s1*s1*vs2 )/s/s/s/s; //accurate
213 
214  h3->SetBinContent(iph,r);
215  h3->SetBinError(iph,sqrt(vr));
216  if(ir==0) sum+=s;
217  }// end of loop over ir
218  }// end of loop over phi
219 
220  printf("sum=%f sum1=%f r=%f\n",sum,sum1,sum/sum1);
221 
222  return 0;
223 }
224 
225 
226 
227 // c1->Print(fname.ReplaceAll("tree.root","bx.ps"));
228 
229 
230 
231 
232 //--------------------------------------------------------
233 //--------------------------------------------------------
234 //--------------------------------------------------------
235 Double_t Cos012(Double_t *x, Double_t *par)
236 {
237  float PI=3.141592654;
238 
239  Float_t phi =x[0];
240  Float_t A0=par[0];
241  Float_t A1=par[1];
242  Float_t A2=par[2];
243  Float_t phi0=0; //par[3]/180*3.1416;
244 
245  Double_t f =A0 +A1*cos(phi-phi0) + A2*cos(2*(phi-phi0));
246  return f;
247 }
248 
249