/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Mdc/MdcCalibAlg/MdcCalibAlg-00-09-02/src/QtMdcCalib.cxx

Go to the documentation of this file.
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      // get EsTimeCol
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           // dr cut
00140           double dr = rectrk->getDr();
00141           if(fabs(dr) > m_param.drCut) continue;
00142 
00143           // dz cut
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 //             tw = qtFun(qbcen, m_qtpar[lay]) + deltw;
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 //        if( (0 == ierflg) && (3 == istat) ){
00255 //             for(ord=0; ord<m_qtorder; ord++){
00256 //                  gmqt -> GetParameter(ord, qtpar, qterr);
00257 //                  calconst -> resetQtpar(lay, ord, qtpar);
00258 
00259 //                  fqtlog << setw(12) << qtpar
00260 //                         << setw(12) << qterr
00261 //                         << endl;
00262 //             }
00263 //        } else{
00264 //             fqtlog << setw(12) << m_qtpar[lay][0] 
00265 //                    << setw(12) << "0"
00266 //                    << setw(12) << m_qtpar[lay][1]
00267 //                    << setw(12) << "0"
00268 //                    << endl;
00269 //        }
00270 
00271      } // end of layer loop
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 

Generated on Tue Nov 29 23:12:51 2016 for BOSS_7.0.2 by  doxygen 1.4.7