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