Index: /trunk/AddOn/TAcq/acqparam_exemple.d
===================================================================
--- /trunk/AddOn/TAcq/acqparam_exemple.d	(revision 3955)
+++ /trunk/AddOn/TAcq/acqparam_exemple.d	(revision 3956)
@@ -44,7 +44,9 @@
 #   Mode d'acquisition   
 #  Par defaut  @acqmode std
-#   Modes standard:  [std=raw2c : 2 channels raw data] [fft2c: fft 2 canaux - NOT reordered] 
-#                     fftshrink=fft2cshrink  
-#   Autres modes:  raw1c , fft1c , fft1cshrink , ordfft2c , ordfft1c  
+#   Modes standard:  [std=raw2c : 2 channels raw data] [fft2c: fft 2 channels - NOT reordered] 
+#                    [ordfft2c : fft 2 channels with software reordering]
+#                    [fftshrink=fft2cshrink : FFT 2 chan firmware with shrink - 250/4 MHz]
+#                    [hdcorrel : data from FPGA / F.Deschamps correlator ]
+#   Autres modes:  raw1c , fft1c , fft1cshrink ,  , ordfft1c  
 #                  [nof=std+NoFitsFile] pattern,patnof,fft2cnof ...
 @acqmode std
Index: /trunk/AddOn/TAcq/branap.cc
===================================================================
--- /trunk/AddOn/TAcq/branap.cc	(revision 3955)
+++ /trunk/AddOn/TAcq/branap.cc	(revision 3956)
@@ -16,4 +16,5 @@
 {
   outpath_="./";
+  fgfitsout_=false;
   nmean_=nmean;
   nbloc_=1;
@@ -26,5 +27,6 @@
   nzones_=nzon;
   npaqinzone_=npaqz;
-  fgdatafft_=false;  fgsinglechannel_=false; fgforcesinglechan_=false;
+  fgdatafft_=false;   fgforceraworfft_=false; 
+  fgsinglechannel_=false; fgforcesinglechan_=false;
   prtlevel_=0;
   prtmodulo_=50000;
@@ -64,4 +66,8 @@
       ka+=2;
     }
+    else if (strcmp(arg[ka],"-fitsout")==0) {
+      fgfitsout_=true; 
+      ka++;
+    }
     else if (strcmp(arg[ka],"-nmean")==0) {
       nmean_=atoi(arg[ka+1]);
@@ -101,4 +107,12 @@
     else if (strcmp(arg[ka],"-singlechan")==0) {
       fgsinglechannel_=true; fgforcesinglechan_ = true; 
+      ka++;
+    }
+    else if (strcmp(arg[ka],"-rawdata")==0) {
+      fgforceraworfft_=true; fgdatafft_ = false; 
+      ka++;
+    }
+    else if (strcmp(arg[ka],"-fftdata")==0) {
+      fgforceraworfft_=true; fgdatafft_ = true; 
       ka++;
     }
@@ -166,9 +180,10 @@
 {
   cout << " --- BRAnaParam : Reading/Processing BAORadio FITS files parameters " << endl;
-  cout << " Usage:  prgname [-act ACT] [-out OutPath] [-nmean NMean] [-zones NZones,nPaqinZone] \n" 
+  cout << " Usage:  prgname [-act ACT] [-out OutPath] [-fitsout] \n" 
+       << "                 [-nmean NMean] [-zones NZones,nPaqinZone] \n" 
        << "                 [-nbloc NBloc] [-freq NumFreqMin,NumFreqMax,NBinFreq] \n" 
-       << "                 [-prt lev,modulo] [-nvcal n] [-nthr n] [-nosfc] [-singlechan]\n"
-       << "                 [-freqfilter]\n"
-       << "                 [-gain filename] [-varcut min,max] [-nband nband,first,last] \n"
+       << "                 [-prt lev,modulo] [-nvcal n] [-nthr n] [-nosfc]\n"
+       << "                 [-singlechan] [-fftdata] [-rawdata] \n"
+       << "                 [-freqfilter] [-gain filename] [-varcut min,max] [-nband nband,first,last] \n"
        << "                 [-filldt] [-tspwin wsz,extsz,nfiles] \n" 
        << "         -in Imin,Imax,Istep InPath FiberList [InPath2 FiberList2 InPath3 FiberList3 ...] \n" << endl; 
@@ -178,12 +193,14 @@
   }
   cout << " -act Action: cube3d or vis or viscktt or mspec \n"
-       << "    cube3d: create 3D fits cubes, vis: compute visibilites,  \n" 
-       << "    viscktt: compute visibilities and check TimeTag/FrameCounter\n "
+       << "    cube3d: create 3D fits cubes \n " 
+       << "    vis: compute visibilites (vismfib program) \n" 
+       << "    viscktt: compute visibilities and check TimeTag/FrameCounter (vismfib program)\n "
        << "    mspec: compute and save mean spectra for each channel \n "
        << "    bproc: run BRBaseProcessor for debug/printing (use -prt)  \n "
        << " -out OutPath: Output directory name \n"
+       << " -fitsout : Force FITS format for output files  \n"
        << " -nmean NMean: Number of packet used for spectra/visibility computation \n"
        << " -nbloc NBloc: Number of MemMgr blocs in output file\n"
-       << " -zones NZones,NbPaqinZone : Number of Zones and number of paquets in one zone \n" 
+       << " -zones NZones,NbPaqinZone : Number of Zones and number of paquets in one zone (RAcqMemZoneMgr) \n" 
        << " -freq NumFreqMin,NumFreqMax,NBinFreq : Frequency zone and number of bins \n" 
        << " -prt lev,modulo : Print level (0,1,2...) and print counter modulo (10000, 50000 ...) \n" 
@@ -192,4 +209,6 @@
        << " -nosfc : Don't force reading with SAME FrameCounter \n" 
        << " -singlechan : Force one channel per fiber \n"
+       << " -rawdata : Force raw data mode (firmware raw) \n"
+       << " -fftdata : Force FFT data mode (firmware fft) \n"
        << " -varcut min,max : min-max cut on variance \n" 
        << " -nband nband,first,last: numbers of freq. bands and first and last bands used for cuts \n"
@@ -212,6 +231,8 @@
   char flnm[1024];
   sprintf(flnm,"%s/signal%d.fits",dirlist_[0].c_str(),imin_);
-  int rc = DecodeMiniFitsHeader(flnm,paqsize_, npaqinfile_,fgdatafft_, fgsinglechannel_); 
+  bool fgdatafft_in_fits=false;
+  int rc = DecodeMiniFitsHeader(flnm,paqsize_, npaqinfile_,fgdatafft_in_fits, fgsinglechannel_); 
   if(fgforcesinglechan_) fgsinglechannel_= true;
+  if (!fgforceraworfft_) fgdatafft_=fgdatafft_in_fits;
   return rc;
 }
@@ -225,5 +246,5 @@
   cout << " IMin= " << imin_ << " IMax= " << imax_ << " IStep= " << istep_ 
        << ((rdsamefc_)?" SameFrameCounter read mode":" AllOKPaquets read mode ") << endl;
-  cout << " OutPath= " << outpath_ << endl;
+  cout << " OutPath= " << outpath_ << (fgfitsout_?" force FITS output":" PPF output") << endl;
   cout << " Action=" << action_ << "  NMean=" << nmean_ << " NBloc=" << nbloc_ << endl;
   cout << " FreqMin= " << freqmin_ << " FreqMax= " << freqmax_ << " NBinFreq= " << nbinfreq_ << endl;
@@ -237,5 +258,5 @@
   cout << " PaqSize=" << paqsize_ << "  -  NZones=" << nzones_ << " NPaqZone=" << npaqinzone_ 
        << " PrtLevel=" << prtlevel_ << " PrtCntModulo=" <<  prtmodulo_ << endl;
-  cout << " AcqMode: " << ((fgdatafft_)?" Data_FFT " : " Data_Raw " ) 
+  cout << " AcqDataMode: " << ((fgdatafft_)?" Data_FFT " : " Data_Raw " ) 
        << ((fgsinglechannel_)?" SingleChannel " : " TwoChannels " ) << endl;
   cout << " NbVisibCalculator in Group: " <<  nbcalgrp_ << " with N//threads: " << nthreads_ << endl;
Index: /trunk/AddOn/TAcq/branap.h
===================================================================
--- /trunk/AddOn/TAcq/branap.h	(revision 3955)
+++ /trunk/AddOn/TAcq/branap.h	(revision 3956)
@@ -31,4 +31,5 @@
   string action_;
   string outpath_;
+  bool fgfitsout_;   // true -> force fichier sortie format FITS (defaut PPF)
   uint_4 nmean_;
   uint_4 nbloc_;
@@ -40,8 +41,10 @@
   uint_4 npaqinfile_;    // nombre de paquets dans un fichier p
   bool fgdatafft_;  // true -> donnee FFT (provenant du firmware FFT)
+  bool fgforceraworfft_; // true force par la ligne de commande fgdatafft_ true or false 
   bool fgsinglechannel_; // true -> un seul canal par fibre (par defaut=2 canaux/fibres)
   bool fgforcesinglechan_; // true force par la ligne de commande
   int prtlevel_;
   long int prtmodulo_; 
+
   uint_4 nbcalgrp_;    // Nb d'objets/threads dans BRVisCalcGroup 
   uint_4 nthreads_;  // Nb de threads pour l'execution parallele ds BRVisibilityCalculator
Index: /trunk/AddOn/TAcq/brfitsrd.cc
===================================================================
--- /trunk/AddOn/TAcq/brfitsrd.cc	(revision 3955)
+++ /trunk/AddOn/TAcq/brfitsrd.cc	(revision 3956)
@@ -148,5 +148,5 @@
     cout << " ---------------------------------------------------------- " << endl;
 
-    usleep(50000);       // Attente de traitement du dernier paquet
+    usleep(250000);       // Attente de traitement du dernier paquet
     memgr_.Stop();        // Arret 
 
Index: /trunk/AddOn/TAcq/brviscalc.cc
===================================================================
--- /trunk/AddOn/TAcq/brviscalc.cc	(revision 3955)
+++ /trunk/AddOn/TAcq/brviscalc.cc	(revision 3956)
@@ -12,5 +12,7 @@
 #include "pexceptions.h"
 #include "fioarr.h"
+#include "fitsarrhand.h"
 #include "matharr.h"
+#include "arrctcast.h"
 #include "timestamp.h"
 #include "ctimer.h"
@@ -26,8 +28,11 @@
 BRVisibilityCalculator::BRVisibilityCalculator(RAcqMemZoneMgr& memgr, string outpath, uint_4 nmean, size_t nthr)
   : BRBaseProcessor(memgr), paralex_(*this, nthr), nparthr_(nthr), 
-    outpath_(outpath), nmean_(nmean), nbcalc_(1), calcid_(0), vpdata_(2*memgr.NbFibres())
+    outpath_(outpath), nmean_(nmean), nbcalc_(1), calcid_(0), 
+    vpdata_(2*memgr.NbFibres()), vpdatar_(2*memgr.NbFibres())
     // , dtfos_(outpath+"visdt.fits", Fits_Create), visdt_(dtfos_, 1024, true);
 {  
+  SetFFTData();
   DefineRank(1,0);
+  SetPPFOutput();
 
   uint_4 maxnpairs = (2*memgr_.NbFibres()+1)*memgr_.NbFibres();
@@ -35,5 +40,7 @@
   chanpairnumall_.SetSize(maxnpairs);
   chanpairsall_.SetSize(maxnpairs,2);
-  for(size_t i=0; i<2*memgr_.NbFibres(); i++)   vpdata_[i]=NULL;
+  for(size_t i=0; i<2*memgr_.NbFibres(); i++)   { 
+    vpdata_[i]=NULL;   vpdatar_[i]=NULL;  
+  }
   SelectPairs();
 
@@ -113,5 +120,6 @@
     else 
       SelectPairs(calcid_*npairspth+pair1, npairspth, fgpimp);
-    MemZaction mmzas[6]={MemZA_ProcA,MemZA_ProcB,MemZA_ProcC,MemZA_ProcD,MemZA_ProcE,MemZA_ProcF};
+    MemZaction mmzas[10]={MemZA_ProcA,MemZA_ProcB,MemZA_ProcC,MemZA_ProcD,MemZA_ProcE,MemZA_ProcF,
+                          MemZA_ProcG,MemZA_ProcH,MemZA_ProcI,MemZA_ProcJ};
     SetMemZAction(mmzas[calcid_]);
     setNameId("viscalc_grp", calcid_); 
@@ -197,17 +205,32 @@
 
   string filename;
-  filename = outpath_+"chanum.ppf";
+  filename = (outpath_+"chanum.")+OutFileExtension();
   if (nbcalc_>1) {
     char sbuff[32];
-    sprintf(sbuff,"chanum_%d.ppf",(int)calcid_);
+    sprintf(sbuff,"chanum_%d.%s",(int)calcid_,OutFileExtension());
     filename = outpath_+sbuff;
   }
-  POutPersist poc(filename);
-  poc << PPFNameTag("chanids") << chanids_; 
-  poc << PPFNameTag("chanpairs") << chanpairs_; 
-  poc << PPFNameTag("chanpairnum") << chanpairnum_; 
-  poc << PPFNameTag("chanpairsall") << chanpairsall_; 
-  poc << PPFNameTag("chanpairnumall") << chanpairnumall_; 
-  cout << "BRVisibilityCalculator[" << calcid_ << "]::UpdateChanIds() Channel Ids/Pairs saved to PPF file " 
+  if (fgfitsout_) {  // Ecriture au format FITS
+    FitsInOutFile foc(filename, FitsInOutFile::Fits_Create);
+    foc.SetNextExtensionName("chanids"); 
+    foc << chanids_; 
+    foc.SetNextExtensionName("chanpairs");
+    foc << chanpairs_; 
+    foc.SetNextExtensionName("chanpairnum");
+    foc << chanpairnum_; 
+    foc.SetNextExtensionName("chanpairsall");
+    foc << chanpairsall_; 
+    foc.SetNextExtensionName("chanpairnumall");
+    foc << chanpairnumall_; 
+  }
+  else {  // Format PPF 
+    POutPersist poc(filename);
+    poc << PPFNameTag("chanids") << chanids_; 
+    poc << PPFNameTag("chanpairs") << chanpairs_; 
+    poc << PPFNameTag("chanpairnum") << chanpairnum_; 
+    poc << PPFNameTag("chanpairsall") << chanpairsall_; 
+    poc << PPFNameTag("chanpairnumall") << chanpairnumall_; 
+  }
+  cout << "BRVisibilityCalculator[" << calcid_ << "]::UpdateChanIds() Channel Ids/Pairs saved to file " 
        << filename << endl; 
   cout << " ... NbVisib=NbChanPairs=" << chanpairs_.NRows() << " ChannelPairs= " ;
@@ -266,4 +289,5 @@
 
     size_t paqsz=memgr_.PaqSize();
+    size_t procpaqsz=memgr_.ProcPaqSize();
     bool fgrun=true;
     while (fgrun) {
@@ -289,4 +313,10 @@
 	  break;
 	}
+	if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid,fib))==NULL)) {   // cela ne devrait pas arriver non plus
+	  cout << "BRVisibilityCalculator[" << calcid_ << "]::run()/ERROR memgr.GetProcMemZone(" 
+	       << mid << "," << fib << ") -> NULL" << endl;
+	  setRC(9);	  fgrun=false;		
+	  break;
+	}
       }
 
@@ -299,10 +329,18 @@
 	  char nfile[48];
 	  if (nbcalc_==1) 
-	    sprintf(nfile,"vismtx%d.ppf",numfile_);
+	    sprintf(nfile,"vismtx%d.%s",numfile_,OutFileExtension());
 	  else 
-	    sprintf(nfile,"vismtx_%d_%d.ppf",(int)calcid_,numfile_);
+	    sprintf(nfile,"vismtx_%d_%d.%s",(int)calcid_,numfile_,OutFileExtension());
 	  string flnm=outpath_+nfile;
-	  POutPersist po(flnm);
-	  po << vismtx_;
+	  if (fgfitsout_) {  // Ecriture au format FITS
+	    FitsInOutFile fo(flnm, FitsInOutFile::Fits_Create);
+	    TArray<r_4> arvismtx = ArrCastC2R(vismtx_);
+	    arvismtx.Info()=vismtx_.Info();
+	    fo << arvismtx;
+	  }
+	  else {  // Format PPF 
+	    POutPersist po(flnm);
+	    po << vismtx_;
+	  }
 	  if ((prtlev_>0)&&(numfile_%prtmodulo_==0)) {
 	    cout << numfile_ << "-BRVisCalc[" << calcid_ << "/" << nbcalc_ << "]::run() NPaqProc="
@@ -324,4 +362,5 @@
 	  vfgok_[fib] = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
 	  if (!vfgok_[fib])  fgallfibok[jp]=fgokallfibers_=false;
+	  if (procpaqsz>0)    vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
 	}
 	if (fgokallfibers_)  {
@@ -375,7 +414,15 @@
 {
   if (totnbpaq_==0) UpdateChanIds();  // Appele ici pour etre sur que le thread de remplissage a mis l'info a jour.
-  for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
-    vpdata_[2*fib] = vpaq_[fib].Data1C();
-    vpdata_[2*fib+1] = vpaq_[fib].Data2C();
+  if (fgdataraw_) {  // Donnees firmware RAW apres TF soft 
+    for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
+      vpdatar_[2*fib] = reinterpret_cast< complex<r_4>* > (vprocpaq_[fib]);
+      vpdatar_[2*fib+1] = reinterpret_cast< complex<r_4>* >(vprocpaq_[fib]+memgr_.ProcPaqSize()/2) ;
+    }
+  } 
+  else {   // donnees firmware FFT 
+    for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
+      vpdata_[2*fib] = vpaq_[fib].Data1C();
+      vpdata_[2*fib+1] = vpaq_[fib].Data2C();
+    }
   }
   
@@ -388,10 +435,18 @@
       char nfile[48];
       if (nbcalc_==1) 
-	sprintf(nfile,"vismtx%d.ppf",numfile_);
+	sprintf(nfile,"vismtx%d.%s",numfile_,OutFileExtension());
       else 
-	sprintf(nfile,"vismtx_%d_%d.ppf",(int)calcid_,numfile_);
+	sprintf(nfile,"vismtx_%d_%d.%s",(int)calcid_,numfile_,OutFileExtension());
       string flnm=outpath_+nfile;
-      POutPersist po(flnm);
-      po << vismtx_;
+      if (fgfitsout_) {  // Ecriture au format FITS
+	FitsInOutFile fo(flnm, FitsInOutFile::Fits_Create);
+	TArray<r_4> arvismtx = ArrCastC2R(vismtx_);
+	arvismtx.Info()=vismtx_.Info();
+	fo << arvismtx;
+      }
+      else {  // Format PPF 
+	POutPersist po(flnm);
+	po << vismtx_;
+      }
       if ((prtlev_>0)&&(numfile_%prtmodulo_==0)) {
 	cout << numfile_ << "-BRVisCalc[" << calcid_ << "/" << nbcalc_ << "]::Process() NPaqProc="
@@ -419,7 +474,15 @@
       if (fgpimp_&&(i!=j)&&((i+j)%2==0))  continue;  // calcul des visib avec numero pair-impair + autocorrel
       TVector< complex<r_4> > vis = vismtx_.Row(k);  k++;   
-      for(sa_size_t f=1; f<vis.Size(); f++) {
-	vis(f) += complex<r_4>((r_4)vpdata_[i][f].realB(), (r_4)vpdata_[i][f].imagB()) * 
-	  complex<r_4>((r_4)vpdata_[j][f].realB(), -(r_4)vpdata_[j][f].imagB());
+
+      if (fgdataraw_) {  // Donnees firmware RAW apres TF soft 
+	for(sa_size_t f=1; f<vis.Size(); f++) {
+	  vis(f) += vpdatar_[i][f] * vpdatar_[j][f];
+	}
+      }
+      else {   // donnees firmware FFT 
+	for(sa_size_t f=1; f<vis.Size(); f++) {
+	  vis(f) += complex<r_4>((r_4)vpdata_[i][f].realB(), (r_4)vpdata_[i][f].imagB()) * 
+	    complex<r_4>((r_4)vpdata_[j][f].realB(), -(r_4)vpdata_[j][f].imagB());
+	}
       }
       nb_flop_ += (8.*(r_8)(vis.Size()-1));
@@ -468,4 +531,5 @@
 {
   vector<TwoByteComplex*>  pvpdata(2*memgr_.NbFibres());
+  vector< complex<r_4>* >  pvpdatar(2*memgr_.NbFibres());
   size_t paqsz=memgr_.PaqSize();
   BRPaquet ppaq(paqsz);
@@ -481,8 +545,17 @@
   for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) {   // boucle sur les paquets d'une zone  
     if (!fgallfibok[jp])  continue;
-    for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
-      ppaq.Set(fbuff_[fib]+jp*paqsz);
-      pvpdata[2*fib] = ppaq.Data1C();
-      pvpdata[2*fib+1] = ppaq.Data2C();
+    if (fgdataraw_) {  // Donnees firmware RAW apres TF soft 
+      size_t procpaqsz=memgr_.ProcPaqSize();
+      for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) { 
+	pvpdatar[2*fib] = reinterpret_cast< complex<r_4>* > (fprocbuff_[fib]+jp*procpaqsz); 
+	pvpdatar[2*fib+1] = reinterpret_cast< complex<r_4>* >(vprocpaq_[fib]+jp*procpaqsz+procpaqsz/2) ;
+      }
+    } 
+    else {  // donnees firmware FFT 
+      for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
+	ppaq.Set(fbuff_[fib]+jp*paqsz);
+	pvpdata[2*fib] = ppaq.Data1C();
+	pvpdata[2*fib+1] = ppaq.Data2C();
+      }
     }
 
@@ -498,7 +571,14 @@
 	if (fgpimp_&&(i!=j)&&((i+j)%2==0))  continue;  // calcul des visib avec numero pair-impair + autocorrel
 	TVector< complex<r_4> > vis = vismtx_.Row(k);  k++;  
-	for(sa_size_t f=fdeb; f<ffin; f++) {
-	  vis(f) += complex<r_4>((r_4)pvpdata[i][f].realB(), (r_4)pvpdata[i][f].imagB()) * 
-	    complex<r_4>((r_4)pvpdata[j][f].realB(), -(r_4)pvpdata[j][f].imagB());
+	if (fgdataraw_) {  // Donnees firmware RAW apres TF soft 
+	  for(sa_size_t f=fdeb; f<ffin; f++) {
+	    vis(f) += pvpdatar[i][f] * pvpdatar[j][f];
+	  }
+	}
+	else {  // donnees firmware FFT 
+	  for(sa_size_t f=fdeb; f<ffin; f++) {
+	    vis(f) += complex<r_4>((r_4)pvpdata[i][f].realB(), (r_4)pvpdata[i][f].imagB()) * 
+	      complex<r_4>((r_4)pvpdata[j][f].realB(), -(r_4)pvpdata[j][f].imagB());
+	  }
 	}
 	nb_flop_ += (8.*(r_8)(ffin-fdeb));
@@ -609,4 +689,24 @@
 }
 /* --Methode-- */
+MemZStatus BRVisCalcGroup::SetMemZAction(MemZaction mmact)
+{
+  MemZaction mmzas[10]={MemZA_ProcA,MemZA_ProcB,MemZA_ProcC,MemZA_ProcD,MemZA_ProcE,MemZA_ProcF,
+			MemZA_ProcG,MemZA_ProcH,MemZA_ProcI,MemZA_ProcJ};
+  MemZStatus mmzss[10]={MemZS_ProcA,MemZS_ProcB,MemZS_ProcC,MemZS_ProcD,MemZS_ProcE,MemZS_ProcF,
+			MemZS_ProcG,MemZS_ProcH,MemZS_ProcI,MemZS_ProcJ};
+  size_t ia=9999;
+  for(int i=0; i<10; i++) {
+    if (mmact==mmzas[i]) { ia=i; break; }
+  }
+  if (ia>=10)  
+    throw ParmError("BRVisCalcGroup::SetMemZAction() Bad MemZaction mmact !");
+  if ((ia+viscalcp_.size())>10)  
+    throw ParmError("BRVisCalcGroup::SetMemZAction() MemZaction mmact too high !");
+  for(size_t i=0; i<viscalcp_.size(); i++) {
+    viscalcp_[i]->SetMemZAction(mmzas[ia]);   ia++;
+  }
+  return mmzss[ia-1];
+}
+/* --Methode-- */
 int BRVisCalcGroup::SelectFreqBinning(uint_4 freq1, uint_4 freq2, uint_4 nbfreq)
 {
@@ -622,4 +722,16 @@
     viscalcp_[i]->ActivateVisDTable(fgfdt);
 }
+/* --Methode-- */
+void BRVisCalcGroup::SetFitsOutput()
+{
+  for(size_t i=0; i<viscalcp_.size(); i++)
+    viscalcp_[i]->SetFitsOutput();
+} 
+/* --Methode-- */
+void BRVisCalcGroup::SetPPFOutput()
+{
+  for(size_t i=0; i<viscalcp_.size(); i++)
+    viscalcp_[i]->SetPPFOutput();
+} 
 /* --Methode-- */
 void BRVisCalcGroup::SetPrintLevel(int lev, uint_8 prtmodulo)
Index: /trunk/AddOn/TAcq/brviscalc.h
===================================================================
--- /trunk/AddOn/TAcq/brviscalc.h	(revision 3955)
+++ /trunk/AddOn/TAcq/brviscalc.h	(revision 3956)
@@ -40,4 +40,9 @@
   virtual ~BRVisibilityCalculator(); // Fait le nettoyage final , sauvegarde des objets ...
 
+  // configuration avec donnees firmware FFT (defaut) 
+  inline void SetRawData()  { fgdataraw_=true; } 
+  // configuration avec donnees firmware RAW (defaut) 
+  inline void SetFFTData()  { fgdataraw_=false; } 
+
   // Pour definir le rang de l'objet lors d'un traitement avec plusieurs BRVisibilityCalculator en //
   void DefineRank(uint_4 nbc, uint_4 cid, uint_4 pair1=0, uint_4 nbpairs=999999999, bool fgpimp=false);
@@ -58,9 +63,13 @@
   // Pour activer le remplissage du DataTable des visibilites 
   inline void ActivateVisDTable(bool fgfdt=false)  { fgvisdt_=fgfdt;  return; }
+  // Pour ecrire les fichiers de sortie au format fits (format PPF sinon) 
+  inline void SetFitsOutput() { fgfitsout_=true; }
+  // Pour ecrire les fichiers de sortie au format PPF (defaut) 
+  inline void SetPPFOutput() { fgfitsout_=false; }
 
   // Methode d'execution standard du thread (on redefinit la methode de BRBaseProcessor)
   virtual void run();  
   // Methode de la classe ParallelTaskInterface 
-  virtual int    execute(int tid);
+  virtual int  execute(int tid);
 
   // Le nombre total d'operations effectuees
@@ -78,8 +87,10 @@
   virtual int FillVisibTable(double fcm, double ttm); 
   virtual int CheckTimeTag(); 
+  inline const char* OutFileExtension() { return ((fgfitsout_)?"fits":"ppf"); } 
 
   ParallelExecutor paralex_;  // Pour l'execution en parallele  
   size_t nparthr_;
 
+  bool fgdataraw_;  // true -> donnees provenant du firmware RAW 
   uint_4 nmean_;  // Nombre de spectres pour le calcul des moyennes 
   string outpath_;  // directory pour fichiers de sortie
@@ -91,5 +102,7 @@
   uint_4 jf1_,jf2_,djf_;  // binning en frequence pour la datatable
 
-  vector<TwoByteComplex*> vpdata_;
+  vector<TwoByteComplex*> vpdata_;   // donnees du fimrware FFT 
+  vector< complex<r_4>* > vpdatar_;   // donnees du fimrware RAW apres FFT soft 
+
   bool* fgallfibok;  
 
@@ -99,9 +112,11 @@
   
   TMatrix< complex<r_4> > vismtx_; 
-  TVector< uint_4 > chanids_;    // Numero de chaque canal=FiberId*2-1, FiberId*2
-  TVector< uint_4 > chanpairnumall_;  // Liste de tous les numeros de paires de canaux (forme 1000*C1+C2=IIIJJJ)
-  TMatrix< uint_4 > chanpairsall_ ;  // Liste de toutes paires de canaux (forme (C1,C2) )
-  TVector< uint_4 > chanpairnum_;    // Liste des paires de canaux calcules par ce BRVisibilityCalculator
-  TMatrix< uint_4 > chanpairs_ ;  // Liste des paires de canaux (forme (C1,C2) ) pour ce BRVisibilityCalculator
+  TVector< int_4 > chanids_;    // Numero de chaque canal=FiberId*2-1, FiberId*2
+  TVector< int_4 > chanpairnumall_;  // Liste de tous les numeros de paires de canaux (forme 1000*C1+C2=IIIJJJ)
+  TMatrix< int_4 > chanpairsall_ ;  // Liste de toutes paires de canaux (forme (C1,C2) )
+  TVector< int_4 > chanpairnum_;    // Liste des paires de canaux calcules par ce BRVisibilityCalculator
+  TMatrix< int_4 > chanpairs_ ;  // Liste des paires de canaux (forme (C1,C2) ) pour ce BRVisibilityCalculator
+
+  bool fgfitsout_;  // if true -> write visibility matrices in fits format 
 
   //  FitsInOutFile dtfos_;
@@ -137,8 +152,15 @@
 		 uint_4 pair1=0, uint_4 nbpairs=999999999, bool fgpimp=false, size_t nthr=1);
   ~BRVisCalcGroup();
+
+  MemZStatus SetMemZAction(MemZaction mmact=MemZA_ProcA);
+
   int SelectFreqBinning(uint_4 freq1=0, uint_4 freq2=0, uint_4 nbfreq=1);
   inline int ActivateTimeTagCheck(uint_8 maxnpaq)
   { return viscalcp_[0]->ActivateTimeTagCheck(maxnpaq); }
   void ActivateVisDTable(bool fgfdt=false);
+  // Pour ecrire les fichiers de sortie au format fits (format PPF sinon) 
+  void SetFitsOutput();
+  // Pour ecrire les fichiers de sortie au format PPF (defaut) 
+  void SetPPFOutput();
   void SetPrintLevel(int lev=0, uint_8 prtmodulo=10);
 
Index: /trunk/AddOn/TAcq/vismfib.cc
===================================================================
--- /trunk/AddOn/TAcq/vismfib.cc	(revision 3955)
+++ /trunk/AddOn/TAcq/vismfib.cc	(revision 3956)
@@ -58,22 +58,12 @@
     ResourceUsage resu;
 
-    cout << " visimfib: Creating MemZoneMgr/threads - PaqSz= " << par.paqsize_ << endl;
+    BRPaquet paq(par.paqsize_);
+    uint_4 procsz=sizeof(float)*(paq.DataSize()+4);
+    if ((par.fgdatafft_)||(par.action_=="cube3d")) procsz = 0;
+    cout << " visimfib: Creating MemZoneMgr/processing threads - PaqSz= " << par.paqsize_ 
+	 << " ProcPaqSz=" << procsz << endl;
 
-    RAcqMemZoneMgr mmgr(par.nzones_, par.dirlist_.size(), par.npaqinzone_, par.paqsize_);
-    if (par.action_ == "cube3d")  mmgr.SetFinalizedMask((uint_4)MemZS_Saved);
-    else  {
-      if (par.nbcalgrp_==2) 
-	mmgr.SetFinalizedMask((uint_4)MemZS_ProcA|(uint_4)MemZS_ProcB);
-      else if (par.nbcalgrp_==3) 
-	mmgr.SetFinalizedMask((uint_4)MemZS_ProcA|(uint_4)MemZS_ProcB|(uint_4)MemZS_ProcC);
-      else if (par.nbcalgrp_==4) 
-	mmgr.SetFinalizedMask((uint_4)MemZS_ProcA|(uint_4)MemZS_ProcB|(uint_4)MemZS_ProcC|(uint_4)MemZS_ProcD);
-      else if (par.nbcalgrp_==5) 
-	mmgr.SetFinalizedMask((uint_4)MemZS_ProcA|(uint_4)MemZS_ProcB|(uint_4)MemZS_ProcC|(uint_4)MemZS_ProcD|(uint_4)MemZS_ProcE);
-      else if (par.nbcalgrp_==6) 
-	mmgr.SetFinalizedMask((uint_4)MemZS_ProcA|(uint_4)MemZS_ProcB|(uint_4)MemZS_ProcC|
-                              (uint_4)MemZS_ProcD|(uint_4)MemZS_ProcE|(uint_4)MemZS_ProcF);
-      else mmgr.SetFinalizedMask((uint_4)MemZS_ProcA);	
-    }
+    RAcqMemZoneMgr mmgr(par.nzones_, par.dirlist_.size(), par.npaqinzone_, par.paqsize_, procsz);
+    
     BRMultiFitsReader reader(mmgr, par.dirlist_, par.rdsamefc_, par.imin_, par.imax_, par.istep_);
     reader.SetPrintLevel(par.prtlevel_,par.prtmodulo_);
@@ -85,4 +75,16 @@
 
     if (par.action_ == "viscktt")  procg.ActivateTimeTagCheck(par.TotalNPaquets());
+    if (par.fgfitsout_) procg.SetFitsOutput();
+
+    BRFFTCalculator procfft(mmgr, par.fgsinglechannel_);
+
+    // On determine MemZaction pour chaque processeur et le finalizemask en fonction du traitement demande 
+    if (par.action_ == "cube3d")  mmgr.SetFinalizedMask((uint_4)MemZS_Saved);
+    else {
+      MemZStatus mfmask=MemZS_ProcA;
+      if (par.fgdatafft_) mfmask=procg.SetMemZAction(MemZA_ProcA);
+      else mfmask=procg.SetMemZAction(MemZA_ProcB);
+      mmgr.SetFinalizedMask((uint_4)mfmask);
+    }
 
     FitsCubeWriter wrt(mmgr, par.outpath_, par.nbloc_);
@@ -92,9 +94,15 @@
     reader.start();
     if (par.action_ == "cube3d")   wrt.start();
-    else  procg.start();
+    else  { 
+      if (!par.fgdatafft_)  procfft.start(); 
+      procg.start();
+    }
     usleep(200000);
     reader.join();
     if (par.action_ == "cube3d")  wrt.join();
-    else procg.join();
+    else {
+      if (!par.fgdatafft_)  procfft.join(); 
+      procg.join();
+    }
     mmgr.Print(cout);
     cout << resu ; 
