00001 #include "PerBaseEvent/HeaderObjectCnv.h"
00002 #include "PerBaseEvent/TemporalDataObjectCnv.h"
00003 #include "Context/Context.h"
00004 #include "Event/RegistrationSequence.h"
00005 #include "GaudiKernel/IDataProviderSvc.h"
00006 #include "GaudiKernel/MsgStream.h"
00007 #include "GaudiMessages/GaudiMessages.h"
00008 #include "DybKernel/IEvtStoreQuery.h"
00009
00010 #include "GaudiKernel/ServiceHandle.h"
00011
00012 #include <string>
00013 #include <vector>
00014
00015 using namespace DayaBay;
00016 using namespace std;
00017
00018 HeaderObjectCnv::HeaderObjectCnv(ISvcLocator* svc)
00019 : RootIOTypedCnv<PerHeaderObject,HeaderObject>("PerHeaderObject",classID(),svc)
00020 {
00021 }
00022
00023 HeaderObjectCnv::~HeaderObjectCnv()
00024 {
00025 }
00026
00027 void HeaderObjectCnv::clear()
00028 {
00029 PerHeaderObject* objs[3] = {
00030 &getPerInputObject(),
00031 &getPerOutputObject(),
00032 0
00033 };
00034 const char* label[] = { "input", "output", 0 };
00035 for (int ind=0; objs[ind]; ++ind) {
00036 PerHeaderObject& tho = *objs[ind];
00037 tho.context = Context();
00038 tho.context.SetTimeStamp(TimeStamp(0.0));
00039 tho.execNumber = -1;
00040 tho.jobId = DayaBay::JobId();
00041 tho.randomState.clear();
00042
00043 MsgStream log(msgSvc(), "HeaderObjectCnv::clear");
00044 log << MSG::VERBOSE
00045 << "clearing " << tho.inputHeaders.size() << " input headers from "
00046 << label[ind] << " PerHeaderObject"
00047 << endreq;
00048 tho.inputHeaders.clear();
00049 }
00050 }
00051
00052
00053 StatusCode HeaderObjectCnv::toTran(const PerHeaderObject& perobj,
00054 HeaderObject& tranobj)
00055 {
00056 StatusCode sc = TemporalDataObjectCnv::toTran(perobj,tranobj);
00057 if (sc.isFailure()) return sc;
00058
00059
00060 tranobj.setContext(perobj.context);
00061 tranobj.setExecNumber(perobj.execNumber);
00062 tranobj.setJobId(perobj.jobId);
00063 tranobj.setRandomState(perobj.randomState);
00064 tranobj.setInputHeaders(vector<const DayaBay::IHeader*>());
00065 return StatusCode::SUCCESS;
00066 }
00067
00068 StatusCode HeaderObjectCnv::toPer(const HeaderObject& tranobj,
00069 PerHeaderObject& perobj)
00070 {
00071 StatusCode sc = TemporalDataObjectCnv::toPer(tranobj,perobj);
00072 if (sc.isFailure()) return sc;
00073
00074
00075
00076 perobj.context = tranobj.context();
00077 perobj.execNumber = tranobj.execNumber();
00078 perobj.jobId = tranobj.jobId();
00079 perobj.randomState = tranobj.randomState();
00080 perobj.inputHeaders.clear();
00081 return StatusCode::SUCCESS;
00082 }
00083
00084
00085 StatusCode HeaderObjectCnv::fillPer(IRootIOSvc* rioSvc,
00086 const DayaBay::HeaderObject& ho,
00087 PerHeaderObject& tho)
00088 {
00089 GaudiMsgStreams log("HeaderObjectCnv::fillPer");
00090
00091 tho.inputHeaders.clear();
00092 size_t siz = ho.inputHeaders().size();
00093 if( siz <= 0 ) return StatusCode::SUCCESS;
00094
00095 for (size_t ind = 0; ind<siz; ++ind) {
00096 const IHeader* ihead = ho.inputHeaders()[ind];
00097 const HeaderObject* other_ho =
00098 dynamic_cast<const HeaderObject*>(ihead);
00099
00100 const GenericAddress* gad=other_ho->outputAddress();
00101 if(!gad) {
00102 static map<string,int> errorMap;
00103 string other_ho_name = other_ho->name();
00104 if (!errorMap[other_ho_name]) {
00105 log.warning()
00106 << MSG::WARNING
00107 << "Failed to get output address for " << other_ho_name
00108 << ", skipping and won't tell you about it again." << endreq;
00109 }
00110 errorMap[other_ho_name] = 1;
00111 continue;
00112 }
00113
00114 const RootOutputAddress* roa=dynamic_cast<const RootOutputAddress*>(gad);
00115 tho.inputHeaders.push_back(PerRef(roa->entry(),roa->tespath()));
00116 }
00117 return StatusCode::SUCCESS;
00118 }
00119
00120
00121
00122 StatusCode HeaderObjectCnv::fillRepRefs(IOpaqueAddress* ,
00123 DataObject* tranobj)
00124 {
00125 HeaderObject* ho = dynamic_cast<HeaderObject*>(tranobj);
00126 PerHeaderObject& tho = getPerOutputObject();
00127 return HeaderObjectCnv::fillPer(m_rioSvc, *ho, tho);
00128 }
00129
00130 StatusCode HeaderObjectCnv::fillTran(IRootIOSvc* rioSvc,
00131 const PerHeaderObject& tho,
00132 DayaBay::HeaderObject& ho)
00133 {
00134 GaudiMsgStreams log("HeaderObjectCnv::fillTran");
00135
00136 static IEvtStoreQuery* s_evtStoreQuery=0;
00137
00138 if (s_evtStoreQuery==0) {
00139 ServiceHandle<IEvtStoreQuery> msgh("EvtStoreQuery","HeaderObjectCnv");
00140 s_evtStoreQuery = msgh.operator->();
00141 }
00142
00143
00144 string rs_path = RegistrationSequence::defaultLocation();
00145 DataObject *rs_tranobj = 0;
00146 StatusCode sc = rioSvc->dataSvc()->retrieveObject(rs_path,rs_tranobj);
00147 if (sc.isFailure()) {
00148 return sc;
00149 }
00150 RegistrationSequence* rsobj = dynamic_cast<RegistrationSequence*>(rs_tranobj);
00151 if (!rsobj)return StatusCode::FAILURE;
00152
00153 vector<const DayaBay::IHeader*> inputs;
00154
00155 size_t siz = tho.inputHeaders.size();
00156 for (size_t ind=0; ind < siz; ++ind) {
00157 const PerRef& pref = tho.inputHeaders[ind];
00158
00159 log.debug()
00160 << s_evtStoreQuery << "\t" << pref.path() << "\t" << pref.entry()
00161 << endreq;
00162 const DataObject* pOBJ = s_evtStoreQuery->queryInputAddress(pref.path(),pref.entry());
00163
00164 if(pOBJ!=0) {
00165 const IHeader* ihead = dynamic_cast<const IHeader*>(pOBJ);
00166 inputs.push_back(ihead);
00167 }
00168 else {
00169 static int headerWarningCount = 0;
00170 if( headerWarningCount < 10 ){
00171 log.warning()
00172 <<"An inputHeader " << pref.path() << ", " << pref.entry() << " not found."
00173 << " Consider using a longer AES window."
00174 << endreq;
00175 headerWarningCount++;
00176 if(headerWarningCount==10){
00177 log.warning()
00178 <<" (Further missing inputHeader messages suppressed.)"
00179 << endreq;
00180 }
00181 }
00182 }
00183 }
00184 ho.setInputHeaders(inputs);
00185 return StatusCode::SUCCESS;
00186 }
00187
00188 StatusCode HeaderObjectCnv::fillObjRefs(IOpaqueAddress* ,
00189 DataObject* tranobj)
00190 {
00191 PerHeaderObject& tho = getPerInputObject();
00192 HeaderObject* ho = dynamic_cast<HeaderObject*>(tranobj);
00193 return HeaderObjectCnv::fillTran(m_rioSvc, tho, *ho);
00194 }
00195
00196
00197 StatusCode HeaderObjectCnv::PerToTran(const PerHeaderObject& perobj,
00198 HeaderObject& tranobj)
00199 {
00200 return HeaderObjectCnv::toTran(perobj,tranobj);
00201 }
00202
00203 StatusCode HeaderObjectCnv::TranToPer(const HeaderObject& tranobj,
00204 PerHeaderObject& perobj)
00205 {
00206 return HeaderObjectCnv::toPer(tranobj,perobj);
00207 }
00208