00001 #include "MdcPrintSvc/MdcPrintSvc.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 #include "GaudiKernel/ISvcLocator.h"
00008 #include "GaudiKernel/Bootstrap.h"
00009 #include "GaudiKernel/IDataProviderSvc.h"
00010 #include "GaudiKernel/DataSvc.h"
00011 #include "EventModel/EventHeader.h"
00012 #include "GaudiKernel/SmartDataPtr.h"
00013
00014 #include "Identifier/MdcID.h"
00015 #include "RawEvent/RawDataUtil.h"
00016 #include "MdcRawEvent/MdcDigi.h"
00017 #include "EvTimeEvent/RecEsTime.h"
00018 #include "MdcRecEvent/RecMdcTrack.h"
00019 #include "MdcRecEvent/RecMdcHit.h"
00020 #include "McTruth/McParticle.h"
00021 #include "McTruth/MdcMcHit.h"
00022 #include "EventModel/EventModel.h"
00023
00024 #include <iomanip>
00025 #include <iostream>
00026
00027 using namespace std;
00028 using namespace Event;
00029
00030 MdcPrintSvc::MdcPrintSvc( const string& name, ISvcLocator* svcloc) :
00031 Service (name, svcloc) {
00032
00033
00034 declareProperty("printHit", m_printHit=1);
00035 declareProperty("printTrackDetail", m_printTrackDetail=1);
00036 declareProperty("printErrMat", m_printErrMat=0);
00037 declareProperty("printTdcAdc", m_printTdcAdc=0);
00038 declareProperty("printMcTk", m_printMcTk=0);
00039 }
00040
00041 MdcPrintSvc::~MdcPrintSvc(){
00042 }
00043
00044 StatusCode MdcPrintSvc::initialize(){
00045 MsgStream log(messageService(), name());
00046 log << MSG::INFO << "MdcPrintSvc::initialize()" << endreq;
00047
00048 StatusCode sc = Service::initialize();
00049 if( sc.isFailure() ) return sc;
00050
00051 ISvcLocator* svcLocator = Gaudi::svcLocator();
00052 svcLocator->service("EventDataSvc",eventSvc,true);
00053 if (NULL == eventSvc){
00054 std::cout << "ERROR Could not load service DataSvc" << std::endl;
00055 return StatusCode::FAILURE;
00056 }
00057
00058 IRawDataProviderSvc* irawDataProviderSvc;
00059 sc = service ("RawDataProviderSvc", irawDataProviderSvc);
00060 m_rawDataProviderSvc = dynamic_cast<RawDataProviderSvc*> (irawDataProviderSvc);
00061 if ( sc.isFailure() ){
00062 log << MSG::FATAL << "Could not load RawDataProviderSvc!" << endreq;
00063 return StatusCode::FAILURE;
00064 }
00065
00066
00067 return StatusCode::SUCCESS;
00068 }
00069
00070 StatusCode MdcPrintSvc::finalize(){
00071 MsgStream log(messageService(), name());
00072 log << MSG::INFO << "MdcPrintSvc::finalize()" << endreq;
00073
00074 return StatusCode::SUCCESS;
00075 }
00076
00077 StatusCode MdcPrintSvc::queryInterface(const InterfaceID& riid, void** ppvInterface){
00078 if( IID_IMdcPrintSvc.versionMatch(riid) ){
00079 *ppvInterface = static_cast<IMdcPrintSvc*> (this);
00080 } else{
00081 return Service::queryInterface(riid, ppvInterface);
00082 }
00083 return StatusCode::SUCCESS;
00084 }
00085
00086 void MdcPrintSvc::printDigi(uint32_t getDigiFlag)const{
00087 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec(getDigiFlag);
00088 MdcDigiCol::iterator iter = mdcDigiVec.begin();
00089 std::cout<<"//==== "<<name()<<" print MdcDigiVec, nDigi="<<mdcDigiVec.size()<<" :"<<std::endl;
00090 for (int iDigi=0;iter!= mdcDigiVec.end(); iter++,iDigi++ ) {
00091 long l = MdcID::layer((*iter)->identify());
00092 long w = MdcID::wire((*iter)->identify());
00093 cout<<"("<<l<<","<<w;
00094 if(m_printMcTk) {
00095 int tkTruth = (*iter)->getTrackIndex();
00096 cout<<";"<<tkTruth;
00097 }
00098 if(m_printTdcAdc) {
00099 double tdc = RawDataUtil::MdcTime((*iter)->getTimeChannel());
00100 double adc = RawDataUtil::MdcCharge((*iter)->getChargeChannel());
00101 cout<<",t "<<tdc<<",c "<<adc;
00102 }
00103 cout<<")";
00104 if(iDigi%4==0) std::cout<<std::endl;
00105 }
00106 std::cout<<std::endl;
00107 }
00108
00109 void MdcPrintSvc::printRecMdcTrackCol()const{
00110 MsgStream log(messageService(), name());
00111
00112 SmartDataPtr<RecMdcTrackCol> recMdcTrackCol(eventSvc,"/Event/Recon/RecMdcTrackCol");
00113 if (!recMdcTrackCol) {
00114 log << MSG::WARNING << "Could not find RecMdcTrackCol" << endreq;
00115 return;
00116 }
00117
00118 std::cout<< "//======= "<<name()<<" RecMdcTrackCol size = "<<recMdcTrackCol->size() << std::endl;
00119 RecMdcTrackCol::iterator it = recMdcTrackCol->begin();
00120 for (;it!= recMdcTrackCol->end();it++){
00121 printRecMdcTrack(*it);
00122 }
00123
00124 }
00125
00126 void MdcPrintSvc::printRecMdcTrack(const RecMdcTrack* tk)const{
00127 std::cout<< "//==== "<<name()<<" print RecMdcTrack No."<<tk->trackId()<<" :"<< std::endl;
00128 cout <<" dr "<<tk->helix(0)
00129 <<" phi0 "<<tk->helix(1)
00130 <<" cpa "<<tk->helix(2)
00131 <<" z0 "<<tk->helix(3)
00132 <<" tanl "<<tk->helix(4)
00133 <<endl;
00134 if(m_printTrackDetail){
00135 std::cout<<" q "<<tk->charge()
00136 <<" theta "<<tk->theta()
00137 <<" phi "<<tk->phi()
00138 <<" x0 "<<tk->x()
00139 <<" y0 "<<tk->y()
00140 <<" z0 "<<tk->z()
00141 <<" r0 "<<tk->r()
00142 <<endl;
00143 std::cout <<" p "<<tk->p()
00144 <<" pt "<<tk->pxy()
00145 <<" pxyz("<<tk->px()
00146 <<","<<tk->py()
00147 <<","<<tk->pz()
00148 <<")"<<endl;
00149 std::cout<<" tkStat "<<tk->stat()
00150 <<" chi2 "<<tk->chi2()
00151 <<" ndof "<<tk->ndof()
00152 <<" nhit "<<tk->getNhits()
00153 <<" nst "<<tk->nster()
00154 <<endl;
00155 if(m_printErrMat){
00156 std::cout<< "errmat " << std::endl;
00157 for (int i=0; i<15; i++){ std::cout<< " "<<tk->err(i); }
00158 std::cout<< " " << std::endl;
00159 }
00160 }
00161
00162 if(m_printHit){
00163 int haveDigi[43][288];
00164 if(m_printMcTk) {
00165 for(int ii=0;ii<43;ii++){
00166 for(int jj=0;jj<43;jj++){
00167 haveDigi[ii][jj]=-9999;
00168 }
00169 }
00170 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec();
00171 MdcDigiCol::iterator iter = mdcDigiVec.begin();
00172 std::cout<<name()<<"//==== "<<name()<<" print MdcDigiVec, nDigi="<<mdcDigiVec.size()<<" :"<<std::endl;
00173 for (int iDigi=0;iter!= mdcDigiVec.end(); iter++,iDigi++ ) {
00174 long l = MdcID::layer((*iter)->identify());
00175 long w = MdcID::wire((*iter)->identify());
00176 haveDigi[l][w]=(*iter)->getTrackIndex();
00177 }
00178 }
00179
00180 int nhits = tk->getVecHits().size();
00181 std::cout<<"nHits=" <<nhits<< std::endl;
00182 cout<<"No. ";
00183 if(m_printMcTk) cout<<"mcTkId ";
00184 cout<<"(layer,wire,lr) stat z"<<endl;
00185 for(int ii=0; ii <nhits ; ii++){
00186 Identifier id(tk->getVecHits()[ii]->getMdcId());
00187 int layer = MdcID::layer(id);
00188 int wire = MdcID::wire(id);
00189 cout<<ii<<":";
00190 if(m_printMcTk) { cout<<haveDigi[layer][wire]; }
00191 cout<<" ("<<layer<<","<<wire
00192 <<","<<tk->getVecHits()[ii]->getFlagLR()
00193 <<") "<<tk->getVecHits()[ii]->getStat()
00194 <<" "<<tk->getVecHits()[ii]->getZhit()<< " "<<std::endl;
00195 }
00196 std::cout << " "<< std::endl;
00197 }
00198 }
00199
00200 void MdcPrintSvc::printMdcMcHitCol()const{
00201 MsgStream log(messageService(), name());
00202
00203 SmartDataPtr<MdcMcHitCol> mdcMcHitCol(eventSvc,"/Event/MC/MdcMcHitCol");
00204 if (!mdcMcHitCol) {
00205 log << MSG::WARNING << "Could not find MdcMcHitCol" << endreq;
00206 return;
00207 }
00208
00209 int ihit= 0;
00210 cout<< "//==== "<<name()<<" print MdcMcHitCol nMcHit="<<mdcMcHitCol->size()<< endl;
00211 if (mdcMcHitCol->size()>0){
00212 cout<<"No. (layer,wire) mcTk (x,y,z) lr driftdist(cm) energy"<<endl;
00213 }
00214 MdcMcHitCol::iterator iter_mchit = mdcMcHitCol->begin();
00215 for (;iter_mchit != mdcMcHitCol->end(); iter_mchit++,ihit++ ) {
00216 const Identifier id= (*iter_mchit)->identify();
00217 int layer = MdcID::layer(id);
00218 int wire = MdcID::wire(id);
00219 int iMcTk = (*iter_mchit)->getTrackIndex();
00220 double mcX = (*iter_mchit)->getPositionX()/10.;
00221 double mcY = (*iter_mchit)->getPositionY()/10.;
00222 double mcZ = (*iter_mchit)->getPositionZ()/10.;
00223 double mcLR = (*iter_mchit)->getPositionFlag();
00224 double mcDrift = (*iter_mchit)->getDriftDistance()/10.;
00225 double mcEnergy = (*iter_mchit)->getDepositEnergy()/10.;
00226 if (mcLR == 0) mcLR = -1;
00227 cout<<ihit <<" ("<<layer<<","<<wire<<") "<< iMcTk
00228 <<" ("<< mcX<<"," <<mcY<<","<< mcZ
00229 <<") " <<mcLR
00230 <<" " <<mcDrift
00231 <<" " <<mcEnergy
00232 <<endl;
00233 }
00234 }