Go to the documentation of this file.00001 #include "FWCore/Framework/interface/RunPrincipal.h"
00002
00003 #include "DataFormats/Common/interface/WrapperOwningHolder.h"
00004 #include "DataFormats/Provenance/interface/ProcessHistoryRegistry.h"
00005 #include "DataFormats/Provenance/interface/ProductRegistry.h"
00006 #include "FWCore/Framework/interface/DelayedReader.h"
00007 #include "FWCore/Framework/interface/Group.h"
00008 #include "FWCore/Utilities/interface/EDMException.h"
00009
00010 namespace edm {
00011 RunPrincipal::RunPrincipal(
00012 boost::shared_ptr<RunAuxiliary> aux,
00013 boost::shared_ptr<ProductRegistry const> reg,
00014 ProcessConfiguration const& pc,
00015 HistoryAppender* historyAppender) :
00016 Base(reg, pc, InRun, historyAppender),
00017 aux_(aux) {
00018 }
00019
00020 void
00021 RunPrincipal::fillRunPrincipal(DelayedReader* reader) {
00022
00023 fillPrincipal(aux_->processHistoryID(), reader);
00024
00025 for (const_iterator i = this->begin(), iEnd = this->end(); i != iEnd; ++i) {
00026 (*i)->setProcessHistoryID(processHistoryID());
00027 }
00028 }
00029
00030 void
00031 RunPrincipal::put(
00032 ConstBranchDescription const& bd,
00033 WrapperOwningHolder const& edp) {
00034
00035 assert(bd.produced());
00036 if(!edp.isValid()) {
00037 throw edm::Exception(edm::errors::InsertFailure,"Null Pointer")
00038 << "put: Cannot put because auto_ptr to product is null."
00039 << "\n";
00040 }
00041 Group *g = getExistingGroup(bd.branchID());
00042 assert(g);
00043
00044 putOrMerge(edp, g);
00045 }
00046
00047 void
00048 RunPrincipal::readImmediate() const {
00049 for (Principal::const_iterator i = begin(), iEnd = end(); i != iEnd; ++i) {
00050 Group const& g = **i;
00051 if(!g.branchDescription().produced()) {
00052 if(!g.productUnavailable()) {
00053 resolveProductImmediate(g);
00054 }
00055 }
00056 }
00057 }
00058
00059 void
00060 RunPrincipal::resolveProductImmediate(Group const& g) const {
00061 if(g.branchDescription().produced()) return;
00062 if(!reader()) return;
00063
00064
00065 BranchKey const bk = BranchKey(g.branchDescription());
00066 WrapperOwningHolder edp(reader()->getProduct(bk, g.productData().getInterface(), this));
00067
00068
00069 if(edp.isValid()) {
00070 putOrMerge(edp, &g);
00071 }
00072 }
00073 }