BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
GrXtCalib.cpp
Go to the documentation of this file.
1#include "include/GrXtCalib.h"
2#include "include/fun.h"
3
4#include <cmath>
5
6#include "TF1.h"
7#include "TMinuit.h"
8
10 m_maxNhit = 5000;
11 m_nMaxEd = 1000;
12 for ( int lay = 0; lay < NLAYER; lay++ )
13 {
14 if ( lay < 8 ) m_tEd[lay] = 200.0;
15 else m_tEd[lay] = 300.0;
16 }
17 cout << "Calibration type: GrXtCalib" << endl;
18}
19
21
22void GrXtCalib::init( TObjArray* hlist, MdcCosGeom* pGeom ) {
23 CalibBase::init( hlist, pGeom );
24
25 m_fdXt = new TFolder( "mfdxt", "fdxt" );
26 hlist->Add( m_fdXt );
27
28 m_haxis = new TH2F( "axis", "", 50, 0, 300, 50, 0, 9 );
29 m_haxis->SetStats( 0 );
30 m_fdXt->Add( m_haxis );
31
32 char hname[200];
33 for ( int lay = 0; lay < NLAYER; lay++ )
34 {
35 for ( int iEntr = 0; iEntr < NENTRXT; iEntr++ )
36 {
37 for ( int lr = 0; lr < NLR; lr++ )
38 {
39 m_nhitIn[lay][iEntr][lr] = 0;
40 m_nhitEd[lay][iEntr][lr] = 0;
41
42 sprintf( hname, "mgrXt%02d_%02d_lr%01d", lay, iEntr, lr );
43 m_grxt[lay][iEntr][lr] = new TGraph();
44 m_grxt[lay][iEntr][lr]->SetName( hname );
45 m_grxt[lay][iEntr][lr]->SetMarkerStyle( 10 );
46 m_grxt[lay][iEntr][lr]->SetLineColor( 10 );
47 m_fdXt->Add( m_grxt[lay][iEntr][lr] );
48 }
49 }
50 }
51}
52
53void GrXtCalib::mergeHist( TFile* fhist ) {
54 CalibBase::mergeHist( fhist );
55
56 double tdr, doca;
57 char hname[200];
58 TFolder* fd = (TFolder*)fhist->Get( "fdXtGr" );
59 for ( int lay = 0; lay < NLAYER; lay++ )
60 {
61 for ( int iEntr = 0; iEntr < NENTRXT; iEntr++ )
62 {
63 for ( int lr = 0; lr < NLR; lr++ )
64 {
65 if ( ( m_nhitIn[lay][iEntr][lr] > m_maxNhit ) &&
66 ( m_nhitEd[lay][iEntr][lr] > m_nMaxEd ) )
67 continue;
68
69 sprintf( hname, "grXt%02d_%02d_lr%01d", lay, iEntr, lr );
70 TGraph* gr = (TGraph*)fd->FindObjectAny( hname );
71 int nPoint = gr->GetN();
72 for ( int i = 0; i < nPoint; i++ )
73 {
74 gr->GetPoint( i, tdr, doca );
75 if ( ( tdr < m_tEd[lay] ) && ( m_nhitIn[lay][iEntr][lr] <= m_maxNhit ) )
76 {
77 int np = m_grxt[lay][iEntr][lr]->GetN();
78 m_grxt[lay][iEntr][lr]->SetPoint( np, tdr, doca );
79 m_nhitIn[lay][iEntr][lr]++;
80 }
81 else if ( ( tdr >= m_tEd[lay] ) && ( m_nhitEd[lay][iEntr][lr] <= m_nMaxEd ) )
82 {
83 int np = m_grxt[lay][iEntr][lr]->GetN();
84 m_grxt[lay][iEntr][lr]->SetPoint( np, tdr, doca );
85 m_nhitEd[lay][iEntr][lr]++;
86 }
87 }
88 }
89 }
90 }
91}
92
93void GrXtCalib::calib( MdcCalibConst* calconst, TObjArray* newXtList, TObjArray* r2tList ) {
94 CalibBase::calib( calconst, newXtList, r2tList );
95
96 int ord;
97 double xtpar[NLAYER][NENTRXT][NLR][8];
98 TF1* fxtDr = new TF1( "fxtDr", xtFitFun, 0, 300, 6 );
99 TF1* fxtEd = new TF1( "fxtEd", xtFitEdge, 150, 500, 1 );
100 if ( 1 == gfixXtC0 ) fxtDr->FixParameter( 0, 0 );
101
102 for ( int lay = 0; lay < NLAYER; lay++ )
103 {
104 for ( int iEntr = 0; iEntr < NENTRXT; iEntr++ )
105 {
106 for ( int lr = 0; lr < NLR; lr++ )
107 {
108 m_fgFit[lay][iEntr][lr] = false;
109 if ( 0 == gFgCalib[lay] ) continue;
110
111 if ( m_nhitIn[lay][iEntr][lr] > 1000 )
112 {
113 Tmax = calconst->getXtpar( lay, iEntr, lr, 6 );
114
115 m_grxt[lay][iEntr][lr]->Fit( "fxtDr", "Q+", "", 0, Tmax );
116 for ( ord = 0; ord < 6; ord++ )
117 { xtpar[lay][iEntr][lr][ord] = fxtDr->GetParameter( ord ); }
118 xtpar[lay][iEntr][lr][6] = Tmax;
119
120 Dmax = 0.0;
121 for ( ord = 0; ord < 6; ord++ )
122 Dmax += xtpar[lay][iEntr][lr][ord] * pow( Tmax, ord );
123
124 if ( m_nhitEd[lay][iEntr][lr] > 300 )
125 {
126 m_grxt[lay][iEntr][lr]->Fit( "fxtEd", "Q+", "", Tmax, Tmax + 300 );
127 xtpar[lay][iEntr][lr][7] = fxtEd->GetParameter( 0 );
128 if ( xtpar[lay][iEntr][lr][7] < 0.0 ) xtpar[lay][iEntr][lr][7] = 0.0;
129 }
130 else { xtpar[lay][iEntr][lr][7] = 0.0; }
131
132 m_fgFit[lay][iEntr][lr] = true;
133 }
134
135 } // end of lr loop
136 } // end of entrance angle loop
137 } // end of layer loop
138
139 ofstream fxtlog( "xtlog" );
140 for ( int lay = 0; lay < NLAYER; lay++ )
141 {
142 for ( int iEntr = 0; iEntr < NENTRXT; iEntr++ )
143 {
144 for ( int lr = 0; lr < NLR; lr++ )
145 {
146 fxtlog << setw( 3 ) << lay << setw( 3 ) << iEntr << setw( 3 ) << lr;
147
148 int fgUpdate = -1;
149 if ( m_fgFit[lay][iEntr][lr] )
150 {
151 fgUpdate = 1;
152 for ( ord = 0; ord < 8; ord++ )
153 calconst->resetXtpar( lay, iEntr, lr, ord, xtpar[lay][iEntr][lr][ord] );
154 }
155 else
156 {
157 int iEntrNew = findXtEntr( lay, iEntr, lr );
158 if ( -1 != iEntrNew )
159 {
160 fgUpdate = 2;
161 for ( ord = 0; ord < 8; ord++ )
162 { calconst->resetXtpar( lay, iEntr, lr, ord, xtpar[lay][iEntrNew][lr][ord] ); }
163 }
164 }
165 fxtlog << setw( 3 ) << fgUpdate;
166 for ( ord = 0; ord < 8; ord++ )
167 {
168 double par = calconst->getXtpar( lay, iEntr, lr, ord );
169 if ( 6 == ord ) fxtlog << setw( 9 ) << par;
170 else fxtlog << setw( 14 ) << par;
171 }
172 fxtlog << endl;
173 }
174 }
175 }
176 fxtlog.close();
177
178 cout << "Xt update finished. File xtlog was written." << endl;
179
180 renameHist();
181 delete fxtDr;
182 delete fxtEd;
183}
184
185void GrXtCalib::renameHist() {
186 char hname[200];
187 m_fdXt->SetName( "fdXtGr" );
188 for ( int lay = 0; lay < NLAYER; lay++ )
189 {
190 for ( int iEntr = 0; iEntr < NENTRXT; iEntr++ )
191 {
192 for ( int lr = 0; lr < NLR; lr++ )
193 {
194 sprintf( hname, "grXt%02d_%02d_lr%01d", lay, iEntr, lr );
195 m_grxt[lay][iEntr][lr]->SetName( hname );
196 }
197 }
198 }
199}
200
201int GrXtCalib::findXtEntr( int lay, int iEntr, int lr ) const {
202 int id0 = 8;
203 int id1 = 9;
204 int idmax = 17;
205 int entrId = -1;
206 if ( iEntr <= id0 )
207 {
208 int id = -1;
209 for ( int i = iEntr; i <= id0; i++ )
210 {
211 if ( m_fgFit[lay][i][lr] )
212 {
213 id = i;
214 break;
215 }
216 }
217 if ( -1 != id ) entrId = id;
218 else
219 {
220 for ( int i = iEntr; i >= 0; i-- )
221 {
222 if ( m_fgFit[lay][i][lr] )
223 {
224 id = i;
225 break;
226 }
227 }
228 entrId = id;
229 }
230 }
231 else
232 {
233 int id = -1;
234 for ( int i = iEntr; i >= id1; i-- )
235 {
236 if ( m_fgFit[lay][i][lr] )
237 {
238 id = i;
239 break;
240 }
241 }
242 if ( -1 != id ) entrId = id;
243 else
244 {
245 for ( int i = iEntr; i < idmax; i++ )
246 {
247 if ( m_fgFit[lay][i][lr] )
248 {
249 id = i;
250 break;
251 }
252 }
253 entrId = id;
254 }
255 }
256 if ( -1 == entrId )
257 {
258 cout << "find EntrId error "
259 << "layer " << lay << " iEntr " << iEntr << " lr " << lr << endl;
260 }
261
262 return entrId;
263}
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
TGraph * gr
Double_t xtFitEdge(Double_t *x, Double_t par[])
Double_t xtFitFun(Double_t *x, Double_t par[])
virtual void init(TObjArray *hlist, MdcCosGeom *pGeom)=0
Definition CalibBase.cpp:12
virtual void mergeHist(TFile *fhist)=0
virtual void calib(MdcCalibConst *calconst, TObjArray *newXtList, TObjArray *r2tList)=0
void calib(MdcCalibConst *calconst, TObjArray *newXtList, TObjArray *r2tList)
Definition GrXtCalib.cpp:93
void init(TObjArray *hlist, MdcCosGeom *pGeom)
Definition GrXtCalib.cpp:22
void mergeHist(TFile *fhist)
Definition GrXtCalib.cpp:53
void resetXtpar(int lay, int entr, int lr, int order, double val)
double getXtpar(int lay, int entr, int lr, int order)