![]() |
![]() |
00001 #ifndef DataFormats_Provenance_Provenance_h 00002 #define DataFormats_Provenance_Provenance_h 00003 00004 /*---------------------------------------------------------------------- 00005 00006 Provenance: The full description of a product and how it came into 00007 existence. 00008 00009 ----------------------------------------------------------------------*/ 00010 #include <iosfwd> 00011 00012 #include "boost/shared_ptr.hpp" 00013 00014 #include "DataFormats/Provenance/interface/BranchDescription.h" 00015 #include "DataFormats/Provenance/interface/BranchMapper.h" 00016 #include "DataFormats/Provenance/interface/ParameterSetID.h" 00017 #include "DataFormats/Provenance/interface/ProcessConfigurationID.h" 00018 #include "DataFormats/Provenance/interface/ProcessHistoryID.h" 00019 #include "DataFormats/Provenance/interface/Parentage.h" 00020 #include "DataFormats/Provenance/interface/ConstBranchDescription.h" 00021 #include "DataFormats/Provenance/interface/ProductID.h" 00022 #include "DataFormats/Provenance/interface/ReleaseVersion.h" 00023 00024 /* 00025 Provenance 00026 00027 definitions: 00028 Product: The EDProduct to which a provenance object is associated 00029 00030 Creator: The EDProducer that made the product. 00031 00032 Parents: The EDProducts used as input by the creator. 00033 */ 00034 00035 namespace edm { 00036 class ProductProvenance; 00037 class Provenance { 00038 public: 00039 Provenance(boost::shared_ptr<ConstBranchDescription> const& p, ProductID const& pid); 00040 00041 ~Provenance() {} 00042 00043 Parentage const& event() const {return parentage();} 00044 BranchDescription const& product() const {return branchDescription_->me();} 00045 00046 BranchDescription const& branchDescription() const {return branchDescription_->me();} 00047 ConstBranchDescription const& constBranchDescription() const {return *branchDescription_;} 00048 boost::shared_ptr<ConstBranchDescription> const & constBranchDescriptionPtr() const {return branchDescription_;} 00049 00050 bool productProvenanceResolved() const { 00051 return productProvenancePtr_; 00052 } 00053 boost::shared_ptr<ProductProvenance> resolve() const; 00054 boost::shared_ptr<ProductProvenance> productProvenancePtr() const { 00055 if (productProvenancePtr_) return productProvenancePtr_; 00056 return resolve(); 00057 } 00058 Parentage const& parentage() const {return productProvenancePtr()->parentage();} 00059 BranchID const& branchID() const {return product().branchID();} 00060 std::string const& branchName() const {return product().branchName();} 00061 std::string const& className() const {return product().className();} 00062 std::string const& moduleLabel() const {return product().moduleLabel();} 00063 std::string const& processName() const {return product().processName();} 00064 ProductStatus const& productStatus() const {return productProvenancePtr()->productStatus();} 00065 std::string const& productInstanceName() const {return product().productInstanceName();} 00066 std::string const& friendlyClassName() const {return product().friendlyClassName();} 00067 ProcessHistoryID processHistoryID() const {return store_->processHistoryID();} 00068 ProcessConfigurationID processConfigurationID() const; 00069 ParameterSetID psetID() const; 00070 std::string moduleName() const; 00071 ReleaseVersion const& releaseVersion() const; 00072 std::map<ProcessConfigurationID, ParameterSetID> const& parameterSetIDs() const { 00073 return product().parameterSetIDs(); 00074 } 00075 std::map<ProcessConfigurationID, std::string> const& moduleNames() const { 00076 return product().moduleNames(); 00077 } 00078 std::set<std::string> const& branchAliases() const {return product().branchAliases();} 00079 00080 bool isPresent() const {return productstatus::present(productStatus());} 00081 00082 std::vector<BranchID> const& parents() const {return parentage().parents();} 00083 00084 void write(std::ostream& os) const; 00085 00086 void setStore(boost::shared_ptr<BranchMapper> store) const {store_ = store;} 00087 00088 ProductID const& productID() const {return productID_;} 00089 00090 void setProductProvenance(boost::shared_ptr<ProductProvenance> prov) const { 00091 productProvenancePtr_ = prov; 00092 } 00093 00094 void setProductID(ProductID const& pid) { 00095 productID_ = pid; 00096 } 00097 00098 void setBranchDescription(boost::shared_ptr<ConstBranchDescription> const& p) { 00099 branchDescription_ = p; 00100 } 00101 void resetProductProvenance() { 00102 productProvenancePtr_.reset(); 00103 } 00104 00105 void swap(Provenance&); 00106 00107 private: 00108 boost::shared_ptr<ConstBranchDescription> branchDescription_; 00109 ProductID productID_; 00110 mutable boost::shared_ptr<ProductProvenance> productProvenancePtr_; 00111 mutable boost::shared_ptr<BranchMapper> store_; 00112 }; 00113 00114 inline 00115 std::ostream& 00116 operator<<(std::ostream& os, Provenance const& p) { 00117 p.write(os); 00118 return os; 00119 } 00120 00121 bool operator==(Provenance const& a, Provenance const& b); 00122 00123 } 00124 #endif