source: Sophya/trunk/SophyaLib/Manual/sophya.tex@ 1347

Last change on this file since 1347 was 1347, checked in by cmv, 25 years ago

doc NTools and HiStats cmv 25/11/00

File size: 21.5 KB
Line 
1\documentclass[twoside,11pt]{article}
2% Package standard : Utilisation de caracteres accentues, mode francais et graphique
3\usepackage{url}
4\usepackage[latin1]{inputenc}
5\usepackage[T1]{fontenc}
6\usepackage[english]{babel}
7\usepackage{graphicx}
8% package a mettre pour faire du pdf
9\usepackage{palatino}
10
11% Extension de symboles mathematiques
12\usepackage{amssymb}
13
14% Definition pour Docs Sophya
15\usepackage{defsophya}
16
17
18
19\begin{document}
20
21\begin{titlepage}
22% The title page - top of the page with the title of the paper
23\titrehp{Sophya \\ An overview }
24% Authors list
25\auteurs{
26R. Ansari & ansari@lal.in2p3.fr \\
27E. Aubourg & aubourg@hep.saclay.cea.fr \\
28G. Le Meur & lemeur@lal.in2p3.fr \\
29C. Magneville & cmv@hep.saclay.cea.fr \\
30S. Henrot-Versille & versille@in2p3.fr
31}
32% \auteursall
33% The title page - bottom of the page with the paper number
34\titrebp{1}
35\end{titlepage}
36
37\tableofcontents
38
39\newpage
40
41\section{Introduction}
42
43 {\bf SOPHYA} ({\bf SO}ftware for {\bf PHY}sics {\bf A}nalysis)
44is a collection of C++ classes designed for numerical and
45physics analysis software development. Our goal is to provide
46easy to use, yet powerful classes which can be used by scientists.
47We have decided to use as much as possible available
48numerical analysis libraries, encapsulating them whenever
49possible.
50
51 The SOPHYA design and implementation has been carried out
52with the specific goal of providing the general framework for
53the Planck-HFI data processing software. However, most of the
54packages presented here have a more general scope than the CMB analysis
55and Planck mission problem.
56 The source directory tree
57\footnote{ CVS server: cvsserver.lal.in2p3.fr:/projects/Eros/CVSPlanck}
58is organised into a number of modules.
59
60\begin{itemize}
61\item[] {\bf Mgr/} Scripts for code management,
62makefile generation and software installation
63\item[] {\bf SysTools/} General architecture support classes such
64as {\tt PPersist, NDataBlock<T>}, and few utility classes
65({\tt DataCard, DVList} \ldots).
66\item[] {\bf TArray/} template numerical arrays, vectors and matrices \\
67({\tt PixelMap<T> SphericalMap<T>} \ldots)
68\item[] {\bf NTools/} Some standard numerical analysis tools
69(linear, and non linear parameter fitting, FFT, \ldots)
70\item[] {\bf HiStats/} Histogram-ming and data set handling classes \\
71({\tt Histo Histo2D NTuple XNTuple} \ldots)
72\end{itemize}
73
74The modules listed below are more tightly related to the
75CMB (Cosmic Microwave Background) data analysis problem:
76\begin{itemize}
77\item[] {\bf SkyMap/} Local and full sky maps, and few geometry
78handling utility classes. \\
79({\tt PixelMap<T>, LocalMap<T>, SphericalMap<T>, \ldots})
80\item[] {\bf SkyT/}
81classes for spectral emission and detector frequency response modelling \\
82({\tt SpectralResponse, RadSpectra, BlackBody} \ldots)
83\item[] {\bf Samba/} Spherical harmonic analysis.
84\end{itemize}
85
86The following modules contain the interface classes with
87external libraries:
88\begin{itemize}
89\item[] {\bf FitsIOServer/} Classes for handling file input-output
90in FITS format using the cfitsio library.
91\item[] {\bf LinAlg/} Interface with Lapack linear algebra package
92\item[] {\bf IFFTW/} Interface with FFTW package (libfftw.a)
93\end{itemize}
94
95Other modules:
96\begin{itemize}
97\item[] {\bf Tests/} Simple test programs
98\item[] {\bf PrgUtil/} Various utility programs (runcxx, scanppf, scanfits, \ldots)
99\item[] {\bf PMixer/} skymixer and related programs
100\item[] {\bf ProgPI/} interactive analysis tool - It should be noted that
101this module uses the SOPHYA class library and is based on {\bf PI}
102which is a C++ library defining a complete GUI program
103architecture. An additional module (PIext) define the interactive
104analysis program framework and the interfaces with the objects
105in SOPHYA. The {\bf PI/} \footnote{the PI package documentation
106is available from {\bf http://www.lal.in2p3.fr/recherche/eros/PeidaDoc/} }
107and {\bf PIext/} modules are not currently part
108of the SOPHYA CVS structure.
109\end{itemize}
110
111\newpage
112
113\section{Using Sophya}
114Two environment variables {\bf DPCBASEREP} and {\bf EROSCXX} are used
115to define the path where the Sophya libraries and executable are installed.
116{\bf DPCBASEREP} defines the base directory path and {\bf EROSCXX} the
117name of the C++ compiler. The complete path is built using {\bf DPCBASEREP},
118the operating system name (as obtained by the {\tt uname} command), and
119the compiler name. In the example below, we show the complete path
120for a {\tt Linux} system, using the GNU g++ compiler:
121
122\begin{itemize}
123\item \$DPCBASEREP/Include : Include (.h) files
124\item \$DPCBASEREP/Linux-g++/Libs : Path for the archive libraries (.a)
125\item \$DPCBASEREP/Linux-g++/ShLibs : Shared library path (.so)
126\item \$DPCBASEREP/Linux-g++/Exec : Executable file path
127\end{itemize}
128
129In order to use the shared libraries, the {\bf LD\_LIBRARY\_PATH} variable
130should contain the Sophya shared library path
131({\tt \$DPCBASEREP/Linux-g++/ShLibs } when using g++ compiler on Linux)
132
133For modules using external libraries, the {\bf EXTLIBDIR}
134environment variable should contain the path to these libraries
135and corresponding include files.
136C-FitsIO anf FFTW include files should be accessible through: \\
137{\tt \$EXTLIBDIR/Include/FitsIO } \\
138{\tt \$EXTLIBDIR/Include/FFTW } \\
139The corresponding libraries are expected to be found in: \\
140{\tt \$EXTLIBDIR/Linux-g++/Libs} \\
141
142The file {\tt \$DPCBASEREP/Include/MakefileUser.h} defines the compilation
143flags and the list of Sophya libraries. It should be included in the
144user's makefile. The default compilation rules assumes that the object (.o)
145and executable files would be put in the following diretories: \\
146{\tt \$HOME/`uname`-\$EROSCXX/Objs} \\
147{\tt \$HOME/`uname`-\$EROSCXX/Exec}.
148In the case of a {\tt Linux} system and using {\tt g++} as the C++ compiler,
149these two directories would be translated to \\
150{\tt \$HOME/Linux-g++/Objs} and {\tt \$HOME/Linux-g++/Exec}.
151The GNU make program should be used.
152\par
153The file {\tt \$DPCBASEREP/Include/makefile\_auto} defines the rules to compile
154a given source program, and link it against the Sophya libraries to produce
155an executable. The example below shows the steps to compile a program named
156{\tt trivial.cc }.
157\begin{verbatim}
158csh> cp \$DPCBASEREP/Include/makefile_auto makefile
159csh> make trivial
160\end{verbatim}
161This command should compile the {\tt trivial.cc} file,
162and link it against the sophya libraries. The object and executable
163file names are: \\
164{\tt \$HOME/`uname`-\$EROSCXX/Objs/trivial.o} \\
165{\tt \$HOME/`uname`-\$EROSCXX/Exec/trivial}.
166\par
167The file {\tt \$DPCBASEREP/Include/makefile\_example} provides another
168example makefile.
169
170Basic usage of Sophya classes are described in in the following sections.
171Complete Sophya documentation can be found at our web site: \\
172{\bf http://hfi-l2.in2p3.fr}.
173
174
175\section{Module SysTools}
176
177{\bf SysTools} contains utility classes such as {\tt DataCards} or
178{\tt DVlist}, an hierarchy of exception classes for Sophya, a template
179class {\tcls{NDataBlock}} for handling reference counting on numerical
180arrays, as well as classes providing the services for implementing simple
181serialization.
182\vspace*{5mm}
183
184\subsection{SOPHYA persistence}
185\begin{figure}[hbt]
186\dclsa{PPersist}
187\dclsbb{PIOPersist}{PInPersist}
188\dclsb{POutPersist}
189\caption{partial class diagram for classes handling persistence in Sophya}
190\end{figure}
191A simple persistence mechanism is defined in SOPHYA. Its main
192features are:
193\begin{itemize}
194\item[] Portable file format, containing the description of the data structures
195and object hierarchy. \\
196{\bf PPF} {\bf P}ortable {\bf P}ersistence file {\bf F}ormat.
197\item[] Handling of read/write for mutiply referenced objects.
198\item[] All write operations are carried using sequential access only. This
199holds also for read operations, unless positional tags are used.
200SOPHYA persistence services can thus be used to transfer objects
201through network links.
202\end{itemize}
203The example below shows writing of objects through the use of overloaded
204operator $ << $ :
205\begin{verbatim}
206#include "fiondblock.h"
207// ...
208POutPersist pos("aa.ppf");
209NDataBlock<r_4> rdb(40);
210rdb = 567.89;
211pos << rdb;
212// We can also use the PutObject method
213NDataBlock<int_4> idb(20);
214idb = 123;
215pos.PutObject(idb);
216\end{verbatim}
217The following sample programs show the reading of the created PPF file :
218\begin{verbatim}
219PInPersist pis("aa.ppf");
220NDataBlock<r_4> rdb;
221pis >> rdb;
222cout << rdb;
223NDataBlock<int_4> idb;
224cout << idb;
225\end{verbatim}
226
227\subsection{Using DataCards}
228The {\bf DataCards} class can be used to read parameters from a file.
229Each line in the file starting with \@ defines a set of values
230associated with a keyword. In the example below, we read the
231parameters corresponding with the keyword {\tt SIZE} from the
232file {\tt ex.d}. We suppose that {\tt ex.d} contains the line: \\
233{\tt @SIZE 400 250} \\
234\begin{verbatim}
235#include "datacards.h"
236// ...
237// Initializing DataCards object dc from file ex.d
238DataCards dc( "ex.d" );
239// Getting the first and second parameters for keyword size
240// We define a default value 100
241int size_x = dc.IParam("SIZE", 0, 100);
242int size_y = dc.IParam("SIZE", 1, 100);
243cout << " size_x= " << size_x << " size_y= " << size_y << endl;
244\end{verbatim}
245
246\subsection{Dynamic linker}
247The class {\bf PDynLinkMgr} can be used for managing shared libraries
248at run time. The example below shows the run time linking of a function:\\
249{\tt extern "C" { void myfunc(); } } \\
250\begin{verbatim}
251#include "pdlmgr.h"
252// ...
253string soname = "mylib.so";
254string funcname = "myfunc";
255PDynLinkMgr dyl(soname);
256DlFunction f = dyl.GetFunction(funcname);
257if (f != NULL) {
258// Calling the function
259 f();
260}
261\end{verbatim}
262
263\section{Module TArray}
264{\bf TArray} module contains template classes for handling standard
265operations on numerical arrays. Using the class {\tt \tcls{TArray} },
266it is possible to create and manipulate up to 5-dimension numerical
267arrays {\tt (int, float, double, complex, \ldots)}.
268
269\begin{figure}[hbt]
270\dclsccc{AnyDataObj}{BaseArray}{\tcls{TArray}}
271\ldots \\
272\dclsccc{\tcls{TArray}}{\tcls{TMatrix}}{\tcls{TVector}}
273\caption{partial class diagram for arrays, matrices and vectors}
274\end{figure}
275
276\subsection{Using arrays}
277
278The example below shows basic usage of arrays:
279\begin{verbatim}
280#include "array.h"
281// ...
282// Creation , filling of a Matrix
283 TMatrix<r_4> ma(7,9);
284 ma = RegularSequence(0.1, 0.05);
285 cout << "\n ma = " << ma << endl;
286\end{verbatim}
287
288Example of a simple low-pass filter on a one dimensional array (Vector)
289\begin{verbatim}
290// Input Vector containing a noisy periodic signal
291 Vector in(1024), out(1024);
292 in = RandomSequence(RandomSequence::Gaussian, 0., 1.);
293 for(int kk=0; kk<in.Size(); kk++)
294 in(kk) += 2*sin(kk*0.05);
295// Compute the output vector by a simple low pass filter
296 Vector out(1024);
297 int w = 2;
298 for(int k=w; k<in.Size()-w; k++)
299 out(k) = in(Range(k-w, k+w).Sum()/(2.*w+1.);
300\end{verbatim}
301
302\newpage
303
304\section{Module HiStats}
305\begin{figure}[hbt]
306\dclsccc{AnyDataObj}{Histo}{HProf}
307\dclsbb{AnyDataObj}{Histo2D}
308\dclsbb{AnyDataObj}{Ntuple}
309\dclsb{XNtuple}
310\caption{partial class diagram for histograms and ntuples}
311\end{figure}
312
313{\bf HiStats} contains classes for creating, filling, printing and
314doing various operations on one or two dimensional histograms
315{\tt Histo} and {\tt Histo2D} as well as profile histograms {\tt HProf}. \\
316This module also contains {\tt NTuple} and {\tt XNTuple} which are
317more or less the same that the binary FITS tables.
318
319\subsection{1D Histograms}
320
321For 1D histograms, various numerical methods are provided such as
322computing means and sigmas, finding maxima, fitting, rebinning,
323integrating \dots \\
324The example below shows creating and filling a one dimensionnal histogram
325of 100 bins from $-5.$ to $+5.$ to create a gaussian normal distribution
326with errors~:
327\begin{verbatim}
328#include "histos.h"
329// ...
330Histo H(-0.5,0.5,100);
331H.Errors();
332for(int i=0;i<25000;i++) {
333 double x = NorRand();
334 H.Add(x);
335}
336H.Print(80);
337\end{verbatim}
338
339\subsection{2D Histograms}
340
341Much of these operations are also valid for 2D histograms. 1D projection
342or slices can be set~:
343\begin{verbatim}
344#include "histos2.h"
345// ...
346Histo H2(-1.,1.,100,0.,60.,50);
347H2.SetProjX(); // create the 1D histo for X projection
348H2.SetBandX(25.,35.); // create 1D histo projection for 25.<y<35.
349H2.SetBandX(35.,45.); // create 1D histo projection for 35.<y<45.
350H2.SetBandX(40.,55.); // create 1D histo projection for 40.<y<55.
351//... fill H2 with what ever you want
352H2.Print();
353Histo *hx = H2.HProjX();
354 hx->Print(80);
355Histo *hbx2 = HBandX(1); // Get the second X band (35.<y<45.)
356 hbx2->Print(80);
357\end{verbatim}
358
359\subsection{Profile Histograms}
360
361Profiles histograms contains the mean and the sigma of the distribution
362of the values filled in each bin. The sigma can be changed to
363the error on the mean. When filled, the profile histogram looks
364like a 1D histogram and much of the operations that can be done on 1D histo
365may be applied onto profile histograms.
366
367\subsection{Ntuples}
368
369NTuple are memory resident tables of 32 bits floating values (float).
370They are arranged in columns. Each line is often called an event.
371These objects are frequently used to analyze data.
372Graphicals tools (spiapp) can plot a column against an other one
373with respect to various selection cuts. \\
374Here is an example of creation and filling~:
375\begin{verbatim}
376#include "ntuple.h"
377#include "srandgen.h"
378// ...
379char* nament[4] = {"i","x","y","ey"};
380r_4 xnt[4];
381NTuple NT(4,nament);
382for(i=0;i<5000;i++) {
383 xnt[0] = i+1;
384 xnt[1] = 5.*drandpm1(); // a random value between -5 and +5
385 xnt[2] = 100.*exp(-0.5*xnt[1]*xnt[1]) + 1.;
386 xnt[3] = sqrt(xnt[2]);
387 xnt[2] += xnt[3] * NorRand(); // add a random gaussian error
388 NT.Fill(xnt);
389}
390\end{verbatim}
391
392XNtuple are sophisticated NTuple : they accept various types
393of column values (float,double,int,...) and can be as big as
394needed (they used buffers on hard disk).
395
396\subsection{Writing, seeing \dots }
397
398All these objects have been design to be written to or read from a persistant file.
399The following example shows how to write the previously created objects
400into such a file~:
401\begin{verbatim}
402//-- Writing
403{
404char *fileout = "myfile.ppf";
405string tag;
406POutPersist outppf(fileout);
407tag = "H"; outppf.PutObject(H,tag);
408tag = "H2"; outppf.PutObject(H2,tag);
409tag = "NT"; outppf.PutObject(NT,tag);
410} // closing ``}'' destroy ``outppf'' and automatically close the file !
411\end{verbatim}
412
413Sophya graphical tools (spiapp) can automatically display and operate
414all these objects.
415
416\section{Module SkyMap}
417
418\section{Module NTools}
419
420This module provides elementary numerical tools for numerical integration,
421fitting, sorting and ODE solving. FFTs are also provided (Mayer,FFTPack).
422
423\subsection{Fitting}
424
425Fitting is done with two classes {\tt GeneralFit} and {\tt GeneralFitData}
426and is based on the Levenberg-Marquardt method.
427GeneralFitData is a class which provide a description of the data
428to be fitted. GeneralFit is the fitter class. Parametrized functions
429can be given as classes which inherit {\tt GeneralFunction}
430or as simple C functions. Classes of pre-defined functions are provided
431(see files fct1dfit.h and fct2dfit.h). The user interface is very close
432from that of the CERN {\tt Minuit} fitter.
433Number of objects (Histo, HProf \dots ) are interfaced with GeneralFit
434and can be easily fitted. \\
435Here is a very simple example for fitting the previously created NTuple
436with a gaussian~:
437\begin{verbatim}
438#include "fct1dfit.h"
439// ...
440
441// Read from ppf file
442NTuple nt;
443{
444PInPersist pis("myfile.ppf");
445string tag = "NT"; pis.GetObject(nt,tag);
446}
447
448// Fill GeneralData
449GeneralData mGdata(nt.NEntry());
450for(int i=0; i<nt.NEntry(); i++)
451 mGdata.AddData1(xnt[1],xnt[2],xnt[3]); // Fill x, y and error on y
452mGData.PrintStatus();
453
454// Function for fitting : y = f(x) + noise
455Gauss1DPol mFunction; // gaussian + constant
456
457// Prepare for fit
458GeneralFit mFit(&mFunction); // create a fitter for the choosen function
459mFit.SetData(&mGData); // connect data to the fitter
460
461// Set and initialize the parameters (that's non-linear fitting!)
462// (num par, name, guess start, step, [limits min and max])
463mFit.SetParam(0,"high",90.,1..);
464mFit.SetParam(1,"xcenter",0.05,0.01);
465mFit.SetParam(2,"sigma",sig,0.05,0.01,10.);
466 // Give limits to avoid division by zero
467mFit.SetParam(3,"constant",0.,1.);
468
469// Fit and print result
470int rcfit = mFit.Fit();
471mFit.PrintFit();
472if(rcfit>0) {)
473 cout<<"Reduce_Chisquare = "<<mFit.GetChi2Red()
474 <<" nstep="<<mFit.GetNStep()<<" rc="<<rcfit<<endl;
475} else {
476 cout<<"Fit_Error, rc = "<<rcfit<<" nstep="<<mFit.GetNStep()<<endl;
477 mFit.PrintFitErr(rcfit);
478}
479
480// Get the result for further use
481TVector<r_8> ParResult = mFit.GetParm();
482cout<<ParResult;
483\end{verbatim}
484
485Much more usefull possibilities and detailed informations might be found
486in the HTML pages of the Sophya manual.
487
488
489\section{Module Samba}
490
491\section{Module SkyT}
492
493
494\newpage
495\section{Building and installing Sophya}
496Presently, the Sophya library compilation has been tested with the following
497compiler/platform pairs:
498
499\begin{center}
500\begin{tabular}{ll}
501Compaq/DEC OSF1 & cxx (6.0 , 6.2) \\
502Linux & g++ (2.91 , 2.95) \\
503Linux & KCC (3.4) \\
504Solaris & g++ (2.95) \\
505SGI IRIX64 & CC \\
506\end{tabular}
507\end{center}
508
509Some of the modules in the Sophya package uses external libraries. The
510{\bf FitsIOServer} is the example of such a module, where the {\tt libcfitsio.a}
511is used.
512The build procedure expects to find the include files and the libraries in: \\
513{\tt \$EXTLIBDIR/Include/FitsIO } \\
514{\tt \$EXTLIBDIR/`uname`-\$EROSCXX/Libs} \\
515
516The object files from a given Sophya module are grouped in an archive library
517with the module's name ({\tt libmodulename.a}). All Sophya modules
518 are grouped in a single shared library ({\tt libsophya.so}), while the
519modules with reference to external libraries are grouped in
520({\tt libextsophya.so}). The {\bf PI} and {\bf PIext} modules are
521grouped in ({\tt libPI.so}).
522
523The environment variables {\bf DPCDEVREP}, {\bf EXTLIBDIR} and {\bf EROSCXX}
524must be defined in order to install the Sophya package.
525In the example below, we assume that we want to install Sophya from a
526released (tagged) version in the source directory {\tt \$SRC} in the
527{\tt /usr/local/Sophya} diretory, using {\tt g++}. We assume that
528the external libraries directory tree has been set up in
529{\tt /usr/local/ExtLibs/}. \\[3mm]
530\centerline{
531 \rule{20mm}{0.5mm}
532 {\bf \large the use of GNU make is mandatory}
533 \rule{20mm}{0.5mm} }
534
535\vspace*{3mm}
536\begin{verbatim}
537# We select our C++ compiler
538csh> setenv EROSCXX g++
539# Setup the build directory
540csh> mkdir /usr/local/Sophya/
541csh> setenv DPCDEVREP /usr/local/Sophya/
542csh> setenv EXTLIBDIR /usr/local/ExtLibs/
543# Use the top level makefile in Mgr/
544csh> cd \$SRC
545csh> cp Mgr/Makefile Makefile
546# Step 1: Create the directory tree and copy the include files (.h)
547csh> make depend
548# Step 2: Compile the modules without external library reference
549csh> make libs
550# Step 3: Compile the modules WITH external library reference (optional)
551csh> make extlibs
552# Step 4: Build libsophya.so
553csh> make slb
554# Step 5: Build libextsophya.so (optional)
555csh> make slbext
556# Step 6: Compile the PI and PIext modules (optional)
557csh> make PI
558# Step 7: Build the corresponding shared library libPI.so (optional)
559csh> make slbpi
560\end{verbatim}
561
562To compile all modules and build the shared libraries, it is possible
563to use:
564\begin{verbatim}
565# Step 2,3,6
566csh> make all
567# Step 4,5,7
568csh> make slball
569\end{verbatim}
570
571At this step, all libraries sould have been made. Programs using
572Sophya libraries can now be built:
573\begin{verbatim}
574# To compile test programs
575csh> cd Tests
576csh> make arrt ...
577csh> cd ..
578# To compile other programs, for example from the PMixer module
579csh> cd PMixer
580csh> make
581csh> cd ..
582# To build (s)piapp (libPI.so is needed)
583csh> cd ProgPI
584csh> make
585csh> cd ..
586\end{verbatim}
587
588\subsection{Mgr module}
589This module contains scripts which can be used for generating the
590makefiles for each module.
591\begin{itemize}
592\item {\bf Makefile} Top level Makefile for builiding the libraries.
593\item {\bf Makefile.h} contains the defintion of compilation flags for the
594different compilers and systems. This file is used for building the
595library and generating {\bf MakefileUser.h} (to be included in makefiles).
596\item {\bf Makefile.slb} contains the rules for building shared libraries
597for the different compilers and systems. (to be included in makefiles)
598\item {\bf crerep\_sophya} c-shell script for creating the directory tree
599under {\tt \$DPCBASEREP} and {\tt \$DPCDEVREP}
600\item {\bf install\_sophya} c-shell script for installing the Sophya package.
601Usually from {\tt \$DPCDEVREP} to {\tt \$DPCBASEREP}
602\item {\bf mkmflien} c-shell script for making symbolic links or copying
603include files to {\tt \$DPCDEVREP/Include} or {\tt \$DPCBASEREP/Include}
604\item {\bf mkmf} c-shell script for generating module makefiles and the
605top level makefile (named GNUmakefile)
606\item {\bf mkmflib} c-shell script for generating each library module
607makefile (named GNUmakefile)
608\item {\bf mkmfprog} c-shell script for generating makefile for a module
609containing the source for executable programs (named GNUmakefile).
610\item {\bf mkmfPI} c-shell script for generating makefile for PI and PIext
611modules (named GNUmakefile)
612\item {\bf libdirs} List of Sophya modules without reference to external
613libraries.
614\item {\bf extlibdirs} List of Sophya modules with reference to external
615libraries.
616
617\end{itemize}
618
619\newpage
620\appendix
621\section{Exception handling: An example}
622For simple programs, it is a good practice to handle
623the exceptions at least at high level, in the {\tt main()} function.
624The example below shows the exception handling and the usage
625of Sophya persistence.
626
627\input{ex1.inc}
628
629
630\end{document}
Note: See TracBrowser for help on using the repository browser.