CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/DataFormats/Provenance/src/Provenance.cc

Go to the documentation of this file.
00001 #include "DataFormats/Provenance/interface/Provenance.h"
00002 #include "DataFormats/Provenance/interface/ProcessConfiguration.h"
00003 #include "DataFormats/Provenance/interface/ProcessHistory.h"
00004 #include "DataFormats/Provenance/interface/ProcessHistoryRegistry.h"
00005 #include "DataFormats/Provenance/interface/ProductProvenance.h"
00006 
00007 /*----------------------------------------------------------------------
00008 
00009 ----------------------------------------------------------------------*/
00010 
00011 namespace edm {
00012 
00013    Provenance::Provenance() :
00014     branchDescription_(),
00015     productID_(),
00016     productProvenanceValid_(false),
00017     productProvenancePtr_(new ProductProvenance),
00018     store_() {
00019   }
00020 
00021    Provenance::Provenance(boost::shared_ptr<ConstBranchDescription> const& p, ProductID const& pid) :
00022     branchDescription_(p),
00023     productID_(pid),
00024     productProvenanceValid_(false),
00025     productProvenancePtr_(new ProductProvenance),
00026     store_() {
00027   }
00028 
00029   ProductProvenance*
00030   Provenance::resolve() const {
00031     if (!productProvenanceValid_) {
00032       ProductProvenance const* prov  = store_->branchIDToProvenance(branchDescription_->branchID());
00033       if (prov) {
00034         *productProvenancePtr_ = *prov;
00035         productProvenanceValid_ = true;
00036       }
00037     }
00038     return productProvenancePtr_.get();
00039   }
00040 
00041   ProcessConfigurationID 
00042   Provenance::processConfigurationID() const {
00043     if (parameterSetIDs().size() == 1) {
00044       return parameterSetIDs().begin()->first;
00045     }
00046     if (moduleNames().size() == 1) {
00047       return moduleNames().begin()->first;
00048     }
00049     // Get the ProcessHistory for this event.
00050     ProcessHistoryRegistry* phr = ProcessHistoryRegistry::instance();
00051     ProcessHistory ph;
00052     if (!phr->getMapped(store_->processHistoryID(), ph)) {
00053       return ProcessConfigurationID();
00054     }
00055 
00056     ProcessConfiguration config;
00057     if (!ph.getConfigurationForProcess(processName(), config)) {
00058       return ProcessConfigurationID();
00059     } 
00060     return config.id();
00061   }
00062 
00063   ReleaseVersion const&
00064   Provenance::releaseVersion() const {
00065     ProcessConfiguration pc;
00066     ProcessConfigurationRegistry::instance()->getMapped(processConfigurationID(), pc);
00067     return pc.releaseVersion();
00068   }
00069 
00070   ParameterSetID
00071   Provenance::psetID() const {
00072     if (product().parameterSetID().isValid()) {
00073       return product().parameterSetID();
00074     }
00075     if (parameterSetIDs().size() == 1) {
00076       return parameterSetIDs().begin()->second;
00077     }
00078     std::map<ProcessConfigurationID, ParameterSetID>::const_iterator it =
00079         parameterSetIDs().find(processConfigurationID());
00080     if (it == parameterSetIDs().end()) {
00081       return ParameterSetID();
00082     }
00083     return it->second;
00084   }
00085 
00086   std::string 
00087   Provenance::moduleName() const {
00088     if (!product().moduleName().empty()) {
00089       return product().moduleName();
00090     }
00091     if (moduleNames().size() == 1) {
00092       return moduleNames().begin()->second;
00093     }
00094     std::map<ProcessConfigurationID, std::string>::const_iterator it =
00095         moduleNames().find(processConfigurationID());
00096     if (it == moduleNames().end()) {
00097       return std::string();
00098     }
00099     return it->second;
00100   }
00101 
00102   void
00103   Provenance::write(std::ostream& os) const {
00104     // This is grossly inadequate, but it is not critical for the
00105     // first pass.
00106     product().write(os);
00107     productProvenance()->write(os);
00108   }
00109 
00110 
00111   bool operator==(Provenance const& a, Provenance const& b) {
00112     return a.product() == b.product();
00113   }
00114 
00115   void
00116   Provenance::resetProductProvenance() const {
00117     *productProvenancePtr_ = ProductProvenance();
00118     productProvenanceValid_ = false;
00119   }
00120 
00121   void
00122   Provenance::setProductProvenance(ProductProvenance const& prov) const {
00123     *productProvenancePtr_ = prov;
00124     productProvenanceValid_ = true;
00125   }
00126 
00127   void 
00128   Provenance::swap(Provenance& iOther) {
00129     branchDescription_.swap(iOther.branchDescription_);
00130     productID_.swap(iOther.productID_);
00131     productProvenancePtr_.swap(iOther.productProvenancePtr_);
00132     store_.swap(iOther.store_);
00133  }
00134 
00135 }
00136