00001 #include "SimHitSplitSvc/SimHitSplitAlgorithm.h"
00002
00003 #include "Event/GenHeader.h"
00004 #include "Event/SimHeader.h"
00005 #include "Event/RegistrationSequence.h"
00006
00007 #include "RootIOSvc/IRootIOSvc.h"
00008 #include "RootIOSvc/RootIOAddress.h"
00009 #include "PerGenEvent/PerGenHeader.h"
00010 #include "PerSimEvent/PerSimHeader.h"
00011
00012 #include "GaudiKernel/IDataManagerSvc.h"
00013
00014 using namespace std;
00015 using namespace DayaBay;
00016
00017 SimHitSplitAlgorithm::SimHitSplitAlgorithm(const string& name, ISvcLocator* pSvcLocator)
00018 :DybAlgorithm<SimHeader>(name,pSvcLocator)
00019 {
00020 info()<< "Construct:SimHitSplitAlgorithm()!"<< endreq;
00021 }
00022
00023 StatusCode SimHitSplitAlgorithm::initialize()
00024 {
00025 StatusCode status = this->GaudiAlgorithm::initialize();
00026 if(status.isFailure())
00027 {
00028 error()<< "Error when initializing GaudiAlgorithm"<< endreq;
00029 return status;
00030 }
00031
00032 info()<< "SimHitSplitAlgorithm ininalize()"<< endreq;
00033
00034
00035 IService* isvc = 0;
00036 StatusCode sc = serviceLocator()->service("SimHitSplitSvc", isvc, false);
00037 if(sc.isFailure())
00038 {
00039 error()<< "Service : SimHitSplitSvc could not be retrieved"<< endreq;
00040 return sc;
00041 }
00042 isvc->addRef();
00043 sc = isvc->queryInterface(ISimHitSplitSvc::interfaceID(), (void**)&m_simHitSplitSvc);
00044 if(sc.isFailure())
00045 {
00046 error()<< "Service SimHitSplitSvc does not implement ISimHitSplitSvc"<< endreq;
00047 }
00048 return sc;
00049 }
00050
00051 StatusCode SimHitSplitAlgorithm::execute()
00052 {
00053 info()<< "Now into SimHitSplitAlgorithm executation!"<< endreq;
00054
00055 vector<SimHitHeader*> shhs;
00056 SimHeader* sh = 0;
00057 sh = get<SimHeader>(evtSvc(), SimHeaderLocation::Default);
00058 StatusCode sc = m_simHitSplitSvc->getSimHitHeader(sh, shhs, m_hitEarliest, m_hitLatest);
00059 if(sc.isFailure()) return StatusCode::SUCCESS;
00060
00061 for(vector<SimHitHeader*>::iterator vit = shhs.begin(); vit != shhs.end(); vit++)
00062 {
00063 if(!(*vit))
00064 {
00065 error()<< "Error when get one SimHitHeader!"<< endreq;
00066 return StatusCode::FAILURE;
00067 }
00068 info()<< "SimHitHeader's address: "<< (*vit)<< endreq;
00069
00070 map<short int, SimHitCollection*> shc = (*vit)->hitCollection();
00071 for(map<short int, SimHitCollection*>::iterator mit = shc.begin(); mit != shc.end(); mit++)
00072 {
00073 vector<SimHit*> vsh = mit->second->collection();
00074 info()<< MSG::DEBUG<< "In Det"<< mit->first
00075 << " : SimHit's num = "<< vsh.size()<< endreq;
00076 }
00077
00078 }
00079 if(shhs.size() != 1 || shhs[0] != sh->hits())
00080 {
00081 for(vector<SimHitHeader*>::size_type i = 0; i < shhs.size(); i++)
00082 {
00083 SimHitHeader::hc_map& maphc = shhs[i]->hitCollection();
00084 for (SimHitHeader::hc_map::iterator it = maphc.begin(); it != maphc.end(); ++it)
00085 {
00086 it->second->collection().clear();
00087 }
00088
00089 delete shhs[i];
00090 }
00091 }
00092 info()<< "SimHitSplitAlgorithm execute() finalized!" << endreq;
00093 return StatusCode::SUCCESS;
00094 }
00095
00096 StatusCode SimHitSplitAlgorithm::finalize()
00097 {
00098 info()<< "SimHitSplitAlgorithm finalize()"<< endreq;
00099 return StatusCode::SUCCESS;
00100 }
00101
00102 SimHitSplitAlgorithm::~SimHitSplitAlgorithm()
00103 {
00104 info()<< "Destruct:~SimHitSplitAlgorithm()!"<< endreq;
00105 }