Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/analysis/hntools/src/G4PlotManager.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 
 27 // Author: Ivana Hrivnacova, 02/06/2015  (ivana@ipno.in2p3.fr)
 28 
 29 #include "G4HnInformation.hh"
 30 #include "G4PlotManager.hh"
 31 #include "G4AnalysisUtilities.hh"
 32 #include "G4ios.hh"
 33 
 34 #if defined(TOOLS_USE_FREETYPE)
 35 #include "toolx/sg/text_freetype"
 36 #include "toolx/xml/xml_style"
 37 #include "tools/xml/wrap_viewplot_fonts_google_style"
 38   //inlib/xml/viewplot.style file embeded in an inline function.
 39 #include "tools/font/lato_regular_ttf"
 40 #include "tools/font/roboto_bold_ttf"
 41 
 42 namespace {
 43 
 44 // from g4tools/test/viewplot.cpp
 45 //_____________________________________________________________________________
 46 void HD_style(tools::sg::plots& a_plots,float a_line_width) {
 47   std::vector<tools::sg::plotter*> plotters;
 48   a_plots.plotters(plotters);
 49   tools_vforcit(tools::sg::plotter*,plotters,it) {
 50     tools::sg::plotter* _plotter = *it;
 51     _plotter->bins_style(0).line_width = a_line_width;
 52     _plotter->inner_frame_style().line_width = a_line_width;
 53     _plotter->grid_style().line_width = a_line_width;
 54     _plotter->x_axis().line_style().width = a_line_width;
 55     _plotter->x_axis().ticks_style().width = a_line_width;
 56     _plotter->y_axis().line_style().width = a_line_width;
 57     _plotter->y_axis().ticks_style().width = a_line_width;
 58     _plotter->z_axis().line_style().width = a_line_width;
 59     _plotter->z_axis().ticks_style().width = a_line_width;
 60 
 61     // needed if font is hershey :
 62     _plotter->title_style().line_width = a_line_width;
 63     _plotter->infos_style().line_width = a_line_width;
 64     _plotter->title_box_style().line_width = a_line_width;
 65 
 66     _plotter->x_axis().labels_style().line_width = a_line_width;
 67     _plotter->x_axis().mag_style().line_width = a_line_width;
 68     _plotter->x_axis().title_style().line_width = a_line_width;
 69 
 70     _plotter->y_axis().labels_style().line_width = a_line_width;
 71     _plotter->y_axis().mag_style().line_width = a_line_width;
 72     _plotter->y_axis().title_style().line_width = a_line_width;
 73 
 74     _plotter->z_axis().labels_style().line_width = a_line_width;
 75     _plotter->z_axis().mag_style().line_width = a_line_width;
 76     _plotter->z_axis().title_style().line_width = a_line_width;
 77   }
 78 }
 79 
 80 // from g4tools/test/viewplot.cpp
 81 //_____________________________________________________________________________
 82 void regions_style(tools::sg::plots& a_plots,float a_plotter_scale = 1) {
 83   // Rescale some plotter parameters (for example margins) according to the number of regions.
 84   // We assume that these parameters had been set previously according to one plot per page.
 85   // Then this function must be applied after all the styles had been applied (because
 86   // a plotting style may set these parameters).
 87 
 88   float ww_wc = a_plots.width;
 89   float wh_wc = a_plots.height;
 90   float rw_wc = ww_wc/a_plots.cols;
 91   float rh_wc = wh_wc/a_plots.rows;
 92 
 93   float cooking = 1.2f; //if increased the data area is diminished.
 94 
 95   float wfac = (rw_wc/ww_wc)*cooking;
 96   float hfac = (rh_wc/wh_wc)*cooking;
 97 
 98   float label_cooking = 1.6f; //if increased the labels are bigger.
 99 
100   if((a_plots.cols.value()>=4)&&(a_plots.cols.value()>a_plots.rows.value())) label_cooking = 0.9f;
101 
102   float title_cooking = 1.1f; //extra title cooking.
103 
104   a_plots.plotter_scale = a_plotter_scale;
105 
106   std::vector<tools::sg::plotter*> plotters;
107   a_plots.plotters(plotters);
108   tools_vforcit(tools::sg::plotter*,plotters,it) {
109     tools::sg::plotter* _plotter = *it;
110 
111     _plotter->left_margin = _plotter->left_margin * wfac;
112     _plotter->right_margin = _plotter->right_margin * wfac;
113     _plotter->bottom_margin = _plotter->bottom_margin * hfac;
114     _plotter->top_margin = _plotter->top_margin * hfac;
115 
116     _plotter->x_axis().tick_length = _plotter->x_axis().tick_length * wfac;
117     _plotter->y_axis().tick_length = _plotter->y_axis().tick_length * hfac;
118 
119     _plotter->title_to_axis = _plotter->title_to_axis * hfac;
120     _plotter->title_height = _plotter->title_height * hfac * title_cooking;
121 
122     _plotter->x_axis().label_height = _plotter->x_axis().label_height * hfac * label_cooking;
123     _plotter->y_axis().label_height = _plotter->y_axis().label_height * hfac * label_cooking;
124 
125   }
126 }
127 
128 // from g4tools/test/viewplot.cpp
129 //_____________________________________________________________________________
130 bool load_embeded_styles(tools::xml::styles& a_styles) {
131   std::string ss;
132   unsigned int linen;
133   const char** lines = viewplot_fonts_google_style(linen);
134   for(unsigned int index=0;index<linen;index++) {
135     std::string s = lines[index];
136     tools::replace(s,"@@double_quote@@","\"");
137     tools::replace(s,"@@back_slash@@","\\");
138     ss += s + "\n";
139   }
140   return toolx::xml::load_style_string(a_styles,ss);
141 }
142 
143 }
144 #endif
145 
146 using namespace G4Analysis;
147 
148 //
149 // ctors, dtor
150 //
151 
152 //_____________________________________________________________________________
153 G4PlotManager::G4PlotManager(const G4AnalysisManagerState& state)
154  : fState(state)
155 {
156 #if defined(TOOLS_USE_FREETYPE)
157   //////////////////////////////////////////////////////////////////////////////
158   /// plotting, high resolution with freetype fonts and by using styles : //////
159   //////////////////////////////////////////////////////////////////////////////
160   fState.Message(kVL1,  "... using high resolution with Freetype fonts", "");
161   //Have vertical A4 :
162   // unsigned int ww = 2000; //to have better antialising on freetype fonts.
163   // float A4 = 29.7f/21.0f;
164   // unsigned int wh = (unsigned int)(float(ww)*A4*0.80);
165   static toolx::sg::text_freetype ttf;
166   ttf.add_embedded_font(tools::sg::font_lato_regular_ttf(),tools::font::lato_regular_ttf);
167   ttf.add_embedded_font(tools::sg::font_roboto_bold_ttf(),tools::font::roboto_bold_ttf);
168   fViewer = std::make_unique<tools::viewplot>(G4cout, ttf,
169                                     fPlotParameters.GetColumns(),
170                                     fPlotParameters.GetRows(),
171                                     fPlotParameters.GetWidth(),
172                                     fPlotParameters.GetHeight());
173   fViewer->plots().view_border = false;
174   load_embeded_styles(fViewer->styles());
175   fViewer->styles().add_colormap("default",tools::sg::style_default_colormap());
176   fViewer->styles().add_colormap("ROOT",tools::sg::style_ROOT_colormap());
177 #else
178   // cretae a viewer with default parameters
179   fState.Message(kVL1,  "... using low resolution with Hershey fonts", "");
180   fViewer = std::make_unique<tools::viewplot>(G4cout,
181                                     fPlotParameters.GetColumns(),
182                                     fPlotParameters.GetRows(),
183                                     fPlotParameters.GetWidth(),
184                                     fPlotParameters.GetHeight());
185   fViewer->plots().view_border = false;
186 #endif
187 }
188 
189 //
190 // private methods
191 //
192 
193 //_____________________________________________________________________________
194 G4bool G4PlotManager::WritePage()
195 {
196   fState.Message(kVL4, "write a page in", "plot file", fFileName);
197 
198 #if defined(TOOLS_USE_FREETYPE)
199   HD_style(fViewer->plots(), 5);
200   regions_style(fViewer->plots(), fPlotParameters.GetScale());
201 #endif
202 
203   G4bool result = fViewer->write_page();
204   if ( ! result ) {
205     Warn("Cannot write a page in the plot file " + fFileName,
206       fkClass, "WritePage");
207   }
208 
209   // clear viewers plots
210   fViewer->plots().init_sg();
211     //it will recreate the sg::plotters and then reset the styles on new ones.
212 
213   fState.Message(kVL3, "write a page in", "plot file", fFileName);
214 
215   return result;
216 }
217 
218 //
219 // public methods
220 //
221 
222 //_____________________________________________________________________________
223 G4bool G4PlotManager::OpenFile(const G4String& fileName)
224 {
225   fState.Message(kVL4, "open", "plot file", fileName);
226 
227   // Keep filename for logging
228   fFileName = fileName;
229 
230   G4bool result = fViewer->open_file(fileName);
231   if ( ! result ) {
232     Warn("Cannot open plot file " + fileName, fkClass, "OpenFile");
233   }
234 
235   fState.Message(kVL1, "open", "plot file", fileName);
236 
237   return result;
238 }
239 
240 //_____________________________________________________________________________
241 G4bool G4PlotManager::CloseFile()
242 {
243   fState.Message(kVL4, "close", "plot file", fFileName);
244 
245   G4bool result = fViewer->close_file();
246   if ( ! result ) {
247     Warn("Cannot close the plot file", fkClass, "CloseFile");
248   }
249 
250   fState.Message(kVL1, "close", "plot file", fFileName);
251 
252   return result;
253 }
254