source: trunk/documents/UserDoc/DocBookUsersGuides/ForToolkitDeveloper/xml/OOAnalysisDesign/Visualization/visualization.xml @ 1345

Last change on this file since 1345 was 904, checked in by garnier, 16 years ago

ajout de la doc

File size: 23.1 KB
Line 
1<!-- ******************************************************** -->
2<!--  Docbook Version:  For Toolkit Developers Guide          -->
3<!-- ******************************************************** -->
4
5<!-- ******************* Section (Level#1) ****************** -->
6<sect1 id="sect.DsgnFuncVis">
7<title>
8Visualisation
9</title>
10
11<!-- ******************* Section (Level#2) ****************** -->
12<sect2 id="sect.DsgnFuncVis.DsgPhlsp">
13<title>
14Design Philosophy
15</title>
16
17<para>
18The visualisation category consists of the classes required to display
19detector geometry, particle trajectories, tracking steps, and hits.  It also
20provides visualisation drivers, which are interfaces to external graphics
21systems. 
22</para>
23
24<para>
25A wide variety of user requirements went into the design of the visualisation
26category, for example:
27
28<itemizedlist spacing="compact">
29  <listitem><para>
30    very quick response in surveying successive events,
31  </para></listitem>
32  <listitem><para>
33    high-quality output for presentation and documentation,
34  </para></listitem>
35  <listitem><para>
36    flexible camera control for debugging detector geometry and physics,
37  </para></listitem>
38  <listitem><para>
39    selection of visualisable objects,
40  </para></listitem>
41  <listitem><para>
42    interactive picking of graphical objects for attribute editing or
43    feedback to the associated data,
44  </para></listitem>
45  <listitem><para>
46    highlighting incorrect intersections of physical volumes,
47  </para></listitem>
48  <listitem><para>
49    co-working with graphical user interfaces.
50  </para></listitem>
51</itemizedlist>
52</para>
53
54<para>
55Because it is very difficult to respond to all of these requirements
56with only one built-in visualiser, an abstract interface was developed
57which supports several complementary graphics systems.  Here the term
58<emphasis role="bold">graphics system</emphasis> means either an
59application running as a process independent of Geant4 or a graphics
60library to be compiled with Geant4.  A concrete implementation of the
61interface is called a <emphasis role="bold">visualisation driver</emphasis>,
62which can use a graphics library directly, communicate with an
63independent process via pipe or socket, or simply write an intermediate
64file for a separate viewer.
65</para>
66
67</sect2>
68
69<!-- ******************* Section (Level#2) ****************** -->
70<sect2 id="sect.DsgnFuncVis.GrphIntrf">
71<title>
72The Graphics Interfaces
73</title>
74
75<para>
76<itemizedlist spacing="compact">
77  <listitem><para>
78    <emphasis role="bold"></emphasis>G4VVisManager:
79    All user code writes to the graphics systems
80    through this pure abstract interface.  It contains Draw methods for
81    all the graphics primitives in the graphics_reps category
82    (G4Polyline, G4Circle, etc.), geometry objects (through their base
83    classes, G4VSolid, G4PhysicalVolume and G4LogicalVolume) and hits and
84    trajectories (through their base classes, G4VHit and G4VTrajectory).
85    </para>
86    <para>
87    Since this is an abstract interface, all user code must check that
88    there exists a concrete instantiation of it.  A static method is
89    provided, so a typical user code fragment is:
90
91    <informalexample><programlisting>
92  G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
93  if(pVVisManager) {
94    pVVisManager-&gt;Draw(G4Circle...
95    ...
96    </programlisting></informalexample>
97    </para>
98    <para>
99    Note that this allows the building an application without a concrete
100    implementation, for example for a batch job, even if some code, like
101    the above, is still included.  Most of the novice examples can be
102    built this way if G4VIS_NONE is specified.
103    </para>
104    <para>
105    The concrete implementation of this interface is hereafter
106    referred to as the <emphasis role="bold">visualisation manager</emphasis>.
107  </para></listitem>
108  <listitem><para>
109    <emphasis role="bold">G4VGraphicsScene</emphasis>:
110    The visualisation manager must also
111    provide a concrete implementation of the subsidiary interface,
112    G4VGraphicsScene.  It is only for use by the kernel and the modeling
113    category.  It offers direct access to a ``scene handler'' through a
114    reference provided by the visualisation manager.  It is described in
115    more detail in the section on extending the toolkit functionality.
116  </para></listitem>
117</itemizedlist>
118</para>
119
120<para>
121The Geant4 distribution includes implementations of the above
122interfaces, namely <emphasis role="bold">G4VisManager</emphasis> 
123and <emphasis role="bold">G4VSceneHandler</emphasis>
124respectively, and their associated classes.  These define further
125abstract base classes for visualisation drivers.  Together they form
126the <emphasis role="bold">Geant4 Visualisation System</emphasis>
127A variety of concrete visualisation drivers are also included
128in the distribution.  Details of how to implement a visualisation
129driver are given in <xref linkend="sect.ExtdFuncVis" />.
130Of course, it is always possible for
131a user to implement his or her own concrete implementations of
132G4VVisManager and G4VGraphicsScene replacing the Geant4 Visualisation
133System altogether.
134</para>
135
136</sect2>
137
138<!-- ******************* Section (Level#2) ****************** -->
139<sect2 id="sect.DsgnFuncVis.VisSystm">
140<title>
141The Geant4 Visualisation System
142</title>
143
144<para>
145The Geant4 Visualisation System consists of
146
147<itemizedlist spacing="compact">
148  <listitem><para>
149    <emphasis role="bold">G4VisManager</emphasis>: An implementation
150    of the G4VVisManager
151    interface.  It manages multiple graphics systems and defines three
152    more concepts -- the <emphasis role="bold">scene</emphasis> (G4Scene),
153    the <emphasis role="bold">scene handler</emphasis>
154    (base class G4VSceneHandler, itself a sub-class of G4VGraphicsScene)
155    and the <emphasis role="bold">viewer</emphasis> (base class G4VViewer)
156    -- see below.
157    G4VisManager is a singleton and an abstract class, requiring the
158    user to derive from it a concrete visualisation manager
159    (G4VisExecutive is provided -- see below).  Roles and structure of
160    the visualisation manager are described in Chapter 8 of the User's
161    Guide for Application Developers.
162  </para></listitem>
163  <listitem><para>
164    <emphasis role="bold">G4VisExecutive</emphasis>: A concrete visualisation
165    manager that implements the virtual functions RegisterGraphicsSystems and
166    RegisterModelFactories.  These functions must be in the users'
167    domain, since the graphics systems and models that are instantiated
168    by them are, in many cases, provided by the user (graphics
169    libraries, etc.).  It is therefore implemented as a .hh-.icc
170    combination that is designed to be included in the users' code.  Of
171    course, the user may write his or her own.
172  </para></listitem>
173  <listitem><para>
174    <emphasis role="bold">G4Scene</emphasis> The scene is a list if
175    models for physical
176    volumes, axes, hits, trajectories, etc. - see Section
177    <xref linkend="sect.DsgnFuncVis.MdlCat" />.
178    They are distinguished according to their
179    lifetime -- ``run-duration'' for physical volumes, etc.,
180    ``end-of-event'' for hits and trajectories, etc.  The end-of-event
181    models are only to be used when the Geant4 state indicates the end
182    of event has been reached.  The scene has an
183    <emphasis role="bold">extent</emphasis> (G4VisExtent),
184    which is updated by the scene when a new model is
185    added (each model itself has an extent), and a ``standard'' target
186    point; these are used to define the standard view -- see
187    below.  In addition, the scene keeps flags which indicate whether
188    end-of-event objects should be accumulated or refreshed for each
189    event or run.
190  </para></listitem>
191  <listitem><para>
192    <emphasis role="bold">G4VGraphicsSystem</emphasis>: This is an
193    abstract base class for scene
194    handler and viewer factories.  It is used by the visualisation
195    manager to create scene handlers and viewers on request.
196  </para></listitem>
197  <listitem><para>
198    <emphasis role="bold">G4VSceneHandler</emphasis>: A sub-class of
199    G4VGraphicsScene, itself an abstract base class for specific scene
200    handlers, whose job is to
201    convert the scene into graphics-system-specific code for the viewer.
202    For example, the scene handler may create a graphical database,
203    taking care to separate run-duration (persistent) and end-of-event
204    (transient) information (this is described further in
205    <xref linkend="sect.ExtdFuncVis.CrtGrpDrv.DlgTrnsObj" />.
206  </para></listitem>
207  <listitem><para>
208    <emphasis role="bold">G4VViewer</emphasis>: An abstract base class
209    for specific viewers.
210    Its job is to create windows or files and identify where and how the
211    final view should be rendered.  It has
212    <emphasis role="bold">view parameters</emphasis>
213    (G4ViewParameters) which specify viewpoint direction, type of
214    rendering (wireframe or surface), etc.  It is the view's
215    responsibility, noting the scene's extent and target point, to
216    choose a camera position and magnification that ensures that the
217    scene is automatically and comfortably rendered in the viewing
218    window.  This is then the <emphasis role="bold">standard view</emphasis>,
219    and any further
220    operations requested by the user - zoom, pan, etc. - are
221    relative to this standard view.  The class G4ViewParameters has
222    utility routines to assist this procedure; it is strongly advised
223    that toolkit developers writing a viewer should study the
224    G4ViewParameters class, whose header file contains much useful
225    information (also preserved in the Software Reference Manual).
226    </para>
227    <para>
228    The viewer is messaged by the vis manager when the user issues
229    commands, such as <literal>/vis/viewer/refresh</literal>
230    This invokes methods
231    such as SetView, ClearView and DrawView.  A detailed description of
232    the call sequences is given in
233    <xref linkend="sect.ExtdFuncVis.CrtGrpDrv.ImpCmdAct" />-
234    <xref linkend="sect.ExtdFuncVis.CrtGrpDrv.WhtPrcScn" />.
235  </para></listitem>
236</itemizedlist>
237</para>
238
239<para>
240Note there is no restriction on the number or type of scene handlers
241or viewers.  There may be several scene handlers processing the same
242or different scenes, each with several viewers (for example, the same
243scene from differing viewpoints).
244</para>
245
246<para>
247By defining a set of three C++ classes inheriting from the virtual
248base classes - G4VGraphicsSystem, G4VSceneHandler and G4VViewer - an
249arbitrary graphics system can easily be plugged in to Geant4.
250The plugged-in graphics system is then available for visualising
251detector simulations.  Together, this set of three concrete classes is
252called a "visualisation driver".  The DAWN-File driver, for example,
253is the interface to the Fukui Renderer DAWN, and is implemented by the
254following set of classes:
255
256<orderedlist spacing="compact">
257  <listitem><para>
258    G4DAWNFILE : public G4VGraphicsSystem for creation of the
259    scene handlers and viewers
260  </para></listitem>
261  <listitem><para>
262    G4DAWNFILESceneHandler : public G4VSceneHandler for
263    modeling 3D scenes
264  </para></listitem> 
265  <listitem><para>
266    G4DAWNFILEView : public G4VView for rendering 3D scenes
267  </para></listitem>
268</orderedlist>
269</para>
270
271<para>
272Several visualisation drivers are distributed with Geant4.  They are
273complementary to each other in many aspects. For details, see Chapter 8 of
274the User's Guide for Application Developers.
275</para>
276
277</sect2>
278
279<!-- ******************* Section (Level#2) ****************** -->
280<sect2 id="sect.DsgnFuncVis.MdlCat">
281<title>
282Modeling sub-category
283</title>
284
285<para>
286<itemizedlist spacing="compact">
287  <listitem><para>
288    <emphasis role="bold">G4VModel</emphasis> -
289    a base class for visualisation models.  A model is a
290    graphics-system-independent description of a Geant4 component.
291    </para>
292    <para>
293    The sub-category visualisation/modeling defines how to model a 3D
294    scene for visualisation. The term "3D scene" indicates a set of
295    visualisable component objects put in a 3D world. A concrete class
296    inheriting from the abstract base class G4VModel defines a "model",
297    which describes how to visualise the corresponding component object
298    belonging to a 3D scene. G4ModelingParameters defines various
299    associated parameters.
300    </para>
301    <para>
302    For example, G4PhysicalVolumeModel knows how to visualise
303    a physical volume. It describes a physical volume
304    and its daughters to any desired depth. G4HitsModel knows
305    how to visualise hits. G4TrajectoriesModel
306    knows how to visualise trajectories.
307    </para>
308    <para>
309    The main task of a model is to describe itself to a 3D scene by
310    giving a concrete implementation of the following virtual
311    method of G4VModel:
312
313    <informalexample><programlisting>
314    virtual void DescribeYourselfTo (G4VGraphicsScene&amp;) = 0;
315    </programlisting></informalexample>
316    </para>
317    <para>
318    The argument class G4VGraphicsScene is a minimal abstract
319    interface of a 3D scene for the Geant4 kernel defined in the
320    graphics_reps category. Since G4VSceneHandler and its concrete
321    descendants inherit from G4VGraphicsScene, the
322    method DescribeYourselfTo() can pass information of a 3D scene
323    to a visualisation driver.
324    </para>
325    <para>
326    It is easy for a toolkit developer of Geant4 to add a new kind
327    of visualisable component object. It is done by implementing a
328    new class inheriting from G4VModel.
329  </para></listitem>
330  <listitem><para>
331    <emphasis role="bold">G4VTrajectoryModel</emphasis> -
332    an abstract base class for trajectory drawing models.
333    </para>
334    <para>
335    A trajectory model governs how an individual trajectory is drawn.
336    Concrete models inheriting from G4VTrajectoryModel must implement
337    two pure virtual functions:
338
339    <informalexample><programlisting>
340    virtual void Draw(const G4VTrajectory&amp;, G4int i_mode = 0) const = 0;
341    virtual void Print(std::ostream&amp; ostr) const = 0;
342    </programlisting></informalexample>
343    </para>
344    <para>
345    See for example G4TrajectoryDrawByParticleID.
346  </para></listitem>
347  <listitem><para>
348    <emphasis role="bold">G4VModelFactory</emphasis> -
349    an abstract base class for factories creating models and associated
350    messengers.
351    </para>
352    <para>
353    It is not necessary to generate messengers for a trajectory model
354    that will be constructed and configured directly in compiled code.
355    If the user requires model creation and configuration features through
356    interactive commands, however, there must be a mechanism to generate
357    both models and their associated messengers. This is the role of
358    G4VModelFactory. Concrete factories inheriting from G4VModelFactory
359    are responsible for creating a concrete model and concrete messengers.
360    To help ensure a type safe messenger to model interaction on the
361    command line, the messengers should inherit from G4VModelCommand.
362    </para>
363    <para>
364    Concrete factories must implement one pure virtual function:
365
366    <informalexample><programlisting>
367    virtual ModelAndMessengers
368    Create(const G4String&amp; placement, const G4String&amp; modelName) = 0;
369    </programlisting></informalexample>
370
371    where placement indicates which directory space the commands should
372    occupy. See for example G4TrajectoryDrawByParticleIDFactory.
373  </para></listitem>
374</itemizedlist>
375</para>
376
377
378</sect2>
379
380<!-- ******************* Section (Level#2) ****************** -->
381<sect2 id="sect.DsgnFuncVis.ViewParam">
382<title>
383View parameters
384</title>
385
386<para>
387View parameters such as camera parameters, drawing styles
388(wireframe/surface etc) are held by G4ViewParameters.  Each
389viewer holds a view parameters object which can be changed
390interactively and a default object (for use in the
391<literal>/vis/viewer/reset</literal> command).
392</para>
393
394<para>
395If a toolkit developer of Geant4 wants to add entries of view
396parameters, he should add fields and methods to G4ViewParameters.
397</para>
398
399</sect2>
400
401<!-- ******************* Section (Level#2) ****************** -->
402<sect2 id="sect.DsgnFuncVis.VisAttr">
403<title>
404Visualisation Attributes
405</title>
406
407<para>
408All drawable objects (should) have a method:
409
410<informalexample><programlisting>
411  const G4VisAttributes* GetVisAttributes() const;
412</programlisting></informalexample>
413</para>
414
415<para>
416A drawable object might be:
417
418<itemizedlist spacing="compact">
419  <listitem><para>
420    a "visible" (i.e., inheriting G4Visible), such as a polyhedron,
421    polyline, circle, etc. (note that text is a slightly special case
422    - see below) or
423  </para></listitem>
424  <listitem><para>
425    a solid whose vis attributes are held in its logical volume.
426  </para></listitem>
427</itemizedlist>
428</para>
429
430
431
432<!-- ******************* Section (Level#3) ****************** -->
433<sect3 id="sect.DsgnFuncVis.VisAttr.FndAppAtt">
434<title>
435Finding the applicable vis attributes
436</title>
437
438<para>
439This is an issue for all scene handlers.  The scene handler is where
440the colour, style, auxiliary edge visibility, marker size, etc., of
441individual drawable objects are needed.
442</para>
443
444
445<!-- ******************* Section (Level#4) ****************** -->
446<sect4 id="sect.DsgnFuncVis.VisAttr.FndAppAtt.Vsbl">
447<title>
448Visibles
449</title>
450
451<para>
452If the vis attributes pointer is zero, drivers should pick up the
453default vis attributes from the viewer:
454
455<informalexample><programlisting>
456  const G4VisAttributes* pVisAtts = visible.GetVisAttributes();
457  if (!pVisAtts)
458    pVisAtts = fpViewer-&gt;GetViewParameters().GetDefaultVisAttributes();
459</programlisting></informalexample>
460
461where visible denotes any visible object (polyhedron, circle, etc.).
462</para>
463
464<para>
465There is a utility function G4VViewer::GetApplicableVisAttributes
466which does this, so an alternative is:
467
468<informalexample><programlisting>
469  const G4VisAttributes* pVisAtts =
470    fpViewer-&gt;GetApplicableVisAttributes(visible.GetVisAttributes());
471</programlisting></informalexample>
472</para>
473
474<para>
475Confusingly, there is a utility function G4VSceneHandler::GetColour
476which also does this, so if it's only colour you need, the following
477suffices:
478
479<informalexample><programlisting>
480  const G4Colour&amp; colour GetColour(visible);
481</programlisting></informalexample>
482
483but equally well:
484
485<informalexample><programlisting>
486  const G4VisAttributes* pVisAtts =
487    fpViewer-&gt;GetApplicableVisAttributes(visible.GetVisAttributes());
488  const G4Colour&amp; colour pVisAtts-&gt;GetColour();
489</programlisting></informalexample>
490
491or even:
492
493<informalexample><programlisting>
494  const G4VisAttributes* pVisAtts = visible.GetVisAttributes();
495  if (!pVisAtts)
496    pVisAtts = fpViewer-&gt;GetViewParameters().GetDefaultVisAttributes();
497  const G4Colour&amp; colour pVisAtts-&gt;GetColour();
498</programlisting></informalexample>
499</para>
500
501</sect4>
502
503<!-- ******************* Section (Level#4) ****************** -->
504<sect4 id="sect.DsgnFuncVis.VisAttr.FndAppAtt.Txt">
505<title>
506Text
507</title>
508
509<para>
510Text is a special case because it has its own default vis attributes:
511
512<informalexample><programlisting>
513  const G4VisAttributes* pVisAtts = text.GetVisAttributes();
514  if (!pVisAtts)
515    pVisAtts = fpViewer-&gt;GetViewParameters().GetDefaultTextVisAttributes();
516  const G4Colour&amp; colour pVisAtts-&gt;GetColour();
517</programlisting></informalexample>
518
519and there is a utility function G4VSceneHandler::GetTextColour:
520
521<informalexample><programlisting>
522  const G4Colour&amp; colour GetTextColour(text);
523</programlisting></informalexample>
524</para>
525
526</sect4>
527
528<!-- ******************* Section (Level#4) ****************** -->
529<sect4 id="sect.DsgnFuncVis.VisAttr.FndAppAtt.Slds">
530<title>
531Solids
532</title>
533
534<para>
535For specific solids, the G4PhysicalVolumeModel that provides the
536solids also provides, via PreAddSolid, a pointer to its vis
537attributes.  If the vis attribites pointer in the logical volume is
538zero, it provides a pointer to the default vis attributes in the
539model, which in turn is (currently) provided by the viewer's vis
540attributes (see G4VSceneHandler::CreateModelingParameters).  So the
541vis attributes pointer is guaranteed to be pertinent.
542</para>
543
544<para>
545If the concrete driver does not implement AddSolid for any particular
546solid, the base class converts it to primitives (usually a
547G4Polyhedron) and again, the vis attributes pointer is guaranteed.
548</para>
549
550</sect4>
551
552<!-- ******************* Section (Level#4) ****************** -->
553<sect4 id="sect.DsgnFuncVis.VisAttr.FndAppAtt.DrwStyl">
554<title>
555Drawing style
556</title>
557
558<para>
559The drawing style is normally determined by the view parameters but
560for individual drawable objects it may be overridden by the forced
561drawing style flags in the vis attributes.  A utility function
562G4ViewParameters::DrawingStyle G4VSceneHandler::GetDrawingStyle is
563provided:
564
565<informalexample><programlisting>
566  G4ViewParameters::DrawingStyle drawing_style = GetDrawingStyle(pVisAtts);
567</programlisting></informalexample>
568</para>
569
570</sect4>
571
572<!-- ******************* Section (Level#4) ****************** -->
573<sect4 id="sect.DsgnFuncVis.VisAttr.FndAppAtt.AxlEdg">
574<title>
575Auxiliary edges
576</title>
577
578<para>
579Similarly, the visibility of auxiliary/soft edges is normally
580determined by the view parameters but may be overridden by the forced
581auxiliary edge visible flag in the vis attributes.  Again, a utility
582function G4VSceneHandler::GetAuxEdgeVisible is provided:
583
584<informalexample><programlisting>
585  G4bool isAuxEdgeVisible = GetAuxEdgeVisible (pVisAtts);
586</programlisting></informalexample>
587</para>
588
589</sect4>
590
591<!-- ******************* Section (Level#4) ****************** -->
592<sect4 id="sect.DsgnFuncVis.VisAttr.FndAppAtt.LnSgmCrc">
593<title>
594LineSegmentsPerCircle
595</title>
596
597<para>
598Also, the precision of rendering curved edges in the polyhedral
599representation of volumes is normally determined by the view
600parameters but may be overridden by a forced attribute.  A utility
601function that respects this, G4VSceneHandler::GetNoOfSides, is
602provided.  For example:
603
604<informalexample><programlisting>
605  G4Polyhedron::SetNumberOfRotationSteps (GetNoOfSides (pVisAttribs));
606</programlisting></informalexample>
607</para>
608
609</sect4>
610
611<!-- ******************* Section (Level#4) ****************** -->
612<sect4 id="sect.DsgnFuncVis.VisAttr.FndAppAtt.MrkSz">
613<title>
614Marker size
615</title>
616
617<para>
618These have nothing to do with vis attributes; they are an extra
619property of markers, i.e., objects that inherit G4VMarker (circles,
620squares, text, etc.).  However, the algorithm for the actual size is
621quite complicated and a utility function
622G4VSceneHandler::GetMarkerSize is provided:
623
624<informalexample><programlisting>
625  MarkerSizeType sizeType;
626  G4double size = GetMarkerSize (text, sizeType);
627</programlisting></informalexample>
628
629sizeType is world or screen, signifying that the size is in world
630coordinates or screen coordinates respectively.
631</para>
632
633</sect4>
634
635</sect3>
636</sect2>
637
638<!-- ******* Bridgehead ******* -->
639<bridgehead role="revisionHistory" renderas="sect4">
640[Status of this chapter]
641</bridgehead>
642<para>
643<simplelist type="var">
644  <member>
645    27.06.05 partially re-organized and section on design philosophy added (from
646    Geant4 general paper) by D.H. Wright
647  </member>
648  <member>
649    13.10.05 Section on vis attributes added by John Allison.
650  </member>
651  <member>
652    06.01.06 Re-write of ``Design Philosphy'' and introduction of ``The Graphics
653    Interfaces'' and ``The Geant4 Visualisation System'' by John Allison.
654  </member>
655  <member>
656    Dec. 2006 Conversion from latex to Docbook verson by K. Amako
657  </member>
658</simplelist>
659</para>
660   
661
662
663
664</sect1>
Note: See TracBrowser for help on using the repository browser.