00001
00002
00003
00004 #include "GaudiKernel/Kernel.h"
00005 #include "GaudiKernel/IInterface.h"
00006 #include "GaudiKernel/StatusCode.h"
00007
00008 #include "GaudiKernel/SvcFactory.h"
00009 #include "GaudiKernel/MsgStream.h"
00010 #include "GaudiKernel/IIncidentSvc.h"
00011 #include "GaudiKernel/Incident.h"
00012 #include "GaudiKernel/IIncidentListener.h"
00013 #include "GaudiKernel/IDataProviderSvc.h"
00014 #include "GaudiKernel/Service.h"
00015 #include "GaudiKernel/DataSvc.h"
00016 #include "GaudiKernel/SmartDataPtr.h"
00017 #include "TofQElecSvc/TofQElecSvc.h"
00018 #include "TMath.h"
00019
00020 using namespace std;
00021
00022 TofQElecSvc::TofQElecSvc( const std::string& name, ISvcLocator* svcloc ) : Service(name, svcloc) {
00023 declareProperty("Run",m_run=1);
00024 }
00025
00026
00027 StatusCode TofQElecSvc::queryInterface (const InterfaceID& riid, void** ppvInterface ){
00028
00029 if ( IID_ITofQElecSvc.versionMatch(riid) ) {
00030 *ppvInterface = static_cast<ITofQElecSvc*> (this);
00031 } else {
00032 return Service::queryInterface(riid, ppvInterface) ;
00033 }
00034 return StatusCode::SUCCESS;
00035 }
00036
00037 StatusCode TofQElecSvc::initialize ( ) {
00038 m_hasbeeninitialized=false;
00039
00040 MsgStream log(msgSvc(), name());
00041 log << MSG::INFO << name() << ": Start of run initialisation" << endreq;
00042
00043 StatusCode sc = Service::initialize();
00044 if ( sc.isFailure() ) return sc;
00045
00046 IIncidentSvc* incsvc;
00047 sc = service("IncidentSvc", incsvc);
00048 int priority = 100;
00049 if( sc.isSuccess() ){
00050 incsvc -> addListener(this, "NewRun", priority);
00051 }
00052
00053 StatusCode scc;
00054
00055 log<<MSG::INFO << "setProperties()" << endreq;
00056 scc = service("CalibDataSvc", m_pCalibDataSvc, true);
00057 if ( !scc.isSuccess() ) {
00058 log<<MSG::ERROR<<"Could not get IDataProviderSvc interface of QElecXmlCnvSvc"<<endreq;
00059 return scc;
00060 } else {
00061 log << MSG::DEBUG<< "Retrieved IDataProviderSvc interface of QElecXmlCnvSvc"<<endreq;
00062 }
00063
00064 scc = setProperties();
00065 m_data=0;
00066 return sc;
00067 }
00068
00069 StatusCode TofQElecSvc::finalize ( ) {
00070 MsgStream log(msgSvc(), name());
00071 log << MSG::INFO << name() << ": End of Run" << endreq;
00072 return StatusCode::SUCCESS;
00073 }
00074
00075
00076 TofQElecSvc::~TofQElecSvc(){
00077 delete m_data;
00078 return;
00079 }
00080
00081
00082 StatusCode TofQElecSvc::FillfromDatabase(){
00083
00084 MsgStream log(msgSvc(), name());
00085 std::string fullPath = "/Calib/TofQElec";
00086 log << MSG::INFO<<" Tof calib fullPath = "<<fullPath<< endreq;
00087 SmartDataPtr<CalibData::TofElecData> test(m_pCalibDataSvc, fullPath);
00088 if(!test){
00089 log << MSG::FATAL << "TofQElecSvc could not find TofQElecData in TCDS!!" << endreq;
00090 return StatusCode::FAILURE;
00091 }
00092
00093 if(m_data) delete m_data;
00094 m_data = new CalibData::TofElecData;
00095 m_data->sim(test);
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 return StatusCode::SUCCESS;
00136 }
00137
00138
00139 void TofQElecSvc::handle(const Incident& inc){
00140 MsgStream log( messageService(), name() );
00141 log << MSG::DEBUG << "handle: " << inc.type() << endreq;
00142
00143 if ( inc.type() == "NewRun" ){
00144 log << MSG::DEBUG << "New Run" << endreq;
00145 StatusCode sc= FillfromDatabase();
00146 }
00147 return;
00148 }
00149
00150
00151 const unsigned int TofQElecSvc::Board( bool barrel, int id, bool eastEnd ) {
00152 MsgStream log(msgSvc(), name());
00153
00154 if( barrel ) {
00155 if( id<0 || id>175 ) {
00156 log << MSG::WARNING <<"Board : TofId is out of Range, tofid=" << id << endreq;
00157 return 1000;
00158 }
00159 }
00160 else {
00161 if( id<0 || id>95 ) {
00162 log << MSG::WARNING <<"Board : TofId is out of Range, tofid=" << id << endreq;
00163 return 1000;
00164 }
00165 }
00166
00167 unsigned int board;
00168 if( barrel ) {
00169 if( eastEnd ) {
00170 board = (m_data->getBTof(id)).getNumEast(0);
00171 }
00172 else {
00173 board = (m_data->getBTof(id)).getNumWest(0);
00174 }
00175 }
00176 else {
00177 board = (m_data->getETof(id)).getNum(0);
00178 }
00179
00180 return board;
00181 }
00182
00183
00184 const unsigned int TofQElecSvc::Crate( bool barrel, int id, bool eastEnd ) {
00185 MsgStream log(msgSvc(), name());
00186
00187 if( barrel ) {
00188 if( id<0 || id>175 ) {
00189 log << MSG::WARNING <<"Crate : TofId is out of Range, tofid=" << id << endreq;
00190 return 1000;
00191 }
00192 }
00193 else {
00194 if( id<0 || id>95 ) {
00195 log << MSG::WARNING <<"Crate : TofId is out of Range, tofid=" << id << endreq;
00196 return 1000;
00197 }
00198 }
00199
00200 unsigned int crate;
00201 if( barrel ) {
00202 if( eastEnd ) {
00203 crate = (m_data->getBTof(id)).getNumEast(2);
00204 }
00205 else {
00206 crate = (m_data->getBTof(id)).getNumWest(2);
00207 }
00208 }
00209 else {
00210 crate = (m_data->getETof(id)).getNum(2);
00211 }
00212
00213 return crate;
00214 }
00215
00216
00217 const unsigned int TofQElecSvc::Fee( bool barrel, int id, bool eastEnd ) {
00218 MsgStream log(msgSvc(), name());
00219
00220 if( barrel ) {
00221 if( id<0 || id>175 ) {
00222 log << MSG::WARNING <<"Fee : TofId is out of Range, tofid=" << id << endreq;
00223 return 1000;
00224 }
00225 }
00226 else {
00227 if( id<0 || id>95 ) {
00228 log << MSG::WARNING <<"Fee : TofId is out of Range, tofid=" << id << endreq;
00229 return 1000;
00230 }
00231 }
00232
00233 unsigned int crate;
00234 if( barrel ) {
00235 if( eastEnd ) {
00236 crate = (m_data->getBTof(id)).getNumEast(3);
00237 }
00238 else {
00239 crate = (m_data->getBTof(id)).getNumWest(3);
00240 }
00241 }
00242 else {
00243 crate = (m_data->getETof(id)).getNum(3);
00244 }
00245
00246 return crate;
00247 }
00248
00249
00250 const unsigned int TofQElecSvc::Channel( bool barrel, int id, bool eastEnd ) {
00251 MsgStream log(msgSvc(), name());
00252
00253 if( barrel ) {
00254 if( id<0 || id>175 ) {
00255 log << MSG::WARNING <<"Channel : TofId is out of Range, tofid=" << id << endreq;
00256 return 1000;
00257 }
00258 }
00259 else {
00260 if( id<0 || id>95 ) {
00261 log << MSG::WARNING <<"Channel : TofId is out of Range, tofid=" << id << endreq;
00262 return 1000;
00263 }
00264 }
00265
00266 unsigned int channel;
00267 if( barrel ) {
00268 if( eastEnd ) {
00269 channel = (m_data->getBTof(id)).getNumEast(1);
00270 }
00271 else {
00272 channel = (m_data->getBTof(id)).getNumWest(1);
00273 }
00274 }
00275 else {
00276 channel = (m_data->getETof(id)).getNum(1);
00277 }
00278
00279 return channel;
00280 }
00281
00282
00283 const double TofQElecSvc::BQTC1(int id, double q) {
00284 double qtcNew = -999.0;
00285 MsgStream log(msgSvc(), name());
00286 if( id<0 || id>175 ) {
00287 log << MSG::WARNING <<"BQTC1 : TofId is out of Range, tofid=" << id << endreq;
00288 return qtcNew;
00289 }
00290 if( fabs(q-10000.0)<1.0e-6 ) { return 10000.0; }
00291 else if( fabs(q+999.0)<1.0e-6 ) { return -999.0; }
00292
00293 double ratio = (m_data->getBTof(id)).getP1(0);
00294 double p[10];
00295 for(unsigned int i=0; i<10; i++ ) {
00296 p[i] = (m_data->getBTof(id)).getP1(i+1);
00297 }
00298 q = q*ratio;
00299 qtcNew = p[0] + p[1]*q + p[2]*q*q + p[3]*q*q*q + p[4]*q*q*q*q + p[7]*exp(p[5]*(q-p[6]));
00300
00301
00302
00303
00304
00305 return qtcNew;
00306 }
00307
00308
00309 const double TofQElecSvc::BQTC2(int id, double q) {
00310 double qtcNew = -999.0;
00311 MsgStream log(msgSvc(), name());
00312 if( id<0 || id>175 ) {
00313 log << MSG::WARNING <<"BQTC2 : TofId is out of Range, tofid=" << id << endreq;
00314 return qtcNew;
00315 }
00316 if( fabs(q-10000.0)<1.0e-6 ) { return 10000.0; }
00317 else if( fabs(q+999.0)<1.0e-6 ) { return -999.0; }
00318
00319 double ratio = (m_data->getBTof(id)).getP2(0);
00320 double p[10];
00321 for(unsigned int i=0; i<10; i++ ) {
00322 p[i] = (m_data->getBTof(id)).getP2(i+1);
00323 }
00324 q = q*ratio;
00325 qtcNew = p[0] + p[1]*q + p[2]*q*q + p[3]*q*q*q + p[4]*q*q*q*q + p[7]*exp(p[5]*(q-p[6]));
00326
00327
00328
00329
00330
00331 return qtcNew;
00332 }
00333
00334
00335 const double TofQElecSvc::EQTC(int id, double q) {
00336 double qtcNew = -999.0;
00337 MsgStream log(msgSvc(), name());
00338 if( id<0 || id>95 ) {
00339 log << MSG::WARNING <<"EQTC : TofId is out of Range, tofid=" << id << endreq;
00340 return qtcNew;
00341 }
00342 if( fabs(q-10000.0)<1.0e-6 ) { return 10000.0; }
00343 else if( fabs(q+999.0)<1.0e-6 ) { return -999.0; }
00344
00345 double ratio = (m_data->getETof(id)).getP(0);
00346 double p[10];
00347 for(unsigned int i=0; i<10; i++ ) {
00348 p[i] = (m_data->getETof(id)).getP(i+1);
00349 }
00350 q = q*ratio;
00351 qtcNew = p[0] + p[1]*q + p[2]*q*q + p[3]*q*q*q + p[4]*q*q*q*q + p[7]*exp(p[5]*(q-p[6]));
00352
00353
00354
00355
00356
00357 return qtcNew;
00358 }
00359
00360
00361 const double TofQElecSvc::BQChannel1(int id, double qtc) {
00362 double qChannel = -999.0;
00363 MsgStream log(msgSvc(), name());
00364 if( id<0 || id>175 ) {
00365 log << MSG::ERROR <<"BChannel1 : TofId is out of Range, tofid=" << id << endreq;
00366 return qChannel;
00367 }
00368
00369 double ratio = (m_data->getBTof(id)).getSimP1(0);
00370 double p[10];
00371 for(unsigned int i=0; i<10; i++ ) {
00372 p[i] = (m_data->getBTof(id)).getSimP1(i+1);
00373 }
00374 qChannel = ( p[0] + p[1]*qtc + p[2]*qtc*qtc + p[3]*qtc*qtc*qtc )*( 1.0 - TMath::Erf((qtc-p[4])/p[5]) ) + ( p[6] + p[7]*qtc )*( 1.0 + TMath::Erf((qtc-p[8])/p[9]) );
00375 qChannel = ratio*qChannel;
00376
00377
00378
00379
00380
00381 return qChannel;
00382 }
00383
00384
00385 const double TofQElecSvc::BQChannel2(int id, double qtc) {
00386 double qChannel = -999.0;
00387 MsgStream log(msgSvc(), name());
00388 if( id<0 || id>175 ) {
00389 log << MSG::ERROR <<"BChannel2 : TofId is out of Range, tofid=" << id << endreq;
00390 return qChannel;
00391 }
00392
00393 double ratio = (m_data->getBTof(id)).getSimP2(0);
00394 double p[10];
00395 for(unsigned int i=0; i<10; i++ ) {
00396 p[i] = (m_data->getBTof(id)).getSimP2(i+1);
00397 }
00398 qChannel = ( p[0] + p[1]*qtc + p[2]*qtc*qtc + p[3]*qtc*qtc*qtc )*( 1.0 - TMath::Erf((qtc-p[4])/p[5]) ) + ( p[6] + p[7]*qtc )*( 1.0 + TMath::Erf((qtc-p[8])/p[9]) );
00399 qChannel = ratio*qChannel;
00400
00401
00402
00403
00404
00405 return qChannel;
00406 }
00407
00408
00409 const double TofQElecSvc::EQChannel(int id, double qtc) {
00410 double qChannel = -999.0;
00411 MsgStream log(msgSvc(), name());
00412 if( id<0 || id>95 ) {
00413 log << MSG::ERROR <<"EQTC : TofId is out of Range, tofid=" << id << endreq;
00414 return qChannel;
00415 }
00416
00417 double ratio = (m_data->getETof(id)).getSimP(0);
00418 double p[10];
00419 for(unsigned int i=0; i<10; i++ ) {
00420 p[i] = (m_data->getETof(id)).getSimP(i+1);
00421 }
00422 qChannel = ( p[0] + p[1]*qtc + p[2]*qtc*qtc + p[3]*qtc*qtc*qtc )*( 1.0 - TMath::Erf((qtc-p[4])/p[5]) ) + ( p[6] + p[7]*qtc )*( 1.0 + TMath::Erf((qtc-p[8])/p[9]) );
00423 qChannel = ratio*qChannel;
00424
00425
00426
00427
00428
00429 return qChannel;
00430 }