15 using std::ostringstream;
20 : m_LogLevel(ps.
get<
Index>(
"LogLevel")),
21 m_PlotChannelRanges(ps.
get<
NameVector>(prefix +
"ChannelRanges")),
22 m_PlotChannelGroups(ps.
get<
NameVector>(prefix +
"ChannelGroups")),
23 m_PlotOverlayGroups(ps.
get<
Index>(prefix +
"OverlayGroups")),
24 m_PlotDataView(ps.
get<
Name>(prefix +
"DataView")),
25 m_PlotName(ps.
get<
Name>(prefix +
"Name")),
26 m_PlotSummaryNames(ps.
get<
NameVector>(prefix +
"SummaryNames")),
27 m_PlotSizeX(ps.
get<
Index>(prefix +
"SizeX")),
28 m_PlotSizeY(ps.
get<
Index>(prefix +
"SizeY")),
29 m_PlotSplitX(ps.
get<
Index>(prefix +
"SplitX")),
30 m_PlotSplitY(ps.
get<
Index>(prefix +
"SplitY")) {
31 const Name myname =
"AdcMultiChannelPlotter::ctor: ";
35 cout << myname <<
" " << prefix +
"ChannelRanges: [";
37 if ( first ) first =
false;
42 cout << myname <<
" " << prefix +
"ChannelGroups: [";
45 if ( first ) first =
false;
53 cout << myname <<
" " << prefix <<
"SummaryNames: [";
56 if ( first ) first =
false;
66 Name stringBuilder =
"adcStringBuilder";
68 if ( ptm ==
nullptr ) {
69 cout << myname <<
"ERROR: Tool manager not found." <<
endl;
74 cout << myname <<
"WARNING: AdcChannelStringTool not found: " << stringBuilder <<
endl;
79 if ( pcgt ==
nullptr ) {
80 cout << myname <<
"ERROR: IndexRangeGroupTool not found: channelGroups" <<
endl;
85 cout << myname <<
"WARNING: Skipping invalid group " << cgn <<
endl;
93 cout << myname <<
"WARNING: Skipping invalid range " << crn <<
" in group " << cgn <<
endl;
96 if ( ppad ==
nullptr ) {
100 if ( ppad->
crmap.find(crn) != ppad->
crmap.end() ) {
101 cout << myname <<
"WARNING: Ignoring duplicate channel range group " << cgn <<
endl;
105 ppad->
crmap[crn] = ran;
114 if ( pcrt ==
nullptr ) {
115 cout << myname <<
"ERROR: IndexRangeTool not found: channelRanges" <<
endl;
120 cout << myname <<
"WARNING: Skipping invalid range " << crn <<
endl;
126 pad.
crmap[crn] = ran;
143 const Name myname =
"AdcMultiChannelPlotter::viewMap: ";
145 if ( acds.size() == 0 )
return ret;
152 Index npadOnPage = 0;
156 npadOnPage = npadx*npady;
159 cout << myname <<
"Per page pad count is " << npadOnPage <<
" (" << npady <<
" x " << npadx <<
")" <<
endl;
167 for ( AdcChannelDataMap::value_type iacd : acds ) {
173 Name scha = sscha.str();
174 while ( scha.size() < 6 ) scha =
"0" + scha;
175 scha =
"chan" + scha;
176 localPads.emplace_back(scha);
177 Pad& pad = localPads.back();
183 Index npad = pads.size();
184 if (
getLogLevel() >= 4 ) cout << myname <<
"Pad count is " << npad <<
endl;
187 Index ipadOnPage = 0;
188 for (
Index ipad=0; ipad<npad; ++ipad ) {
189 const Pad& pad = pads[ipad];
192 cout << myname <<
" Processing pad " << ipad <<
" for channel group " << cgn <<
endl;
195 for (
Index icr=0; icr<ncr; ++icr ) {
199 cout <<
"ERROR: Range " << crn <<
" in pad group " << cgn <<
" is invalid. Aborting." <<
endl;
203 cout << myname <<
" Processing range " << ran <<
endl;
206 if ( iacd1 == acds.end() ) {
207 if (
getLogLevel() >= 5 ) cout << myname <<
" Skipping range above data." << endl;
211 if ( iacd2 == iacd1 ) {
212 if (
getLogLevel() >= 5 ) cout << myname <<
" Skipping range below data." << endl;
219 Index icha = iacd->first;
221 cout << myname <<
"WARNING: View " <<
getDataView() <<
" is missing for channel " 222 << icha <<
"." <<
endl;
225 for (
Index idve=0; idve<ndve; ++idve ) {
231 Index nacd = acdvec.size();
232 cout << myname <<
" Processing channel range " << crn <<
" with " << nacd
233 <<
" entr" << (nacd == 1 ?
"y" :
"ies" ) <<
" in " << ncha <<
" channel" 234 << (ncha == 1 ?
"" :
"s") <<
"." <<
endl;
238 if ( pmantop ==
nullptr ) {
239 if (
getLogLevel() >= 3 ) cout << myname <<
" Creating canvas for run " << acdFirst.
run 240 <<
", event " << acdFirst.
event <<
"." << endl;
243 if ( npadOnPage > 1 ) pmantop->
split(npadx, npady);
249 sman.
replace(
"%CGRNAME%", cgrn);
251 plotName = sman.
str();
253 if ( plotName.size() ) cout << myname <<
" Created pad with plot name " << plotName << endl;
254 else cout << myname <<
" Created pad with no plot name." <<
endl;
259 if ( ppadPage ==
nullptr ) {
260 cout << myname <<
"ERROR: View pad " << ipadOnPage <<
" not found for pad " << ipad <<
", channel range " << crn <<
"." <<
endl;
268 bool lastpad = (npadOnPage == 0) || (ipadOnPage == npadOnPage) || (ipad+1 == npad);
269 if ( lastpad && pmantop !=
nullptr ) {
270 if ( plotName.size() ) {
271 if (
getLogLevel() >= 3 ) cout << myname <<
" Printing canvas to " << plotName << endl;
272 pmantop->
print(plotName);
274 if (
getLogLevel() >= 3 ) cout << myname <<
" Not printing canvas for channel group " 275 << cgn <<
"." <<
endl;
284 ret.
setInt(
"multiChannelNChannel", ncha);
285 ret.
setInt(
"multiChannelNPlot", nplt);
292 const Name myname =
"AdcMultiChannelPlotter::viewSummary: ";
294 if (
getLogLevel() >= 3 ) cout << myname <<
"Summmary plots not named for level " << ilev <<
endl;
297 if (
getLogLevel() >= 3 ) cout << myname <<
"Creating summmary plots for level " << ilev <<
endl;
300 Index npadOnPage = 1;
304 npadOnPage = npadx*npady;
307 cout << myname <<
"Pad count/page is " << npadOnPage <<
" (" << npady <<
" x " << npadx <<
")" <<
endl;
317 Name scha = sscha.str();
318 while ( scha.size() < 6 ) scha =
"0" + scha;
319 scha =
"chan" + scha;
320 localPads.emplace_back(scha);
321 Pad& pad = localPads.back();
327 Index npad = pads.size();
332 if (
getLogLevel() >= 3 ) cout << myname <<
"Pad count is " << npad <<
endl;
333 for (
Index ipad =0; ipad<npad; ++ipad ) {
334 const Pad& pad = pads[ipad];
336 Index ipadOnPage = npad == 0 ? 0 : ipad % npadOnPage;
337 if (
getLogLevel() >= 4 ) cout << myname <<
" Channel group " << cgn
338 <<
" channel range count is " << pad.
crnames.size() <<
endl;
341 for (
Index icrn=0; icrn<ncrn; ++icrn ) {
344 cout << myname <<
" Processing group/range " << cgn <<
"/" << crn <<
endl;
348 if ( pmantop ==
nullptr ) {
349 if (
getLogLevel() >= 3 ) cout << myname <<
" Creating canvas for run " << acdPrint.
run 350 <<
", event " << acdPrint.
event <<
"." <<
endl;
353 if ( npadOnPage > 1 ) pmantop->
split(npadx, npady);
364 int rstat =
viewMapSummary(ilev, cgn, crn, *pmantop->
man(ipadOnPage), ncrn, icrn);
365 if ( rstat >= 1 ) cout << myname <<
"WARNING: viewMapSummary returned error code " << rstat <<
endl;
366 if (
getLogLevel() >= 5 ) cout << myname <<
" Pad " << ipadOnPage <<
" extra object count: " 370 bool lastpad = (npadOnPage == 0) || (ipadOnPage+1 == npadOnPage) || (ipad+1 == npad);
371 if ( lastpad && pmantop !=
nullptr ) {
372 if (
getLogLevel() >= 3 ) cout << myname <<
" Printing summary canvas to " << plotName << endl;
373 pmantop->
print(plotName);
383 const Name myname =
"AdcMultiChannelPlotter::getChannelGroup: ";
Index getLogLevel() const
Index m_PlotOverlayGroups
std::vector< Name > NameVector
Name getPlotSummaryName(Index ilev) const
BaseState & getBaseState() const
~AdcMultiChannelPlotter() override
int replace(std::string substr, const T &xsub)
int setCanvasSize(int wx, int wy)
int split(Index nx, Index ny)
const std::string & str()
NameVector m_PlotChannelRanges
void viewSummary(Index ilev) const
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
AdcMultiChannelPlotter(const fhicl::ParameterSet &ps, Name prefix="Plot")
const IndexRangeGroup & getChannelGroup(Name cgn) const
bool haveChannelRanges() const
DataMap viewMap(const AdcChannelDataMap &acds) const override
bool haveChannelGroups() const
void setInt(Name name, int val)
virtual int viewMapSummary(Index ilev, Name cgn, Name crn, TPadManipulator &man, Index ncr, Index icr) const =0
bool overlayGroups() const
std::vector< Pad > PadVector
NameVector m_PlotChannelGroups
virtual int viewMapChannels(Name crn, const AcdVector &acds, TPadManipulator &man, Index ncr, Index icr) const =0
const AdcChannelData * viewEntry(Name vpnam, AdcIndex ient) const
std::map< AdcChannel, AdcChannelData > AdcChannelDataMap
const TObjVector & objects() const
auto const & get(AssnsNode< L, R, D > const &r)
bool hasView(Name vnam) const
const AdcChannelStringTool * m_adcStringBuilder
TPadManipulator * man(unsigned int ipad=0)
int print(std::string fname, std::string spat="{,}")
std::vector< const AdcChannelData * > AcdVector
QTextStream & endl(QTextStream &s)
NameVector m_PlotSummaryNames