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
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);
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
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;
00307 double dmin = 0.25;
00308 if(layid < 8){
00309 nmaxBin = 20;
00310 } else{
00311 nmaxBin = 20;
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 }
00440 }
00441 }
00442 }
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;
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;
00572 double aglmax = 1.570796327;
00573 double delAngle = 0.174532925;
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;
00603 double aglmax = 1.570796327;
00604 double delAngle = 0.523598776;
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
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
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
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
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
00711 calConst -> setSdBegin();
00712 while( calConst -> getNextSdpar(key, par) ){
00713 m_sdmap.insert( valType(key, par) );
00714
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;
00739 else m_zst[layid] = zeast;
00740 }
00741
00742
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
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
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