00001 #include <CLHEP/Units/PhysicalConstants.h>
00002 #include <CLHEP/Geometry/Point3D.h>
00003 #include "MdcTrkRecon/MdcMakeHits.h"
00004 #include "MdcData/MdcHitMap.h"
00005 #include "MdcData/MdcHit.h"
00006 #include "GaudiKernel/MsgStream.h"
00007 #include "GaudiKernel/AlgFactory.h"
00008 #include "GaudiKernel/ISvcLocator.h"
00009 #include "GaudiKernel/SmartDataPtr.h"
00010 #include "GaudiKernel/IDataProviderSvc.h"
00011 #include "GaudiKernel/IDataManagerSvc.h"
00012 #include "GaudiKernel/PropertyMgr.h"
00013 #include "MdcRawEvent/MdcDigi.h"
00014 #include "EventModel/Event.h"
00015 #include "MdcGeom/MdcSWire.h"
00016 #include "MdcGeom/MdcLayer.h"
00017 #include "MdcGeom/MdcDetector.h"
00018 #include "Identifier/MdcID.h"
00019 #include "MdcCalibFunSvc/IMdcCalibFunSvc.h"
00020 #include "MdcCalibFunSvc/MdcCalibFunSvc.h"
00021 #include "GaudiKernel/INTupleSvc.h"
00022 #include "RawDataProviderSvc/IRawDataProviderSvc.h"
00023 #include "RawDataProviderSvc/MdcRawDataProvider.h"
00024
00025 #include <vector>
00026 #include <iostream>
00027 using namespace std;
00028 using namespace Event;
00029
00030
00031 extern const CLID & CLID_MdcHitCol;
00032
00033
00035
00036 MdcMakeHits::MdcMakeHits(const std::string& name, ISvcLocator* pSvcLocator) :
00037 Algorithm(name, pSvcLocator)
00038 {
00039
00040 declareProperty("cosmicFit", m_cosmicFit= false);
00041 declareProperty("doSag", m_doSag= false);
00042 declareProperty("countPropTime",m_countPropTime = true);
00043
00044 declareProperty("getDigiFlag", m_getDigiFlag = 0);
00045 declareProperty("maxMdcDigi", m_maxMdcDigi= 0);
00046 declareProperty("keepBadTdc", m_keepBadTdc= 0);
00047 declareProperty("dropHot", m_dropHot= 0);
00048 declareProperty("keepUnmatch", m_keepUnmatch= 0);
00049 declareProperty("minMdcDigi", m_minMdcDigi = 0);
00050 declareProperty("combineTracking",m_combineTracking = false);
00051
00052 #ifdef MDCPATREC_RESLAYER
00053 declareProperty("resLayer", m_resLayer= -1);
00054 #endif
00055 }
00056
00057
00058 StatusCode MdcMakeHits::beginRun(){
00059 _gm = MdcDetector::instance(m_doSag);
00060 if(NULL == _gm) return StatusCode::FAILURE;
00061 return StatusCode::SUCCESS;
00062 }
00063
00064 StatusCode MdcMakeHits::initialize(){
00065
00066 MsgStream log(msgSvc(), name());
00067 log << MSG::INFO << "in initialize()" << endreq;
00068
00069 StatusCode sc;
00070
00071 IMdcCalibFunSvc* imdcCalibSvc;
00072 sc = service ("MdcCalibFunSvc",imdcCalibSvc);
00073 m_mdcCalibFunSvc = dynamic_cast<MdcCalibFunSvc*> (imdcCalibSvc);
00074 if ( sc.isFailure() ){
00075 log << MSG::FATAL << "Could not load MdcCalibFunSvc!" << endreq;
00076 }
00077
00078 IRawDataProviderSvc* irawDataProviderSvc;
00079 sc = service ("RawDataProviderSvc", irawDataProviderSvc);
00080 m_rawDataProviderSvc = dynamic_cast<RawDataProviderSvc*> (irawDataProviderSvc);
00081 if ( sc.isFailure() ){
00082 log << MSG::FATAL << "Could not load RawDataProviderSvc!" << endreq;
00083 return StatusCode::FAILURE;
00084 }
00085
00086 return StatusCode::SUCCESS;
00087 }
00088
00089
00090 StatusCode MdcMakeHits::execute() {
00091 MsgStream log(msgSvc(), name());
00092 log << MSG::INFO << "in execute()" << endreq;
00093 StatusCode sc;
00094
00095 DataObject *pnode = 0;
00096 sc = eventSvc()->retrieveObject("/Event/Hit",pnode);
00097 if(!sc.isSuccess()) {
00098 pnode = new DataObject;
00099 sc = eventSvc()->registerObject("/Event/Hit",pnode);
00100 if(!sc.isSuccess()) {
00101 log << MSG::FATAL << " Could not register hit branch" <<endreq;
00102 return StatusCode::FAILURE;
00103 }
00104 }
00105
00106 SmartIF<IDataManagerSvc> dataManSvc(eventSvc());
00107 DataObject *hitCol;
00108 eventSvc()->findObject("/Event/Hit/MdcHitCol",hitCol);
00109 if(hitCol!= NULL) {
00110 dataManSvc->clearSubTree("/Event/Hit/MdcHitCol");
00111 eventSvc()->unregisterObject("/Event/Hit/MdcHitCol");
00112 }
00113 MdcHitCol *mdcHitCol = new MdcHitCol;
00114 sc = eventSvc()->registerObject("/Event/Hit/MdcHitCol",mdcHitCol);
00115 if(!sc.isSuccess()) {
00116 log << MSG::FATAL << " Could not register hit collection" <<endreq;
00117 return StatusCode::FAILURE;
00118 }
00119
00120 DataObject *hitMap;
00121 eventSvc()->findObject("/Event/Hit/MdcHitMap",hitMap);
00122 if(hitMap!= NULL) {
00123 dataManSvc->clearSubTree("/Event/Hit/MdcHitMap");
00124 eventSvc()->unregisterObject("/Event/Hit/MdcHitMap");
00125 }
00126 MdcHitMap *mdcHitMap = new MdcHitMap(*_gm);
00127 sc = eventSvc()->registerObject("/Event/Hit/MdcHitMap",mdcHitMap);
00128 if(!sc.isSuccess()) {
00129 log << MSG::FATAL << " Could not register hit map" <<endreq;
00130 return StatusCode::FAILURE;
00131 }
00132
00133
00134 uint32_t getDigiFlag = 0;
00135 getDigiFlag += m_maxMdcDigi;
00136 if(m_dropHot || m_combineTracking)getDigiFlag |= MdcRawDataProvider::b_dropHot;
00137 if(m_keepBadTdc) getDigiFlag |= MdcRawDataProvider::b_keepBadTdc;
00138 if(m_keepUnmatch) getDigiFlag |= MdcRawDataProvider::b_keepUnmatch;
00139 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec(getDigiFlag);
00140
00141
00142 if ((int)mdcDigiVec.size()<m_minMdcDigi){
00143 log << MSG::WARNING << " Skip this event for MdcDigiVec.size() < "<<m_minMdcDigi << endreq;
00144 return StatusCode::SUCCESS;
00145 }
00146
00147 MdcDigiVec::iterator iter = mdcDigiVec.begin();
00148 for (;iter != mdcDigiVec.end(); iter++ ) {
00149 const MdcDigi* aDigi = *iter;
00150 MdcHit *hit = new MdcHit(aDigi, _gm);
00151 hit->setCalibSvc(m_mdcCalibFunSvc);
00152 hit->setCosmicFit(m_cosmicFit);
00153 hit->setCountPropTime(m_countPropTime);
00154 #ifdef MDCPATREC_RESLAYER
00155 hit->setResLayer(m_resLayer);
00156 #endif
00157 mdcHitCol->push_back(hit);
00158 mdcHitMap->addHit(*hit);
00159 }
00160 return StatusCode::SUCCESS;
00161 }
00162
00163
00164 StatusCode MdcMakeHits::finalize() {
00165
00166 MsgStream log(msgSvc(), name());
00167 log << MSG::INFO << "in finalize()" << endreq;
00168
00169 return StatusCode::SUCCESS;
00170 }
00171