CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Group.h
Go to the documentation of this file.
1 #ifndef FWCore_Framework_Group_h
2 #define FWCore_Framework_Group_h
3 
4 /*----------------------------------------------------------------------
5 
6 Group: A collection of information related to a single EDProduct. This
7 is the storage unit of such information.
8 
9 ----------------------------------------------------------------------*/
10 
17 
18 #include "boost/shared_ptr.hpp"
19 #include "boost/utility.hpp"
20 
21 #include <string>
22 
23 namespace edm {
24  class BranchMapper;
25  class DelayedReader;
26  class WrapperInterfaceBase;
27 
28  class Group : private boost::noncopyable {
29  public:
30  Group();
31  virtual ~Group();
34  resetStatus();
35  }
36 
37  void deleteProduct() {
40  }
41 
42  // product is not available (dropped or never created)
43  bool productUnavailable() const {return productUnavailable_();}
44 
45  // provenance is currently available
46  bool provenanceAvailable() const;
47 
48  // Scheduled for on demand production
49  bool onDemand() const {return onDemand_();}
50 
51  // Product was deleted early in order to save memory
52  bool productWasDeleted() const {return productWasDeleted_();}
53 
54  // Retrieves a shared pointer to the wrapped product.
55  boost::shared_ptr<void const> product() const { return productData().wrapper_; }
56 
57  // Retrieves the wrapped product and type. (non-owning);
58  WrapperHolder wrapper() const { return WrapperHolder(productData().wrapper_.get(), productData().getInterface()); }
59 
60  // Retrieves pointer to the per event(lumi)(run) provenance.
62  return provenance()->productProvenance();
63  }
64 
65  // Sets the the per event(lumi)(run) provenance.
66  void setProductProvenance(ProductProvenance const& prov) const;
67 
68  // Retrieves a reference to the event independent provenance.
70 
71  // Sets the pointer to the event independent provenance.
72  void resetBranchDescription(boost::shared_ptr<ConstBranchDescription> bd) {productData().resetBranchDescription(bd);}
73 
74  // Retrieves a reference to the module label.
75  std::string const& moduleLabel() const {return branchDescription().moduleLabel();}
76 
77  // Retrieves a reference to the product instance name
78  std::string const& productInstanceName() const {return branchDescription().productInstanceName();}
79 
80  // Retrieves a reference to the process name
81  std::string const& processName() const {return branchDescription().processName();}
82 
83  // Retrieves pointer to a class containing both the event independent and the per even provenance.
84  Provenance* provenance() const;
85 
86  // Initializes the event independent portion of the provenance, plus the process history ID, the product ID, and the mapper.
87  void setProvenance(boost::shared_ptr<BranchMapper> mapper, ProcessHistoryID const& phid, ProductID const& pid);
88 
89  // Initializes the event independent portion of the provenance, plus the process history ID and the mapper.
90  void setProvenance(boost::shared_ptr<BranchMapper> mapper, ProcessHistoryID const& phid);
91 
92  // Initializes the process history ID.
93  void setProcessHistoryID(ProcessHistoryID const& phid);
94 
95  // Write the group to the stream.
96  void write(std::ostream& os) const;
97 
98  // Return the type of the product stored in this Group.
99  // We are relying on the fact that Type instances are small, and
100  // so we are free to copy them at will.
101  TypeID productType() const;
102 
103  // Retrieves the product ID of the product.
104  ProductID const& productID() const {return productData().prov_.productID();}
105 
106  // Puts the product and its per event(lumi)(run) provenance into the Group.
107  void putProduct(WrapperOwningHolder const& edp, ProductProvenance const& productProvenance) {
108  putProduct_(edp, productProvenance);
109  }
110 
111  // Puts the product into the Group.
112  void putProduct(WrapperOwningHolder const& edp) const {
113  putProduct_(edp);
114  }
115 
116  // This returns true if it will be put, false if it will be merged
117  bool putOrMergeProduct() const {
118  return putOrMergeProduct_();
119  }
120 
121  // merges the product with the pre-existing product
122  void mergeProduct(WrapperOwningHolder const& edp, ProductProvenance& productProvenance) {
123  mergeProduct_(edp, productProvenance);
124  }
125 
126  void mergeProduct(WrapperOwningHolder const& edp) const {
127  mergeProduct_(edp);
128  }
129 
130  // Merges two instances of the product.
131  void mergeTheProduct(WrapperOwningHolder const& edp) const;
132 
133  void reallyCheckType(WrapperOwningHolder const& prod) const;
134 
135  void checkType(WrapperOwningHolder const& prod) const {
136  checkType_(prod);
137  }
138 
139  void swap(Group& rhs) {swap_(rhs);}
140 
141  virtual ProductData const& productData() const = 0;
142 
143  virtual ProductData& productData() = 0;
144 
145  private:
146  virtual void swap_(Group& rhs) = 0;
147  virtual bool onDemand_() const = 0;
148  virtual bool productUnavailable_() const = 0;
149  virtual bool productWasDeleted_() const = 0;
150  virtual void putProduct_(WrapperOwningHolder const& edp, ProductProvenance const& productProvenance) = 0;
151  virtual void putProduct_(WrapperOwningHolder const& edp) const = 0;
152  virtual void mergeProduct_(WrapperOwningHolder const& edp, ProductProvenance& productProvenance) = 0;
153  virtual void mergeProduct_(WrapperOwningHolder const& edp) const = 0;
154  virtual bool putOrMergeProduct_() const = 0;
155  virtual void checkType_(WrapperOwningHolder const& prod) const = 0;
156  virtual void resetStatus() = 0;
157  virtual void setProductDeleted() =0;
158  };
159 
160  inline
161  std::ostream&
162  operator<<(std::ostream& os, Group const& g) {
163  g.write(os);
164  return os;
165  }
166 
167  class InputGroup : public Group {
168  public:
169  explicit InputGroup(boost::shared_ptr<ConstBranchDescription> bd) :
172  virtual ~InputGroup();
173 
174  // The following is const because we can add an EDProduct to the
175  // cache after creation of the Group, without changing the meaning
176  // of the Group.
177  void setProduct(WrapperOwningHolder const& prod) const;
180 
181  private:
182  virtual void swap_(Group& rhs) {
183  InputGroup& other = dynamic_cast<InputGroup&>(rhs);
186  }
187  virtual void putProduct_(WrapperOwningHolder const& edp, ProductProvenance const& productProvenance);
188  virtual void putProduct_(WrapperOwningHolder const& edp) const;
189  virtual void mergeProduct_(WrapperOwningHolder const& edp, ProductProvenance& productProvenance);
190  virtual void mergeProduct_(WrapperOwningHolder const& edp) const;
191  virtual bool putOrMergeProduct_() const;
192  virtual void checkType_(WrapperOwningHolder const&) const {}
193  virtual void resetStatus() {productIsUnavailable_ = false;
194  productHasBeenDeleted_=false;}
195  virtual bool onDemand_() const {return false;}
196  virtual bool productUnavailable_() const;
197  virtual bool productWasDeleted_() const {return productHasBeenDeleted_;}
198  virtual ProductData const& productData() const {return productData_;}
199  virtual ProductData& productData() {return productData_;}
201 
203  mutable bool productIsUnavailable_;
205  };
206 
207  // Free swap function
208  inline void swap(InputGroup& a, InputGroup& b) {
209  a.swap(b);
210  }
211 
212  class ProducedGroup : public Group {
213  protected:
214  enum GroupStatus {
215  Present = 0,
216  NotRun = 3,
218  NotPut = 5,
222  };
223  public:
225  virtual ~ProducedGroup();
226  void producerStarted();
227  void producerCompleted();
228  GroupStatus& status() const {return status_();}
229  private:
230  virtual void putProduct_(WrapperOwningHolder const& edp, ProductProvenance const& productProvenance);
231  virtual void putProduct_(WrapperOwningHolder const& edp) const;
232  virtual void mergeProduct_(WrapperOwningHolder const& edp, ProductProvenance& productProvenance);
233  virtual void mergeProduct_(WrapperOwningHolder const& edp) const;
234  virtual bool putOrMergeProduct_() const;
235  virtual void checkType_(WrapperOwningHolder const& prod) const {
236  reallyCheckType(prod);
237  }
238  virtual GroupStatus& status_() const = 0;
239  virtual bool productUnavailable_() const;
240  virtual bool productWasDeleted_() const;
241  virtual void setProductDeleted();
242 
243  };
244 
245  class ScheduledGroup : public ProducedGroup {
246  public:
247  explicit ScheduledGroup(boost::shared_ptr<ConstBranchDescription> bd) : ProducedGroup(), productData_(bd), theStatus_(NotRun) {}
248  virtual ~ScheduledGroup();
249  private:
250  virtual void swap_(Group& rhs) {
251  ScheduledGroup& other = dynamic_cast<ScheduledGroup&>(rhs);
254  }
255  virtual void resetStatus() {theStatus_ = NotRun;}
256  virtual bool onDemand_() const {return false;}
257  virtual ProductData const& productData() const {return productData_;}
258  virtual ProductData& productData() {return productData_;}
259  virtual GroupStatus& status_() const {return theStatus_;}
262  };
263 
264  // Free swap function
266  a.swap(b);
267  }
268 
270  public:
271  explicit UnscheduledGroup(boost::shared_ptr<ConstBranchDescription> bd) : ProducedGroup(), productData_(bd), theStatus_(UnscheduledNotRun) {}
272  virtual ~UnscheduledGroup();
273  private:
274  virtual void swap_(Group& rhs) {
275  UnscheduledGroup& other = dynamic_cast<UnscheduledGroup&>(rhs);
278  }
280  virtual bool onDemand_() const {return status() == UnscheduledNotRun;}
281  virtual ProductData const& productData() const {return productData_;}
282  virtual ProductData& productData() {return productData_;}
283  virtual GroupStatus& status_() const {return theStatus_;}
286  };
287 
288  // Free swap function
290  a.swap(b);
291  }
292 
293  class SourceGroup : public ProducedGroup {
294  public:
295  explicit SourceGroup(boost::shared_ptr<ConstBranchDescription> bd) : ProducedGroup(), productData_(bd), theStatus_(NotPut) {}
296  virtual ~SourceGroup();
297  private:
298  virtual void swap_(Group& rhs) {
299  SourceGroup& other = dynamic_cast<SourceGroup&>(rhs);
302  }
303  virtual void resetStatus() {theStatus_ = NotPut;}
304  virtual bool onDemand_() const {return false;}
305  virtual ProductData const& productData() const {return productData_;}
306  virtual ProductData& productData() {return productData_;}
307  virtual GroupStatus& status_() const {return theStatus_;}
310  };
311 
312  // Free swap function
313  inline void swap(SourceGroup& a, SourceGroup& b) {
314  a.swap(b);
315  }
316 }
317 
318 #endif
std::string const & processName() const
virtual ProductData const & productData() const
Definition: Group.h:257
virtual bool putOrMergeProduct_() const
Definition: Group.cc:104
void swap(Group &rhs)
Definition: Group.h:139
std::string const & processName() const
Definition: Group.h:81
void setProductUnavailable() const
Definition: Group.h:179
void setProvenance(boost::shared_ptr< BranchMapper > mapper, ProcessHistoryID const &phid, ProductID const &pid)
Definition: Group.cc:230
virtual bool putOrMergeProduct_() const
Definition: Group.cc:53
virtual ProductData const & productData() const
Definition: Group.h:198
WrapperInterfaceBase const * getInterface() const
Definition: ProductData.h:25
WrapperHolder wrapper() const
Definition: Group.h:58
void setProductProvenance(ProductProvenance const &prov) const
Definition: Group.cc:152
bool productHasBeenDeleted_
Definition: Group.h:204
virtual void mergeProduct_(WrapperOwningHolder const &edp, ProductProvenance &productProvenance)
Definition: Group.cc:43
GroupStatus theStatus_
Definition: Group.h:261
virtual ProductData const & productData() const =0
SourceGroup(boost::shared_ptr< ConstBranchDescription > bd)
Definition: Group.h:295
void putProduct(WrapperOwningHolder const &edp) const
Definition: Group.h:112
Definition: Hash.h:41
virtual ~InputGroup()
Definition: Group.cc:14
virtual void resetStatus()
Definition: Group.h:193
virtual void swap_(Group &rhs)
Definition: Group.h:274
virtual ProductData const & productData() const
Definition: Group.h:305
virtual GroupStatus & status_() const
Definition: Group.h:307
virtual bool productWasDeleted_() const =0
virtual bool productWasDeleted_() const
Definition: Group.cc:189
virtual void resetStatus()
Definition: Group.h:303
virtual GroupStatus & status_() const =0
ProductProvenance * productProvenance() const
Definition: Provenance.h:51
void reallyCheckType(WrapperOwningHolder const &prod) const
Definition: Group.cc:217
ScheduledGroup(boost::shared_ptr< ConstBranchDescription > bd)
Definition: Group.h:247
virtual void swap_(Group &rhs)=0
virtual bool putOrMergeProduct_() const =0
ProductData productData_
Definition: Group.h:202
virtual void resetStatus()
Definition: Group.h:255
virtual bool onDemand_() const
Definition: Group.h:304
virtual void resetStatus()
Definition: Group.h:279
virtual GroupStatus & status_() const
Definition: Group.h:283
Group()
Definition: Group.cc:11
ProductID const & productID() const
Definition: Group.h:104
virtual ProductData const & productData() const
Definition: Group.h:281
virtual void checkType_(WrapperOwningHolder const &prod) const
Definition: Group.h:235
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:117
virtual void resetStatus()=0
void setProduct(WrapperOwningHolder const &prod) const
Definition: Group.cc:142
virtual bool onDemand_() const
Definition: Group.h:195
virtual ~SourceGroup()
Definition: Group.cc:18
virtual void mergeProduct_(WrapperOwningHolder const &edp, ProductProvenance &productProvenance)
Definition: Group.cc:92
Provenance prov_
Definition: ProductData.h:47
bool onDemand() const
Definition: Group.h:49
virtual ~UnscheduledGroup()
Definition: Group.cc:17
virtual bool productUnavailable_() const
Definition: Group.cc:179
InputGroup(boost::shared_ptr< ConstBranchDescription > bd)
Definition: Group.h:169
virtual void putProduct_(WrapperOwningHolder const &edp, ProductProvenance const &productProvenance)
Definition: Group.cc:21
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
std::string const & productInstanceName() const
virtual ~Group()
Definition: Group.cc:13
boost::shared_ptr< void const > wrapper_
Definition: ProductData.h:46
void mergeProduct(WrapperOwningHolder const &edp) const
Definition: Group.h:126
virtual bool onDemand_() const =0
std::string const & moduleLabel() const
Definition: Group.h:75
virtual void swap_(Group &rhs)
Definition: Group.h:298
virtual bool onDemand_() const
Definition: Group.h:280
virtual void putProduct_(WrapperOwningHolder const &edp, ProductProvenance const &productProvenance)=0
GroupStatus theStatus_
Definition: Group.h:285
virtual bool productUnavailable_() const =0
virtual ProductData & productData()
Definition: Group.h:199
virtual ProductData & productData()
Definition: Group.h:306
void resetProductData()
Definition: ProductData.h:40
virtual void swap_(Group &rhs)
Definition: Group.h:250
bool productIsUnavailable_
Definition: Group.h:203
virtual ~ProducedGroup()
Definition: Group.cc:15
bool putOrMergeProduct() const
Definition: Group.h:117
TypeID productType() const
Definition: Group.cc:212
void mergeTheProduct(WrapperOwningHolder const &edp) const
Definition: Group.cc:115
virtual ProductData & productData()
Definition: Group.h:282
UnscheduledGroup(boost::shared_ptr< ConstBranchDescription > bd)
Definition: Group.h:271
boost::shared_ptr< void const > product() const
Definition: Group.h:55
void setProcessHistoryID(ProcessHistoryID const &phid)
Definition: Group.cc:244
bool productWasDeleted() const
Definition: Group.h:52
virtual bool onDemand_() const
Definition: Group.h:256
GroupStatus theStatus_
Definition: Group.h:309
virtual void swap_(Group &rhs)
Definition: Group.h:182
void resetBranchDescription(boost::shared_ptr< ConstBranchDescription > bd)
Definition: ProductData.cc:26
virtual void setProductDeleted()
Definition: Group.cc:194
GroupStatus & status() const
Definition: Group.h:228
double b
Definition: hdecay.h:120
void mergeProduct(WrapperOwningHolder const &edp, ProductProvenance &productProvenance)
Definition: Group.h:122
void deleteProduct()
Definition: Group.h:37
void checkType(WrapperOwningHolder const &prod) const
Definition: Group.h:135
virtual GroupStatus & status_() const
Definition: Group.h:259
ProductData productData_
Definition: Group.h:284
void resetProductData()
Definition: Group.h:32
boost::shared_ptr< ConstBranchDescription > const & branchDescription() const
Definition: ProductData.h:29
double a
Definition: hdecay.h:121
Provenance * provenance() const
Definition: Group.cc:249
virtual void checkType_(WrapperOwningHolder const &prod) const =0
std::string const & productInstanceName() const
Definition: Group.h:78
virtual void putProduct_(WrapperOwningHolder const &edp, ProductProvenance const &productProvenance)
Definition: Group.cc:81
bool productIsUnavailable() const
Definition: Group.h:178
void resetBranchDescription(boost::shared_ptr< ConstBranchDescription > bd)
Definition: Group.h:72
bool provenanceAvailable() const
Definition: Group.cc:200
virtual void setProductDeleted()
Definition: Group.h:200
ProductID const & productID() const
Definition: Provenance.h:88
ProductData productData_
Definition: Group.h:260
virtual ~ScheduledGroup()
Definition: Group.cc:16
virtual bool productWasDeleted_() const
Definition: Group.h:197
bool productUnavailable() const
Definition: Group.h:43
ProductProvenance * productProvenancePtr() const
Definition: Group.h:61
virtual void setProductDeleted()=0
void putProduct(WrapperOwningHolder const &edp, ProductProvenance const &productProvenance)
Definition: Group.h:107
virtual ProductData & productData()
Definition: Group.h:258
std::ostream & operator<<(std::ostream &ost, const HLTGlobalStatus &hlt)
Formatted printout of trigger tbale.
ConstBranchDescription const & branchDescription() const
Definition: Group.h:69
ProductData productData_
Definition: Group.h:308
virtual bool productUnavailable_() const
Definition: Group.cc:160
std::string const & moduleLabel() const
virtual void checkType_(WrapperOwningHolder const &) const
Definition: Group.h:192
virtual void mergeProduct_(WrapperOwningHolder const &edp, ProductProvenance &productProvenance)=0
void write(std::ostream &os) const
Definition: Group.cc:254