00001 #include "MdcCalibAlg/QtMdcCalib.h"
00002
00003 #include "GaudiKernel/MsgStream.h"
00004 #include "GaudiKernel/IMessageSvc.h"
00005 #include "GaudiKernel/StatusCode.h"
00006 #include "GaudiKernel/ISvcLocator.h"
00007 #include "GaudiKernel/Bootstrap.h"
00008
00009 #include <iostream>
00010 #include <iomanip>
00011 #include <fstream>
00012 #include <string>
00013 #include <cstring>
00014 #include <math.h>
00015
00016 #include "TF1.h"
00017 #include "TMinuit.h"
00018
00019 using namespace std;
00020
00021 QtMdcCalib::QtMdcCalib(){
00022 m_vdr = 0.03;
00023
00024 m_nlayer = MdcCalNLayer;
00025 m_qtorder = MdcCalQtOrd;
00026 m_nbin = MdcCalNQBin;
00027 m_innNLay = MdcCalInnNLay;
00028 }
00029
00030 QtMdcCalib::~QtMdcCalib(){
00031 }
00032
00033 void QtMdcCalib::clear(){
00034 int bin;
00035 for(int lay=0; lay<MdcCalNLayer; lay++){
00036 delete m_hqhit[lay];
00037 delete m_grqt[lay];
00038 delete m_grqdt[lay];
00039 for(bin=0; bin<MdcCalQtOrd; bin++){
00040 delete m_hqt[lay][bin];
00041 }
00042 }
00043 delete m_fdQt;
00044 delete m_fdQ_T;
00045
00046 MdcCalib::clear();
00047 }
00048
00049 void QtMdcCalib::initialize(TObjArray* hlist, IMdcGeomSvc* mdcGeomSvc,
00050 IMdcCalibFunSvc* mdcFunSvc, IMdcUtilitySvc* mdcUtilitySvc) {
00051 IMessageSvc* msgSvc;
00052 Gaudi::svcLocator() -> service("MessageSvc", msgSvc);
00053 MsgStream log(msgSvc, "QtMdcCalib");
00054 log << MSG::INFO << "QtMdcCalib::initialize()" << endreq;
00055
00056 m_hlist = hlist;
00057 m_mdcGeomSvc = mdcGeomSvc;
00058 m_mdcFunSvc = mdcFunSvc;
00059 m_mdcUtilitySvc = mdcUtilitySvc;
00060
00061 MdcCalib::initialize(m_hlist, m_mdcGeomSvc, m_mdcFunSvc, m_mdcUtilitySvc);
00062
00063 int bin;
00064 int lay;
00065 double qbinw;
00066 char hname[200];
00067
00068 for(lay=0; lay<m_nlayer; lay++){
00069 m_qmin[lay] = m_param.qmin[lay];
00070 m_qmax[lay] = m_param.qmax[lay];
00071 m_qbinw[lay] = (m_qmax[lay] - m_qmin[lay]) / (double)m_nbin;
00072 }
00073
00074 m_fdQt = new TFolder("fdQt", "fdQt");
00075 m_fdQ_T = new TFolder("QtPlot", "QtPlot");
00076 m_hlist -> Add(m_fdQt);
00077 m_hlist -> Add(m_fdQ_T);
00078
00079 for(lay=0; lay<m_nlayer; lay++){
00080 sprintf(hname, "HQ_Layer%02d", lay);
00081 m_hqhit[lay] = new TH1F(hname, "", 1500, 0, 3000);
00082 m_fdQt -> Add(m_hqhit[lay]);
00083
00084 sprintf(hname, "HQT_Plot_lay%02d", lay);
00085 m_grqt[lay] = new TGraphErrors();
00086 m_grqt[lay]->SetName(hname);
00087 m_grqt[lay]->SetMarkerStyle(20);
00088 m_grqt[lay]->SetMarkerColor(1);
00089 m_fdQ_T->Add(m_grqt[lay]);
00090
00091 sprintf(hname, "HQdelT_Plot_lay%02d", lay);
00092 m_grqdt[lay] = new TGraphErrors();
00093 m_grqdt[lay]->SetName(hname);
00094 m_grqdt[lay]->SetMarkerStyle(10);
00095 m_grqdt[lay]->SetMarkerColor(1);
00096 m_fdQ_T->Add(m_grqdt[lay]);
00097
00098 for(bin=0; bin<m_nbin; bin++){
00099 sprintf(hname, "HQT_Lay%02d_Bin%02d", lay, bin);
00100 m_hqt[lay][bin] = new TH1F(hname, "", 200, -1, 1);
00101 m_fdQt -> Add(m_hqt[lay][bin]);
00102 }
00103 }
00104 }
00105
00106 int QtMdcCalib::fillHist(MdcCalEvent* event){
00107 IMessageSvc* msgSvc;
00108 Gaudi::svcLocator() -> service("MessageSvc", msgSvc);
00109 MsgStream log(msgSvc, "QtMdcCalib");
00110 log << MSG::DEBUG << "QtMdcCalib::fillHist()" << endreq;
00111
00112 MdcCalib::fillHist(event);
00113
00114
00115 bool esCutFg = event->getEsCutFlag();
00116 if( ! esCutFg ) return -1;
00117
00118 int i;
00119 int k;
00120 int bin;
00121 int lay;
00122
00123 double doca;
00124 double dmeas;
00125
00126 int ntrk;
00127 int nhit;
00128
00129 bool fgHitLay[MdcCalNLayer];
00130
00131 MdcCalRecTrk* rectrk;
00132 MdcCalRecHit* rechit;
00133
00134 ntrk = event -> getNTrk();
00135 for(i=0; i<ntrk; i++){
00136 rectrk = event -> getRecTrk(i);
00137 nhit = rectrk -> getNHits();
00138
00139
00140 double dr = rectrk->getDr();
00141 if(fabs(dr) > m_param.drCut) continue;
00142
00143
00144 double dz = rectrk->getDz();
00145 if(fabs(dz) > m_param.dzCut) continue;
00146
00147 for(lay=0; lay<MdcCalNLayer; lay++) fgHitLay[lay] = false;
00148 for(k=0; k<nhit; k++){
00149 rechit = rectrk -> getRecHit(k);
00150 lay = rechit -> getLayid();
00151 fgHitLay[lay] = true;
00152 }
00153
00154 int nhitlay = 0;
00155 for(lay=0; lay<MdcCalNLayer; lay++) if(fgHitLay[lay]) nhitlay++;
00156 if(nhitlay < m_param.nHitLayCut) continue;
00157
00158 bool fgNoise = rectrk->getFgNoiseRatio();
00159 if(m_param.noiseCut && (!fgNoise)) continue;
00160
00161 for(k=0; k<nhit; k++){
00162 rechit = rectrk -> getRecHit(k);
00163 lay = rechit -> getLayid();
00164 doca = rechit -> getDocaInc();
00165 dmeas = rechit -> getDmeas();
00166 m_resi = rechit -> getResiInc();
00167 m_qhit = rechit -> getQhit();
00168
00169 m_hqhit[lay] -> Fill(m_qhit);
00170
00171 bin = (int)((m_qhit - m_qmin[lay]) / m_qbinw[lay]);
00172 if( (bin >= 0) && (bin < m_nbin) ){
00173 m_hqt[lay][bin] -> Fill( m_resi );
00174 }
00175 }
00176 }
00177 return 1;
00178 }
00179
00180 int QtMdcCalib::updateConst(MdcCalibConst* calconst){
00181 IMessageSvc* msgSvc;
00182 Gaudi::svcLocator() -> service("MessageSvc", msgSvc);
00183 MsgStream log(msgSvc, "QtMdcCalib");
00184 log << MSG::INFO << "QtMdcCalib::updateConst()" << endreq;
00185
00186 MdcCalib::updateConst(calconst);
00187
00188 int lay;
00189 int bin;
00190 int ord;
00191
00192 Stat_t entry;
00193 double qtpar;
00194 double qbcen;
00195 double tw;
00196 double deltw;
00197 double qterr;
00198
00199 TF1* funQt = new TF1("funQt", qtFun, 200, 2000, 2);
00200
00201 ofstream fqtlog("qtlog");
00202 for(lay=0; lay<m_nlayer; lay++){
00203 if(0 == m_param.fgCalib[lay]) continue;
00204
00205 fqtlog << "Layer" << lay << endl;
00206
00207 for(ord=0; ord<m_qtorder; ord++){
00208 m_qtpar[lay][ord] = calconst -> getQtpar(lay, ord);
00209 }
00210
00211 for(bin=0; bin<m_nbin; bin++){
00212 entry = m_hqt[lay][bin] -> GetEntries();
00213
00214 if(entry > 300){
00215 deltw = m_hqt[lay][bin] -> GetMean();
00216 qterr = ( m_hqt[lay][bin]->GetRMS() ) / sqrt((double)entry);
00217 deltw /= m_vdr;
00218 qterr /= m_vdr;
00219 } else{
00220 continue;
00221 }
00222
00223 qbcen = ( (double)bin + 0.5 ) * m_qbinw[lay] + m_qmin[lay];
00224
00225 tw = (m_mdcFunSvc->getTimeWalk(lay, qbcen)) + deltw;
00226
00227 m_grqt[lay]->SetPoint(bin, qbcen, tw);
00228 m_grqt[lay]->SetPointError(bin, 0, qterr);
00229
00230 m_grqdt[lay]->SetPoint(bin, qbcen, deltw);
00231 m_grqdt[lay]->SetPointError(bin, 0, qterr);
00232
00233 fqtlog << setw(3) << bin
00234 << setw(12) << deltw
00235 << setw(12) << tw
00236 << setw(12) << qbcen
00237 << setw(12) << qterr
00238 << endl;
00239 }
00240
00241 m_grqt[lay]->Fit("funQt", "Q+", "", m_qmin[lay], m_qmax[lay]);
00242
00243 fqtlog << "Qtpar: ";
00244 for(ord=0; ord<m_qtorder; ord++){
00245 qtpar = funQt->GetParameter(ord);
00246 qterr = funQt->GetParError(ord);
00247 calconst -> resetQtpar(lay, ord, qtpar);
00248
00249 fqtlog << setw(12) << qtpar
00250 << setw(12) << qterr
00251 << endl;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 }
00272
00273 fqtlog.close();
00274 delete funQt;
00275 return 1;
00276 }
00277
00278 Double_t QtMdcCalib::qtFun(Double_t *x, Double_t *par){
00279 double tw = par[1] / sqrt(x[0]) + par[0];
00280 return tw;
00281 }
00282