/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Mdc/DedxCurSvc/DedxCurSvc-00-00-17/src/DedxCurSvc.cxx

Go to the documentation of this file.
00001 //********************************************************************
00002 // DedxCurSvc package
00003 // This Service is used for TOF measured pulse height correction.
00004 // For BESIII, from run 7991 to run 10881, 
00005 // TOF electronics QTC correction are done online.
00006 // This service is used for convert the corrected Q back to RAW Q
00007 //                      Sun Shengsen   2009-9-17
00008 //********************************************************************
00009 #include "GaudiKernel/Kernel.h"
00010 #include "GaudiKernel/IInterface.h"
00011 #include "GaudiKernel/StatusCode.h"
00012 #include "GaudiKernel/SvcFactory.h"
00013 #include "GaudiKernel/MsgStream.h"
00014 #include "GaudiKernel/IIncidentSvc.h"
00015 #include "GaudiKernel/Incident.h"
00016 #include "GaudiKernel/IIncidentListener.h"
00017 #include "GaudiKernel/IDataProviderSvc.h"
00018 #include "GaudiKernel/Service.h"
00019 #include "GaudiKernel/SmartDataPtr.h"
00020 #include "EventModel/EventModel.h"
00021 #include "EventModel/Event.h"
00022 #include "EventModel/EventHeader.h"
00023 #include "DedxCurSvc/DedxCurSvc.h"
00024 #include "TTree.h"
00025 #include "TBuffer.h"
00026 #include "TBufferFile.h"
00027 
00028 #include <math.h>
00029 
00030 using namespace std; 
00031 
00032 DedxCurSvc::DedxCurSvc( const std::string& name, ISvcLocator* svcloc ) : Service(name, svcloc) {
00033 declareProperty("BossRelease",m_bossRelease="default");
00034 declareProperty("BossVer",m_sftver="default");
00035 declareProperty("ParVer",m_calParVer="default");
00036 declareProperty("DbStatus",m_dbStatus="OK");
00037 declareProperty("Type",m_type="default");
00038 }
00039 
00040 
00041 StatusCode DedxCurSvc::queryInterface (const InterfaceID& riid, void** ppvInterface ){
00042   
00043   if ( IID_IDedxCurSvc.versionMatch(riid) ) { 
00044     *ppvInterface = static_cast<IDedxCurSvc*> (this); 
00045   } 
00046   else return Service::queryInterface(riid, ppvInterface) ; 
00047   return StatusCode::SUCCESS;
00048 }
00049 
00050 
00051 StatusCode DedxCurSvc::initialize ( ) {
00052   
00053   MsgStream log(msgSvc(), name());
00054   log << MSG::INFO << name() << ": Start of run initialisation" << endreq;
00055   
00056   StatusCode sc = Service::initialize();
00057   if ( sc.isFailure() ) return sc;
00058 
00059   IIncidentSvc* incsvc;
00060   sc = service("IncidentSvc", incsvc);
00061   int priority = 100;
00062   if( sc.isSuccess() ){
00063     incsvc -> addListener(this, "NewRun", priority);
00064   }
00065   
00066 
00067    sc = serviceLocator()->service("DatabaseSvc",m_dbsvc,true);
00068   if (sc .isFailure() ) {
00069     log << MSG::ERROR << "Unable to find DatabaseSvc " << endreq;
00070     return sc;
00071   }
00072 
00073 
00074   sc = serviceLocator()->service("EventDataSvc", m_eventSvc, true);
00075   if (sc .isFailure() ) {
00076     log << MSG::ERROR << "Unable to find EventDataSvc " << endreq;
00077     return sc;
00078   }
00079   
00080   StatusCode scc;
00081   log<<MSG::INFO << "setProperties()" << endreq;
00082   scc = setProperties();
00083  
00084   m_runFromMax=0;
00085   m_runToMin=0;
00086 
00087   return sc;
00088 }  
00089 
00090   
00091 StatusCode DedxCurSvc::finalize ( ) {
00092   MsgStream log(msgSvc(), name());
00093   log << MSG::INFO << name() << ": End of Run" << endreq;
00094   return StatusCode::SUCCESS;
00095 }
00096 
00097 
00098 DedxCurSvc::~DedxCurSvc(){
00099 }
00100 
00101 
00102 
00103 void DedxCurSvc::handle(const Incident& inc){
00104   MsgStream log( messageService(), name() );
00105   log << MSG::DEBUG << "handle: " << inc.type() << endreq;
00106 
00107   SmartDataPtr<Event::EventHeader> eventHeader(m_eventSvc,"/Event/EventHeader");
00108   int  run = eventHeader->runNumber();
00109 
00110   if ( inc.type() == "NewRun" ){
00111     log << MSG::DEBUG << "New Run:" << run << endreq;
00112     getDedxCurveInfo();
00113   }
00114 }
00115 
00116 
00117 void DedxCurSvc::getDedxCurveInfo(){
00118   MsgStream log(messageService(), name());
00119   SmartDataPtr<Event::EventHeader> eventHeader(m_eventSvc,"/Event/EventHeader");
00120   int  run = eventHeader->runNumber();
00121   if(run<0){
00122     log << MSG::INFO << "This data is the MC sample with the Run Number: " << run << endreq;
00123     if(m_type=="Sim"){
00124       run=-run;
00125       log << MSG::INFO << "Reverse the sign of Run Number" << endreq;
00126     }
00127   }
00128   //  unsigned long *lengths;
00129   MYSQL_RES *res_set;
00130   MYSQL_ROW row;
00131   char stmt1[400];
00132 
00133   std::string sftver;
00134   
00135   if(m_sftver == "default" && m_bossRelease == "default")
00136   {
00137     log << MSG::FATAL << " BossRelease and BossVer for DedxCurve not set!" << endreq;
00138     exit(1);
00139   }
00140 
00141   if( (run<m_runFromMax || run>m_runToMin) ) 
00142   { 
00143     if(m_sftver == "default")
00144     {
00145       sprintf(stmt1,"select RunFrom, RunTo, SftVer, ParVer from CalVtxLumVer where BossRelease = '%s' and RunFrom <= %d and RunTo >= %d and DataType = 'DedxCurve'", m_bossRelease.c_str(), run, run);
00146       std::cout<<stmt1<<std::endl;
00147       DatabaseRecordVector rest;
00148       int row_no = m_dbsvc->query("offlinedb",stmt1,rest);
00149       if(row_no==0) {
00150         log << MSG::FATAL << "can not find result for DedxCur with: " << stmt1 << endreq;
00151         exit(1);
00152       }
00153       if(row_no>1) {
00154         log << MSG::FATAL << "find more than 1 results for DedxCur with: " << stmt1 << endreq;
00155         exit(1);
00156       }
00157       DatabaseRecord* recordst = rest[0];
00158       sftver = recordst->GetString("SftVer");
00159       m_calParVer = recordst->GetString("ParVer");
00160       m_runFromMax = atoi((recordst->GetString("RunFrom")).c_str());
00161       m_runToMin = atoi((recordst->GetString("RunTo")).c_str());
00162       log << MSG::INFO << "get from CalVtxLumVer, m_runFromMax: "<< m_runFromMax << " m_runToMin: "<<m_runToMin<< endreq;
00163     }
00164     else
00165       sftver = m_sftver;
00166   
00167     if(m_calParVer!="default")
00168       sprintf(stmt1,"select RunFrom, RunTo, DedxCurvePar,DedxSigmaPar from DedxCurvePar where SftVer = '%s' and RunFrom <= %d and RunTo >= %d and DedxCurveParVer = %s and Status='%s'",sftver.c_str(),run,run,m_calParVer.c_str(), m_dbStatus.c_str());
00169     else
00170       sprintf(stmt1,"select RunFrom, RunTo, DedxCurvePar,DedxSigmaPar from DedxCurvePar where SftVer = '%s' and RunFrom <= %d and RunTo >= %d and Status='%s' order by DedxCurveParVer desc",sftver.c_str(),run,run, m_dbStatus.c_str());
00171     std::cout<<stmt1<<std::endl; 
00172     
00173     DatabaseRecordVector res;
00174     int row_no  = m_dbsvc->query("offlinedb", stmt1, res);
00175     if(row_no==0){
00176      log << MSG::FATAL << "can not find result for DedxCur with: "<< stmt1 << endreq;
00177      exit(1);
00178     }
00179     if(row_no>1){
00180       log << MSG::FATAL << "find more than 1 results for DedxCur with: "<< stmt1 << endreq;
00181       exit(1);
00182     }
00183     
00184     DatabaseRecord* records = res[0];
00185     int runFrom = atoi((records->GetString("RunFrom")).c_str());
00186     int runTo = atoi((records->GetString("RunTo")).c_str());
00187     if(m_sftver=="default")
00188     {
00189       m_runFromMax = runFrom>m_runFromMax? runFrom:m_runFromMax;
00190       m_runToMin = runTo<m_runToMin? runTo:m_runToMin;
00191     }
00192     else
00193     {
00194       m_runFromMax = runFrom;
00195       m_runToMin = runTo;
00196     }
00197     log << MSG::INFO << "get from DedxCurvePar runFrom: "<< runFrom << " runTo: "<<runTo<< endreq;
00198     log << MSG::INFO << "m_runFromMax: "<< m_runFromMax << " m_runToMin: "<<m_runToMin<< endreq;
00199 
00200     TBuffer *buf1 = new TBufferFile(TBuffer::kRead);
00201     buf1->SetBuffer((*records)["DedxCurvePar"],327680,kFALSE);
00202     TBuffer *buf2 = new TBufferFile(TBuffer::kRead);
00203     buf2->SetBuffer((*records)["DedxSigmaPar"],327680,kFALSE);
00204     
00205     
00206     TTree* curvetree = new TTree(); 
00207     curvetree->Streamer(*buf1); 
00208     
00209     TTree* sigmatree = new TTree(); 
00210     sigmatree->Streamer(*buf2);
00211     
00212     double curve[50];
00213     double sigma[50];
00214     int SigmaSize;
00215     int CurveSize;
00216     curvetree -> SetBranchAddress("curve", curve);
00217     curvetree -> SetBranchAddress("CurveSize", &CurveSize);
00218     sigmatree -> SetBranchAddress("sigma", sigma);
00219     sigmatree -> SetBranchAddress("SigmaSize", &SigmaSize);
00220     
00221     Int_t nentries_curve = (Int_t)curvetree ->GetEntries();
00222     Int_t nentries_sigma = (Int_t)sigmatree ->GetEntries();
00223     curvetree -> GetEntry(0);
00224     if(CurveSize>50){
00225       log << MSG::ERROR<<"CurveSize larger than designed number"<<endreq;
00226       exit(1);}  
00227     for(int i=0; i<CurveSize;i++){
00228         m_curve[i]=curve[i];
00229        }
00230     
00231     sigmatree-> GetEntry(0);
00232     if(SigmaSize>50){
00233       log << MSG::ERROR<<"SigmaSize larger than designed number"<<endreq;
00234       exit(1);}
00235     for(int i=0; i<SigmaSize;i++){
00236         m_sigma[i]=sigma[i];}
00237       m_curve_size=CurveSize;
00238       m_sigma_size=SigmaSize;
00239      delete curvetree;
00240      delete sigmatree;
00241   }
00242    return;
00243 }
00244 
00245 

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