CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DaqProvenanceHelper.cc
Go to the documentation of this file.
1 #include <algorithm>
2 #include <cassert>
3 #include <vector>
4 
6 
16 
17 namespace edm {
19  : constBranchDescription_(BranchDescription(InEvent
20  , "rawDataCollector"
21  //, "source"
22  , "LHC"
23  // , "HLT"
24  , "FEDRawDataCollection"
25  , "FEDRawDataCollection"
26  , ""
27  , "DaqSource"
28  , ParameterSetID()
29  , TypeWithDict(rawDataType.typeInfo())
30  , false))
31  , dummyProvenance_(constBranchDescription_.branchID())
32  , processParameterSet_()
33  , oldProcessName_()
34  , oldBranchID_()
35  , newBranchID_()
36  , oldProcessHistoryID_(nullptr)
37  , phidMap_() {
38 
39  // Now we create a process parameter set for the "LHC" process.
40  // We don't currently use the untracked parameters, However, we make them available, just in case.
41  std::string const& moduleLabel = constBranchDescription_.moduleLabel();
42  std::string const& processName = constBranchDescription_.processName();
44  typedef std::vector<std::string> vstring;
45  vstring empty;
46 
47  vstring modlbl;
48  modlbl.reserve(1);
49  modlbl.push_back(moduleLabel);
50  processParameterSet_.addParameter("@all_sources", modlbl);
51 
53  triggerPaths.addParameter<vstring>("@trigger_paths", empty);
55 
56  ParameterSet pseudoInput;
57  pseudoInput.addParameter<std::string>("@module_edm_type", "Source");
58  pseudoInput.addParameter<std::string>("@module_label", moduleLabel);
59  pseudoInput.addParameter<std::string>("@module_type", moduleName);
60  processParameterSet_.addParameter<ParameterSet>(moduleLabel, pseudoInput);
61 
62  processParameterSet_.addParameter<vstring>("@all_esmodules", empty);
63  processParameterSet_.addParameter<vstring>("@all_esprefers", empty);
64  processParameterSet_.addParameter<vstring>("@all_essources", empty);
65  processParameterSet_.addParameter<vstring>("@all_loopers", empty);
66  processParameterSet_.addParameter<vstring>("@all_modules", empty);
67  processParameterSet_.addParameter<vstring>("@end_paths", empty);
68  processParameterSet_.addParameter<vstring>("@paths", empty);
69  processParameterSet_.addParameter<std::string>("@process_name", processName);
70  // Now we register the process parameter set.
72 
73  //std::cerr << processParameterSet_.dump() << std::endl;
74  }
75 
77  DaqProvenanceHelper::daqInit(ProductRegistry& productRegistry, ProcessHistoryRegistry& processHistoryRegistry) const {
78  // Now we need to set all the metadata
79  // Add the product to the product registry
80  productRegistry.copyProduct(constBranchDescription_);
81 
82  // Insert an entry for this process in the process history registry
83  ProcessHistory ph;
85  processHistoryRegistry.registerProcessHistory(ph);
86 
87  // Save the process history ID for use every event.
88  return ph.setProcessHistoryID();
89  }
90 
91  bool
93  for(auto const& pc : ph) {
94  if(pc.processName() == oldProcessName_) {
95  return(pc.releaseVersion() == newPC.releaseVersion() && pc.passID() == newPC.passID());
96  }
97  }
98  return false;
99  }
100 
101  void
102  DaqProvenanceHelper::fixMetaData(std::vector<ProcessConfiguration>& pcv, std::vector<ProcessHistory>& phv) {
103  std::vector<ProcessConfiguration> newPCs;
104  for(auto const& pc : pcv) {
105  if(pc.processName() == oldProcessName_) {
106  newPCs.emplace_back(constBranchDescription_.processName(),
108  pc.releaseVersion(), pc.passID());
109  }
110  }
111  assert(!newPCs.empty());
112  pcv.reserve(pcv.size() + newPCs.size());
113  pcv.insert(pcv.end(), newPCs.begin(), newPCs.end());
114  // update existing process histories
115  for(auto& ph : phv) {
116  for(auto const& newPC : newPCs) {
117  if(matchProcesses(newPC, ph)) {
118  ProcessHistoryID oldPHID = ph.id();
119  ph.push_front(newPC);
120  ProcessHistoryID newPHID = ph.id();
121  phidMap_.insert(std::make_pair(oldPHID, newPHID));
122  break;
123  }
124  }
125  }
126  // For new process histories, containing only the new process configurations
127  phv.reserve(phv.size() + newPCs.size());
128  for(auto const& newPC : newPCs) {
129  phv.emplace_back();
130  phv.back().push_front(newPC);
131  }
132  }
133 
134  void
135  DaqProvenanceHelper::fixMetaData(std::vector<BranchID>& branchID) const {
136  std::replace(branchID.begin(), branchID.end(), oldBranchID_, newBranchID_);
137  }
138 
139  void
140  DaqProvenanceHelper::fixMetaData(BranchIDLists const& branchIDLists) const {
143  // The const_cast is ugly, but it beats the alternatives.
144  BranchIDLists& lists = const_cast<BranchIDLists&>(branchIDLists);
145  for(auto& list : lists) {
146  std::replace(list.begin(), list.end(), oldID, newID);
147  }
148  }
149 
150  void
152  typedef std::map<BranchID, std::set<BranchID> > BCMap;
153  // The const_cast is ugly, but it beats the alternatives.
154  BCMap& childLookup = const_cast<BCMap&>(branchChildren.childLookup());
155  // First fix any old branchID's in the key.
156  {
157  BCMap::iterator i = childLookup.find(oldBranchID_);
158  if(i != childLookup.end()) {
159  childLookup.insert(std::make_pair(newBranchID_, i->second));
160  childLookup.erase(i);
161  }
162  }
163  // Now fix any old branchID's in the sets;
164  for(auto& child : childLookup) {
165  if(child.second.erase(oldBranchID_) != 0) {
166  child.second.insert(newBranchID_);
167  }
168  }
169  }
170 
171  // Replace process history ID.
172  ProcessHistoryID const&
174  ProcessHistoryIDMap::const_iterator it = phidMap_.find(phid);
175  assert(it != phidMap_.end());
176  oldProcessHistoryID_ = &it->first;
177  return it->second;
178  }
179 
180  // Replace parentage ID.
181  ParentageID const&
183  ParentageIDMap::const_iterator it = parentageIDMap_.find(parentageID);
184  if(it == parentageIDMap_.end()) {
185  return parentageID;
186  }
187  return it->second;
188  }
189 
190  // Replace branch ID if necessary.
191  BranchID const&
193  return(branchID == oldBranchID_ ? newBranchID_ : branchID);
194  }
195 }
std::string getPassID()
Definition: GetPassID.h:8
int i
Definition: DBlmapReader.cc:9
DaqProvenanceHelper(TypeID const &rawDataType)
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
ParameterSetID id() const
BranchID const & mapBranchID(BranchID const &branchID) const
#define nullptr
bool registerProcessHistory(ProcessHistory const &processHistory)
std::string const & processName() const
ProcessHistoryID setProcessHistoryID()
PassID const & passID() const
unsigned int id() const
Definition: BranchID.h:23
void emplace_back(Args &&...args)
ProcessHistoryID const & mapProcessHistoryID(ProcessHistoryID const &phid)
void fixMetaData(ProcessConfigurationVector &pcv, std::vector< ProcessHistory > &phv)
std::string moduleName(Provenance const &provenance)
Definition: Provenance.cc:27
std::string const & moduleLabel() const
map_t const & childLookup() const
unsigned int value_type
Definition: BranchID.h:16
ProcessHistoryIDMap phidMap_
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:142
std::string const & moduleName() const
ProcessHistoryID daqInit(ProductRegistry &productRegistry, ProcessHistoryRegistry &processHistoryRegistry) const
Hash< ProcessHistoryType > ProcessHistoryID
std::string getReleaseVersion()
ReleaseVersion const & releaseVersion() const
BranchDescription const constBranchDescription_
volatile std::atomic< bool > shutdown_flag false
ParentageID const & mapParentageID(ParentageID const &phid) const
static std::string const triggerPaths
Definition: EdmProvDump.cc:42
ParameterSet const & registerIt()
std::vector< std::string > vstring
Definition: Schedule.cc:347
void copyProduct(BranchDescription const &productdesc)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
ProcessHistoryID const * oldProcessHistoryID_
bool matchProcesses(ProcessConfiguration const &pc, ProcessHistory const &ph) const