5#include "GaudiKernel/IMessageSvc.h"
6#include "GaudiKernel/StatusCode.h"
7#include "GaudiKernel/ISvcLocator.h"
8#include "GaudiKernel/Bootstrap.h"
19#ifndef ENABLE_BACKWARDS_COMPATIBILITY
32 m_docaCut[lay][0] = 0.5;
33 m_docaCut[lay][1] = 5.5;
35 m_docaCut[lay][0] = 0.5;
36 m_docaCut[lay][1] = 7.5;
49 for(
int lay=0; lay<
LAYERNMAX; lay++)
delete m_hresLay[lay];
51 for(
int lay=0; lay<
LAYERNMAX; lay++)
delete m_hresLayRec[lay];
59 Gaudi::svcLocator() -> service(
"MessageSvc",
msgSvc);
60 MsgStream log(
msgSvc,
"MilleAlign");
61 log << MSG::INFO <<
"MilleAlign::initialize()" << endreq;
64 m_mdcGeomSvc = mdcGeomSvc;
65 m_mdcFunSvc = mdcFunSvc;
66 m_mdcUtilitySvc = mdcUtilitySvc;
69 m_hresAll =
new TH1F(
"HResAllInc",
"", 200, -1.0, 1.0);
70 m_hlist->Add(m_hresAll);
72 m_hresInn =
new TH1F(
"HResInnInc",
"", 200, -1.0, 1.0);
73 m_hlist->Add(m_hresInn);
75 m_hresStp =
new TH1F(
"HResStpInc",
"", 200, -1.0, 1.0);
76 m_hlist->Add(m_hresStp);
78 m_hresOut =
new TH1F(
"HResOutInc",
"", 200, -1.0, 1.0);
79 m_hlist->Add(m_hresOut);
83 sprintf(hname,
"Res_Layer%02d", lay);
84 m_hresLay[lay] =
new TH1F(hname,
"", 200, -1.0, 1.0);
85 m_hlist->Add(m_hresLay[lay]);
88 m_hresAllRec =
new TH1F(
"HResAllRecInc",
"", 200, -1.0, 1.0);
89 m_hlist->Add(m_hresAllRec);
91 sprintf(hname,
"Res_LayerRec%02d", lay);
92 m_hresLayRec[lay] =
new TH1F(hname,
"", 200, -1.0, 1.0);
93 m_hlist->Add(m_hresLayRec[lay]);
97 m_hddoca =
new TH1F(
"delt_doca",
"", 200, -1.0, 1.0);
98 m_hlist->Add(m_hddoca);
101 sprintf(hname,
"delt_docaLay%02d", lay);
102 m_hddocaLay[lay] =
new TH1F(hname,
"", 200, -1.0, 1.0);
103 m_hlist->Add(m_hddocaLay[lay]);
119 m_pMilleAlign -> InitMille(&m_dofs[0], &m_sigm[0], m_nglo, m_nloc,
122 m_derGB.resize(m_npar);
123 m_derNonLin.resize(m_npar);
124 m_par.resize(m_npar);
125 m_error.resize(m_npar);
126 m_pull.resize(m_npar);
128 m_derLC.resize(m_nloc);
131 std::vector<double> constTX;
132 std::vector<double> constTY;
133 std::vector<double> constRZ;
135 std::vector<double> constTXE;
136 std::vector<double> constTXW;
137 std::vector<double> constTYE;
138 std::vector<double> constTYW;
139 std::vector<double> constRZE;
140 std::vector<double> constRZW;
142 constTX.resize(m_npar);
143 constTY.resize(m_npar);
144 constRZ.resize(m_npar);
146 constTXE.resize(m_npar);
147 constTXW.resize(m_npar);
148 constTYE.resize(m_npar);
149 constTYW.resize(m_npar);
150 constRZE.resize(m_npar);
151 constRZW.resize(m_npar);
153 for(i=0; i<m_npar; i++){
183 m_pMilleAlign -> ConstF(&constTXE[0], 0.0);
184 m_pMilleAlign -> ConstF(&constTXW[0], 0.0);
185 m_pMilleAlign -> ConstF(&constTYE[0], 0.0);
186 m_pMilleAlign -> ConstF(&constTYW[0], 0.0);
187 m_pMilleAlign -> ConstF(&constRZE[0], 0.0);
188 m_pMilleAlign -> ConstF(&constRZW[0], 0.0);
193 Gaudi::svcLocator() -> service(
"MessageSvc",
msgSvc);
194 MsgStream log(
msgSvc,
"MilleAlign");
195 log << MSG::DEBUG <<
"MilleAlign::fillTree()" << endreq;
225 int ntrk =
event -> getNTrk();
226 if( (ntrk<m_param.
nTrkCut[0]) || (ntrk>m_param.
nTrkCut[1]))
return false;
228 for(itrk=0; itrk<ntrk; itrk++){
229 rectrk =
event->getRecTrk(itrk);
232 trkpar[0] = rectrk -> getDr();
233 trkpar[1] = rectrk -> getPhi0();
234 trkpar[2] = rectrk -> getKappa();
235 trkpar[3] = rectrk -> getDz();
236 trkpar[4] = rectrk -> getTanLamda();
238 int nHit = rectrk -> getNHits();
239 if(nHit < m_param.
nHitCut)
continue;
240 if(fabs(trkpar[0]) > m_param.
drCut)
continue;
241 if(fabs(trkpar[3]) > m_param.
dzCut)
continue;
243 HepVector rechelix = rectrk->
getHelix();
244 HepVector helix = rectrk->
getHelix();
248 for(ihit=0; ihit<nHit; ihit++){
249 rechit = rectrk -> getRecHit(ihit);
250 lr = rechit->
getLR();
251 lay = rechit -> getLayid();
252 cel = rechit -> getCellid();
253 pWire = m_mdcGeomSvc -> Wire(lay, cel);
254 dmeas = rechit -> getDmeas();
255 zhit = rechit -> getZhit();
256 hitSigm = rechit -> getErrDmeas();
258 wpos[0] = pWire -> Backward().x();
259 wpos[1] = pWire -> Backward().y();
260 wpos[2] = pWire -> Backward().z();
261 wpos[3] = pWire -> Forward().x();
262 wpos[4] = pWire -> Forward().y();
263 wpos[5] = pWire -> Forward().z();
264 wpos[6] = pWire -> Tension();
267 double doca = (m_mdcUtilitySvc->
doca(lay, cel, helix, helixErr))*10.0;
269 resi = -1.0*dmeas - doca;
270 if ((fabs(doca) < m_docaCut[lay][0]) || (fabs(doca) > m_docaCut[lay][1]) ||
271 (fabs(resi) > m_resiCut[lay]))
continue;
274 resiRec = rechit -> getResiIncLR();
276 double dd = fabs(doca) - fabs(rechit->
getDocaInc());
277 m_hddoca ->
Fill(dd);
278 m_hddocaLay[lay] ->
Fill(dd);
281 m_hresAll->Fill(resi);
282 if(lay < 8) m_hresInn->Fill(resi);
283 else if(lay < 20) m_hresStp->Fill(resi);
284 else m_hresOut->Fill(resi);
285 m_hresLay[lay]->Fill(resi);
287 m_hresAllRec->Fill(resiRec);
288 m_hresLayRec[lay]->Fill(resiRec);
291 m_pMilleAlign -> ZerLoc(&m_derGB[0], &m_derLC[0], &m_derNonLin[0]);
294 for(ipar=0; ipar<m_nloc; ipar++){
295 if( ! getDeriLoc(ipar, lay, cel ,rechelix, helixErr, deri) ){
296 cout <<
"getDeriLoc == false!" << setw(12) << itrk << setw(12) << ipar << endl;
299 m_derLC[ipar] = deri;
303 for(ipar=0; ipar<m_nGloHit; ipar++){
304 iparGB = getAlignParId(lay, ipar);
305 if( ! getDeriGlo(ipar, iparGB, lay, cel, helix, helixErr, wpos, deri) )
307 cout <<
"getDeriGlo == false!" << setw(12) << itrk << setw(12) << ipar << endl;
310 m_derGB[iparGB] = deri;
312 m_pMilleAlign -> EquLoc(&m_derGB[0], &m_derLC[0], &m_derNonLin[0], resi, hitSigm);
316 bool sc = m_pMilleAlign -> FitLoc(m_pMilleAlign->
GetTrackNumber(), trkparms, 0);
317 if(sc) m_pMilleAlign -> SetTrackNumber( m_pMilleAlign->
GetTrackNumber()+1 );
325 Gaudi::svcLocator() -> service(
"MessageSvc",
msgSvc);
326 MsgStream log(
msgSvc,
"MilleAlign");
327 log << MSG::INFO <<
"MilleAlign::updateConst()" << endreq;
329 m_pMilleAlign -> MakeGlobalFit(&m_par[0], &m_error[0], &m_pull[0]);
336 for(iEP=0; iEP<
NEP; iEP++){
337 ipar = i *
NEP + iEP;
353 alignPar->
setDelRz(iEP, val/1000.0);
354 alignPar->
setErrRz(iEP, err/1000.0);
360int MilleAlign::getAlignParId(
int lay,
int iparHit){
363 else if(lay < 10) ip = 1;
364 else if(lay < 12) ip = 2;
365 else if(lay < 14) ip = 3;
366 else if(lay < 16) ip = 4;
367 else if(lay < 18) ip = 5;
368 else if(lay < 20) ip = 6;
372 int ipar = iparHit * 8 + ip;
376bool MilleAlign::getDeriLoc(
int ipar,
int lay,
int cel, HepVector rechelix, HepSymMatrix &helixErr,
double &deri){
383 for(i=0; i<m_nloc; i++) sampar[i] = rechelix[i];
384 double startpar = rechelix[ipar] - 0.5*
gStepLC[ipar]*(double)
gNsamLC;
387 sampar[ipar] = startpar + (double)i *
gStepLC[ipar];
388 xxLC[i] = sampar[ipar];
389 if(0==ipar || 3==ipar) xxLC[i] *= 10.;
391 HepVector helix = sampar;
392 bool passCellRequired =
false;
393 doca = (m_mdcUtilitySvc->
doca(lay, cel, helix, helixErr,passCellRequired))*10.0;
403 if (0==ipar || 3==ipar) rechelix[ipar] *= 10.;
404 TSpline3* pSpline3 =
new TSpline3(
"deri", xxLC, yyLC,
gNsamLC);
405 deri = pSpline3->Derivative(rechelix[ipar]);
410bool MilleAlign::getDeriGlo(
int iparHit,
int iparGB,
int lay,
int cel, HepVector helix,
411 HepSymMatrix &helixErr,
double wpos[],
double &deri){
417 double dAlignParini = 0.0;
418 double startpar = dAlignParini - 0.5*
gStepGB[iparGB]*(double)
gNsamGB;
420 for(i=0; i<7; i++) wposSam[i] = wpos[i];
423 dAlignPar = startpar + (double)i *
gStepGB[iparGB];
426 wposSam[0] = wpos[0] + dAlignPar;
427 }
else if(1 == iparHit){
428 wposSam[3] = wpos[3] + dAlignPar;
429 }
else if(2 == iparHit){
430 wposSam[1] = wpos[1] + dAlignPar;
431 }
else if(3 == iparHit){
432 wposSam[4] = wpos[4] + dAlignPar;
433 }
else if(4 == iparHit){
434 wposSam[0] = wpos[0] - (wpos[1] * dAlignPar * 0.001);
435 wposSam[1] = wpos[1] + (wpos[0] * dAlignPar * 0.001);
436 }
else if(5 == iparHit){
437 wposSam[3] = wpos[3] - (wpos[4] * dAlignPar * 0.001);
438 wposSam[4] = wpos[4] + (wpos[3] * dAlignPar * 0.001);
442 HepPoint3D eastP(wposSam[0]/10., wposSam[1]/10., wposSam[2]/10.);
443 HepPoint3D westP(wposSam[3]/10., wposSam[4]/10., wposSam[5]/10.);
444 doca = (m_mdcUtilitySvc->
doca(lay, cel, eastP, westP, helix, helixErr))*10.0;
448 if(doca == 0)
return false;
452 TSpline3* pSpline3 =
new TSpline3(
"deri", xxGB, yyGB,
gNsamGB);
453 deri = pSpline3 -> Derivative(dAlignParini);
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)
HepGeom::Point3D< double > HepPoint3D
virtual double doca(int layer, int cell, const HepVector helix, const HepSymMatrix errMat, bool passCellRequired=true, bool doSag=true) const =0
double getDocaInc() const
HepSymMatrix getHelixErr() const
HepVector getHelix() const
void setErrRz(int iEP, double val)
void setDelDy(int iEP, double val)
void setDelRz(int iEP, double val)
void setErrDx(int iEP, double val)
void setDelDx(int iEP, double val)
void setErrDy(int iEP, double val)
bool fillHist(MdcAliEvent *event)
void initialize(TObjArray *hlist, IMdcGeomSvc *mdcGeomSvc, IMdcCalibFunSvc *mdcFunSvc, IMdcUtilitySvc *mdcUtilitySvc)
void updateConst(MdcAlignPar *alignPar)
const double g_res_cut_init
const double g_start_chi_cut