00001 #include "Event/HeaderObject.h" 00002 00003 DayaBay::HeaderObject::~HeaderObject() 00004 { 00005 const DayaBay::IHeader *pIHeader; 00006 const DayaBay::HeaderObject *pHeaderObj; 00007 DayaBay::HeaderObject *pNonConst; 00008 00009 //inputHeaders may live in a different time frame 00010 //This will improve the robustness of the code. 00011 //pull method and I/O will need this. 00012 for(size_t ind=0;ind<m_inputHeaders.size();ind++) { 00013 pIHeader=m_inputHeaders[ind]; 00014 try{ 00015 pHeaderObj=dynamic_cast<const DayaBay::HeaderObject*>(pIHeader); 00016 pNonConst=const_cast<DayaBay::HeaderObject*>(pHeaderObj); 00017 } 00018 catch(...) { 00019 // output something 00020 } 00021 pNonConst->release(); 00022 } 00023 m_inputHeaders.clear(); 00024 } 00025 00026 std::ostream& DayaBay::HeaderObject::fillStream(std::ostream& s) const 00027 { 00028 TemporalDataObject::fillStream(s); 00029 IHeader::fillStream(s); 00030 00031 s << "{ " 00032 << "context : " << m_context << std::endl 00033 << "execNumber : " << m_execNumber << std::endl 00034 << "jobId : " << m_jobId.uuid() << std::endl; 00035 00036 s << "randomState : ["; 00037 for (size_t ind=0; ind<m_randomState.size(); ++ind) { 00038 s << " " << m_randomState[ind]; 00039 } 00040 s << " ]" << std::endl; 00041 00042 size_t siz = m_inputHeaders.size(); 00043 s << "inputHeaders :\t" << siz << ": [\n"; 00044 for (size_t ind=0; ind<siz; ++ind) { 00045 m_inputHeaders[ind]->fillStream(s); 00046 } 00047 s << "\n]\n}"; 00048 return s; 00049 } 00050 00051 const TimeStamp& DayaBay::HeaderObject::timeStamp() const 00052 { 00053 return m_context.GetTimeStamp(); 00054 } 00055 00056 void DayaBay::HeaderObject::setTimeStamp(const TimeStamp& ts) 00057 { 00058 m_context.SetTimeStamp(ts); 00059 } 00060 00061 void DayaBay::HeaderObject::setInputHeaders(const std::vector<const DayaBay::IHeader*>& iheaders) 00062 { 00063 const DayaBay::IHeader *pIHeader; 00064 const DayaBay::HeaderObject *pHeaderObj; 00065 DayaBay::HeaderObject *pNonConst; 00066 00067 // release the old ones first if they exist 00068 for(size_t ind=0;ind<m_inputHeaders.size();ind++) { 00069 pIHeader=m_inputHeaders[ind]; 00070 try{ 00071 pHeaderObj=dynamic_cast<const DayaBay::HeaderObject*>(pIHeader); 00072 pNonConst=const_cast<DayaBay::HeaderObject*>(pHeaderObj); 00073 } 00074 catch(...) { 00075 // output something 00076 } 00077 pNonConst->release(); 00078 } 00079 m_inputHeaders.clear(); 00080 00081 // then set the new one 00082 m_inputHeaders = iheaders; 00083 00084 //inputHeaders may live in a different time frame 00085 //This will improve the robustness of the code. 00086 //pull method and I/O will need this. 00087 for(size_t ind=0;ind<m_inputHeaders.size();ind++) { 00088 pIHeader=m_inputHeaders[ind]; 00089 try{ 00090 pHeaderObj=dynamic_cast<const DayaBay::HeaderObject*>(pIHeader); 00091 pNonConst=const_cast<DayaBay::HeaderObject*>(pHeaderObj); 00092 } 00093 catch(...){ 00094 // output something 00095 } 00096 pNonConst->addRef(); 00097 } 00098 } 00099 00100 void DayaBay::HeaderObject::addInputHeader(const DayaBay::IHeader* iheader) 00101 { 00102 // Append this input header 00103 m_inputHeaders.push_back(iheader); 00104 00105 // Add a reference to ensure this object is not prematurely deleted 00106 const DayaBay::HeaderObject *pHeaderObj; 00107 DayaBay::HeaderObject *pNonConst; 00108 try{ 00109 pHeaderObj=dynamic_cast<const DayaBay::HeaderObject*>(iheader); 00110 pNonConst=const_cast<DayaBay::HeaderObject*>(pHeaderObj); 00111 } 00112 catch(...){ 00113 // output something 00114 } 00115 pNonConst->addRef(); 00116 00117 } 00118 00119 00120 const std::vector<const DayaBay::IHeader*> DayaBay::HeaderObject::findHeaders(const CLID& clid) const 00121 { 00122 // This is for output 00123 std::vector<const DayaBay::IHeader*> iHeaders; 00124 // By default, nothing found 00125 iHeaders.clear(); 00126 00127 const DayaBay::IHeader* pIH; 00128 const DayaBay::HeaderObject* pHO; 00129 std::vector<const DayaBay::IHeader*> grandparents; 00130 std::vector<const DayaBay::IHeader*>::const_iterator cit; 00131 00132 // Searching in the immediate parent level 00133 for( size_t ind=0; ind<m_inputHeaders.size(); ind++ ) { 00134 00135 pIH = m_inputHeaders[ind]; 00136 pHO = dynamic_cast< const DayaBay::HeaderObject* > (pIH); 00137 00138 if( pHO->clID()==clid ) { 00139 // check for duplications 00140 cit = find( iHeaders.begin(), iHeaders.end(), pIH ); 00141 if( cit==iHeaders.end() ) { 00142 // add it to output 00143 iHeaders.push_back(pIH); 00144 } 00145 } 00146 00147 // Searching in the grandparents level 00148 grandparents = pHO->findHeaders( clid ); 00149 00150 for( size_t idx=0; idx<grandparents.size(); idx++ ) { 00151 pIH = grandparents[idx]; 00152 // Check for duplications 00153 cit = find( iHeaders.begin(), iHeaders.end(), pIH ); 00154 if( cit==iHeaders.end() ) { 00155 // Not find, then add it. 00156 iHeaders.push_back(pIH); 00157 } 00158 } 00159 } 00160 00161 return iHeaders; 00162 }