Print a string representing the control flow state.
84 {
85
88 std::string indent( recursionLevel, ' ' );
91 << ")"
92 <<
", in state: " << states[
m_algoIndex] << std::endl;
93
94
96
97
98 output << indent <<
"========" << std::endl;
100
101
102 ConditionNode* conditionNode = dynamic_cast<ConditionNode*>( dataNode );
103 DataReadyPromoter visitor( slot, {} );
104 bool wasProduced = false;
105 if ( conditionNode ) {
106
107
108 wasProduced = !visitor.visitEnter( *conditionNode );
109 } else {
110
111 wasProduced = visitor.visit( *dataNode );
112 }
113
114
115 if ( !wasProduced ) {
116
117
118 if ( conditionNode )
119 output << indent <<
"missing conditions data: " << dataNode->name() << std::endl;
120 else
121 output << indent <<
"missing data: " << dataNode->name() << std::endl;
122
123
124 DataHandleFinder finder( dataNode->name() );
126 if ( finder.holderNames().size() > 1 ) {
127 output << indent <<
"required by tool:";
128 for ( auto const& holderName : finder.holderNames() ) {
129 if ( holderName != this->
name() )
output <<
" " << holderName;
130 }
132 }
133
134 if ( conditionNode ) {
135
137 std::vector<EventIDRange> validRanges;
138 conditionNode->m_condSvc->validRanges( validRanges, dataNode->name() )
139 .ignore( );
140 for (
auto& range : validRanges ) {
output << indent <<
"interval of validity: " <<
range << std::endl; }
141 if ( validRanges.empty() )
output << indent <<
"no interval(s) of validity" << std::endl;
142 } else {
143
144 output << indent <<
"can be produced by alg(s): ";
145 for ( auto algoNode : dataNode->getProducers() ) {
146 output <<
"( " << algoNode->name() <<
" in state: " << states[algoNode->getAlgoIndex()] <<
" ) ";
147 }
149 }
150
151
152 if ( !conditionNode ) {
153 std::vector<EventSlot>* testSubSlots = &slot.
allSubSlots;
155
156
161 if ( visitor.visit( *dataNode ) ) {
162 output << indent <<
"data is available at whole-event level" << std::endl;
163 }
164 }
165
166
167 for ( auto& pair : *subSlotMap ) {
168 if ( pair.second.size() > 0 ) {
169 bool madeLine = false;
170
171
172 for ( int slotIndex : pair.second ) {
173
174 EventSlot* subSlot = &testSubSlots->at( slotIndex );
175 visitor.m_slot = subSlot;
176 if ( visitor.visit( *dataNode ) ) {
177
178 if ( !madeLine ) {
179
180 output << indent <<
"data is available in sub-slot(s) ";
181 madeLine = true;
182 }
183 output << slotIndex <<
", ";
184 }
185 }
186 if ( madeLine ) {
output <<
"entered from " << pair.first << std::endl; }
187 }
188 }
189 }
190 }
191 }
192 output << indent <<
"========" << std::endl;
193 }
194 }
const EventIDBase & eventID() const
void acceptDHVisitor(IDataHandleVisitor *) const override
const std::vector< DataNode * > & getInputDataNodes() const
Get all consumer nodes.
Gaudi::Algorithm * getAlgorithm() const
get Algorithm representatives
const std::string & name() const
Get node name.
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
std::unique_ptr< EventContext > eventContext
Cache for the eventContext.
std::vector< EventSlot > allSubSlots
Actual sub-slot instances.
EventSlot * parentSlot
Pointer to parent slot (null for top level).
std::unordered_map< std::string, std::vector< unsigned int > > subSlotsByNode
Listing of sub-slots by the node (name) they are attached to.
AlgsExecutionStates algsStates
Vector of algorithms states.
std::vector< int > controlFlowState
State of the control flow.