\documentclass[twoside,11pt,A4]{article}
% \documentclass[twoside,11pt,A4]{report}
\usepackage[french]{babel}

% \usepackage[T1]{fontenc}
\usepackage[applemac]{inputenc}
\usepackage{palatino}
% \usepackage{times}
% package pour ecrire DRAFT en fond de page 
% \usepackage[light,all,draft]{draftcopy}

% \usepackage{epsfig}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amssymb}

\setlength{\textwidth}{16cm}
\setlength{\textheight}{22 cm}
\setlength{\topmargin}{-5mm}
\setlength{\oddsidemargin}{0.cm}
\setlength{\evensidemargin}{0.cm}
\setlength{\unitlength}{1mm}

\newcommand{\tcls}[1] {#1$<$T$>$}   
\newcommand{\tclsc}[2] {#1$<$#2$>$}   

\newcommand{\rond}{$\bullet \ $}
\newcommand{\etoile}{$\star \ $}
\newcommand{\cercle}{$\circ \ $}
\newcommand{\carre}{$\Box \ $}

%%%% Pour le decoupage en sections
% \newcommand{\groupe}[1]{\chapter{#1}}
% \newcommand{\titre}[1]{\section{#1}}
% \newcommand{\soustitre}[1]{\subsection{#1}}
%%%
\newcommand{\groupe}[1]{\section{#1}}
\newcommand{\titre}[1]{\subsection{#1}}
\newcommand{\soustitre}[1]{\subsubsection{#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{titlepage}
\begin{center}
{\Large \bf SOPHYA Change Log \\[1mm]
  Liste des modifications de SOPHYA } \\[5mm] 
{\large Septembre 2003 - Septembre 2008 } \\[25mm]
Liste des tags et dates : \\[5mm]
{\large 
\begin{tabular}{lcl}
V = 0.727 &   \hspace{10mm}  & Octobre 1999 \\
V = 0.8  &   \hspace{10mm}  &  F\'evrier 2000 \\
V = 1.1  &   \hspace{10mm}  &  F\'evrier 2001 \\
V = 1.2  &   \hspace{10mm}  &  Juillet 2001 \\
V = 1.3  &   \hspace{10mm}  &  Novembre  2001 \\
V = 1.5  &   \hspace{10mm}  &   D\'ecembre  2002 \\
V = 1.7  &   \hspace{10mm}  &   Septembre 2003 \\
V = 1.9  &   \hspace{10mm}  &   Juin 2005 - SANS tag CVS \\
V = 1.9xx  &   \hspace{10mm}  & 09/2005 ... 09/2006  \\
V = 2.0  &   \hspace{10mm}  &  Septembre 2006 - tag CVS \\
V = 2.046  &   \hspace{10mm}  &  Ao\^{u}t 2007 - NO tag  \\
V = 2.1  &   \hspace{10mm}  &  Novembre 2007 - tag CVS \\
V = 2.1xx  &   \hspace{10mm}  &  12/ 2007 - \ldots \\
V = 2.125  &   \hspace{10mm}  &  Sept-Oct 2008 - NO tag  \\
V = 2.140  &   \hspace{10mm}  &  Sept-Oct 2009 - NO tag  \\

\end{tabular}
} \\[8mm]
%%%%%%
\begin{tabular}{ll}
R. Ansari            &  ansari@lal.in2p3.fr       \\
C. Magneville        &  cmv@hep.saclay.cea.fr     
\end{tabular} 
\\[5mm]
\today 
\end{center}
\end{titlepage}

\newpage
\tableofcontents
\newpage

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\groupe{De V2.1 (Dec2007) à V2.2 \ldots }
\titre{Global}
\begin{itemize}
\item[\rond] Fev 2009 : Changement de {\tt char *} en {\tt const char *} dans le code pour 
éviter les message {\it deprecated} du compilateur lors de l'utilisation de chaîne de caractère constante.
\end{itemize}

\titre{BaseTools}
\begin{itemize}
\item[\rond] Avril 2009 : Introduction de la classe RandomGeneratorInterface, DR48RandGen, ThSDR48RandGen
 et FMTRandGen - La classe ThSDR48RandGen RandomGenerator 
\item[\rond] Mars 2009 : Les exceptions sophya (PExceptions ...) héritent de de std::exception (methode what())
\item[\rond] Oct 2008 : Suppression des flags {\tt OS\_xxx (OS\_MACOSX OS\_LINUX OS\_AIX ...) }
de machdefs\_mkmf.h et ajout constructeur MuTyV(uint\_4, uint\_8)
\end{itemize}

\titre{TArray}
\begin{itemize}
\item[\rond] Fev 2009 : Correction du bug de SetTemp() intempestive provoquant sur-écriture de 
tableaux lors d'opération avec des SubArray.
\item[\rond] Jan 2008 : Correction bug de protection dans TArray::Resize() \\
(lors de resize avec  ndim=BASEARRAY\_MAXNDIMS = 5) 
\end{itemize}

\titre{SkyMap/Samba}
\begin{itemize}
\item[\rond] Sep 2008 : Nettoyage cosmetique ds lambdaBuilder.h .cc - {\bf A FAIRE :} rendre 
LambdaLMBuilder thread-safe.
\item[\rond] Aout 2008 {\bf (Samba)}: Nettoyage cosmetique ds alm.h .cc, utilisation de la
classe RandomGenerator par la classe Alm$<$T$>$. Possibilite de specifier un objet 
RandomGenerator au constructeur de la classe SphericalTransformServer. Adaptation 
programme PrgMap/cl2map.cc.
\item[\rond] Aout 2008 {\bf (SkyMap)} : modifs/correction ds la classe SphereECP$<$T$>$.
Ajout m\'ethode \\ 
{\tt SphereECP<T>::ExtractPartial() } \hspace{5mm} et correction calcul phi ds  \\ 
{\tt SphereECP<T>::PixThetaPhi() } et modif programme Tests/tsphereecp.cc
\end{itemize}

\titre{NTools}
\begin{itemize}
\item[\rond] Oct 2008 : Instanciation explicite des classes  
\tcls{Image} et \tcls{ArrayFitter} pour T=uint\_4, uint\_8
\end{itemize}

\titre{SysTools}
\begin{itemize}
\item[\rond] Dec 2009: Introduction des classes {\bf ParallelTaskInterface, ParallelTaskFunction}
et {\bf ParalExThread, ParallelExecutor} afin de faciliter l'écriture de code avec exécution de 
fonctions en parallèle dans des threads. Voir les fichier {\tt SysTools/parlex.h .cc} 
et {\tt Tests/tparlex.cc}.
\item[\rond] Fev 2009 : Amélioration conversion double->string pour éviter la perte de 
précision lors des évaluations avec les variables de l'interpréteur (commander.cc). 
\item[\rond] Fev 2009 : Amélioration de la classe {\bf Timer}, précision time-elapsed 
par utilisation {\tt gettimeofday(...)} au lieu de {\tt time()}, 
amélioration calcul temps cpu pour jobs tres long (lorsque TCPU dépasse le maximum $2^{32}$.
\end{itemize}

\titre{FitsIOServer}
\begin{itemize}
\item[\rond] Avril 2008 : Ajout m\'ethodes de lecture/écriture tableaux avec offset: \\
{\tt FitsArrayHandler::ReadAtOffset()  , WriteAtOffset() } \\
$\longrightarrow$ Possibilité de lecture/écriture de tableaux par morceaux 
de HDU IMAGE 
\item[\rond] Jan 2008 : Ajout {\tt FitsInOutFile::SetBScaleBZero(...)} et type LONGLONG 
pour HDU\_Image.  Enregistrement conditionnel handler TArray$<$int\_8$>$.
\end{itemize}

\titre{PI/piapp}
{\bf IMPORTANT }\\
{\bf A1} Reste a faire : debug / prise en charge des images avec tables de couleurs de plus de
256 entrees dans fichier postscript. \\
{\bf A2} Utiliser la classe PICMapDrawer dans le widget PICMapView et ajouter la possibilité d'afficher une table 
de couleur dans PIScDrawWdg. 
\begin{itemize}
\item[\rond] Introduction de la classe classe {\bf PICMapDrawer}  et ajout de la possibilité d'afficher 
la table de couleur dans la fenêtre principale PIImage. L'attribut graphique {\tt showcmap} contrôle
l'affichage de la table. \\
{\tt showcmap  , showcmap=no , showcmap=top , \\ 
showcmap=no/top/right/bottom/left/horiz/vert } 
\item[\rond] Dec 2009: Ajout des options d'affichage : \\
{\tt cdreal   cdimag   cdphase cdmod (=defaut)  cdmod2 } \\
pour les tableaux 2D en mode image ou surface. Fichiers modifiés: 
nomtarradapter.cc , nomtmatvecadapter.cc , pitvmaad.cc , pitvmaad.h. 
\item[\rond] Ajout de gestionnaire d'évenements VisibilityChange ds pixtbase.cc pour gérer les 
problèmes de fenêtre PIBaseWdg non rafraîchie - suppression de {\tt XFlush()/usleep() }mis 
dans piwindowx.cc en Aout 2007
\item[\rond] Jan 2009 {\bf PI , PIext} Extension de la logique AutoFontSize (choix automatique de 
la taille de fonte comme fraction de la taille du widget a tous les PIDrawer. Valeur globale par defaut 
en variable et méthode statique de PIDrawer (=0.04). Changement possible par variable d'environnement 
{\bf PIDEFAFSZFRAC} et la commande piapp {\bf  setdefafsz }.
\item[\rond] Nov 2008 {\bf PIext} Ajout commande {\bf pirgbdisp} - Lecture et affichage d'image RGB
(objet  PIPixRGBArray) 
\item[\rond] Nov 2008 {\bf PI} Optimisation classe LUT, introduction typeExp
\item[\rond] Oct 2008 {\bf PIext} : Instanciation explicite et enregistrement des adaptateurs NObjMgrAdapter pour TArray, et TMatrix/TVector $<$T$>$ pour T=uint\_4, uint\_8
\item[\rond] Sep-Nov 2008 {\bf PI} : Modifs importantes pour permettre la visalisation des images 
ou photos couleurs (RGB) ds piapp : 
\begin{enumerate}
\item  Introduction des classes auxiliaires PIPixColIdx , PIPixRGB , PIPixRGBArray
(nouveau fichier pipixutils.cc .h) pour support de tables de couleurs avec $>$ 256 couleurs.
\item Ajout de tables de couleurs RGB (RGB216CM , RGB512CM, RGB4096CM, RGB32768CM) 
pour representation d'images/photos couleurs RGB
\item Extension et modification de la classe P2DArrayAdapter, introduction de la methode 
P2DArrayAdapter::MeanVal()
\item Modif de la classe LUT pour introduction typeRGB et methode LUT::ApplyRGB()
\end{enumerate}
\item[\rond] Avril 2008 {\bf (PI)}: Ajout d\'ecodage options sens des axes X,Y à PiScDrawWdg. \\
{\tt revax = axerl } (kAxeDirRtoL) \hspace{5mm}  {\tt axelr}   (kAxeDirLtoR) \\
{\tt revay = axeud}  (kAxeDirUpDown) \hspace{5mm} {\tt axedu} ((kAxeDirDownUp)
\item[\rond] Fevrier 2008 {\bf (PI)}: Nouvelle m\'ethode de calcul de limite de LUT\\
On garde les $frackeep$ valeurs centrales des pixels, cad on vire les $(1-frackeep)/2$
valeurs les plus petites et les $(1-frackeep)/2$ valeurs les plus grandes.
\begin{verbatim}
  autolut=hisrng,frackeep,min,max
\end{verbatim}
\item[\rond] Janvier 2008 {\bf (ProgPI)} Ajout de l'option {\tt -nobsz} à la commande {\bf readfits}
et ajout de la commande de lecture array from fits : {\bf rdfitsarr}
\end{itemize}

\groupe{De V2.0 (Sep2006) à V2.1 (Nov2007) }
\titre{BuildMgr} 
\begin{itemize}
\item[\rond] Nov 2007 : configure detecte Linux 64 bits {(\tt -> /usr/X11R6/lib64)}
et correction bug lors de l'execution de sed pour la creation de sophyamake.inc 
{\tt AIX, -X 64 }.
\item[\rond] Oct 2007 : Ajout flag {\tt -alsofftwfloat} au script pour compilation/link
methodes float (r\_4) de FFTWServer.
\item[\rond] Avril 2007 :  Amélioration du script configure, qui prend en charge 
la gestion des différents flags de compilation (mis dans fichier machdefs.h généré
ou dans sophyamake.inc (pour les flags du compilateur) - Nettoyage du fichier 
BaseTools/machdefs\_mkmf.h et des fichiers osname\_compilo.inc
\begin{verbatim}
csh> cd BuildMgr/
csh> ./configure -h
configure [-sbase SOPHYABASE] [-scxx SOPHYACXX] [-incln] 
  [-minc mymake.inc]  [-compopt 'cc/cxxOptions'] 
  [-arch64] [-sasz64] [-nofpic] [-nothsafe] [-boundcheck] [-sodebug]
  [-extp dir1 -extp dir2 ...] [-extip dir1 -extip dir2 ... ] 
                   [-extlp dir1 -extlp dir2 ... ]
  [-noextlib] [-noext fits] [-noext fftw] 
                     [-noext lapack] [-noext astro]
  [-noPI] [-slballinone]
  [-usefftw2 -uselapack2] 
  (See SOPHYA manual/web pages for a detailed description 
   of configure options)
\end{verbatim}
\end{itemize}

%%%%%%
\titre{BaseTools} 
\begin{itemize}
\item[\rond] Novembre 2007 : Ajout de la classe de générateur aléatoire
thread-safe {\bf RandomGenerator } - fichiers {\tt stsrand.h .cc} - 
Ajout du programme {\tt Tests/tmtrnd,3.cc }.\\
Correction , protection I/O PPF pour NDataBlock de taille nulle.
\item[\rond] Aout 2007 : Passage numéro de version SOPHYA V=2.135 
à V=2.046 - Les numéros V=A.B sont désormais réservés aux versions 
avec un tag cvs.
\item[\rond] Avril 2007 : {\bf ThreadSafe } \hspace{5mm}
Les opérations de partage de référence rendues thread-safe pour les classes 
{\bf NDataBlock$<$T$>$ , SegDataBlock$<$T$>$, SwSegDataBlock$<$T$>$} 
\begin{itemize}
\item Ajout de la classe {\bf ThSafeOp} avec les méthodes {\tt lock() , unlock() } utilisant 
un mutex. 
\item Ces méthodes peuvent être rendues transparentes (sans effet) en activant le flag \\
{\tt SO\_NOTHSAFE} (option -nothsafe de configure) 
\item Cette protection / synchronisation semble être efficace en ce qui concerne les 
constructeurs de copie et l'extraction de sous-tableaux pour TArray, TMatrix,TVector.
(programme de vérification Tests/zthr.cc - option sync ).  
\item En ce qui concerne les classes SegDataBlock , SwSegDataBlock, l'efficacité 
de la protection n'a pas été testée. Les opérations d'écriture sur les DataTable 
devront aussi  être protégées pour l'utilisation multi-thread.
\end{itemize}
\item[\rond] Avril 2007 :  Nettoyage du fichier machdefs\_mkmf.h, suppression des flags 
de compilation optionnelle MacOS 8.x  9.x / compilo CodeWarrior
\item[\rond]  Fev 2007 :  Ajout methode NDataBlock::RenewObjId() , et Dealloc() (alias de Delete())
et correction bug ds SwSegDataBlock::GetCstSegment() 
\end{itemize}

%%%%%%
\titre{TArray} 
\begin{itemize}
\item[\rond] Oct 07 : Méthode TArray::SumX2() renommée en SumSq(), Norm2() appelle SumSq() sauf pour les tableaux complexes, où on calcule une norme réelle positive (Sum[el x conj(el)).
\item[\rond] Avr 07 : Constructeur de copie et extraction de sous-tableaux rendus thread-safe 
(voir ci-dessus)
\item[\rond]  Jan 07 : Ajout classes/methodes de cast de contenu - sans conversion (fichier arrctcast.h)
\item[\rond]  Fev 07 :  Ajout methode TArray::RenewObjId() (reecriture PPF), et ZeroSize()
(deallocation tableau / le rendre vierge=sans taille)
\end{itemize}

%%%%%%
\titre{HiStats} 

\begin{itemize}
\item[\rond] Novembre 2007 : Les methodes de remplissage de NTuple {\tt Fill() }
et de DataTable, SwPPFDataTable {\tt AddRow() }, ainsi que 
{\tt BaseDataTable::GetRow() } rendues thread-safe. \\
Activation avec la methode {\tt SetThreadSafe(bool fg=true)  }
pour chaque NTuple ou DataTable / SwPPFDataTable. Ajout du programme Tests/tmtdt.cc.
\item[\rond]  Janvier 2007 : Remaniement de la classe HistoErr: elle n'h\'erite plus
de Histo et devient stand-alone avec des TVector comme support des donne\'ees. \\
Introduction de la classe Histo2DErr qui fait la meme chose que HistoErr
mais \`a $2$ dimensions. \\
Modifs des adaptateurs: NOMAdapter\_Histo ne contient plus HistoErr,
et NOMAdapter\_HistoErr, NOMAdapter\_Histo2DErr sont cr\'ees dans PIext.

\end{itemize}

%%%%%%
\titre{SkyMap} 

\begin{itemize}
\item[\rond]  Aou 2007 :  Correction de signe dans {\tt LocalMap::PixToSphereC()} suite message de
S. Plaszczynski du 12/07/07
\item[\rond]  Fev 2007 :  Ajout methode RenewObjId() (reecriture PPF) pour les cartes spheriques 
et localmap
\end{itemize}

%%%%%%
\titre{SysTools} 

\begin{itemize}
\item[\rond]  Jul 2007 :  Ajout d'acces au temps CPU et elapsed ds la classe Timer - et 
ajout test specifique dans Tests/tcmd.cc {\tt (tcmd timer)}. \\
{\tt Timer::TotalElapsedTime() , PartialElapsedTime() , TotalCPUTime() , PartialCPUTime() }
\end{itemize}

%%%%%%
\titre{FitsIOServer}

\begin{itemize}
\item[\rond] Nov 2007 : propagation des modifs BaseDataTable-Thread-safe dans 
SwFitsDataTable. Mais les SwFitsDataTable NE sont toujours pas thread-safe.
\item[\rond]  Jan/Fev 2007 :  Passage a la version LONGLONG  ( fits\_xxxll ) permettant 
la gestion de tailles $ > 2^{32} $
\end{itemize}

\titre{IFFTW}

\begin{itemize}
\item[\rond] Nov 2007 : Correction resize tableau de sortie {\tt FFT(complexe -> reel)} multi-dim.
\item[\rond]  Oct 2007 :  Ajout version float (r\_4) des methodes {\tt FFTForward} et {\tt FFTBackward}
a la classe FFTWServer. (compilation sous condition et flag -alsofftwfloat du script configure)
\end{itemize}

%%%%%%
\titre{PI/piapp}
\begin{itemize}
%%%
\item[\rond] Novembre 2007 {\bf PIext/ProgPI}: \\
- Ajout commande de trace d'ellipse d'erreur {\tt errorellipse} \\
- Axes en degres (0..360, -90..90) pour la projection molleweide et adaptation de la commande {\tt mollgrid}. Suppression de mollgridsph. \\
- Ajout fonctions tetphi2mollX/Y() et longlat2mollX/Y() ds les fichiers d'expressi
on ntuple generes par piapp pour trace sur projection de type molleweide. \\
- Ajout flag [-s] a openppf . openfits/savefits comme alias de readfits/writefits.
- Verification arret thread Reveil avant destruction de l'objet. 
\item[\rond] Octobre 2007 {\bf (PI/PIext)}: Ajout methodes de redirection stdout/stderr vers un objet PIConsole, 
a travers un fichier disque (fichiers PI/piapplx.h .cc) avec possibilite de recopie sur stdout/stderr 
original (terminal) - en plus d'affichage sur PIConsole. \\
+ Adaptation au niveau de PIext/pistdimgapp.h .cc et ProgPI/piapp.cc \\
+ la redirection passe par les fichiers PIATmp\_xxx/sout.log /serr.log \\
+ le flag (s)piapp -doublered permet la redirection avec recopie sur terminal
%%%
\item[\rond] Octobre 2007 {\bf (PIext)}: Correction/protection au niveau de gestion des locks de mutex 
(classes NamedObjMgr , PIStdImgApp) pour eviter les blocages de l'application sous certaines 
conditions ( lors de l'affichage de la fenetre de gestion d'objets  et lecture PPF). \\
Modification des classes NamedObjMgr . ObjMgrWind, la methode 
{ \tt UpdateObjMgrWindow() } de NamedObjMgr en particulier. \\
Ajout de la classe {\bf SOpExObj} (ds piacmd.h piacmd.cc) pour executer 
- de maniere asynchrone - 
les commandes display,print \ldots  sur les objets, initiees au niveau 
de la boucle d'evenements (fenetre ObjMgrWind).
\item[\rond] Octobre 2007 {\bf (PIext)}: Ajout attributs graphiques \\
{\tt samew=WdgName } specification de widget cible pour trace en superposition \\
{\tt wname=Nom } Pour specifier un nom de widget (= nom d'objet par defaut) \\
{\tt inset=fx1,fx2,fy1,fy2 } pour specifier la position du drawer en inset (medaillon)
\item[\rond] Octobre 2007 {\bf (PIGcont/PIext)}: Codage méthode PIContourDrawer::GetOptionsHelpInfo() pour le traceur de contour. \\
Ajout accès aux attributs {\tt min max minmax sumsq norm2 } aux niveau des adaptateurs 
des objets de type TArray, TMatrix, TVector ({\tt \$\{arrName.sumsq\} \$\{arrName.min\} } \ldots).
\item[\rond]  Aout 2007 {\bf (PI)}: Nouvelles méthodes de calcul de limite de LUT
dans PIImage (AutoLut) et ajout du décodage de l'option {\tt autolut=alt[,ns[,minp,maxp]]}.
Si {\tt minp,maxp} spécifiés, seuls les pixels entre {\tt minp <= pixval <= maxp} 
sont utilisés pour le calcul des limites.
\begin{verbatim}
  autolut=minmax,frac   Fraction de la dynamique totale
  autolut=meansig,ns   min=mean-ns*sigma , max=mean+ns*sigma
  autolut=histail,ns   Queue de l'histo des pixels 
  autolut=hispeak,ns  Pic de l'histo des pixels
\end{verbatim}
%
\item[\rond]  Aout 2007 {\bf (PI)}:  Contournement d'un problème d'évenements X expose 
perdu - apparu avec des versions récentes du serveur XFree ou le serveur X sur Linux
ou une combinaison des deux. Résultat, contenu non affiché lors d'une création de fenêtre
suivi d'un ajout de PIBaseWidget (sauf PIImage) et plantage lors du click dans la fenêtre.
Correction: Ajout de {\tt XFlush() + usleep(5000)} (5 $\mu$s). 
\item[\rond]  Juin 2007 {\bf (PI/PIext)}:  Ajout des méthodes 
{\tt PIGraphicAtt::ColNameToColor() , ColIndexToColor()} et possibilité d'utiliser le contenu
d'une colonne d'une table comme nom de couleur ou numéro de couleur pour le tracé
des markers par PINTuple {\tt PINTuple::SelectColorByName() , SelectColorByIndex()}.
Ajout des commandes {\bf nt2dcn} et {\bf nt2dci}  et {\bf plot2dc}  ds piapp. 
\item[\rond]  Avril 2007 {\bf (PI)}:  La source des problèmes sur MacOS/PowerPC (G4/G5)
et AIX (architecture Power) a finalement été identifié et corrigé/
Parmi ces problèmes:  des pull-down menus mal placés (MenuBar), ou encore des 
dysfonctionnement de boutons dans les fenêtres de dialogues. \\
Source et correction: \hspace{5mm} {\tt XtMoveWidget / XtResizeWidget} remplacé par \\
\hspace*{10mm} {\tt XtMakeGeometryRequest}   
\item[\rond]  Avril 2007 {\bf (PIext/piapp)}: 
\begin{itemize}
\item Ajout de la classe {\bf NOMAdapter\_DVList}
pour la prise en charge des objets DVList. 
Accès aux variables par {\tt \$\{dvlName.varName\} } 
\item Accès à l'objet DVList attaché aux TArray, TMatrix, DataTable et NTuple par \\
\hspace*{5mm}  {\tt \$\{objName.info.varName\} }
\item L'adaptateur de DataTable permet aussi d'accéder aux lignes de la table par \\
\hspace*{5mm} {\tt \$\{tableName.row.num\} }
\item Prise en charge de la classe {\tt Image<T>} par l'adaptateur des matrices 
{\tt NOMAdapter\_TMatrix<T> } au lieu de l'adaptateur spécifique 
{\tt NOMAdapter\_Image<T>  }
\end{itemize}
\item[ \rond] Janvier 2007  {\bf (PIext)}:  modification des trac\'es des histogrammes PIHisto.
La classe PIHisto prend en entr\'ee un wrapper P1DHistoWrapper.
Les wrappers HistoWrapper et HistoErrWrapper sont cr\'ees.
Ainsi les HistoErr peuvent \^etre dessin\'es sous forme d'histogrammes.
Mise en place des options graphiques permettant de dessiner les
valeurs (``val''), erreurs (``err'') et le nombre d'entr\'ees par bin (``nb'')
pour les HistoErr. Idem pour les versions $2$ dimensions.
\end{itemize}

%%%%%%%%
\titre{Documentation (Manual/) } 
\begin{itemize}
\item[\rond]  Jan 2007 :  Ajout fichier de mesure de performances comparees entre 
differentes processeur / OS / compilateur {\tt perfmachine.txt }
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\groupe{De V1.7 (Sep2003) à V2.0 (Sep2006) }
\titre{BuildMgr} 
\begin{itemize}
\item[\rond] Juin 2006 :  Ajout targets cleanobj prgall tests prgutil
\item[\rond] Avril 2006 :  suppression de libextsophya.so pour fabriquer libPI.so 
(PIext rendu independant de FitsIOServer) 
\item[\rond] Dec 2005/Jan 2006 :  Portage sur AIX - xlC 
\item[\rond] Dec 2005 : check Compil avec icc , compil avec gcc-4
\item[\rond] Avril-Mai 2005 : Introduction de la nouvelle version de
scripts de gestion du code - avec un script principal configure. \\
Variable d'environnement {\bf SOPHYABASE } - \\
Pour les makefiles, l'ensemble des définitions se trouve dans : \\
SOPHYABASE/include/sophyamake.ic \\
\end{itemize}

%%%%%%
\titre{BaseTools} 

\soustitre{Modifs} 

\begin{itemize}
\item[\rond] Jun/Jul 2006 : Amelioration gestion initialiseur modules \\
- Ajout methodes statique  {\tt RegisterModule(const char* name, double version)
ListModules(ostream\& os) } a la classe de base SophyaInitiator. \\
- Enregistrement des modules avec leur nom et un numero de version par module,
independante du numero de version SOPHYA \\
- le programme scanppf peut donner la liste des modules enregistrees et leur numero 
de version. 
\item[\rond] Octobre-Novembre 2005 :  \\
1/ Correction bug TimeStamp::ToDays() + petites amelioration \\
2/ Prise en compte du type TimeStamp dans MuTyV (sous forme de double en interne) \\
3/ Adaptation DVList a modifs MuTyV (typ TimeStamp) et R/W PPersist \\
4/ Gestion format YYYY-MM-DDThh:mm:ss par TimeStamp \\
5/ Gestionnaire PPersist pour TimeStamp
%
\item[\rond] Septembre 2004 - {\bf Namespace SOPHYA } \\
Suppression de {\tt using namespace SOPHYA ; } ds machdefs.h - 
Ajout fichier {\tt \#include "sopnamsp.h"} dans les .cc de SOPHYA,
ainsi que lors de la génération automatique du code (runxx, c++exec) 
\end{itemize}
 
\soustitre{PPF}
\begin{itemize}
\item[\rond] Avril 2005 - Ajout de wrapper de lecture/ecriture PPF pour les vecteurs de
la librairie standard (classe PPFWrapperSTLVector$<$T$>$ ) fichier ppfwrapstlv.h
\item[\rond] Ajout de la classes utilitaire PPF\_TPointer\_IO$<$T$>$ 
(fichiers ppftpointer.h .cc)
\item[\rond] Amelioration de l'impression ds AnalyseTags (ppfbinstream.cc)
\item[\rond] scanppf.cc revision 1.8 (2005/04/05)
modification programme scanppf: ajout option -lh -lho pour lister les classes PP
ersist handler
\item[\rond] Décembre 2003 (9/12/2003) Fin de l'ensemble des modifs pour les
PPF V3 \\
- Ecriture nombre complexes r4, r8 avec tag spécifique. \\
Tag de positionnement sous forme de \\
\centerline{\tt <tag (1 byte)><FilePosition (8 byte, long int)> } \\
- Ecriture PosTagTable \\
- Ecriture Statistiques en fin de fichier \\
- Voir BaseTools/ppfbinstream.h: \\
\centerline{\tt  GotoPositionTag(int\_8 pos) , } 
\centerline{\tt  GetPosTagTable(...) } 
\centerline{\tt  int\_8 WritePositionTag() PutPosTagTable(...) } 
- Ajout programme de test Tests/ppftswap.cc
\item[\rond] Décembre 2003 - Ajout ppfbinstream.h .cc \\
Classes PPFBinaryIOStream , PPFBinaryInputStream , PPFBinaryOutputStream
\item[\rond] Novembre 2003 (21/11/2003) - Ajout rawstream.h .cc \\
Classes RawInOutStream  ,  RawInFileStream , RawOutFileStream

\end{itemize}


\soustitre{Nouvelles classes}
\begin{itemize}
\item[\rond] Ajout de la classe {\bf TimeStamp} pour la manipulation de date et heure - 
calcul de duree. - Ajout du prog. test Tests/ttimestamp.cc (Mars 2005) 
\item[\rond] { \bf Segmented Data Block :}  \\
Mars-Avril 2005: Introduction des classes similaires aux NDataBlock, mais permettant 
de gerer des blocs de donnees segementes, pour tout type de donnees, de structures
et de classes (template pour tout type T). 
\begin{enumerate}
\item  Ajout de la classe {\tt SegDataBlock<T>} (et l'interface { \tt SegDBInterface<T>} )
pour la gestion de blocs de donnees segmentes (segdatablock.h) et son
gestionnaire PPF {\tt FIO\_SegDataBlock<T>}  (fichier fiosegdb.h )
\item Ajout de la classe {\tt SwSegDataBlock<T>} (Data bloc segmente avec gestion
de swap) et la classe swapper PPF {\tt PPFDataSwapper<T>} (fichiers
ppfswapper.h et swsegdb.h)
\item Ajout programme de test Tests/tstsegdb.cc 
\end{enumerate}
\end{itemize}

%%%%%
\titre{TArray}
%%
Il s'agit essentiellement des ameliorations en terme de performances et 
de correction d'erreur. 

\begin{itemize}
\item[\rond] Avril 2006  \\
- Instanciation explicite des tableaux , matrices et vecteurs en types \\
{\tt int\_2 uint\_2 uint\_4 uint\_8 } \\
- Optimisation du code (ds tarray.cc) des operations sur tableaux  \\
{\tt (TArray::Add/Mul/Sub/DivCst  TArray::Add/Mul/Sub/DivElt ) } \\ 
a travers le  choix entre Share() ou Allocation si le tableau resultat est non alloue. 
D'apres les tests de performances (TCPU), {\bf (tjet , spar)}, il ne semble pas y 
avoir de cas de pertes, et on a en general des gains de l'ordre de 20\% dans la plupart 
des cas de tests,  et un ou deux cas avec des gains de 50-80\%. \\
- Declaration de l'operateur / entre tableaux (DivElt) et l'operateur \& \& pour la 
multiplication element par element (MulElt)   
\item[\rond] Janvier, Février 2006  \\
- Amélioration des fonctionalités de la classe {\bf Range} et  des méthodes d'extraction
de sous-tableaux (+ correction bugs et amélioration documentation) \\ 
- Ajout de la methode BaseArray::ValueAtPositionDB() pour corriger un gros bug au 
niveau de la conversion de type (r\_4 r\_8 ...) des tableaux \\
- Compil avec g++ 4 : ajouts fichiers declarations privees tmatrix\_tsnl.h tvector\_tsnl.h 

\item[\rond] Juillet 2004 \\
- Optimisation de la multiplication matricielle (CMV) - Extrait du 
message (from CMV) du 30 Juillet 2004: \\
\begin{verbatim}
- on definit un flag d'optimisation
  Contrairement a ce qu'on avait dit, je n'ai pas ajoute
  un argument a Multiply car on ne peut pas jouer
  avec qiand on utilise l'operateur * surcharge.
  Or au vu des performance il'ma parut interessant que l'utilisateur
  meme lambda puisse choisir le niveau d'optimisation
  --> donc j'ai ajoute une methode statis dans BaseArray::
    void BaseArray::SetMatProdOpt(uint_2);
    uint_2 BaseArray::GetMatProdOpt();

- Je n'ai refait les test de rapidite que sur OSF:

1./  pour les matrices 1000x1000 (grosses)
  on arrive effectivement au meme temps pour les 4 cas
  si on copie dans le cas lent (FxC)
  ---EndMultiply FxC  CPUTime: Total= 93.1296  (Partial= 69.3806) Sec.
  devient
  ---EndMultiply FxC  CPUTime: Total= 34.9653  (Partial= 11.1829) Sec.
  exactement comme les copains:
  La copie prend de la place mais ne prend absolument
  pas de temps pour les grosses matrices

2./ pour les matrices 10x10 (1000000 multiplications par cas)
  on a bien ce que l'on attend a savoir que
  la copie faites 100000 fois finie par nous faire perdre du temps
  ---EndMultiply FxC  CPUTime: Total= 37.4152  (Partial= 12.4662) Sec.
  devient
  ---EndMultiply FxC  CPUTime: Total= 53.9978  (Partial= 28.8322) Sec.
  dans ce cas on perd un gros facteur 2 a cause de la copie
  mais rien de surprenant la dedans.

-----------------------------------------------------------------------
- ensuite j'ai implemente une prise de decision au niveau de
l'optimisation pour les petites matrices:
le test est simple mais me semble OK:
je calcule sza taille du NDataBlock de A
           szb                         B
si ((sza+szb)*sizeof(T) < 100000 ) pas d'optimisation
IDEE: on pifometre que raisonnablement il y a 100 koctets
   de disponible pour les matrices A et B dans le cache processeur
   et que dans ce cas elles sont copiees toutes les 2 dans le cache
   par l'optimiseur du compilo qui est tres malin et surtout qui
   veux absolument nous faire plaisir......

-----------------------------------------------------------------
===> Les resultats sont dans le fichier toto.calc en attached
.. En tete tu as l'explication des flags d'optimisation
...Avec les 2 sections:
    GROSSE MATRICE
       et
    PETITE MATRICE
\end{verbatim}

\item[\rond] Juillet 2004 : Optimisation operations diverses, en particulier \\
1) Remplacement des methodes Add/Sub/Mul/DivElt(a) par
   Add/Sub/Mul/DivElt(TArray a, TArray res) \\
2)  Operateurs += -= A+B A-B TArray et TMatrix/TVecteur modifies en consequence
\item[\rond] Extrait de {\tt cvs log tarray.cc } 
{\small \begin{verbatim}
----------------------------
revision 1.38
date: 2004/07/30 13:31:39;  author: ansari;  state: Exp;  lines: +28 -24
Diverses petites optimisations ds les methodes operations/affectations de TArray - Reza 30 Juillet 2004
----------------------------
----------------------------
revision 1.36
date: 2004/07/27 11:44:23;  author: ansari;  state: Exp;  lines: +4 -1
Corrections bug apres modifs methods Add/Sub/Mul/DivCst(x,res) - Reza 27 Juillet 2004
----------------------------
revision 1.35
date: 2004/07/26 17:30:40;  author: ansari;  state: Exp;  lines: +187 -108
Remplacement methodes Add/Mul/Sub/Div(T x) par AddCst/MulCst/SubCst/DivCst(T x, TArray<T> res) ds TArray - Reza 26 Juillet 2004
----------------------------
\end{verbatim} }

\item[\rond] Extrait de {\tt cvs log tarray.cc } 
{\small \begin{verbatim}
----------------------------
revision 1.27
date: 2004/07/30 10:24:12;  author: cmv;  state: Exp;  lines: +97 -32
- Intro decision auto d'optimisation produit de matrices
- Possibilite a l'utilisateur pour choisir l'optimisation
- cas FxC optimise par copie
                cmv 30/07/04
----------------------------
revision 1.26
date: 2004/07/29 12:31:16;  author: ansari;  state: Exp;  lines: +7 -5
1/ Remplacement des methodes Add/Sub/Mul/DivElt(a) par
   Add/Sub/Mul/DivElt(TArray a, TArray res)
2/ Operateurs += -= A+B A-B TArray et TMatrix/TVecteur modifies en consequence
3/ Ajout methode TArray::ScalarProduct()
4/ Methode TArray::SetT renomme en SetCst() SetT garde en alias
5/ Ajout parametre bool fzero (mise a zero) ajoute ds constructeur et
   ReSize() de TMatrix et TVecteur.
                                          Reza 29/07/2004
----------------------------
revision 1.25
date: 2004/07/29 08:40:49;  author: cmv;  state: Exp;  lines: +148 -1
Optimisation produit de matrice a la sauce cmv 29/07/04
----------------------------
\end{verbatim}  }

\end{itemize}


%%%%%%%%
\titre{HiStats} 
%%%%%
\soustitre{Classe Histo,HProf,HistoErr,Histo2D } 
\noindent
- Aout 2006 : refonte profonde des allocations memoire et delete de
 Histo,HProf,HistoErr,Histo2D pour faciliter la gestion des IO FITS. \\
- Sept 2004 : Ajout classe HistoErr. 
C'est un Histo qui garde le nombre d'entr\'ees dans chaque bin) \\
\soustitre{NTuple}
la classe NTuple peut maintenant avoir des colonnes float ou double.
Il y a maintenant deux methodes Fill(r\_4 *) et Fill(r\_8 *)
Les noms ne sont plus limites a 8 caracteres.


\soustitre{ Les DataTable (SuperNTuple) }

{\bf Octobre-Novembre 2005 } \\
\begin{itemize}
\item[\rond] Ajout classe {\bf DataTableRow} pour manipulation d'une ligne de la table.
Ajout/maj methode BaseDataTable::EmptyRow() AddRow() GetRow() 
\item[\rond] Gestion des types {\tt complex<r\_4>  ,   complex<r\_8>  , TimeStamp } par 
BaseDataTable, DataTable et SwPPFDataTable
\item[\rond] Codage methode Print() (Dump ascii) et NTFrAscii (decodage fichier 
text) dans BaseDataTable. 
\item[\rond] Codage méthode BaseDataTable::GetColumnD() pour recuperer
une colonne de la table en {\tt TVector<r\_8>} - NON TESTE 
\end{itemize}

\begin{verbatim}
BaseDataTable                                    
              --------  DataTable
              --------  SwPPFDataTable
\end{verbatim}

\noindent {\bf BaseDataTable} : Classe de base, avec qques methodes virtuelles
pures, implementent la presque totalite des fonctionalites, en particulier
celles de l'interface NTupleInterface.

\noindent {\bf DataTable} : Implementation concrete de BaseDataTable avec donnees en 
memoire \\ 
(utilise SegDataBlock$<$T$>$ pour stocker les colonnes)

\noindent {\bf SwPPFDataTable} : Implementation concrete de BaseDataTable avec donnees 
en swap sur stream PPF (POutPersist)- \\ 
Utilise  (SwSegDataBlock$<$T$>$ avec 
un data-swapper PPF (classe PPFDataSwapper$<$T$>$ ) 

DataTable et SwPPFDataTable respecte +/- les conventions SOPHYA , 
constructeur de copie avec partage ou copie de donnees, operateur = 
Datatable : partage et copie , = : fait une copie
SwPPFDataTable : C'est toujours partage (presque par definition)
Autre point, compte tenu de la structure des streams PPF , 
les SwPPFDataTable fonctionne en ecriture OU en lecture, mais
pas les deux a la fois. 

Classe de gestion de persistence commune : \\
{\bf ObjFileIO$<$BaseDataTable$>$ }

Lit et ecrit les DataTable et SwPPFDataTable
Actuellement, on ne peut les relires que dans le meme type,
cad on ne peut relire avec un SwPPFDataTable un objet 
ecrit comme DataTable - mais cette possibilite pourra 
peut-etre codee ulterieurement (d'ou l'interet en particulier 
d'un gestionnaire commun ObjFileIO$<$BaseDataTable$>$

(les operateurs habituel $<<$ et $>>$ sur PIn/OutPersist sont definies)


Les merges et copie sont prevues, 
on doit en principe pouvoir ecrire par exemple:
\begin{verbatim}
SwPPFDataTable swdt;
PInPersist pis("swdt.ppf");
pis >> swdt;
DataTable dt;
dt = swdt;  // Pour tout charger en memoire 
\end{verbatim}

{\it On pourra aussi ajouter des methodes d'acces aux variables 
membres pour enrichier l'interface. }


{\bf DataTable cote PIAPP :} \\ 
Cote piapp, les DataTable et SwPPFDataTable  sont pris en charge par 
{\tt NOMAdapter\_DataTable} (qui prend en charge tous les 'BaseDataTable' )
Il faudrait peut-etre rajouter deux commandes : \\
newdt ou newdatatable 
newdt ncol col1 [col2 .... ]  \\
avec possibilite de specifier coli sous fome de X:colname ou X = D,F,S,I,L ...
et puis dtfromascii  ...

Voir Tests/tnt.cc pour exemple d'utilisation :
\begin{verbatim}
DataTable dt(64);
dt.AddIntegerColumn("line");
dt.AddDoubleColumn("x");
dt.AddFloatColumn("f_sin");
MuTyV rec[10];
for(int k = 0; k<1000; k++) {
  rec[0] = k;
  double x = M_PI*k/100.;
  double fx = sin(x)*cos(x);
  rec[1] = x;
  rec[2] = sin(x);
}
 POutPersist po("dtable.ppf");
 po << dt;
\end{verbatim}

Pour SwPPFDataTable, il faut juste creer un stream PPF avant, qui doit rester
ouvert tant que le SwPPFDataTable est actif: \\
\begin{verbatim}
 POutPersist po("swdtable.ppf");
 SwPPFDataTable dt(po, 64);
\end{verbatim}



\titre{SkyMap} 
%%%
\begin{itemize}
\item[\rond] Juin 2006: Prise en charge du rangement mémoire {\bf NESTED} dans 
les SphereHEALPix , + I/O PPF et FITS
\item[\rond] Juin 2006:  Nettoyage et améliorations diverses dans les classes 
Vector3d, UnitVector, LongLat \ldots et les cartes sphériques, en particulier : 
\begin{enumerate}
\item Nettoyage/uniformation méthodes  {\tt Print()}  des cartes, et 
 ajout de la méthode {\tt Show()} dans PixelMap 
 \item Ajout méthodes {\tt HasSymThetaSlice() , GetSymThetaSliceIndex() }
 dans les cartes sphériques (SphericalMap) 
 \item Ajout methode {\tt ResolToSizeIndex() SizeIndexToResol() } 
 ds SphereThetaPhi , SphereHEALPix et SphereECP
 \item Petites optimisations dans {\tt GetThetaSlice()} + methode {\tt GetThetaSliceDataPtr() }
 \end{enumerate}
\item[\rond] Juin 2006: Introduction de la classe {\bf Angle}  - pour conversion d'angle. 
\begin{verbatim}
   // Example to convert 0.035 radians to arcsec
   double vr = 0.035;
   cout << "Angle rad= " << vr << " ->arcsec= " << Angle(vr).ToArcSec() << endl;
   // Example to convert 2.3 arcmin to radian - we use the conversion operator
   double vam = 2.3;
   cout << "Angle arcmin= " << vam << " ->rad= " 
        << (double)Angle(vam, Angle::ArcMin) << endl;
\end{verbatim} 
%


\item[\rond]  {\bf SphereECP} - Septembre 2004 \\
Extrait du message du 7 Septembre 2004 
\begin{verbatim}
 J'ai mis dans la base (module SkyMap) le code de la classe
SphereECP<T> (pixelisation avec projection cylindrique) - carte partielle et complete,
+ gestionnaire PPersist + modifs adaptateur NomSkyMapAdaptor (PIext/ spiapp)

Programme test (avec appel a transforme en Alm) ds Test/tsphereecp.cc
Attention, mettre le parametere de pixelisation a -1 lors de l'appel a Generate pour eviter
le Resize de la sphereECP
ylmserver.GenerateFromCl(map, -1,  clin, 0.);

Dans piapp, c'est visualise par defaut en projection Molleweide
On peut ajouter dans les options d'affichage :
ecparray : affichage direct du tableau TArray des pixels (X:Phi, Y:Theta)
Si option ecparray, on peut preciser en plus
     - ecpscaledeg: echelle des axes en degres au lieu de pixels
     - ecpscalerad: echelle des axes en radians au lieu de pixels
Exemple:
Cmd> disp mapecp 'ecparray ecpscaledeg zoomx2 stdaxes'
\end{verbatim} 

\item[\rond]  Bug non corrigé ds classe Circle 
\begin{verbatim}
From: Laurence Perotto <perotto@cdf.in2p3.fr>
Date: Mon Jan 5, 2004  4:59:12 PM Europe/Paris
To: Reza Ansari <ansari@lal.in2p3.fr>, Christophe Magneville <cmv@hep.saclay.cea.fr>
Subject: un bug dans sophya...

    Bonjour et bonne annee a tous les deux...

    Je viens de trouver un ptit bug dans la fonction TanOnCircle de la classe Circle: Il
s'agit d'un melange entre les coordonnees (beta, lambda) de Benoit et les (theta, phi)
utilises dans Sophya. Lors du passage de l'un a l'autre, une transfo sin->cos a ete
oubliee...
    Voila...
    Bonne journee.

    Laurence.
\end{verbatim} 
\end{itemize}

\titre{Samba }

\begin{itemize}
\item[\rond] {\bf Juin 2006:} correction bug de calcul $a_{lm} \rightarrow$ SphereHEALPix 
(zones polar cap): le problème venant du choix de taille lors du calcul de la transformé
de Fourier complex $\rightarrow$ réel (n/2 - 1 ou n/2 -2) .
Correction dans {\tt RfourierSynthesisFromB } et utilisation de cette méthode
pour tout type de carte.
On gagne un peu encore en temps de calcul - sur asc (OSF1-cxx) , avec 
SphereThetaPhi(m=400), $l_{max} = 511$ \\[2mm]
\begin{tabular}{|l|c|c|}
\hline
Opération & TCPU Avant & TCPU Après OPT \\
\hline
map $\rightarrow a_{lm}$ & 10 s & 3.6 s. \\
$a_{lm} \rightarrow$ map & 26 & 10.5 s. \\
\hline
\end{tabular}  \\[1mm]
%
\item[\rond] {\bf Mai 2006:}  Optimisation calcul transformé en harmoniques sphériques 
{\bf SphericalTransformServer}. \\
Au lieu de calculer un tableau de $\lambda_{lm}$ dans LambdaLMBuilder 
et utiliser ensuite ce tableau, on calcule les sommes nécessaires au vol,
dans des méthodes spécifiques de la classe LambdaLMBuilder qui 
sont utilisées dans SphericalTransformServer (pour les transformés
scalaire/température) - PAS fait pour la polarisation pour le moment.
On peut encore gagner un facteur 2 en utilisant la symétrie 
en $\theta <> \pi-\theta$. \\ 
Extrait de cvs log :
\begin{verbatim}
revision 1.8
date: 2006/06/01 11:34:50;  author: ansari;  state: Exp;  lines: +147 -12
1/ passage en sa_size_t (au lieu de int) dans Alm<T> et Bm<T>
2/ Ajout des methodes optimisees (statiques) pour calcul transforme Ylm
ds LambdaLMBuilder et utilisation ds SphericalTransformServer
                             Reza , 1/06/2006
\end{verbatim}

\item[\rond] {\bf Fin 2004} : Tests et vérifications des polynomes de Legendre.
La classe LambdaLMBuilder donne les bons r\'esultats mais calcule les Plm
pour tous les $l,m$.
Introduction d'une routine (C-like) ``HarmSph\_array\_teta'' qui calcule
les Plm pour $m$ fix\'e et $l\in [0,l_{max}]$ comme ce qui est fait
dans la GSL... (la routine GSL ne marche pas corectement).
\end{itemize}

%%%%%%%%%%%
\titre{SysTools} 
{\bf Mai-Juin 2006 } classe ZThread - petites modifs/améliorations liées
à la gestion des signaux et méthodes kill 

\soustitre{Classe SOPHYA::Commander (module SysTools) }
Mai-Juin 2006:
Debug (?) de gestion/controle des threads dans la classe Commander - 
Extrait de cvs log : 
\begin{verbatim}
date: 2006/05/29 17:27:35;  author: ansari;  state: Exp;  lines: +62 -11
Ajout gestionnaire signal ds ZThread et correction/adaptation gestion des thread
s (killthr) dans Commander - Reza 29 mai 2006
----------------------------
revision 1.7
date: 2006/04/26 15:22:09;  author: ansari;  state: Exp;  lines: +13 -0
ajout methode ZThread::kill() pour envoi de signal a un thread + remplacement Ca
ncelThread par StopThread (par kill/SIGUSR1) dans Commander (commander.cc) + ame
----------------------------
revision 1.22
date: 2006/05/31 12:30:13;  author: ansari;  state: Exp;  lines: +20 -11
correction gestion & pour ThrExec ds Commander - Reza 31/05/2006
----------------------------
revision 1.21
date: 2006/05/29 17:27:35;  author: ansari;  state: Exp;  lines: +37 -16
Ajout gestionnaire signal ds ZThread et correction/adaptation gestion des thread
s (killthr) dans Commander - Reza 29 mai 2006
----------------------------
revision 1.20
date: 2006/04/26 15:22:08;  author: ansari;  state: Exp;  lines: +55 -15
ajout methode ZThread::kill() pour envoi de signal a un thread + remplacement Ca
ncelThread par StopThread (par kill/SIGUSR1) dans Commander (commander.cc) + ame
lioration documentation , Reza 26/4/2006

\end{verbatim}

Mars-Avril 2004 : 
Classe d'interpréteur de ligne de commande inspire de C-Shell,
destine a etre incluee dans des applications C/C++. \\
( Programme test Test/tcmd.cc )  \\
Avril 2005 : Introduction de la possibilite d'execution de commandes
en multithreads \\
Avril 2005 : Controle strict sur les noms de variables, limites
aux caracteres alphanumeriques + underscore - Adaptation
de l'algorithme de substitution en consequence.

{\bf Mini guide de l'interpreteur - Message du 19 Mars 2004 }   \

\begin{itemize}

\item[\rond] {\bf Gestion des variables } \\
 - Les variables sont non typees toutes traitees comme des chaines 
de caracteres. 
 - Acces aux variables d'environnement - 
 - Un niveau variable d'environnement application est aussi prevu
 - Toutes les variables de l'interpreteur  sont traitees comme des vecteurs.
extensibles automatiquement (difference avec le C-Shell) 

\item[\rond] {\bf Creation / initialisation de variables }  \\
\begin{verbatim}
Cmd> set sv StringValue
# Suppression d'une variable : unset ou clearvar 
Cmd> unset sv 

# Initialisation de type vecteur - Espace avant/apres ')' et avant ')' obligatoire
Cmd> set vecv ( mot1 mot2 mot3 mot4 mot5 )
#Calcul numerique : expression de type C  - Espace avant/apres '=' obligatoire
Cmd> a = 2+3*sqrt(4)
# Le signe egal peut etre utilise pour attribuer une chaine de caracteres
Cmd> a = 'Bonjour Madame'
# Un element de tableau peut etre specifie avant le signe egal 
Cmd> vecv[2] = 'coucou'
# Ou bien 
Cmd> i = 3
Cmd> vecv[i] = 'Ooohhh' 
\end{verbatim}

A droite du signe egal (membre de droite), les variables doivent etre
adressees a l'aide du signe \$.  

Une chaine peut etre cassee en mots a l'aide de la commande var2words
\begin{verbatim}
Cmd> var2words varname wordvarname [separateur]
\end{verbatim}

\item[\rond] {\bf Acces aux variables } \\
L'acces aux variables s'effectue par le signe \$  {\tt \$varname} .
Les {\tt \$xxx} sont remplaces par le contenu de la variable xxx. 
Cette substitution ne s'effectue pas entre simple quotes {\tt ' ... \$xxx '},
mais se fait entre double quotes {\tt " ... \$xxx ... "} . Les formes
{\tt \${vname} } ou {\tt \$(vname)} peuvent etre utilisees.

\begin{verbatim}
Cmd> x = 'Hello'
Cmd> echo $x
# Taille d'une variable de type vecteur $#vname
Cmd> set vx ( 111 2222 3333 444444 )
Cmd> echo $#vx 
# Acces aux elements de tableau
Cmd> echo $vx[0] $vx[1] 
#  ou bien indexe par une variable 
Cmd> i = 2
Cmd> echo $vx[i] 
# Une syntaxe particuliere: $[vname] retourne le contenu de
# la variable dont le nom est ds vname 
Cmd> zzz = 'Commander'
Cmd> xxx = 'zzz'
Cmd> echo '$[xxx]= '  $[xxx]
$[xxx]= Commander
\end{verbatim}

Variables d'environnement: L'acces aux variables d'environnement 
se fait simplement par{\tt \$varenvname}. Attention, les variables locales
de l'interpreteur sont prioritaires.

\item[\rond] {\bf Variables particulieres: } \\
{\tt \$retval} ou {\tt \$retstr}  :  chaine specifee sur la derniere commande return 
{\tt \$status} : code de retour de la derniere commande executee.
(variable existe et est rempli - mais il faudra se donner une regle 
plus claire ...)
Arguments des fichiers .pic appeles par la commande exec 
{\tt \$\# } : nombre d'arguments, a part \$0 
{\tt \$0} nom du fichier ou du script 
{\tt \$1 \$2 \$3} .... les arguments  (pour les scripts et les .pic (exec))

 
\item[\rond] {\bf Structures de controle  } \\
\begin{verbatim}
foreach f ( w1 w2 w3 ... )
  ...
  echo $f
end
\end{verbatim}

Espace avant/apres '(' et avant ')' obligatoire.

\begin{verbatim}
foreach v vecname 
  ...
  echo $v
end
\end{verbatim}

Boucle de type integer:
\begin{verbatim}
for i  startInt:endInt[:stepInt]
  ....
  echo $i 
end
\end{verbatim}

Boucle de type float
\begin{verbatim}
for f  startFloat:endFloat[:stepFloat]
  ....
  echo $f
end
\end{verbatim}

Boucle sur les lignes d'un fichier:
\begin{verbatim}
forinfile line FileName
  ...
  echo $line
end
\end{verbatim}

Instruction {\tt break} pour casser une boucle

\item[\rond] {\bf Les tests  }
\begin{verbatim}
if ( test ) then 
endif

if ( test ) then
 ....
else
 .... 
endif
\end{verbatim}

Espace avant/apres '(' et avant ')' obligatoire.

test de type {\tt a == b} OU {\tt a != b} OU {\tt a < b}  OU {\tt a > b} 
OU {\tt a <= b} OU {\tt a >= b}
les espaces avant l'operateur de comparaison sont obligatoires.
{\tt ==} et {\tt !=}  effectue une comparaison de chaines de caracteres.
{\tt < , > , <= , >=}une comparaison apres conversion en valeur flottante.

\item[\rond] {\bf Definition de script } \\
\begin{verbatim}
defscript scriptname  [description ]
   ....
endscript 
\end{verbatim}

L'appel a un script se fait simplement a l'aide
du nom de script (contrairement aux fichiers
de commande qui sont executes a l'aide de la 
commande {\tt exec} )
\begin{verbatim}
Cmd> scriptname arg1 arg2 arg3 ....
\end{verbatim}

L'instruction {\tt return} provoque l'arret (et le retour) d'execution d'un
script ou d'un fichier de commandes.
Commandes {\bf listscript }et {\bf clearscript scriptname} 
 permettet d'avoir la liste des scripts 
 definis / supprimer la definition d'un script 

\item[\rond] {\bf Autres commandes}
\begin{itemize}
\item Instruction {\bf echo } pour ecrire sur cout/stdout
\item Instruction {\bf echo2file} pour ecrire a la fin d'un fichier
\item Instruction {\bf sleep nsec} (attente de nsec seconds )
\item Instructions {\bf timingon , timingoff , traceon , traceoff } \\
%
\item Commande {\bf exec commandfilename [arg1 arg2 ... ] }
\item Commandes {\bf help et help keyword/commandname }
\item Commandes {\bf listvars , listcommands }
\item  Defintion et liste d'alias : {\bf alias aliasname 'string ' } et {\bf  listalias} 
\end{itemize} 

\item[\rond] {\bf Threads d'execution de commandes (Avril 2005)} \\
Possibilite de lancer des commandes (autre que les commandes
  de l'interpreteur lui-meme) en thread separe (il suffit de mettre un \& 
  a la fin de la commande) \\ 
  Commandes des gestion des threads : \\
  {\bf thrlist  ;  cleanthrlist  ;  cancelthr ThId ;   waitthr  } \\
  Attention, la possibilite de lancer des commandes en threads separes ne fonctionne que
pour des commandes "thread-safe".
La plupart de nos commandes de piapp sont  \\
   - soit trop rapide,  \\
   - soit non "thread-safe"   \\

  \item[\rond] controle d'execution : \\
Possibilite d'arreter l'execution de l'interpreteur (dans une boucle
   ou dans dans un fichier .pic ... 
   Utiliser la commande {\bf stop} ou {\tt <Cntrl C>} dans PIConsole

\end{itemize} 

\soustitre{Classes CExpressionEvaluator et RPNExpressionEvaluator }
\begin{itemize}
\item[\rond]  Ajout des classes RPNExpressionEvaluator et CExpressionEvaluator 
d'évaluation d'expressions numériques en notation polonaise inverse
et avec la syntaxe C . Utilise dans la classe Commander.  
\item[\rond]   Programme test Test/tcmd.cc 
\item[\rond]  extrait de {\tt cvs log cexpre.cc }
{\small \begin{verbatim} 
----------------------------
revision 1.3
date: 2004/03/18 18:15:19;  author: ansari;  state: Exp;  lines: +10 -6
Suite (presque finie) des modifications de l'interpreteur - gestion des variables en particulier - Reste au moins un bug ds CExpressionEvaluator - Reza 18/03/2004
----------------------------
revision 1.2
date: 2004/03/16 08:47:48;  author: ansari;  state: Exp;  lines: +5 -6
suppression variables inutilisees ds cexpr.cc - Reza 16 Mars 2004
----------------------------
revision 1.1
date: 2004/03/15 22:19:43;  author: ansari;  state: Exp;
Ajout fichiers des classes RPNExpressionEvaluator et CExpressionEvaluator (expression arithmetiques) et MAJ du fichier Makefile et objlist.list - Reza 15 Mars 2003
\end{verbatim} }

\item[\rond] Extrait du message du 3 Mars 2004 
\begin{verbatim}
Le code est base sur une hierarchie de classe d'expression :
 Expr --------  NumberExp
      --------- BinExp ------ AddExp
                       ------ MulExp
                       ------ SubExp
                       ------ DivExp
    ---------  FuncExp
    ---------  CExpressionEvaluator

NumberExp  : expression elementaire de nombre, sait actuellement traduire Pi et E
                          tres facile d'ajouter d'autres constantes
BinExp: Classe d'operations binaires (deux operandes) a+b a-b a*b a/b
               avec gestion de niveau de priorite des operateurs
               On peut facilement ajouter d'autres operateurs binaires (par exemple
               puissance ^ a^b ) - et les priorites relatives seront gerees en principe.
FuncExp: classe d'expression fonctionnelle, avec n arguments f(x1,x2,...x3)
                  actuellemenent, n=0 a n=3 arguments et quelques fonctions
                  usuelles sont decodes ds cette classe (sin,cos,tan, asin, acos, atan, exp, log,
                  atan2, pow ) - voir ds le code

CExpressionEvaluator : C'est la classe de haut niveau a utiliser -
                                            la fonction de decodage de la chaine ASCII (qui utilise
                                            les fonctionalites des differentes classes est la dedans
                                            et ce n'est pas tres long.
(+ une classe d'exception specifique).
\end{verbatim}

\end{itemize}


%%%%%%%%
\titre{FitsIOServer}
%%%
\begin{itemize}
\item[\rond] Aout 2006 : Ecriture/Lecture des classes Histo,HProf,HistoErr,Histo2D dans fichier FITS.
Les Histo2D et leurs projections 1D associ\'ees sont lus et \'ecrits
sur plusieurs HDU cons\'ecutifs.
\item[\rond]  Juin 2006 : Ajout verification/correction noms de colonne lors de lecture FITS / DataTable, 
et remplacement throw par un warning lors de lecture fits-healpix avec $nbcols > 1$ \\[1mm]
\item[\rond]  { \large Sep 2005-Jan 2006 : Refondation totale du module }
\begin{itemize}
\item[\rond] Amelioration du programme PrgUtil/scanppf - 
(scanfits -V1 -lh -rd -header filename) 
\item[\rond] La classe FitsFile (et donc FitsInFile FitsOutFile) heritent de FitsInOutFile.
(Jan 2006) 
\item[\rond] Fonctionalites classe {\bf FitsManager } etendues - en particulier ScanFile() 
\item[\rond] Les FitsIOHandler (ancien) heritent de FitsHandlerInterface - 
Tous les handlers sont pris en charge et enregistre par FitsManager (Jan 2006) 
\item[\rond] Ajout classe d'initialisation du module {\bf FitsIOServerInitiator },
fichiers fiosinit.h .cc (Dec 2005) 
\item[\rond]  Classe { \bf SwFitsDataTable } (DataTable avec swap sur FITS) ajoute 
 + classe FitsHandler<BaseDataTable> modifie pour prise 
en charge de SwFitsDataTable (Dec 2005 - Jan 2006) 
\item[\rond] Classes {\bf FITSDataSwapper$<$T$>$} modifies (Dec 2005) 
\item[\rond]  Prise en charge de types TSTRING et TCOMPLEX et TDBLCOMPLEX 
lors de lecture/ecriture de colonnes FITS. 
\item[\rond]  Prise en charge de l'ensemble des types de colonnes pour le handler de Fits
de DataTable
\item[\rond]  Classe {\bf  FitsInOutFile } comme wrapper des fonctions de la librairie cfitsio +
classe d'exception spécifique {\bf FitsIOException} , et la classe des types FITS {\bf FitsTypes}.
\item[\rond]  Classe template {\bf FitsBlockRW$<$T$>$} pour lecture/écriture (tableaux de données)
sur IMGHDU et Tables.
\item[\rond] Classes gestionnaires I/O Fits pour les objets {\bf FitsHandler$<$T$>$} et {\bf FitsManager}
\item[\rond] Classes gestionnaire pour les tableaux : {\bf FitsArrayHandler$<$T$>$} 
\item[\rond] Classes gestionnaire pour les DataTable {\bf FitsHandler$<$BaseDataTable$>$}
\item[\rond] Mai 2005 : Classe {\bf FITSDataSwapper$<$T$>$} pour la gestion des 
SwSegDataBlock sur fichiers FITS
\end{itemize}
\end{itemize}

\titre{LinAlg} 
Extension des fonctionalités de la classe {\tt LapackServer<T>} : 
(Juillet 2004 / cmv , Février 2005 / Reza)
\begin{itemize}
\item[\rond] Ajout lancement d'exception sur renvoi de code d'erreur par lapack 
(desactivable par flag au niveau du constructeur de la classe serveur) 
\item[\rond] Introduction de l'interface Lapack d'inversion des matrices symetriques (21/7/2004)
\item[\rond]  Introduction de l'interface Lapack de recherche de valeurs et vecteurs propres
  (cas general, symetrique et hermitique) (21/7/2004)
\item[\rond] Introduction d'un fonction d'interface pour le calculateur de workspace
  (ilaenv\_) (21/7/2004)
\item[\rond] Ajout prog test Tests/tsttminv.cc + Commentaires sur les diverses methodes et sur les matrices FORTRAN (21/7/2004)
\item[\rond] Ajout SVD decomp by Divide and Conquer SVD\_DC (23/7/2004)
\item[\rond] Ajout  Least Square with SVD DC
\item[\rond] Ajout methode calcul de la matrice inverse par Lapack en utilisant la 
resolution de systemes (07/02/2005) 
\end{itemize}

\titre{IFFTW}
\noindent 
- Juillet 2007 : Passage a FFTW 3 \\
- Nov 2005 : Correction du bug dans le cas de FFT-1D Backward(complex -> reel) 
in(1).imag() pouvait etre ecrase.

\titre{PI,PIext,piapp} 
\soustitre{PI: Classes modifiees - ameliorees}
\begin{itemize}
\item[\rond] {\bf  PIImageNavigator } \\
Ajout de la classe {\tt PIImageNavigator } permettant de visualiser une image 
avec ses propres widget zoom / global view et colormap. (Fevrier 2005) \\
Commande {\tt imagnav} ajoute ds piapp/baseexcute.cc . \\
\item[\rond] Avril 2005 - Amelioration de la classe {\bf PIConsole} \\
1/Envoi Message PIMSG\_Cancel lors de {\tt <Cntl C>} \\ 
 2/ Correction positionnement curseur lors de rappel de commande,
  Si possible en fin de commande - mais toujours avec le 
  debut de commande visible.  \\
3/ Correction (probable) du petit bug sur les derniers caracteres lors de copier/coller
  ds PIConsole
\item[\rond] Codage Options graphiques en text (string) pour PIGraphicAtt  (Nov-Dec 2005) 
\item[\rond] Corrections diverses trace d'axes  etc ... (Dec 2005) 
\item[\rond] PIext rendu indépendant de FITS (Avril 2006) - commandes spécifiques dans 
ProgPI/fitsbtadapter.cc 
\item[\rond] BUG A corriger, DrawOpaqueString ds PIGraphPS (sortie postscript)
\end{itemize}
%%%% 
\soustitre{ Codage texte des options graphiques (11 Mars 2004)}
\begin{verbatim}
//   Methode retournant un vecteur de string a partir des options
virtual int        PIDrawer::OptionToString(vector<string> & opt) const
qui vient completer les deux methodes
virtual int        PIDrawer:: DecodeOptionString(vector<string> & opt, bool ...) et
virtual void       PIDrawer:: GetOptionsHelpInfo(string& info);
Ces methodes s'occupent de decoder les options graphiques (et l'aide
associe). La methode ajoutee permet de faire l'operation inverse, fabriquer
une serie de chaine de caracteres a partir des options graphiques.
Il y a aussi la methode
virtual int            PIWdgGen::OptionToString(vector<string> & opt) const
que j'ai ajoute (rien a faire pour le moment) - ainsi que
int PIGraphicAtt::AttToStrings(vector<string> & att) const.

Peux-tu remplir la methode PIGraphicAtt::AttToStrings(vector<string> & att) const.
L'implementation par defaut de PIDrawer::OptionToString(vector<string> & opt) const
appelle PIGraphicAtt::AttToStrings() -  a laisser donc tel quel.

par contre, pour les autres drawer (PIYfXDrawer, PIFuncDrawer, PIElDrawer,
PISurfaceDrawer, PIHisto, PIHisto2D, PINTuple ...) - lorsque
DecodeOptionString(vector<string> & opt, bool ...) est modifie,
rajouter la methode OptionToString(vector<string> & opt) et verifier le help.
Attention, il ne faut pas mettre l'argument opt a zero, mais ajouter des chaines
derriere (push_back()) afin de pouvoir cumuler les options de base  + options
specifiques.

Comment tester ?
Pour tester, tu peux utiliser  la fenetre des options texte ou j'ai ajoute le bouton
[GetOption] . Tu peux acceder a cette fenetre a partir de la fenetre des options
graphiques <Alt>O , ou directement sur un objet de gestionnaire 2D - par
<Alt>T - <Shift>Button-1 permet de selectionner le drawer actif
\end{verbatim}

\soustitre{ Trace des axes (11 Mars 2004)}
    Ajouter la possibilite de specifier l'origine (le point de croisement des axes)
lorsque les axes ne sont pas de type 'box' - classes PIAxes et PIElDrawer.  FAIT

\soustitre{ Selection graphique (souris) du drawer actif (11 Mars 2004)}
\begin{verbatim}
J'ai ajoute la methode PIDrawer::GetDistanceToPoint(double x, double y)
// Renvoie une distance au point x,y
// 0: au(x) point(s) le(s) plus proche(s) ... 1  au bord xmin/xmax , ymin/ymax
// La methode par defaut calcule la distance normalisee au point ((xmin+xmax)/2,
(ymin+ymax)/2)
  virtual double     PIDrawer::GetDistanceToPoint(double x, double y);

ainsi que ce qu'il faut ds PIBaseWdgGen et ds PIDrawer pour exploiter cette
methode + code permettant le test ds PIScDrawWdg.
(virtual  void      PIDrawer::WdgCoord2DrwCoord(int x, int y, double& xu ...
 virtual int PIBaseWdgGen:;FindNearestDrawerId(int x, int y) ...)
Tu as a t'aoccuper de la methode  PIDrawer::GetDistanceToPoint(double x, double y)
qui doit etre redefinie si possible pour chaque drawer, afin de fournir une
distance raisonnable au point (x,y) en argument.
J'ai juste mis une implementation par defaut (ds PIDrawer) et une implementation
partielle pour PIElDrawer (qui trace les axes en particulier) - qu'il faut
completer.

Comment tester ?
J'ai mis ce qu'il faut ds le gestionnaire 2D (PIScDrawWdg) -
<Shift>Button-1 choisit le drawer le plus proche (base sur la
valeur de retour de  PIDrawer::GetDistanceToPoint(double x, double y)
comme drawer actif. Ce drawer est passe en 'highlight' pendant que
le bouton est appuye.
\end{verbatim}

\soustitre{ Manipulation interactive des drawers (3 Juin 2004) }
La manipulation interactive des drawers (à l'aide d'un menu) a
été finalisée pour les PIImage PIScDrawWdg PI3DWdg .

\begin{verbatim}
   o <Alt>D affiche le menu avec les differentes option
   o Move/Resize: Affichage du rectangle + rectangle milieu
   (deplacement) + coin bas-droite (deplacement) - 
   clicker ailleurs pour finir
   o Mouse Select : Le mouse select des drawers est gere
   maintenant par un PIEventHandler (comme pour Move/ReSize)
   Drawer actif affiche par le rectangle muni d'un petit coin 
   (petit carre + rond dedans, en bas a droite). 
   Click souris change eventuellement le drawer actif. 
   On termine en clickant ds le petit [carre+rond] 
\end{verbatim}

\soustitre{ Traceur de bar-graph (classe PIBarGraph) (3 Juin 2004) } 
Ajout du traceur de bar-graph (classe {\bf PIBarGraph}) ds module PI/
et commande {\tt bargraph}  ds PIext/basexecut.cc .
La commande bargraph ne gere pas encore toutes les possibilites
de la classe PIBarGraph. \\
Exemple d'utilisation:
\begin{verbatim}
Cmd> bargraph ' ' -10. 15. 22. 8. 33. 7 -4. 
Cmd> bargraph 'blue ' -10. 15. 22. 8. 33. 7 -4. 
Cmd> bargraph 'blue horizontalbars' -10. 15. 22. 8. 33. 7 -4. 
Cmd> bargraph 'blue horizontalbars barvaluelabel ' -10. 15. 22. 8. 33. 7 -4. 
Cmd> bargraph 'blue verticalbars nofill barvaluelabel ' -10. 15. 22. 8. 33. 7 -4. 
Cmd> bargraph 'font=times,bold,16 blue verticalbars nofill barvaluelabel ' \
     -10. 15. 2 2. 8. 33. 7 -4. 
Cmd> bargraph 'font=times,bold,16 blue verticalbars fill barvaluelabel packfrac=0.8' \
     -10. 15. 22. 8. 33. 7 -4. 
\end{verbatim}

\soustitre{ Traceur de lignes de texte (classe PITextDrawer)  (3 Juin 2004) } 

Ajout d'une classe de traceur de lignes de texte (classe {\bf PITextDrawer}) et commande 
{\tt textdrawe}r ds PIext/basexecut.cc . Mais le traceur (et sa commande) 
doivent etre completes. \\
Exemple d'utilisation:
\begin{verbatim}
# On affiche qque chose
Cmd> openppf demo.ppf
Cmd> disp h1d
Cmd> textdrawer 'frame line=solid,2 font=times,bold,16 red inset'  \
     ' Christophe ' ' Reza Ansari' ' SOPHYA ' 
\end{verbatim}

\soustitre{ Gestion de re-scale-ing des  axes en 3D  (3 Juin 2004)  }

Mise en place complete (?) de la gestion de re-scale-ing des  axes en 3D 
avec gestion des options graphiques (texte) - Il est possible en particulier d'imposer
les limites de la boites 3D.
cela a ete une grosse prise de tete de tout un apres-midi.
J'ai eu ensuite mal a la tete une partie de la soiree !  \\
Exemple d'utilisation:

\begin{verbatim}

# On ouvre le fichier demo.ppf
Cmd> openppf demo.ppf
Cmd> surf mtx1 'colbr32'
Cmd> surf mtx1 'colbr32 noautoscale'
Cmd> surf mtx1 'colbr32 lim3dbox=-10,60,-10,60,-3,15 autoscale3dbox'
#  Affichage avec superposition
Cmd> nt3d nt32 x y z - - - - - 'marker=circle,7 red'
Cmd> nt3d nt32 x y z - - - - - 'same marker=cross,5 blue '
#  Ou bien : 
Cmd> nt3d nt32 x y z - - - - - 'marker=circle,7 red noautoscale'
Cmd> nt3d nt32 x y z - - - - - 'same marker=cross,5 blue '

\end{verbatim}
\soustitre{piapp (PIext/ProgPI) }
\begin{itemize}
%%%%
\item[\rond] Juillet 2006 : Ameliorations et ajouts divers : \\
- Ajout commande {\bf plot3dw} ({\tt Services2NObjMgr::DisplayPoints3DW() }) \\
- Ajout possibilite d'acces aux caracteristiques des objets par {\tt \$\{objname.att\} }  \\
{\tt (PIACmd::GetVarApp()) } et amelioration verification du nom des objets 
(methode {\tt NamedObjMgr::CheckName()}) \\
- Operations sur objets: commande {\bf objaoper} ({\tt NObjMgrAdapter::PerformOperation()}) 

\begin{verbatim}
#  Extracting row / column from matrix
Cmd> objaoper matrixname row 23
Cmd> objaoper matrixname col 148
#  Extracting plane from 3D array (slicexy slicexz sliceyz)
Cmd> objaoper arr3dname slicexy 14
\end{verbatim} 
%%%%
\item[\rond] Avril 2006: Ajout possibilite de lecture des commandes sur le terminal (stdin) 
et flag en argument de commande {\tt -small} \\
Extrait de cvs log :
\begin{verbatim}
revision 1.16
date: 2006/04/26 15:53:18;  author: ansari;  state: Exp;  lines: +20 -11
1/ Ajout classe de lecture sur stdin (terminal) avec thread separe pour
piapp - incluant la possibilite d'utilisation de la librairie GNU readline
(fichiers piacmdrdr.cc piacmdrdr.h + fichier makfile specifique makefile_wgrdl
 pour compil+link avec GNU readline)
2/ MAJ Makefile et modif programme principal piapp.cc avec flag -small
et activation thread de lecture sur terminal
                           Reza , 26/04/2006

----------------------------
\end{verbatim}

\item[\rond] Jan 2006 : commandes readfits writefits scanfits ont ete ajoutees 
dans ProgPI/fitsbtadapter.cc en utilisant le nouveau FITS - 
Le menu OpenFits de PIStdImgApp utilise desormais ces commandes
\item {\bf BUG } a corriger pour {\tt imagvav}: 
La destruction de l'objet et/ou widget pascorrectement geres - 
provoque des plantages lors de la sortie de l'application.
\end{itemize}
\soustitre{piapp multi-thread }
\begin{itemize}
\item[\rond] Avril 2005: Possibilité d'execution de commandes en threads separes, en
ajoutant {\bf \&} en fin de ligne de commande.
\item[\rond] Janvier 2004: Le multithreading a été mis en oeuvre dans piapp . 

\item[\rond] Extrait de {\tt cvs log pistdimgapp.cc } : 
\begin{verbatim}
revision 1.77
date: 2005/04/27 11:55:00;  author: ansari;  state: Exp;  lines: +26 -10
1/ Prise en charge de DataTable et SwPPFDataTable pour piapp (NObjMgrAdapter) :
nomhistadapter.cc et piiinit.cc
2/ Lecture de tous les objets ds un fichier PPF par NamedObjMgr::ReadAll() pour
fichier PPF sans nametag.
3/ Ajout bloc try/catch ds PIStdImgApp::Run() (boucle d'evenements)
                                           Reza , 27 Avril 2005
----------------------------
revision 1.76
date: 2005/04/19 09:13:49;  author: ansari;  state: Exp;  lines: +3 -1
Ajout de l option nodisp ds les affichages des NamedObjMgr, prise en compte de 
<Cntrl C> (Msg_Cancel) pour arreter l'execution de l'interpreteur ds PIStdImgApp 
et remplacement commande breakexe par stop ds PIACmd - Reza 19/4/2005
----------------------------
revision 1.75
date: 2005/04/19 06:56:52;  author: ansari;  state: Exp;  lines: +5 -4
Remis en marche la possibilite d'execution d'un .pic au lancement de piapp - 
Reza 19/4/2005
----------------------------
revision 1.74
date: 2005/02/18 14:09:47;  author: ansari;  state: Exp;  lines: +62 -37
Modifications pour l'utilisation viewer PIImageNavigator (ajout commande imagnav
) - Reza 18 Fev 2005
----------------------------
revision 1.73
date: 2004/11/19 17:41:07;  author: ansari;  state: Exp;  lines: +26 -0
Ajout commandes addoval addfoval pour trace d'ellipse - Reza 19/11/2004
----------------------------
revision 1.71
date: 2004/09/07 07:10:18;  author: ansari;  state: Exp;  lines: +35 -0
Ajout bloc try/catch ds piacmd.cc (thread execution commandes) et ds pistdimgapp.cc (
methode process, thread boucle d'evts) - Reza 07/09/2004
----------------------------
revision 1.70
date: 2004/01/06 18:44:56;  author: ansari;  state: Exp;  lines: +11 -1
 Suite debugging gestion lock entre threads ds piapp - A l'air de
marcher sur OSF1 et Linux ...   Reza 06/01/2004
----------------------------
revision 1.69
date: 2004/01/06 17:05:25;  author: ansari;  state: Exp;  lines: +33 -7
Suite debug piapp multithread : on ne peut pas utiliser ZSync() ds un if (destructeur
 appele de suite) - Reza 06/01/2004
----------------------------
revision 1.68
date: 2004/01/04 19:02:43;  author: ansari;  state: Exp;  lines: +43 -13
Suite des modifs pour piapp multi-threads
1) Ajout Mutex de synchronisation ds ls classe NamedObjMgr
2) Suite controle de gestion d'appel aux methodes de PIStdImgApp depuis
la classe elle-meme, a travers le NamedObjMgr
3) Modification de la boucle d'evenements, avec un thread de reveil
periodique
                                    Reza, 4 Janvier 2004
\end{verbatim}
\item[\rond] Extrait de {\tt cvs log pistdimgapp.cc } : 
\begin{verbatim}
----------------------------
revision 1.62
date: 2003/11/27 10:51:58;  author: ansari;  state: Exp;  lines: +45 -20
Suite modification/adaptations a la classe PIACmd qui herite maintenent de SOPHYA::Co
mmander - Reza 27/11/2003
----------------------------
revision 1.61
date: 2003/11/26 23:01:55;  author: ansari;  state: Exp;  lines: +20 -1755
Modification du code de PIACmd : La classe PIACmd herite maintenant de la classe Comm
ander (de SysTools) - Reza 26/11/2003
----------------------------
revision 1.60
date: 2003/07/21 21:13:10;  author: cmv;  state: Exp;  lines: +3 -3
- introduction notion de numero de ligne dans expression ntuple
  modif prototype PlotExprFunc NTLoopExprFunc (add _nl _nstart _nend)
  modif int_4 -> int_8_exprf (long long) pour _nl (DecodeLoopParameters,
     PrepareNTExpressionCFile, LinkExprFunc,...)
- doc pour _nl _nstart _nend et arragement repartition RegisterHelp/RegisterCommand
             (rz + cmv 21/7/2003)
----------------------------
\end{verbatim}
\end{itemize}

\titre{Documentation (Manual/) } 
%%%%
Documentation des classes de SysTools. \\
Extrait message du 12 Aout 2004 : \\
\begin{verbatim} 
---> Au sujet de la doc (Manual/)
       J'ai installe doxygen sur le Mac, version 1.3.8 -
       Il faut updater le fichier de config de depart (dox_sophya.conf)
       Pour ma part, j'ai du modifier mkmf (en version privee) -
      En effet, il n'y avait pas le program doxysearch - Je ne sais pas si c'est general
      ou specifique Mac.

      J'ai aussi modifie certaines options de doxygen (en version privee)
     EXTRACT_LOCAL_CLASSES  --> NO   (au lieu de YES)
     DETAILS_AT_TOP  ---> YES     (au lieu de No)
     SORT_MEMBER_DOCS  ---> NO    (au lieu de YES)

      Si on est d'accord, on peut modifier ces options ds le fichier dox_sophya.conf et
      utiliser la fonction update de doxygen (doxygen -u)
\end{verbatim}

\titre{Mgr} 
\begin{itemize}
\item Avril-Mai 2005 : Basculement vers la nouvelle version de scripts 
de gestion du code (module {\bf BuildMgr/ } ) 
On n'a plus a se preoccuper des indications de cette section 

\item 
Septembre 2003 (17/9/2003) :  Changement DPCDEVREP, DPCBASEREP
en SOPHYADEVREP , SOPHYABASEREP , EROSCXX en SOPHYACXX 
\end{itemize}



\titre{Plan de modifs pour SOPHYA V 2.x PI/piapp V 4.x }

{\bf Sep 2006} : La grande majorit\'e des modifs pr\'evues en 2003 ont \'et\'e
effectu\'ees. Reste \`a faire , si besoin :
\begin{itemize}
\item SophyaLib::TArray/ 
\begin{verbatim}
  - Ajouter une classe de base abstraite GenericMatrix<T>
    avec methode d'acces aux elements, nb de lignes, nb de colonnes,
  - Introduire les TinyMatrix  (TinyMatrix<T, int L, int C>)
    avec passage de/vers TMatrix<T> (et TinyVector<T, int N>) ?
  - Introduire des matrices creuses simples SpareMatrix<T>
  - Introduire les DiagonalMatrix<T>
Remarque: Les TMatrix TinyMatrix et  SparseMatrix heritent de GenericMatrix
\end{verbatim}

\item PI/ piapp 
\begin{verbatim}
o Ajouter un traceur de  ApplePie (BarChart fait )
o Ajouter un traceur de Lego-Plot
o (?) Une fonction pour faire facilement une fenetre d'alerte ou d'info (?)
o Voir comment on pourrait "joindre" deux objets ayant l'interface NTupleInterface
  pour pouvoir plotter des objets, l'un vs l'autre
o (???) Introduire quelque chose du style
  AddDialogue("Cmd", "dialogue-description)
  qui pourrait fabriquer automatiquement une fenetre avec des champs a remplir
  pour les commandes usuelles (???)
\end{verbatim}
\end{itemize}


\end{document}
