/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Mdc/MdcCalibAlg/MdcCalibAlg-00-09-02/share/distcalib/src/QtCalib.cpp

Go to the documentation of this file.
00001 #include "include/QtCalib.h"
00002 #include "include/fun.h"
00003 #include <cmath>
00004 #include "TF1.h"
00005 
00006 QtCalib::QtCalib(){
00007      cout << "Calibration type: QtCalib" << endl;
00008 }
00009 
00010 QtCalib::~QtCalib(){
00011 }
00012 
00013 void QtCalib::init(TObjArray* hlist, MdcCosGeom* pGeom){
00014      CalibBase::init(hlist, pGeom);
00015      m_pGeom = pGeom;
00016 
00017      char hname[200];
00018      for(int lay=0; lay<NLAYER; lay++){
00019           m_qmin[lay] = gQmin[lay];
00020           m_qmax[lay] = gQmax[lay];
00021           m_qbinw[lay] = (m_qmax[lay] - m_qmin[lay]) / (double)NQBin;
00022      }
00023 
00024      m_fdQt = new TFolder("mfdQt", "fdQt");
00025      m_fdQ_T = new TFolder("mQtPlot", "QtPlot");
00026      hlist -> Add(m_fdQt);
00027      hlist -> Add(m_fdQ_T);
00028 
00029      for(int lay=0; lay<NLAYER; lay++){
00030           sprintf(hname, "mHQ_Layer%02d", lay);
00031           m_hqhit[lay] = new TH1F(hname, "", 1500, 0, 3000);
00032           m_fdQt -> Add(m_hqhit[lay]);
00033 
00034           sprintf(hname, "mHQT_Plot_lay%02d", lay);
00035           m_grqt[lay] = new TGraphErrors();
00036           m_grqt[lay]->SetName(hname);
00037           m_grqt[lay]->SetMarkerStyle(20);
00038           m_grqt[lay]->SetMarkerColor(1);
00039           m_grqt[lay]->SetLineColor(10);
00040           m_fdQ_T->Add(m_grqt[lay]);
00041 
00042           sprintf(hname, "mHQdelT_Plot_lay%02d", lay);
00043           m_grqdt[lay] = new TGraphErrors();
00044           m_grqdt[lay]->SetName(hname);
00045           m_grqdt[lay]->SetMarkerStyle(10);
00046           m_grqdt[lay]->SetMarkerColor(1);
00047           m_grqdt[lay]->SetLineColor(10);
00048           m_fdQ_T->Add(m_grqdt[lay]);
00049         
00050           for(int bin=0; bin<NQBin; bin++){
00051                sprintf(hname, "mHQT_Lay%02d_Bin%02d", lay, bin);
00052                m_hqt[lay][bin] = new TH1F(hname, "", 200, -1, 1);
00053                m_fdQt -> Add(m_hqt[lay][bin]);
00054           }
00055      }
00056 }
00057 
00058 void QtCalib::mergeHist(TFile* fhist){
00059      CalibBase::mergeHist(fhist);
00060 
00061      char hname[200];
00062      TH1F* hist;
00063      TFolder* fdQt = (TFolder*)fhist->Get("fdQt");
00064      for(int lay=0; lay<NLAYER; lay++){
00065           sprintf(hname, "HQ_Layer%02d", lay);
00066           hist = (TH1F*)fdQt->FindObjectAny(hname);
00067           m_hqhit[lay]->Add(hist);
00068 
00069           for(int bin=0; bin<NQBin; bin++){
00070                sprintf(hname, "HQT_Lay%02d_Bin%02d", lay, bin);
00071                hist = (TH1F*)fdQt->FindObjectAny(hname);
00072                m_hqt[lay][bin]->Add(hist);
00073           }
00074      }
00075 }
00076 
00077 void QtCalib::calib(MdcCalibConst* calconst, TObjArray* newXtList, TObjArray* r2tList){
00078      CalibBase::calib(calconst, newXtList, r2tList);
00079 
00080      double vdr = 0.03;
00081      Stat_t entry;
00082      double qtpar;
00083      double qbcen;
00084      double tw;
00085      double deltw;
00086      double qterr;
00087      TF1* funQt = new TF1("funQt", qtFun, 200, 2000, 2);
00088 
00089      ofstream fqtlog("qtlog");
00090      for(int lay=0; lay<NLAYER; lay++){
00091           if(0 == gFgCalib[lay]) continue;
00092 
00093           fqtlog << "Layer" << lay << endl;
00094           double qtini[2];
00095           for(int ord=0; ord<QtOrd; ord++) qtini[ord] = calconst->getQtpar(lay, ord);
00096           for(int bin=0; bin<NQBin; bin++){
00097                entry = m_hqt[lay][bin]->GetEntries();
00098                if(entry > 300){
00099                     deltw = m_hqt[lay][bin] -> GetMean();
00100                     qterr = ( m_hqt[lay][bin]->GetRMS() ) / sqrt((double)entry);
00101                     deltw /= vdr;
00102                     qterr /= vdr;
00103                } else{
00104                     continue;
00105                }
00106 
00107                qbcen = ( (double)bin + 0.5 ) * m_qbinw[lay] + m_qmin[lay];
00108 //             tw = qtFun(qbcen, m_qtpar[lay]) + deltw;
00109 //             tw = (m_mdcFunSvc->getTimeWalk(lay, qbcen)) + deltw;
00110                tw = qtini[1] / sqrt(qbcen) + qtini[0] + deltw;
00111 
00112                m_grqt[lay]->SetPoint(bin, qbcen, tw);
00113                m_grqt[lay]->SetPointError(bin, 0, qterr);
00114 
00115                m_grqdt[lay]->SetPoint(bin, qbcen, deltw);
00116                m_grqdt[lay]->SetPointError(bin, 0, qterr);
00117 
00118                fqtlog << setw(3) << bin << setw(12) << deltw << setw(12) << tw
00119                       << setw(12) << qbcen << setw(12) << qterr << endl;
00120           }
00121 
00122           m_grqt[lay]->Fit("funQt", "Q+", "", m_qmin[lay], m_qmax[lay]);
00123 
00124           fqtlog << "Qtpar:  ";
00125           for(int ord=0; ord<QtOrd; ord++){
00126                qtpar = funQt->GetParameter(ord);
00127                qterr = funQt->GetParError(ord);
00128                calconst -> resetQtpar(lay, ord, qtpar);
00129 
00130                fqtlog << setw(12) << qtpar << setw(12) << qterr << endl;
00131           }
00132      } // end of layer loop
00133      fqtlog.close();
00134      renameHist();
00135      delete funQt;
00136 }
00137 
00138 Double_t QtCalib::qtFun(Double_t *x, Double_t *par){
00139      Double_t tw = par[1] / sqrt(x[0]) + par[0];
00140      return tw;
00141 }
00142 
00143 void QtCalib::renameHist(){
00144      char hname[200];
00145      m_fdQt->SetName("fdQt");
00146      m_fdQ_T->SetName("QtPlot");
00147      for(int lay=0; lay<NLAYER; lay++){
00148           sprintf(hname, "HQ_Layer%02d", lay);
00149           m_hqhit[lay]->SetName(hname);
00150 
00151           sprintf(hname, "HQT_Plot_lay%02d", lay);
00152           m_grqt[lay]->SetName(hname);
00153 
00154           sprintf(hname, "HQdelT_Plot_lay%02d", lay);
00155           m_grqdt[lay]->SetName(hname);
00156 
00157           for(int bin=0; bin<NQBin; bin++){
00158                sprintf(hname, "HQT_Lay%02d_Bin%02d", lay, bin);
00159                m_hqt[lay][bin]->SetName(hname);
00160           }
00161      }
00162 }

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