/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Mdc/MdcCalibFunSvc/MdcCalibFunSvc-00-03-16/src/MdcCalibFunSvc.cxx

Go to the documentation of this file.
00001 #include "MdcCalibFunSvc/MdcCalibFunSvc.h"
00002 #include "GaudiKernel/Kernel.h"
00003 #include "GaudiKernel/IInterface.h"
00004 #include "GaudiKernel/StatusCode.h"
00005 #include "GaudiKernel/SvcFactory.h"
00006 #include "GaudiKernel/MsgStream.h"
00007 
00008 #include "GaudiKernel/IIncidentSvc.h"
00009 #include "GaudiKernel/Incident.h"
00010 #include "GaudiKernel/IIncidentListener.h"
00011 
00012 #include "GaudiKernel/ISvcLocator.h"
00013 #include "GaudiKernel/Bootstrap.h"
00014 
00015 #include "GaudiKernel/IDataProviderSvc.h"
00016 #include "GaudiKernel/SmartDataPtr.h"
00017 #include "GaudiKernel/DataSvc.h"
00018 
00019 #include "CalibData/CalibModel.h"
00020 #include "CalibData/Mdc/MdcCalibData.h"
00021 #include "CalibData/Mdc/MdcDataConst.h"
00022 #include "EventModel/EventHeader.h"
00023 #include "GaudiKernel/SmartDataPtr.h"
00024 
00025 #include "TFile.h"
00026 #include "TTree.h"
00027 #include "TList.h"
00028 
00029 #include <iomanip>
00030 #include <iostream>
00031 #include <fstream>
00032 #include <math.h>
00033 
00034 using namespace std;
00035 
00036 typedef map<int, double>::value_type valType;
00037 
00038 MdcCalibFunSvc::MdcCalibFunSvc( const string& name, ISvcLocator* svcloc) :
00039      Service (name, svcloc), m_layInfSig(-1) {
00040 
00041      // declare properties
00042      declareProperty("CheckConst", m_checkConst = false);
00043      declareProperty("LayerInfSig", m_layInfSig);
00044      declareProperty("XtMode", m_xtMode = 1);
00045      declareProperty("NewXtFile", m_xtfile);
00046      declareProperty("ReadWireEffDb", m_readWireEffDb = true);
00047      declareProperty("WireEffFile", m_wireEffFile);
00048      declareProperty("LinearXT", m_linearXT = false);
00049      declareProperty("FixSigma", m_fixSigma = false);
00050      declareProperty("FixSigmaValue", m_fixSigmaValue = 130.0); // micron
00051      m_outputXtMode = true;
00052 }
00053 
00054 MdcCalibFunSvc::~MdcCalibFunSvc(){
00055 }
00056 
00057 StatusCode MdcCalibFunSvc::queryInterface(const InterfaceID& riid, void** ppvInterface){
00058      if( IID_IMdcCalibFunSvc.versionMatch(riid) ){
00059           *ppvInterface = static_cast<IMdcCalibFunSvc*> (this);
00060      } else{
00061           return Service::queryInterface(riid, ppvInterface);
00062      }
00063      return StatusCode::SUCCESS;
00064 }
00065 
00066 StatusCode MdcCalibFunSvc::initialize(){
00067      MsgStream log(messageService(), name());
00068      log << MSG::INFO << "MdcCalibFunSvc::initialize()" << endreq;
00069 
00070      StatusCode sc = Service::initialize();
00071      if( sc.isFailure() ) return sc;
00072 
00073      IIncidentSvc* incsvc;
00074      sc = service("IncidentSvc", incsvc);
00075      int priority = 100;
00076      if( sc.isSuccess() ){
00077           incsvc -> addListener(this, "NewRun", priority);
00078      }
00079 
00080      sc = service("CalibDataSvc", m_pCalDataSvc, true);
00081      if( sc == StatusCode::SUCCESS ){
00082           log << MSG::INFO << "Retrieve IDataProviderSvc" << endreq;
00083      }else{
00084           log << MSG::FATAL << "can not get IDataProviderSvc" << endreq;
00085      }
00086 
00087      sc = service("MdcGeomSvc", m_pMdcGeomSvc);
00088      if( sc != StatusCode::SUCCESS ){
00089           log << MSG::ERROR << "can not use MdcGeomSvc" << endreq;
00090           return StatusCode::FAILURE;
00091      }
00092 
00093      if(m_fixSigma) cout << "Fix MDC sigma to " << m_fixSigmaValue << " micron." << endl;
00094 
00095      m_updateNum = 0;
00096      for(int wir=0; wir<6796; wir++) m_wireEff[wir] = 1.0;
00097      for(int lay=0; lay<NLAYER; lay++){
00098           for(int iEntr=0; iEntr<NXTENTR; iEntr++){
00099                for(int lr=0; lr<2; lr++) m_nR2t[lay][iEntr][lr] = 0;
00100           }
00101      }
00102 
00103      return StatusCode::SUCCESS;
00104 }
00105 
00106 StatusCode MdcCalibFunSvc::finalize(){
00107      MsgStream log(messageService(), name());
00108      log << MSG::INFO << "MdcCalibFunSvc::finalize()" << endreq;
00109 
00110      m_xtmap.clear();
00111      m_t0.clear();
00112      m_delt0.clear();
00113      m_qtpar0.clear();
00114      m_qtpar1.clear();
00115      m_sdmap.clear();
00116 
00117      return StatusCode::SUCCESS;
00118 }
00119 
00120 void MdcCalibFunSvc::handle(const Incident& inc){
00121      MsgStream log( messageService(), name() );
00122      log << MSG::DEBUG << "handle: " << inc.type() << endreq;
00123 
00124      if ( inc.type() == "NewRun" ){
00125           log << MSG::DEBUG << "NewRun" << endreq;
00126 
00127           if( ! initCalibConst() ){
00128                log << MSG::ERROR 
00129                    << "can not initilize Mdc Calib Constants" << endl
00130                    << "  Please insert the following statement "
00131                    << "in your \"jobOption.txt\" "
00132                    << "before the include file of Mdc Reconstruction: "
00133                    << endl << "        "
00134                    << "#include \"$CALIBSVCROOT/share/job-CalibData.txt\""
00135                    << endl
00136                    << "  If still error, please contact with Wu Linghui "
00137                    << "(wulh@mail.ihep.ac.cn)."
00138                    << endreq;
00139           }
00140      } 
00141 }
00142 
00143 double MdcCalibFunSvc::getTprop(int lay, double z) const{
00144      double vp = getVprop(lay);
00145      double tp = fabs(z - m_zst[lay]) / vp;
00146      return tp;
00147 }
00148 
00149 double MdcCalibFunSvc::driftTimeToDist(double drifttime, int layid, int cellid,
00150                                        int lr, double entrance) const {
00151      double dist;
00152      if(0 == m_xtMode){
00153           dist = t2dPoly(drifttime, layid, cellid, lr, entrance);
00154      } else{
00155           if((0==lr) || (1==lr)) dist = t2dInter(drifttime, layid, cellid, lr, entrance);
00156           else{
00157                double dl = t2dInter(drifttime, layid, cellid, lr, entrance);
00158                double dr = t2dInter(drifttime, layid, cellid, lr, entrance);
00159                dist = (dl + dr) * 0.5;
00160           }
00161      }
00162 //      cout << setw(15) << drifttime << setw(15) << dist << endl;
00163      if(m_linearXT) dist = 0.03 * drifttime;
00164      return dist;
00165 }
00166 
00167 double MdcCalibFunSvc::t2dPoly(double drifttime, int layid, int cellid,
00168                                int lr, double entrance) const {
00169      int ord;
00170      double xtpar[8];
00171      double dist = 0.0;
00172 
00173      int entr = getXtEntrIndex(entrance);
00174      getXtpar(layid, entr, lr, xtpar);
00175 
00176      if(drifttime < xtpar[6]){
00177           for(ord=0; ord<6; ord++){
00178                dist += xtpar[ord] * pow(drifttime, ord);
00179           }
00180      } else{
00181           for(ord=0; ord<6; ord++){
00182                dist += xtpar[ord] * pow(xtpar[6], ord);
00183           }
00184           dist += xtpar[7] * (drifttime - xtpar[6]);
00185      }
00186 
00187      return dist;
00188 }
00189 
00190 double MdcCalibFunSvc::t2dInter(double drifttime, int layid, int cellid,
00191                                 int lr, double entrance) const {
00192      double dist;
00193      int iEntr = getXtEntrIndex(entrance);
00194      int nBin = m_nNewXt[layid][iEntr][lr];
00195      if(drifttime < m_vt[layid][iEntr][lr][0]){
00196           dist = m_vd[layid][iEntr][lr][0];
00197      } else if(drifttime < m_vt[layid][iEntr][lr][nBin-1]){
00198           for(int i=0; i<(nBin-1); i++){
00199                if((drifttime>=m_vt[layid][iEntr][lr][i]) && (drifttime<m_vt[layid][iEntr][lr][i+1])){
00200                     double t1 = m_vt[layid][iEntr][lr][i];
00201                     double t2 = m_vt[layid][iEntr][lr][i+1];
00202                     double d1 = m_vd[layid][iEntr][lr][i];
00203                     double d2 = m_vd[layid][iEntr][lr][i+1];
00204                     dist = (drifttime-t1) * (d2-d1) / (t2-t1) + d1;
00205                     break;
00206                }
00207           }
00208      } else{
00209           dist = m_vd[layid][iEntr][lr][nBin-1];
00210      }
00211      return dist;
00212 }
00213 
00214 double MdcCalibFunSvc::distToDriftTime(double dist, int layid, int cellid,
00215                                        int lr, double entrance) const {
00216      int i = 0;
00217      double time;
00218      int ord;
00219      double xtpar[8];
00220      double dxdtpar[5];
00221      double x;
00222      double dxdt;
00223      double deltax;
00224 
00225      int entr = getXtEntrIndex(entrance);
00226      getXtpar(layid, entr, lr, xtpar);
00227 
00228      double tm1 = xtpar[6];
00229      double tm2 = 2000.0;
00230      double dm1 = driftTimeToDist(tm1, layid, cellid, lr, entrance);
00231      double dm2 = driftTimeToDist(tm2, layid, cellid, lr, entrance);
00232 
00233      if(dist < 0){
00234           cout << "Warning in MdcCalibFunSvc: driftDist < 0" << endl;
00235           time = 0.0;
00236      } else if(dist < xtpar[0]){
00237           time = 0.0;
00238      } else if(dist < dm1){
00239           for(ord=0; ord<5; ord++){
00240                dxdtpar[ord] = (double)(ord+1) * xtpar[ord+1];
00241           }
00242           time = dist / 0.03;
00243           while(1){
00244                if( i > 50 ){
00245                     cout << "Warning in MdcCalibFunSvc: "
00246                          << "can not get the exact value in the dist-to-time conversion." 
00247                          << endl;
00248                     time = dist / 0.03;
00249                     break;
00250                }
00251 
00252                x = 0.0;
00253                for(ord=0; ord<6; ord++)
00254                     x += xtpar[ord] * pow(time, ord);
00255 
00256                deltax = x - dist;
00257                if( fabs(deltax) < 0.001 ){
00258                     break;
00259                }
00260 
00261                dxdt = 0.0;
00262                for(ord=0; ord<5; ord++)
00263                     dxdt += dxdtpar[ord] * pow(time, ord);
00264 
00265                time = time - (deltax / dxdt);
00266                i++;
00267           }
00268      } else if(dist < dm2){
00269           time = (dist - dm1) * (tm2 - tm1) / (dm2 - dm1) + tm1;
00270      } else{
00271           time = tm2;
00272      }
00273 
00274      if(m_linearXT) time = dist / 0.03;
00275      return time;
00276 }
00277 
00278 double MdcCalibFunSvc::getSigma(int layid, int lr, double dist,
00279                                 double entrance, double tanlam,
00280                                 double z, double Q) const {
00281      double sigma;
00282      if( (0 == lr) || (1 == lr) ){
00283           sigma = getSigmaLR(layid, lr, dist, entrance, tanlam, z, Q);
00284      } else{
00285           double sl = getSigmaLR(layid, 0, dist, entrance, tanlam, z, Q);
00286           double sr = getSigmaLR(layid, 1, dist, entrance, tanlam, z, Q);
00287           sigma = (sl + sr) * 0.5;
00288      }
00289 
00290      if(m_fixSigma) sigma = 0.001 * m_fixSigmaValue;
00291      if(layid == m_layInfSig) sigma = 9999.0;
00292      return sigma;
00293 }
00294 
00295 double MdcCalibFunSvc::getSigmaLR(int layid, int lr, double dist,
00296                                   double entrance, double tanlam,
00297                                   double z, double Q) const {
00298 
00299      double sigma = 9999.0;
00300      double par[NSDBIN];
00301 
00302      int entr = getSdEntrIndex(entrance);
00303      getSdpar(layid, entr, lr, par);
00304 
00305      int nmaxBin;
00306      double dw = 0.5;           // width of each distance bin
00307      double dmin = 0.25;        // mm
00308      if(layid < 8){
00309           nmaxBin = 20; // 11->20 2011-12-10
00310      } else{
00311           nmaxBin = 20; // 15->20 2011-12-10
00312      }
00313 
00314      double dref[2];
00315      double distAbs = fabs(dist);
00316      if(distAbs < dmin){
00317           sigma = par[0];
00318      } else{
00319           int bin = (int)((distAbs - dmin) / dw);
00320           if(bin >= nmaxBin){
00321                sigma = par[nmaxBin];
00322           } else if(bin < 0){
00323                sigma = par[0];
00324           } else{
00325                dref[0] = (double)bin * dw + 0.25;
00326                dref[1] = (double)(bin+1) * dw + 0.25;
00327                if((dref[1] - dref[0]) <= 0){
00328                     sigma = 9999.0;
00329                } else{
00330                     sigma = (par[bin+1] - par[bin]) * (distAbs - dref[0]) /
00331                          (dref[1] - dref[0]) + par[bin];
00332                }
00333           }
00334      }
00335      return sigma;
00336 }
00337 
00338 double MdcCalibFunSvc::getSigma1(int layid, int lr, double dist,
00339                                  double entrance, double tanlam,
00340                                  double z, double Q) const {
00341      double sigma1 = getSigma(layid, lr, dist, entrance, tanlam, z, Q);
00342      return sigma1;
00343 }
00344 
00345 double MdcCalibFunSvc::getSigma2(int layid, int lr, double dist,
00346                                  double entrance, double tanlam,
00347                                  double z, double Q) const {
00348 
00349      return 0.0;
00350 }
00351 
00352 double MdcCalibFunSvc::getF(int layid, int lr, double dist,
00353                             double entrance, double tanlam,
00354                             double z, double Q) const {
00355 
00356      return 1.0;
00357 }
00358 
00359 double MdcCalibFunSvc::getSigmaToT(int layid, int lr, double tdr, double entrance,
00360                                    double tanlam, double z, double Q) const{
00361      if(!m_fgR2t){
00362           cout << "ERROR: can not get sigma-time functions" << endl;
00363           return -999.0;
00364      } else if( (0 == lr) || (1 == lr) ){
00365           return getSigmaToTLR(layid, lr, tdr, entrance, tanlam, z, Q);
00366      } else{
00367           double sl = getSigmaToTLR(layid, 0, tdr, entrance, tanlam, z, Q);
00368           double sr = getSigmaToTLR(layid, 1, tdr, entrance, tanlam, z, Q);
00369           double sigma = (sl + sr) * 0.5;
00370           return sigma;
00371      }
00372 }
00373 
00374 double MdcCalibFunSvc::getSigmaToTLR(int layid, int lr, double tdr, double entrance,
00375                                      double tanlam, double z, double Q) const{
00376      double sigma;
00377      int iEntr = getXtEntrIndex(entrance);
00378      int nBin = m_nR2t[layid][iEntr][lr];
00379      if(tdr < m_tR2t[layid][iEntr][lr][0]){
00380           sigma = m_sR2t[layid][iEntr][lr][0];
00381      } else if(tdr < m_tR2t[layid][iEntr][lr][nBin-1]){
00382           for(int i=0; i<(nBin-1); i++){
00383                if((tdr>=m_tR2t[layid][iEntr][lr][i]) && (tdr<m_tR2t[layid][iEntr][lr][i+1])){
00384                     double t1 = m_tR2t[layid][iEntr][lr][i];
00385                     double t2 = m_tR2t[layid][iEntr][lr][i+1];
00386                     double s1 = m_sR2t[layid][iEntr][lr][i];
00387                     double s2 = m_sR2t[layid][iEntr][lr][i+1];
00388                     sigma = (tdr-t1) * (s2-s1) / (t2-t1) + s1;
00389                     break;
00390                }
00391           }
00392      } else{
00393           sigma = m_sR2t[layid][iEntr][lr][nBin-1];
00394      }
00395      return sigma;
00396 }
00397 
00398 int MdcCalibFunSvc::getNextXtpar(int& key, double& par){
00399      if( m_xtiter != m_xtmap.end() ){
00400           key = (*m_xtiter).first;
00401           par = (*m_xtiter).second;
00402           m_xtiter++;
00403           return 1;
00404      }
00405      else return 0;
00406 }
00407 
00408 void MdcCalibFunSvc::getXtpar(int layid, int entr, int lr, double par[]) const{
00409      int parId;
00410      for(int ord=0; ord<8; ord++){
00411           parId = getXtparId(layid, entr, lr, ord);
00412           par[ord] = m_xtpar[parId];
00413      }
00414 }
00415 
00416 bool MdcCalibFunSvc::getNewXtpar() {
00417      MsgStream log(messageService(), name());
00418      log << MSG::INFO << "read calib const from TCDS" << endreq;
00419 
00420      for(int layid=0; layid<NLAYER; layid++){
00421           for(int entr=0; entr<NXTENTR; entr++){
00422                for(int lr=0; lr<2; lr++){
00423                     double br_t,br_d;
00424                     TTree* newXtTree = getNewXtparTree(layid,entr,lr);
00425                     if(!newXtTree) return false;
00426                     newXtTree -> SetBranchAddress("t", &br_t);
00427                     newXtTree -> SetBranchAddress("d", &br_d);
00428                     int nEntries = newXtTree -> GetEntries();
00429                     if((nEntries<10) || (nEntries>=200)){
00430                          log << MSG::ERROR << "wrong X-T constants: layer " << layid
00431                              << ", iEntr " << entr << ", lr " << lr << endreq;
00432                          return false;
00433                     }
00434                     m_nNewXt[layid][entr][lr] = nEntries;
00435                     for(int i=0; i<nEntries; i++){
00436                          newXtTree->GetEntry(i);
00437                          m_vt[layid][entr][lr][i] = br_t;
00438                          m_vd[layid][entr][lr][i] = br_d;
00439                     }//end loop entries
00440                }//end lr
00441           }//end entr
00442      }//end layid
00443 
00444      return true;
00445 }
00446 
00447 TTree* MdcCalibFunSvc::getNewXtparTree(int layid, int entr, int lr) const{
00448      MsgStream log(messageService(), name());
00449      string fullPath = "/Calib/MdcCal";
00450      SmartDataPtr<CalibData::MdcCalibData> calConst(m_pCalDataSvc, fullPath);
00451      if( ! calConst ){
00452           log << MSG::ERROR << "can not get MdcCalibConst via SmartPtr" << endreq;
00453           return NULL;
00454      }
00455 
00456      TTree* newXtTree = calConst->getNewXtpar(layid,entr,lr);
00457      return newXtTree;
00458 }
00459 
00460 bool MdcCalibFunSvc::getR2tpar() {
00461      for(int layid=0; layid<NLAYER; layid++){
00462           int br_iEntr,br_lr;
00463           double br_s,br_t;
00464           TTree* r2tTree = getR2tTree(layid);
00465           if(!r2tTree) return false;
00466           r2tTree -> SetBranchAddress("iEntr", &br_iEntr);
00467           r2tTree -> SetBranchAddress("lr", &br_lr);
00468           r2tTree -> SetBranchAddress("s", &br_s);
00469           r2tTree -> SetBranchAddress("t", &br_t);
00470           int nEntries = r2tTree -> GetEntries();
00471           for(int i=0; i<nEntries; i++){
00472                r2tTree->GetEntry(i);
00473                int bin = m_nR2t[layid][br_iEntr][br_lr];
00474                if(bin>=200){
00475                     cout << "Error: number of sigma-time bins overflow" << endl;
00476                     return false;
00477                }
00478                m_tR2t[layid][br_iEntr][br_lr][bin] = br_t;
00479                m_sR2t[layid][br_iEntr][br_lr][bin] = br_s;
00480                m_nR2t[layid][br_iEntr][br_lr]++;
00481           }
00482      }
00483      for(int layid=0; layid<NLAYER; layid++){
00484           for(int iEntr=0; iEntr<NXTENTR; iEntr++){
00485                for(int lr=0; lr<2; lr++){
00486                     if((m_nR2t[layid][iEntr][lr]<10) || (m_nR2t[layid][iEntr][lr]>=200)) return false;
00487                }
00488           }
00489      }
00490      return true;
00491 }
00492 
00493 TTree* MdcCalibFunSvc::getR2tTree(int layid) const{
00494      MsgStream log(messageService(), name());
00495      string fullPath = "/Calib/MdcCal";
00496      SmartDataPtr<CalibData::MdcCalibData> calConst(m_pCalDataSvc, fullPath);
00497      if( ! calConst ){
00498           log << MSG::ERROR << "can not get MdcCalibConst via SmartPtr" << endreq;
00499           return NULL;
00500      }
00501 
00502      TTree* r2tTree = calConst->getR2tpar(layid);
00503      return r2tTree;
00504 }
00505 
00506 
00507 double MdcCalibFunSvc::getT0(int layid, int cellid) const {
00508      int wireid = m_pMdcGeomSvc->Wire(layid, cellid)->Id();
00509      double t0 = getT0(wireid);
00510 
00511      return t0;
00512 }
00513 
00514 double MdcCalibFunSvc::getTimeWalk(int layid, double Q) const {
00515      double tw = 0.0;
00516      double qtpar[2];
00517      int ord;
00518 
00519      if(Q < 0.0001) Q = 0.0001;
00520 
00521      for(ord=0; ord<2; ord++){
00522           qtpar[ord] = getQtpar(layid, ord);
00523      }
00524 
00525      tw = qtpar[0] + qtpar[1] / sqrt( Q );
00526      if(m_run < 0) tw = 0.0;    // for MC
00527 
00528      return tw;
00529 }
00530 
00531 double MdcCalibFunSvc::getWireEff(int layid, int cellid) const {
00532      int wireid = m_pMdcGeomSvc->Wire(layid, cellid)->Id();
00533      return m_wireEff[wireid];
00534 }
00535 
00536 double MdcCalibFunSvc::getQtpar(int layid, int ord) const {
00537      if(0 == ord)       return m_qtpar0[layid];
00538      else if(1 == ord)  return m_qtpar1[layid];
00539      else {
00540           cout << "wrong order number" << endl;
00541           return 0.0;
00542      }
00543 }
00544 
00545 void MdcCalibFunSvc::getSdpar(int layid, int entr, int lr, double par[]) const{
00546      int parId;
00547      if( (entr < 0) || (entr >= 18) ){
00548           entr = 17;
00549      }
00550      for(int bin=0; bin<NSDBIN; bin++){
00551           parId = getSdparId(layid, entr, lr, bin);
00552           par[bin] = m_sdpar[parId];
00553      }
00554 }
00555 
00556 int MdcCalibFunSvc::getNextSdpar(int& key, double& par){
00557      if( m_sditer != m_sdmap.end() ){
00558           key = (*m_sditer).first;
00559           par = (*m_sditer).second;
00560           m_sditer++;
00561           return 1;
00562      }
00563      else return 0;
00564 }
00565 
00566 int MdcCalibFunSvc::getXtEntrIndex(double entrance) const {
00567      int i;
00568      int index;
00569      int idmax = 17;
00570      double aglpi = 3.141592653;
00571      double aglmin = -1.570796327; // -90 degree
00572      double aglmax = 1.570796327; // 90 degree
00573      double delAngle = 0.174532925; // 10 degree
00574 
00575      MsgStream log(messageService(), name());
00576      if(entrance < aglmin){
00577           log << MSG::WARNING << "entrance angle < -pi/2" << endreq;
00578           while(1){
00579                entrance += aglpi;
00580                if(entrance >= aglmin) break;
00581           }
00582      } else if(entrance > aglmax){
00583           log << MSG::WARNING << "entrance angle > pi/2" << endreq;
00584           while(1){
00585                entrance -= aglpi;
00586                if(entrance <= aglmax) break;
00587           }
00588      }
00589 
00590      index = (int)((entrance-aglmin) / delAngle);
00591      if(index < 0) index = 0;
00592      else if(index > idmax) index = idmax;
00593 
00594      return index;
00595 }
00596 
00597 int MdcCalibFunSvc::getSdEntrIndex(double entrance) const {
00598      int i;
00599      int index;
00600      int idmax = 5;
00601      double aglpi = 3.141592653;
00602      double aglmin = -1.570796327; // -90 degree
00603      double aglmax = 1.570796327; // 90 degree
00604      double delAngle = 0.523598776; // 30 degree
00605 
00606      MsgStream log(messageService(), name());
00607      if(entrance < aglmin){
00608           log << MSG::WARNING << "entrance angle < -pi/2" << endreq;
00609           while(1){
00610                entrance += aglpi;
00611                if(entrance >= aglmin) break;
00612           }
00613      } else if(entrance > aglmax){
00614           log << MSG::WARNING << "entrance angle > pi/2" << endreq;
00615           while(1){
00616                entrance -= aglpi;
00617                if(entrance <= aglmax) break;
00618           }
00619      }
00620 
00621      index = (int)((entrance-aglmin) / delAngle);
00622      if(index < 0) index = 0;
00623      else if(index > idmax) index = idmax;
00624 
00625      return index;
00626 }
00627 
00628 bool MdcCalibFunSvc::initCalibConst(){
00629      MsgStream log(messageService(), name());
00630      log << MSG::INFO << "read calib const from TCDS" << endreq;
00631 
00632      IDataProviderSvc* eventSvc = NULL;
00633      Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00634      SmartDataPtr<Event::EventHeader> eventHeader(eventSvc,"/Event/EventHeader");
00635      if (!eventHeader) {
00636           log << MSG::FATAL << "Could not find Event Header" << endreq;
00637           return( StatusCode::FAILURE);
00638      }
00639      m_run = eventHeader->runNumber();
00640 
00641      // clear calibration constants vectors
00642      m_xtmap.clear();
00643      m_xtpar.clear();
00644      m_t0.clear();
00645      m_delt0.clear();
00646      m_qtpar0.clear();
00647      m_qtpar1.clear();
00648      m_sdmap.clear();
00649      m_sdpar.clear();
00650 
00651      string fullPath = "/Calib/MdcCal";
00652      SmartDataPtr<CalibData::MdcCalibData> calConst(m_pCalDataSvc, fullPath);
00653      if( ! calConst ){
00654           log << MSG::ERROR << "can not get MdcCalibConst via SmartPtr" 
00655               << endreq;
00656           return false;
00657      }
00658 
00659      // initialize XT parameter
00660      int layid;
00661      int entr;
00662      int lr;
00663      int ord;
00664      int key;
00665      double par;
00666      calConst -> setXtBegin();
00667      while( calConst->getNextXtpar(key, par) ){
00668           m_xtmap.insert( valType(key, par) );
00669      }
00670 
00671      int parId;
00672      unsigned mapsize = m_xtmap.size();
00673      m_xtpar.resize(mapsize);
00674      log << MSG::INFO << "size of xtmap: " << mapsize << endreq;
00675 
00676      calConst -> setXtBegin();
00677      while( calConst->getNextXtpar(key, par) ){
00678           layid = (key >> XTLAYER_INDEX) & XTLAYER_DECO;
00679           entr = (key >> XTENTRA_INDEX) & XTENTRA_DECO;
00680           lr = (key >> XTLR_INDEX) & XTLR_DECO;
00681           ord = (key >> XTORDER_INDEX) & XTORDER_DECO;
00682 
00683           parId = getXtparId(layid, entr, lr, ord);
00684           m_xtpar[parId] = par;
00685      }
00686 
00687      // initialize T0 parameter
00688      int wid;
00689      double t0;
00690      double delt0;
00691      for(wid=0; wid<NWIRE; wid++){
00692           t0 = calConst->getT0(wid);
00693           delt0 = calConst->getDelT0(wid);
00694 
00695           m_t0.push_back(t0);
00696           m_delt0.push_back(delt0);
00697      }
00698 
00699      // initialize QT parameter
00700      double qtpar0;
00701      double qtpar1;
00702      for(layid=0; layid<NLAYER; layid++){
00703           qtpar0 = calConst -> getQtpar0(layid);
00704           qtpar1 = calConst -> getQtpar1(layid);
00705 
00706           m_qtpar0.push_back(qtpar0);
00707           m_qtpar1.push_back(qtpar1);
00708      }
00709 
00710      // initialize resolution parameter
00711      calConst -> setSdBegin();
00712      while( calConst -> getNextSdpar(key, par) ){
00713           m_sdmap.insert( valType(key, par) );
00714 //        cout << setw(15) << key << setw(15) << par << endl;
00715      }
00716 
00717      mapsize = m_sdmap.size();
00718      m_sdpar.resize(mapsize);
00719      log << MSG::INFO << "size of sdmap: " << mapsize << endreq;
00720 
00721      calConst -> setSdBegin();
00722      while( calConst -> getNextSdpar(key, par) ){
00723           layid = (key >> SDLAYER_INDEX) & SDLAYER_DECO;
00724           entr = (key >> SDENTRA_INDEX) & SDENTRA_DECO;
00725           lr = (key >> SDLR_INDEX) & SDLR_DECO;
00726           ord = (key >> SDBIN_INDEX) & SDBIN_DECO;
00727 
00728           parId = getSdparId(layid, entr, lr, ord);
00729           m_sdpar[parId] = par;
00730      }
00731 
00732      double zeast;
00733      double zwest;
00734      for(layid=0; layid<NLAYER; layid++){
00735           zwest = m_pMdcGeomSvc->Wire(layid, 0)->Forward().z();
00736           zeast = m_pMdcGeomSvc->Wire(layid, 0)->Backward().z();
00737 
00738           if(0 == (layid % 2)) m_zst[layid] = zwest;    // west end
00739           else m_zst[layid] = zeast; // east end
00740      }
00741 
00742      // read new-XT
00743      log << MSG::INFO << "read new xt from TCDS" << endreq;
00744      if (!getNewXtpar()){
00745           log << MSG::WARNING << "can not get MDC New XT Trees" << endreq;
00746           m_xtMode = 0;
00747      }
00748      if(m_run < 0) m_xtMode = 0;
00749      if(0 == m_xtMode) log << MSG::INFO << "use old X-T functions " << endreq;
00750      else log << MSG::INFO << "use new X-T functions " << endreq;
00751      if(m_outputXtMode){
00752           if(0 == m_xtMode) cout << "use old X-T functions " << endl;
00753           else cout << "use new X-T functions " << endl;
00754           m_outputXtMode = false;
00755      }
00756 
00757      // read r-t
00758      for(layid=0; layid<NLAYER; layid++){
00759           for(entr=0; entr<NXTENTR; entr++){
00760                for(lr=0; lr<2; lr++) m_nR2t[layid][entr][lr] = 0;
00761           }
00762      }
00763      m_fgR2t = true;
00764      log << MSG::INFO << "read new sigma-time from TCDS" << endreq;
00765      if (!getR2tpar()){
00766           log << MSG::WARNING << "can not get sigma-time functions" << endreq;
00767           m_fgR2t = false;
00768      } else{
00769           log << MSG::INFO << "read sigma-time successfully " << endreq;
00770      }
00771 
00772      // read wire efficiency
00773      if(m_readWireEffDb){
00774           fullPath = "/Calib/MdcDataConst";
00775           log << MSG::INFO <<"Read Wire Eff from TCDS: "<< fullPath << endreq;
00776           log << MSG::INFO << "Read wire eff!" << endreq;
00777 
00778           SmartDataPtr<CalibData::MdcDataConst> dataConst(m_pCalDataSvc, fullPath);
00779           if(!dataConst){
00780                log << MSG::ERROR << "can not get MdcDataConst via SmartPtr" << endreq;
00781                return false; 
00782           }
00783           for(int wir=0; wir<NWIRE; wir++) {
00784                m_wireEff[wir] = dataConst->getWireEff(wir);
00785           }
00786      } else{
00787           log << MSG::INFO <<"Read Wire Eff from file: "<< m_wireEffFile << endreq;
00788           ifstream fEff(m_wireEffFile.c_str());
00789           if(!fEff.is_open()){
00790                log << MSG::ERROR << "can not open wire eff file: " << m_wireEffFile << endreq;
00791                return false;
00792           } else{
00793                string strtmp;
00794                for(int i=0; i<4; i++) fEff >> strtmp;
00795                for(int wir=0; wir<NWIRE; wir++) fEff >> strtmp >> strtmp >> strtmp >> m_wireEff[wir];
00796                fEff.close();
00797           }
00798      }
00799      if(m_checkConst) checkConst();
00800      m_updateNum++;
00801 
00802      return true;
00803 }
00804 
00805 int MdcCalibFunSvc::getXtKey(int layid, int lr, int ord, int entr) const{
00806 
00807      int key = ( (layid << XTLAYER_INDEX) & XTLAYER_MASK ) |
00808           ( (entr << XTENTRA_INDEX) & XTENTRA_MASK ) |
00809           ( (lr << XTLR_INDEX) & XTLR_MASK ) |
00810           ( (ord << XTORDER_INDEX) & XTORDER_MASK );
00811 
00812      return key;
00813 }
00814 
00815 int MdcCalibFunSvc::getSdKey(int layid, int entr, int lr, int ord) const {
00816      int key = ( (layid << SDLAYER_INDEX) & SDLAYER_MASK ) |
00817           ( (entr << SDENTRA_INDEX) & SDENTRA_MASK ) |
00818           ( (lr << SDLR_INDEX) & SDLR_MASK ) |
00819           ( (ord << SDBIN_INDEX) & SDBIN_MASK );
00820 
00821      return key;
00822 }
00823 
00824 void MdcCalibFunSvc::checkConst(){
00825      char fname[200];
00826      sprintf(fname, "checkXt_%d.txt", m_updateNum);
00827      ofstream fxt(fname);
00828      unsigned mapsize = m_xtmap.size();
00829      unsigned vsize = m_xtpar.size();
00830      fxt << setw(10) << mapsize << setw(10) << vsize << endl << endl;
00831      int key;
00832      double par;
00833      std::map<int, double>::iterator xtiter = m_xtmap.begin();
00834      while(  xtiter != m_xtmap.end() ){
00835           key = (*xtiter).first;
00836           par = (*xtiter).second;
00837           fxt << setw(20) << key << setw(20) << par << endl;
00838           xtiter++;
00839      }
00840      fxt << endl;
00841      for(unsigned i=0; i<vsize; i++){
00842           fxt << setw(5) << i << setw(15) << m_xtpar[i] << endl;
00843      }
00844      fxt.close();
00845 
00846      sprintf(fname, "checkT0_%d.txt", m_updateNum);
00847      ofstream ft0(fname);
00848      ft0 << setw(10) << m_t0.size() << setw(10) << m_delt0.size() << endl;
00849      for(unsigned i=0; i<m_t0.size(); i++){
00850           ft0 << setw(5) << i << setw(15) << m_t0[i] << setw(15) << m_delt0[i] << endl;
00851      }
00852      ft0.close();
00853 
00854      sprintf(fname, "checkQt_%d.txt", m_updateNum);
00855      ofstream fqt(fname);
00856      fqt << setw(10) << m_qtpar0.size() << setw(10) << m_qtpar1.size() << endl;
00857      for(unsigned i=0; i<m_qtpar0.size(); i++){
00858           fqt << setw(5) << i << setw(15) << m_qtpar0[i] << setw(15) << m_qtpar1[i] << endl;
00859      }
00860      fqt.close();
00861 
00862      sprintf(fname, "checkSd_%d.txt", m_updateNum);
00863      ofstream fsd(fname);
00864      mapsize = m_sdmap.size();
00865      vsize = m_sdpar.size();
00866      fsd << setw(10) << mapsize << setw(10) << vsize << endl << endl;
00867      std::map<int, double>::iterator sditer = m_sdmap.begin();
00868      while(  sditer != m_sdmap.end() ){
00869           key = (*sditer).first;
00870           par = (*sditer).second;
00871           fsd << setw(20) << key << setw(20) << par << endl;
00872           sditer++;
00873      }
00874      fsd << endl;
00875      for(unsigned i=0; i<vsize; i++){
00876           fsd << setw(5) << i << setw(15) << m_sdpar[i] << endl;
00877      }
00878      fsd.close();
00879 
00880      sprintf(fname, "checkNewXt_%d.txt", m_updateNum);
00881      ofstream fnewxt(fname);
00882      for(int lay=0; lay<43; lay++){
00883           for(int iEntr=0; iEntr<18; iEntr++){
00884                for(int lr=0; lr<2; lr++){
00885                     fnewxt << setw(5) << lay << setw(5) << iEntr << setw(3) << lr
00886                            << setw(5) << m_nNewXt[lay][iEntr][lr] << endl;
00887                     for(int bin=0; bin<m_nNewXt[lay][iEntr][lr]; bin++){
00888                          fnewxt << setw(15) << m_vt[lay][iEntr][lr][bin]
00889                                 << setw(15) << m_vd[lay][iEntr][lr][bin] << endl;
00890                     }
00891                }
00892           }
00893      }
00894      fnewxt.close();
00895 
00896      sprintf(fname, "checkR2t_%d.txt", m_updateNum);
00897      ofstream fr2t(fname);
00898      for(int lay=0; lay<43; lay++){
00899           for(int iEntr=0; iEntr<18; iEntr++){
00900                for(int lr=0; lr<2; lr++){
00901                     fr2t << setw(5) << lay << setw(5) << iEntr << setw(3) << lr
00902                          << setw(5) << m_nR2t[lay][iEntr][lr] << endl;
00903                     for(int bin=0; bin<m_nR2t[lay][iEntr][lr]; bin++){
00904                          fr2t << setw(15) << m_tR2t[lay][iEntr][lr][bin]
00905                               << setw(15) << m_sR2t[lay][iEntr][lr][bin] << endl;
00906                     }
00907                }
00908           }
00909      }
00910      fr2t.close();
00911 }
00912 

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