StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
scanBXoff_w2009.C
1 scanBXoff( char* Rrun = "R10103027") {
2  gStyle->SetPalette(1,0);
3  gStyle->SetOptStat(11);
4 
5  char *tit[]={"mubX7","bX48"};
6  // char *tit[]={"bX48"};
7  int myOff[]={-1, -1};
8  int myRms[]={-1, -1};
9  int nd=1;
10 
11  TString fname="../dataB4.31/"; fname+=Rrun; fname+=".wana.hist.root";
12 
13  TFile *fd=new TFile(fname);
14  //printf("open?=%d\n",fd->IsOpen());
15  if(!fd->IsOpen()) {
16  printf("scanBXoff %s not exits \n",fname.Data());
17  return;
18  }
19 
20  fd->ls();
21 
22  // return;
23  // tmp
24  TFile *fd2=new TFile("../dataB4.31/R10103027.wana.hist.root");
25  fd2->ls();
26  hI =(TH1F*) fd->Get("mubX7v"); assert(hI); // Ideal distribution --> the goal
27 
28 
29  TH1F *hI2=(TH1F*)hI->Clone();
30 
31  hI2->Scale(50.);
32  hI2->SetFillColor(kYellow);
33  hI2->SetLineColor(kWhite);
34 
35  TCanvas *c1=new TCanvas(Rrun,Rrun,800,700);
36  c1->Divide(nd,3);
37 
38 
39  // ..... find bXing offset for the list of spectra
40  int k,i;
41 
42  for(k=0;k<nd;k++) {
43  TString tt=tit[k];
44  TH1F *hc =new TH1F("ch-"+tt,"CHi2 dostribution vs. bXing offset for:"+tt,120,-0.5,119.5);
45 
46  TH1F *hd=(TH1F*) fd->Get(tt);
47  hd->Print();
48  if(hd==0) {
49  printf("%s file exist but %s is missing\n",fname.Data(),tt.Data());
50  continue;
51  }
52  assert(hd);
53 
54  c1->cd(0*nd+k+1); hd->Draw();
55  hI2->Draw("same");
56  hd->Draw("same");
57  hd->SetFillColor(kBlue);
58 
59 
60  myRms[k]=hd->GetRMS();
61  if(myRms[k]<10) continue;
62 
63  TH1F *hx=(TH1F*)hd->Clone(); // working copy
64  setNorm(hx);
65 
66  int off= scanOff(hx, hI, hc);
67  myOff[k]=off;
68  printf("run=%s off=%d\n",Rrun,off);
69  c1->cd(1*nd+k+1); hc->Draw(); gPad->SetLogy();
70  hc->SetFillColor(kGreen);
71  //hc->SetLineColor(kWhite);
72 
73  TH1F *hg=(TH1F*)hd->Clone(); // input+shift
74  shift(hd,hg,off);
75  c1->cd(2*nd+k+1);
76  hg->Draw();
77  hI2->Draw("same");
78  hg->Draw("same");
79  hg->SetFillColor(kBlue);
80 
81 
82  }
83  // hg->SetLineColor(kRed);
84  printf("#scanBXoff %s ",Rrun);
85 
86  for(k=0;k<nd;k++) {
87  printf("%s: rms=%f off=%d ",tit[k], myRms[k], myOff[k]);
88  }
89  // printf("spinBitsMean=%.1f\n", ((TH2F*) fd->Get("sBit0119"))->GetMean(2));
90  printf("\n");
91 
92  // c1->Print(fname.ReplaceAll(".root",".ps"));
93 
94 }
95 
96 
97 //========================================================
98 //========================================================
99 //========================================================
100 void shift(TH1F *hd,TH1F *hg, int off) {
101 
102  hg->Reset();
103  int i;
104  for(i=0;i<120;i++) {
105  int j= 1+(i+120-off)%120;
106  hg->SetBinContent(i+1, hd->GetBinContent(j));
107  // hg->SetBinError(i+1, hd->GetBinError(j));
108  }
109 }
110 //========================================================
111 //========================================================
112 //========================================================
113 int scanOff(TH1F *hx, TH1F *hp, TH1F *hc) {
114  int off;
115  float min=1e100;
116  int k=-1;
117  for(off=0;off<120;off++) {
118  float chi2= getChi2(hx,hp,off);
119  hc->Fill(off,chi2);
120  if(min>chi2) { min=chi2; k=off;}
121  // printf("off=%d chi2=%8.0f max=%f off=%d\n",off,chi2,min,k);
122  //printf(".");
123  }
124  if(min*3.>hc->Integral()/120.) return -2;
125 
126  return (120-k)%120;
127 }
128 
129 
130 
131 //========================================================
132 //========================================================
133 //========================================================
134 float getChi2(TH1F *hx, TH1F *hp, int off) {
135  int nb=hx->GetNbinsX();
136  assert(nb>=120);
137 
138  float * x=hx->GetArray();
139  float * p=hp->GetArray();
140 
141  float sum=0;
142  int i;
143  for(i=0;i<120;i++) {
144  int j= 1+(i+off)%120;
145  float xx= (x[j] -p[i+1])/hx->GetBinError(j);
146  sum+=xx*xx;
147  }
148  return sum;
149 }
150 
151 //========================================================
152 //========================================================
153 //========================================================
154 void setNorm(TH1F *h){
155  int nb=h->GetNbinsX();
156 
157  float * y=h->GetArray();
158  float sum=0;
159  int i;
160  for(i=1;i<=nb;i++) {
161  sum+=y[i];
162  }
163  float fac=(50*1+10*0.01 )/sum;
164 
165  for(i=1;i<=120;i++) {
166  float xx=y[i];
167  float val=xx*fac;
168  if(xx==0) xx=1;
169  float err=fac*sqrt(xx);
170  h->SetBinContent(i,val);
171  h->SetBinError(i,err);
172  }
173 
174 }
175 
176 
177 //========================================================
178 //========================================================
179 //========================================================
180 void draw_raw2(TFile *dirL1=0){
181 
182  assert(dirL1->IsOpen());
183 
184  TCanvas *c1=new TCanvas("raw1","My raw1",450,500);
185  c1->Divide(1,2);
186 
187  char *tit[]={"bX7","bX48"};
188  int nd=2;
189  int k,i;
190 
191  for(k=0;k<nd;k++) {
192  c1->cd(1+k);
193 
194  TH1F* h1=(TH1F*) dirL1->Get(tit[k]);
195  h1->Draw();
196  h1->SetLineColor(kBlue);
197  // h1->SetLineStyle(3);
198  }
199 }
200 
201 
202