00001
00013 #ifndef DYBBASEALG
00014 #define DYBBASEALG
00015
00016 #include "Event/HeaderObject.h"
00017 #include "GaudiAlg/GaudiAlgorithm.h"
00018
00019 #include <vector>
00020
00021 class IJobInfoSvc;
00022
00023 class DybBaseAlg : public GaudiAlgorithm
00024 {
00025 public:
00026 DybBaseAlg(const std::string& name, ISvcLocator* pSvcLocator);
00027 virtual ~DybBaseAlg();
00028
00030 virtual StatusCode sysInitialize();
00031
00033 virtual StatusCode sysExecute();
00034
00036 virtual StatusCode preExecute();
00037
00039 virtual StatusCode postExecute();
00040
00042 virtual StatusCode sysFinalize();
00043
00045
00047 IDataProviderSvc* arcSvc() const;
00048
00051 void putTES(DataObject* obj, std::string location) const;
00052
00056 template <class TYPE>
00057 TYPE* getTES(std::string location) const;
00058
00063 template <class TYPE>
00064 TYPE* getAES(std::string location, int index) const;
00065
00072 std::vector<DataObject*> getAEScollection(std::string location) const;
00073
00075 int getExecNum() { return m_execNum; }
00076
00078 std::string Location() const { return m_location; }
00079
00080 protected:
00081
00083 void InitializeHeader(DayaBay::HeaderObject* header);
00084
00087 void AppendInputHeader(const DayaBay::HeaderObject* header) const;
00088
00089 DayaBay::HeaderObject* m_headerObject;
00090
00092 bool m_pullMode;
00093
00094 private:
00095
00099 int m_execNum;
00100
00104 int m_saveRandomState;
00105
00106 mutable std::vector<const DayaBay::HeaderObject*> m_inputHeaders;
00107
00109 std::vector<unsigned long> m_state;
00111 IJobInfoSvc* m_jobInfoSvc;
00112
00113 protected:
00114
00118 std::string m_location;
00119
00120 };
00121
00122 template <class TYPE>
00123 TYPE* DybBaseAlg::getTES(std::string location) const
00124 {
00125 TYPE* obj = get<TYPE>(location);
00126
00127 DayaBay::HeaderObject* header = dynamic_cast<DayaBay::HeaderObject*>(obj);
00128 if (header) {
00129 if (std::find(m_inputHeaders.begin(),m_inputHeaders.end(),header) == m_inputHeaders.end()) {
00130 this->AppendInputHeader(header);
00131 debug() << "Saved " << m_inputHeaders.size()
00132 << " input headers from TES, latest: "
00133 << header->name()
00134 << endreq;
00135 }
00136 }
00137 return obj;
00138 }
00139
00140 template <class TYPE>
00141 TYPE* DybBaseAlg::getAES(std::string location, int index) const
00142 {
00143 if (index<0) return 0;
00144
00145 std::vector<DataObject*> vec = this->getAEScollection(location);
00146 if (!vec.size() || index >= vec.size()) return 0;
00147 DataObject* dobj = vec[index];
00148 TYPE* obj = dynamic_cast<TYPE*>(dobj);
00149 if (!obj) return 0;
00150
00151 DayaBay::HeaderObject* header = dynamic_cast<DayaBay::HeaderObject*>(obj);
00152 if (header) {
00153 if (std::find(m_inputHeaders.begin(),m_inputHeaders.end(),header) == m_inputHeaders.end()) {
00154 this->AppendInputHeader(header);
00155 debug() << "Saved " << m_inputHeaders.size()
00156 << " input headers from TES, latest: "
00157 << header->name()
00158 << endreq;
00159 }
00160 }
00161
00162 return obj;
00163 }
00164 #endif // DYBBASEALG