| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

HeaderObjectCnv.cc

Go to the documentation of this file.
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 // get a service pointer in a static function
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)); // default is sets to "now"
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     // do header copy
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     // do header copy
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; // skip this one
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* /*addr*/,
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     // get a service pointer in a static function
00138     if (s_evtStoreQuery==0) {
00139         ServiceHandle<IEvtStoreQuery> msgh("EvtStoreQuery","HeaderObjectCnv");
00140         s_evtStoreQuery = msgh.operator->();
00141     }
00142 
00143     // Get current RegistrationSequence
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* /*addr*/,
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 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:18:44 2011 for PerBaseEvent by doxygen 1.4.7