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  phv.push_back(ProcessHistory()); // For new processHistory, containing only processConfiguration_
104  std::vector<ProcessConfiguration> newPCs;
105  for(auto const& pc : pcv) {
106  if(pc.processName() == oldProcessName_) {
107  newPCs.emplace_back(constBranchDescription_.processName(),
109  pc.releaseVersion(), pc.passID());
110  }
111  }
112  assert(!newPCs.empty());
113  pcv.reserve(pcv.size() + newPCs.size());
114  pcv.insert(pcv.end(), newPCs.begin(), newPCs.end());
115  // update existing process histories
116  for(auto& ph : phv) {
117  for(auto const& newPC : newPCs) {
118  if(ph.empty() || matchProcesses(newPC, ph)) {
119  ProcessHistoryID oldPHID = ph.id();
120  ph.push_front(newPC);
121  ProcessHistoryID newPHID = ph.id();
122  phidMap_.insert(std::make_pair(oldPHID, newPHID));
123  break;
124  }
125  }
126  }
127  // For new process histories, containing only the new process configurations
128  phv.reserve(phv.size() + newPCs.size());
129  for(auto const& newPC : newPCs) {
130  phv.emplace_back();
131  phv.back().push_front(newPC);
132  }
133  }
134 
135  void
136  DaqProvenanceHelper::fixMetaData(std::vector<BranchID>& branchID) const {
137  std::replace(branchID.begin(), branchID.end(), oldBranchID_, newBranchID_);
138  }
139 
140  void
141  DaqProvenanceHelper::fixMetaData(BranchIDLists const& branchIDLists) const {
144  // The const_cast is ugly, but it beats the alternatives.
145  BranchIDLists& lists = const_cast<BranchIDLists&>(branchIDLists);
146  for(auto& list : lists) {
147  std::replace(list.begin(), list.end(), oldID, newID);
148  }
149  }
150 
151  void
153  typedef std::map<BranchID, std::set<BranchID> > BCMap;
154  // The const_cast is ugly, but it beats the alternatives.
155  BCMap& childLookup = const_cast<BCMap&>(branchChildren.childLookup());
156  // First fix any old branchID's in the key.
157  {
158  BCMap::iterator i = childLookup.find(oldBranchID_);
159  if(i != childLookup.end()) {
160  childLookup.insert(std::make_pair(newBranchID_, i->second));
161  childLookup.erase(i);
162  }
163  }
164  // Now fix any old branchID's in the sets;
165  for(auto& child : childLookup) {
166  if(child.second.erase(oldBranchID_) != 0) {
167  child.second.insert(newBranchID_);
168  }
169  }
170  }
171 
172  // Replace process history ID.
173  ProcessHistoryID const&
175  ProcessHistoryIDMap::const_iterator it = phidMap_.find(phid);
176  assert(it != phidMap_.end());
177  oldProcessHistoryID_ = &it->first;
178  return it->second;
179  }
180 
181  // Replace parentage ID.
182  ParentageID const&
184  ParentageIDMap::const_iterator it = parentageIDMap_.find(parentageID);
185  if(it == parentageIDMap_.end()) {
186  return parentageID;
187  }
188  return it->second;
189  }
190 
191  // Replace branch ID if necessary.
192  BranchID const&
194  return(branchID == oldBranchID_ ? newBranchID_ : branchID);
195  }
196 }
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