Index: /trunk/AddOn/TAcq/bracqvers.h
===================================================================
--- /trunk/AddOn/TAcq/bracqvers.h	(revision 3671)
+++ /trunk/AddOn/TAcq/bracqvers.h	(revision 3671)
@@ -0,0 +1,11 @@
+#ifndef BRACQVERS_H_SEEN
+#define BRACQVERS_H_SEEN
+
+/* -----  BAORadio  acquisition software ----- 
+   Software version     LAL - 2008-2010 
+*/
+#define BAOR_ACQ_VER 6.4
+#define BAOR_ACQ_VER_STR "BaoAcq_v6r4_Oct09 "
+
+#endif
+
Index: /trunk/AddOn/TAcq/brpaqu.cc
===================================================================
--- /trunk/AddOn/TAcq/brpaqu.cc	(revision 3670)
+++ /trunk/AddOn/TAcq/brpaqu.cc	(revision 3671)
@@ -3,4 +3,44 @@
 #include "brpaqu.h"
 
+/* ----------------------------------------
+     Projet BAORadio --- LAL - 2008-2010 
+     R. Ansari , M.Taurigna 
+-------------------------------------------  */
+
+/* --Methode-- */
+BAORadioException::BAORadioException(const char * m)   throw()
+{
+  if (m!=NULL) { 
+    strncpy(msg_, m, BREX_MAXMSGLEN-1);
+    msg_[BREX_MAXMSGLEN-1] = '\0';
+  }
+  else msg_[0] = '\0';
+}
+/* --Methode-- */
+BAORadioException::BAORadioException(const string& m)   throw()
+{
+  strncpy(msg_, m.c_str(), BREX_MAXMSGLEN-1);
+  msg_[BREX_MAXMSGLEN-1] = '\0';
+}
+
+/* --Methode-- */
+BAORadioException::~BAORadioException()  throw()
+{
+}
+
+/* --Methode-- */
+const char* BAORadioException::what() const throw()
+{
+  return msg_;
+}
+
+/* --Methode-- */
+string const BAORadioException::Msg() const 
+{
+  return (string(msg_));
+}
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
 
 static inline void bswap4(void* p)
@@ -14,17 +54,20 @@
 
 /* --Methode__ */
-BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgswap,int binMin,int nbBin )
+BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgconv)
   // swapall = true -> on swap tout le paquet, sinon swap entete seulement
 {
   dst_ = dst;
   sz_ = paqsz;
-  if ((src == NULL) || (dst == NULL)) return;
-  // Il faut mettre une protection (throw) si dst==NULL ou sz==0
+  /*
+  if ((dst == NULL) || (paqsz<=(BRHDRSIZE+BRTRLSIZE)) ) 
+    throw BAORadioException("BRPaquet::BRPaquet(src,dst...) NULL src or dst pointer OR paqsz<HDR+TRLSize");
+  */
+  if ((dst==NULL)||(src==NULL))  return;
 
   UInt32* src32 = (UInt32*)src;
   UInt32* dst32 = (UInt32*)dst;
-  Byte* tmp = new Byte[sz_];
  
-  switch ( fgswap ) {
+ 
+  switch ( fgconv ) {
   case BR_DoNothing :  // rien a faire
     break;
@@ -32,17 +75,7 @@
     memcpy(dst_, src, sz_); 
     break;
-  case BR_Copy_Reduc : // copie directe 
-   memcpy(dst_, src, HeaderSize()); 
-   
-    memcpy(dst_+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin); 
-   memcpy(dst_+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin); 
-   memcpy(dst_+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize());
- 
-    SetPaqLen( nbBin/2);
-   break;
-   
   case BR_Swap32 : // On swappe toutes les donnees du paquet 
   //  les bytes sont dans l'ordre par paquet de 4 octets (Int32) , les deux Int32 de 
-  // On copie la zone donnees en faisant un byte-swap correspondant a 8 octets (4->8 Reza/firmware SGDMA) 
+  // On copie la zone donnees en faisant un byte-swap correspondant a 8 octets (4->8 Reza/firmware SGDMA)
     for(int ka=0; ka<sz_/4; ka+=2) {
       dst32[ka] = src32[ka+1];
@@ -51,5 +84,6 @@
     break;
   case BR_SwapAll:
-  for(int ka=0; ka<sz_; ka+=8) {
+    // Byte swap complet sur 8 bytes 
+    for(int ka=0; ka<sz_; ka+=8) {
       for(int kb=0; kb<4; kb++) {
         dst_[ka+kb] = src[ka+3-kb+4];    
@@ -57,5 +91,12 @@
       }
     }
-  for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
+    break;
+  case BR_CopyHDR:
+    for(int ka=0; ka<BRHDRSIZE/4; ka++)  dst32[ka] = src32[ka];
+    for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++)  dst32[ka] = src32[ka];
+    break;
+  case BR_SwapHDR :
+    // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete 
+    for(int ka=0; ka<BRHDRSIZE; ka+=8) {
       for(int kb=0; kb<4; kb++) {
 	dst_[ka+kb] = src[ka+3-kb+4];    
@@ -63,8 +104,32 @@
       }
     }
-    break;
-  case BR_SwapHDR :
+    // Byte swap (sur 8 octets) du trailer 
+    for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
+      for(int kb=0; kb<4; kb++) {
+	dst_[ka+kb] = src[ka+3-kb+4];    
+        dst_[ka+kb+4] = src[ka+3-kb];    
+      }
+    }
+    break;
+
+    //  --------------------
+    //  --- Copie/remise en ordre des donnees FFT 
   case BR_FFTOneChan :
   case BR_FFTTwoChan :
+    // copie du header uniquement 
+    for(int ka=0; ka<BRHDRSIZE/4; ka++)  dst32[ka] = src32[ka];
+    // on reoordonne les coeff FFT (pas de swap) 
+    if (fgconv == BR_FFTOneChan) 
+      ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
+    else  {
+      ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
+      ReorderFFTData((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
+    }
+    // copie du trailler uniquement : 
+    for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++)  dst32[ka] = src32[ka];
+    break;
+
+  case BR_FFTOneChanSwapAll :
+  case BR_FFTTwoChanSwapAll :
     // Byte swap (sur 8 octets) de l'entete
     // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete 
@@ -75,10 +140,10 @@
       }
     }
-
     // on reoordonne les coeff FFT et on swappe en mem temps  (Byte-swap sur 8 octets)
-    if (fgswap == BR_FFTOneChan) ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
-    else if (fgswap == BR_FFTTwoChan) {
-      ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
-      ReorderFFTData((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
+    if (fgconv == BR_FFTOneChanSwapAll) 
+      ReorderFFTDataSwapAll((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
+    else  {
+      ReorderFFTDataSwapAll((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
+      ReorderFFTDataSwapAll((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
     }
     // Byte swap (sur 8 octets) du trailer 
@@ -91,6 +156,6 @@
     break;
  
-  case BR_FFTOneChan32 :
-  case BR_FFTTwoChan32 :
+  case BR_FFTOneChanSwap32 :
+  case BR_FFTTwoChanSwap32 :
     // swap du header uniquement : Echange de deux mots de 4 octets
     for(int ka=0; ka<BRHDRSIZE/4; ka+=2) {
@@ -98,10 +163,10 @@
       dst32[ka+1] = src32[ka];
     }
-  
     // on reoordonne et on swappe en mem temps (Echange de deux mots de 4 octets)
-    if (fgswap == BR_FFTOneChan32) ReorderFFTData32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
-    else if (fgswap == BR_FFTTwoChan32) {
-      ReorderFFTData32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
-      ReorderFFTData32((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
+    if (fgconv == BR_FFTOneChanSwap32) 
+      ReorderFFTDataSwap32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
+    else  {
+      ReorderFFTDataSwap32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
+      ReorderFFTDataSwap32((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
     }
     // swap du trailler uniquement : Echange de deux mots de 4 octets
@@ -111,52 +176,10 @@
     }
     break;
-  case BR_FFTOneChanNoSwap :
-  case BR_FFTTwoChanNoSwap :
-    // copie du header uniquement 
-    for(int ka=0; ka<BRHDRSIZE/4; ka++)  dst32[ka] = src32[ka];
-
-    //DEL  on a plus de swapdonc il faut copier dans dst
-    //DEL    memcpy(dst_, src, sz_); 
-
-    // on reoordonne les coeff FFT (pas de swap) 
-    if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
-    else if (fgswap == BR_FFTTwoChanNoSwap) {
-      ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
-      ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
-    }
-    // copie du trailler uniquement : 
-     for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++)  dst32[ka] = src32[ka];
-     break;
-  case BR_CpHdrTrl :
-    for(int ka=0; ka<BRHDRSIZE/4; ka++)  dst32[ka] = src32[ka];
-    for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++)  dst32[ka] = src32[ka];
-    break;
-
- case BR_FFTOneChanNoSwapReduct :
-  case BR_FFTTwoChanNoSwapReduct :
-    // copie du header uniquement 
-   
-    for(int ka=0; ka<BRHDRSIZE/4; ka++)  dst32[ka] = src32[ka];
-
-    //DEL  on a plus de swapdonc il faut copier dans dst
-    //DEL    memcpy(dst_, src, sz_); 
-
-    // on reoordonne les coeff FFT (pas de swap) 
-    if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(tmp+HeaderSize()), DataSize());
-    else if (fgswap == BR_FFTTwoChanNoSwap) {
-      ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(tmp+HeaderSize()), DataSize()/2);
-      ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(tmp+HeaderSize()+DataSize()/2), DataSize()/2);
-    }
-    memcpy(tmp+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin); 
-   memcpy(tmp+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin); 
-   memcpy(tmp+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize());
-   memcpy(dst_+ HeaderSize(),tmp+ HeaderSize(),( 2* nbBin)+TrailerSize());
-    SetPaqLen( nbBin/2);
-
-    // copie du trailler uniquement : 
-    //  for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++)  dst32[ka] = src32[ka];
-     break;
+
+  default:
+    // on ne fait rien 
+    break;
   }  // Fin switch 
-
+  
 }
 
@@ -164,7 +187,63 @@
 BRPaquet::BRPaquet(Byte* srcdst, int paqsz)
 {
+  /*
+  if ((srcdst==NULL)||(paqsz<=(BRHDRSIZE+BRTRLSIZE))) 
+    throw BAORadioException("BRPaquet::BRPaquet(srcdst) NULL pointer OR paqsz<HDR+TRLSize");  
+  */
   dst_ = srcdst;
   sz_ = paqsz;
-  // Il faut mettre une protection (throw) si srcdst==NULL ou sz==0
+}
+
+/* --Methode__ */
+BRPaquet::BRPaquet(int paqsz)
+{
+  /*
+  if (paqsz<=(BRHDRSIZE+BRTRLSIZE))
+    throw BAORadioException("BRPaquet::BRPaquet(paqsz) paqsz<HDR+TRLSize");  
+  */
+  dst_ = NULL;
+  sz_ = paqsz;
+}
+
+/* --Methode__ */
+void BRPaquet::CopyFrom(BRPaquet& pq, BRPaqReducAction ract, int offset)
+{
+  if (ract==BR_CopyRA) {
+    if (PaquetSize()!=pq.PaquetSize()) 
+      throw BAORadioException("BRPaquet::CopyFrom(BR_CopyRA) - NOT equal paquet size");
+      memcpy(Begin(), pq.Begin(), PaquetSize()); 
+      return;
+  }
+  // Recopie de l'entete HDR et trailer TRL 
+  memcpy(Header(), pq.Header(), HeaderSize()); 
+  memcpy(Trailer(), pq.Trailer(), TrailerSize());
+  // Recopie partielle des donnees 
+  size_t szc, szcmx;
+  switch (ract) {
+  case BR_OneChanReduc:
+  case BR_OneChanReducK0:
+    szc = DataSize();
+    szcmx = pq.DataSize()-offset;
+    if (szcmx<szc) szc=szcmx;
+    memcpy(Data1(), pq.Data1(), szc);
+    if (ract==BR_OneChanReducK0)   *(Data1C()) = *(pq.Data1C());  // On garde le continu et le nyquist   
+    SetPaqLen(szc/4);  
+    break;
+  case BR_TwoChanReduc:
+  case BR_TwoChanReducK0:
+    szc = DataSize()/2;
+    szcmx = pq.DataSize()/2-offset;
+    if (szcmx<szc) szc=szcmx;
+    memcpy(Data1(), pq.Data1(), szc);
+    memcpy(Data2(), pq.Data2(), szc);
+    if (ract==BR_TwoChanReducK0)  {   // On garde le continu et le nyquist  
+      *(Data1C()) = *(pq.Data1C()); 
+      *(Data2C()) = *(pq.Data2C()); 
+    }
+    SetPaqLen(szc/2);  
+    break;
+  default:
+    break;
+  }
 }
 
@@ -294,6 +373,7 @@
 
 /* --Methode__ */
-void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N)
-{
+void BRPaquet::ReorderFFTDataSwapAll(SByte* src, SByte* dst, int N)
+{
+  // Remise en ordre des donnees avec swap complet sur 8 bytes 
   // Code recopie depuis /Dev/DisplayData/HistoWindow.cc 
   // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie 
@@ -342,6 +422,8 @@
 }
 
-void BRPaquet::ReorderFFTData32(SByte* src, SByte* dst, int N)
-{
+/* --Methode__ */
+void BRPaquet::ReorderFFTDataSwap32(SByte* src, SByte* dst, int N)
+{
+  // Remise en ordre avec echange (swap) des mots de 32 bits 
   // Code recopie depuis /Dev/DisplayData/HistoWindow.cc 
   // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie 
@@ -384,6 +466,9 @@
   return ; 
 }
-void BRPaquet::ReorderFFTDataNoSwap(SByte* src, SByte* dst, int N)
-{
+
+/* --Methode__ */
+void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N)
+{
+  // Remise en ordre des donnees FFT (sans swap) 
   // Code recopie depuis /Dev/DisplayData/HistoWindow.cc 
   // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie 
@@ -428,8 +513,8 @@
 
 /* --Methode__ */
-const char* BRPaquet::FmtConvToString(BRDataFmtConv fgswap)
+const char* BRPaquet::FmtConvToString(BRDataFmtConv fgconv)
 {
   const char * rs="";
-  switch ( fgswap ) {
+  switch ( fgconv ) {
   case BR_DoNothing :  
     rs = "BR_DoNothing";
@@ -441,4 +526,10 @@
     rs = "BR_SwapAll";
     break;
+  case BR_Swap32 :
+    rs = "BR_Swap32";
+    break;
+  case BR_CopyHDR :
+    rs = "BR_CopyHDR";
+    break;
   case BR_SwapHDR :
     rs = "BR_SwapHDR";
@@ -450,18 +541,15 @@
     rs = "BR_FFTTwoChan";
     break;
-  case BR_Swap32 :
-    rs = "BR_Swap32";
-    break;
-  case BR_FFTOneChan32 :
-    rs = "BR_FFTOneChan32";
-    break;
-  case BR_FFTTwoChan32 :
-    rs = "BR_FFTTwoChan32";
-    break;
-  case BR_FFTOneChanNoSwap :
-    rs = "BR_FFTOneChanNoSwap";
-    break;
-  case BR_FFTTwoChanNoSwap :
-    rs = "BR_FFTTwoChanNoSwap";
+  case BR_FFTOneChanSwapAll :
+    rs = "BR_FFTOneChanSwapAll";
+    break;
+  case BR_FFTTwoChanSwapAll :
+    rs = "BR_FFTTwoChanSwapAll";
+    break;
+  case BR_FFTOneChanSwap32 :
+    rs = "BR_FFTOneChanSwap32";
+    break;
+  case BR_FFTTwoChanSwap32 :
+    rs = "BR_FFTTwoChanSwap32";
     break;
   default:
@@ -476,4 +564,5 @@
 // --------------------------------------------------------------------------
 
+/* --Methode__ */
 BRPaqChecker::BRPaqChecker(bool cktrl, int maxprt)
 {
@@ -490,4 +579,5 @@
 }
 
+/* --Methode__ */
 BRPaqChecker::~BRPaqChecker()
 {
@@ -500,4 +590,5 @@
 }
 
+/* --Methode__ */
 UInt64 BRPaqChecker::DefineTRLTag(UInt32 trl1, UInt32 trl2)
 {
@@ -506,5 +597,5 @@
 }
 
-
+/* --Methode__ */
 bool BRPaqChecker::Check(BRPaquet& paq, UInt64& numframe)
 {
@@ -543,4 +634,5 @@
 }
 
+/* --Methode__ */
 ostream& BRPaqChecker::Print(ostream& os) const
 {
@@ -556,2 +648,17 @@
   return os;
 }
+
+/* --Methode__ */
+string BRPaqChecker::Summary(bool detail) const
+{
+  double meangap = (cnt_saut>0)?((double)lostframes/(double)cnt_saut):0.;
+  double lossrate= (double)lostframes*100./(double)totnframes;
+  char buff[256];
+  if (detail) 
+    sprintf(buff, " TotNPaq= %ld  HDR/TRL OK= %ld LostFrames= %ld LossRate= %lg NbGaps= %ld MeanGap= %lg",
+	    (long)totnframes, (long)nframeok, (long)lostframes, lossrate, (long)cnt_saut, meangap);
+  else 
+    sprintf(buff, "TotNPaq=%ld  N_Ok=%ld LossRate=%lg", (long)totnframes, (long)nframeok, lossrate); 
+  return buff;
+}
+
Index: /trunk/AddOn/TAcq/brpaqu.h
===================================================================
--- /trunk/AddOn/TAcq/brpaqu.h	(revision 3670)
+++ /trunk/AddOn/TAcq/brpaqu.h	(revision 3671)
@@ -9,4 +9,5 @@
 #include <stdio.h>
 #include <iostream>
+#include <exception>
 #include <string>
 #include "brtypes.h"
@@ -14,4 +15,22 @@
 
 using namespace std;
+
+// ---------------------------------------------------------
+// ----- Classe d'exception pour Acquisition BAORadio ------
+#define BREX_MAXMSGLEN 160
+
+class BAORadioException : public std::exception {
+  public:
+  explicit BAORadioException(const char * m) throw() ; 
+  explicit BAORadioException(const string& m) throw() ;
+  virtual ~BAORadioException() throw() ; 
+  //! Implementation of std::exception what() method, returning the exception message
+  virtual const char* what() const throw();
+  virtual string const Msg() const ; 
+ private:
+  char msg_[BREX_MAXMSGLEN];
+};
+
+
 
 // ------------------------------------------------
@@ -38,10 +57,14 @@
 
   inline double realD() { return  (double)(val_)[0]; }
-      inline double imagD() { return  (double)(val_)[1]; }
+  inline double imagD() { return  (double)(val_)[1]; }
 
   SByte val_[2];
 };
 
-// ------------------------------------------------
+// --------------------------------------------------------
+// ----- Classe BRPaquet , constante et enum associe ------
+//     Representation, manipulation des paquets/frames 
+//     envoyes par les cartes ADC  
+// --------------------------------------------------------
 
 // OFFSET : au cas ou le firmware reception ajoute des mots avant le header 
@@ -68,47 +91,35 @@
 //#define BRPCOFF 16
 
-enum ChannelID
-  {
-    None=0,
-    Ch1,
-    Ch2,
-    Ch1_2,
-    Ch3,
-    Ch4,
-    Ch3_4
-  };
-enum ModeAcq
-  {
-    RawData=1,
-    FFT
-  };
+enum ChannelID { None=0, Ch1, Ch2, Ch1_2, Ch3, Ch4, Ch3_4 };
+enum ModeAcq { RawData=1, FFT };
 
 // Definition des actions sur la conversion de format (swap...) des donnees arrivant
 enum BRDataFmtConv {
-  BR_DoNothing,
-  BR_Copy,
-  BR_SwapAll,
-  BR_SwapHDR,
-  BR_FFTOneChan,
-  BR_FFTTwoChan,
-  BR_Swap32,
-  BR_FFTOneChan32,
-  BR_FFTTwoChan32,
-  BR_FFTOneChanNoSwap,
-  BR_FFTTwoChanNoSwap,
-  BR_CpHdrTrl,
-  BR_Copy_Reduc,
-  BR_FFTOneChanNoSwapReduct,
-  BR_FFTTwoChanNoSwapReduct
-};
-
+  BR_DoNothing, BR_Copy, BR_SwapAll, BR_Swap32, BR_CopyHDR, BR_SwapHDR, 
+  BR_FFTOneChan, BR_FFTTwoChan,  
+  BR_FFTOneChanSwapAll, BR_FFTTwoChanSwapAll, 
+  BR_FFTOneChanSwap32, BR_FFTTwoChanSwap32,
+};
+
+// Definition des action pour recopie de paquet avec reduction de taille de paquet
+//    Copie complete (--> egalite de taille, 1,2 canaux, K0 -> Keep first two bytes (Continu/Nyquist) 
+enum BRPaqReducAction {
+  BR_CopyRA, BR_OneChanReduc, BR_TwoChanReduc, BR_OneChanReducK0, BR_TwoChanReducK0
+};
+
+//---- Classe BRPaquet 
 // Structure correspondant a HEADER-DATA-TRAILER
 class BRPaquet {
  public:
 // Cree d'un objet BRPaquet avec copie/swap depuis src -> dst (si src != NULL)
-  BRPaquet(Byte* src, Byte* dst, int paqsz=16424, BRDataFmtConv fgswap=BR_Copy,int minBin=0,int nbBin=0);
+  BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgconv=BR_Copy);
   // Cree d'un objet BRPaquet de taille paqsz sur la zone dst   
-  BRPaquet(Byte* srcdst, int paqsz=16424);
+  BRPaquet(Byte* srcdst, int paqsz);
+  BRPaquet(int paqsz);
+
   //  ~BRPaquet();
+
+  // Pour la copie/reduction de taille de paquet 
+  void CopyFrom(BRPaquet& pq, BRPaqReducAction ract=BR_CopyRA, int offset=0);
 
   // Acces diverses tailles 
@@ -175,8 +186,11 @@
 
   // fonction appelee par le constructeur pour reordonner les donnees FFT 
+  // --- Remise en ordre avec swap complet sur 8 bytes 
+  static void ReorderFFTDataSwapAll(SByte* src, SByte* dst, int sz);
+  // --- Remise en ordre avec echanges des mots de 4 bytes 
+  static void ReorderFFTDataSwap32(SByte* src, SByte* dst, int sz);
+  // --- Remise en ordre seulement 
   static void ReorderFFTData(SByte* src, SByte* dst, int sz);
-  static void ReorderFFTData32(SByte* src, SByte* dst, int sz);
-  static void ReorderFFTDataNoSwap(SByte* src, SByte* dst, int sz);
-  static const char* FmtConvToString(BRDataFmtConv fgswap);
+  static const char* FmtConvToString(BRDataFmtConv fgconv);
 // protected:
   // donnees membres
@@ -209,4 +223,6 @@
   ostream & Print(ostream& os) const;
   inline ostream & Print() const { return Print(cout); }
+  // renvoie le resume de la statistique paquets sous forme de chaine
+  string Summary(bool detail=false) const;
 
   // Acces aux differents compteurs 
Index: /trunk/AddOn/TAcq/brparam.cc
===================================================================
--- /trunk/AddOn/TAcq/brparam.cc	(revision 3671)
+++ /trunk/AddOn/TAcq/brparam.cc	(revision 3671)
@@ -0,0 +1,221 @@
+#include "brparam.h"
+#include "strutilxx.h"
+#include "bracqvers.h"
+
+
+// Classe qui memorise tous les parametres importants de l'acquisition
+
+/* --Methode-- */
+BRParList::BRParList(string fibres,unsigned int paqsz ,unsigned int nframeDMA, 
+		     int nfiles, string acqmod,int nblocfile,int nmxproc ,
+		     string outpath, uint_4 nzon , uint_4 npaqzon, bool fgcntlc)
+{
+  FiberListS=fibres;
+  NbFibers=0;
+  for (int fib=0; fib<PMAXNBFIBRES;fib++)  FiberNum[fib]=0;
+  PaqSize=paqsz;
+  nbFrameDMA=nframeDMA;
+  NbFiles=nfiles;
+  AcqMode=acqmod;
+  NBlocPerFile=nblocfile;
+  NMaxProc=nmxproc;
+  OutPathName=outpath;
+  nZones=nzon;
+  nPaqZone=npaqzon;
+  swapall=BR_Copy;
+  savesigfits=true;
+  fgnulldev4fits=false;
+  fg_hard_ctrlc=fgcntlc;
+  fgnulldev4fits = (OutPathName == "/dev/null") ? true : false;
+
+  fgreducpsize=false;
+  redpqsize=PaqSize;
+  reducoffset=0;
+
+  monothr=false;
+  activate_pattern=false;
+
+  Decode();    // On decode et on complete les parametres 
+}
+
+/* --Methode-- */
+BRParList::BRParList(BRParList const & p)
+{
+  Set(p);
+}
+
+/* --Methode-- */
+void BRParList::Set(BRParList const & p)
+{
+  FiberListS=p.FiberListS;
+  NbFibers=p.NbFibers;
+  for (int fib=0; fib<PMAXNBFIBRES;fib++)  FiberNum[fib]=p.FiberNum[fib];
+  PaqSize=p.PaqSize;
+  nbFrameDMA=p.nbFrameDMA;
+  NbFiles=p.NbFiles;
+  AcqMode=p.AcqMode;
+  NBlocPerFile=p.NBlocPerFile;
+  NMaxProc=p.NMaxProc;
+  OutPathName=p.OutPathName;
+  nZones=p.nZones;
+  nPaqZone=p.nPaqZone;
+  swapall=p.swapall;
+  savesigfits=p.savesigfits;
+  fgnulldev4fits=p.fgnulldev4fits;
+  fg_hard_ctrlc=p.fg_hard_ctrlc;
+  fgnulldev4fits=p.fgnulldev4fits;
+
+  fgreducpsize=p.fgreducpsize;
+  redpqsize=p.redpqsize;
+  reducoffset=p.reducoffset;
+
+  monothr=p.monothr;
+  activate_pattern=p.activate_pattern;
+  return;
+}
+
+/* --Methode-- */
+void BRParList::ReadDCFile(string file)
+{
+  DataCards conf(file);
+  FiberListS= conf.SParam("Fibres",0,"1");
+  PaqSize=(unsigned int)conf.IParam("PaqSZ",0,16424);
+  nbFrameDMA =(unsigned int) conf.IParam("nbFrameDma",0,32);
+  NbFiles=conf.IParam("NbFiles",0,1);
+  NBlocPerFile=conf.IParam("NBlocPerFile",0,10);
+  NMaxProc=conf.IParam("NMaxProc",0,0);
+  OutPathName= conf.SParam("OutPathName",0,"TstAcq");
+  AcqMode =conf.SParam("acqmode",0,"std");
+  nZones=(unsigned int)conf.IParam("nZones",0,4);
+  nPaqZone=(uint_4)conf.IParam("nPaqZone",0,128);
+  fg_hard_ctrlc=conf.HasKey("fg_hard_ctrlc");
+
+  Decode();
+}
+
+/* --Methode-- */
+void BRParList::Decode() 
+{
+  vector<string> fiblist;
+  FillVStringFrString(FiberListS, fiblist, ',');
+  NbFibers=fiblist.size();
+  for (int fib=0; fib<fiblist.size(); fib++) {
+    FiberNum[fib]=atoi(fiblist[fib].c_str()); 
+  }
+  string acqmode = AcqMode;
+  if (acqmode == "std")  swapall = BR_Copy ;
+  if (acqmode == "nosw")   swapall = BR_Copy ;
+  if (acqmode == "nof")  { swapall = BR_Copy ; savesigfits = false; }
+  if (acqmode == "fft1c")  swapall = BR_FFTOneChan;
+  if (acqmode == "fft2c")  swapall = BR_FFTTwoChan;
+  if (acqmode == "fft1cnof")  { swapall = BR_FFTOneChan;  savesigfits = false; }
+  if (acqmode == "fft2cnof")  { swapall = BR_FFTTwoChan;  savesigfits = false; }
+  if (acqmode == "mono")  { monothr = true;   swapall = BR_Copy; }
+  if (acqmode == "monodirect")  { monothr = true;  swapall =  BR_CopyHDR;}
+  if (acqmode == "patmonodirect")  { monothr = true;  swapall =  BR_CopyHDR; activate_pattern=true; }
+  if (acqmode == "patmono")  { monothr = true;   swapall = BR_Copy; activate_pattern=true; }
+  if (acqmode == "patnof")  { savesigfits = false; swapall = BR_Copy; activate_pattern=true; }
+  if (acqmode == "pattern")  { savesigfits = true; swapall = BR_Copy; activate_pattern=true; }
+
+  if (acqmode == "swapall")  swapall = BR_SwapAll;
+  if (acqmode == "fft1csw")  swapall = BR_FFTOneChanSwapAll;
+  if (acqmode == "fft2csw")  swapall = BR_FFTTwoChanSwapAll;
+  if (acqmode == "fft1cswnof")  { swapall = BR_FFTOneChanSwapAll;  savesigfits = false; }
+  if (acqmode == "fft2cswnof")  { swapall = BR_FFTTwoChanSwapAll;  savesigfits = false; }
+  if ((acqmode == "swh") || (acqmode == "mxs") || (acqmode == "monoswh") )  swapall = BR_SwapHDR;
+  if ((acqmode == "swapallnof") || (acqmode == "mxs") )  savesigfits = false;
+  if (acqmode == "monoswh")  { monothr = true;   swapall = BR_SwapHDR;; }
+  if (acqmode == "monosw")  { monothr = true;   swapall = BR_SwapAll; }
+
+  if (acqmode == "swap32")   swapall = BR_Swap32 ;
+  if (acqmode == "nof32")   { swapall = BR_Swap32 ; savesigfits = false; }
+  if (acqmode == "fft1c32")  swapall = BR_FFTOneChanSwap32;
+  if (acqmode == "fft2c32")  swapall = BR_FFTTwoChanSwap32;
+  if (acqmode == "fft1cnof32")  { swapall = BR_FFTOneChanSwap32;  savesigfits = false; }
+  if (acqmode == "fft2cnof32")  { swapall = BR_FFTTwoChanSwap32;  savesigfits = false; }
+}
+
+/* --Methode-- */
+ostream& BRParList::Print(ostream& os) 
+{  
+  os << " ------ BRParList::Print() ----- " << endl;
+  os << " FiberListS=" << FiberListS ;
+  os << " PaqSize=" <<PaqSize;
+  os << " nbFrameDMA=" <<nbFrameDMA << endl;
+  os << " AcqMode="<<AcqMode;
+  os << " Type of acquisition :" << BRPaquet::FmtConvToString( swapall) << endl;
+  os << " NbFiles="<<NbFiles;
+  os << " NBlocPerFile="<<NBlocPerFile;
+  os << " OutPathName="<<OutPathName << endl;
+  os << " MemMgr: nZones="<<nZones;
+  os << " nPaqZone="<<nPaqZone;
+  os << " fg_hard_ctrlc=" << ((fg_hard_ctrlc)?"true":"false");
+  os << " Save to fits " << ((savesigfits)?"true":"false") << endl;
+  os << " monothr y(1)/n(0) " << ((monothr)?"true":"false"); 
+  os << " ActivatePattern " << ((activate_pattern)?"true":"false") <<  endl;
+  
+  return os;
+}
+
+
+BRParList* BRAcqConfig::param_=NULL;
+
+/* --Methode-- */
+BRAcqConfig::BRAcqConfig()
+{
+  if (param_==NULL)  param_ = new BRParList;  
+}
+
+/* --Methode-- */
+int BRAcqConfig::CreateOutputDirectories()
+{
+  char cmd[512];
+  if (param_->fgnulldev4fits!=true) {
+    sprintf(cmd,"mkdir %s",param_->OutPathName.c_str());
+    if (system(cmd) < 0) {
+      cout << "CreateOutputDirectories()/Error: Can not create  subdirectory " 
+	   << param_->OutPathName << " -> stop" << endl;
+      return 2;
+    }
+    cout << "CreateOutputDirectories() - Executed command " << cmd << endl;
+    
+    memset(cmd,0,512); 
+    for (int  i= 0; i< NFibers() ; i++)  {
+      sprintf(cmd,"mkdir %s/Fibre%d",param_->OutPathName.c_str(),param_->FiberNum[i]);
+      if (system(cmd) < 0) {
+	cout << "CreateOutputDirectories()/Error: Can not create subdirectory " 
+	     << param_->OutPathName << "/FiberII -> stop" << endl;
+	return 3;
+      }
+      else cout << "CreateOutputDirectories() - Executed command " << cmd << endl;
+    }
+  }
+  else {
+    string ProcPathName = "./XZXZXZX/";
+    cout << " Using " << ProcPathName << " for other processed files ... " << endl;
+    char cmd[512];
+    sprintf(cmd,"mkdir %s",ProcPathName.c_str());
+    if (system(cmd) < 0) {
+      cout << "CreateOutputDirectories()/Error: Can not create subdirectory ./XZXZXZX/" 
+	   << "-> stop" << endl;
+      return 3;
+    }
+    else cout << "CreateOutputDirectories() - Executed command " << cmd << endl;
+
+    sprintf(cmd,"mkdir %s/Fibre1 %s/Fibre2",ProcPathName.c_str(),ProcPathName.c_str());
+    if (system(cmd) < 0) {
+      cout << "CreateOutputDirectories()/Error: Can not create subdirectory ./XZXZXZX/Fibre1,2" 
+	   << "-> stop" << endl;
+      return 4;
+    }
+  }
+  return 0;
+}
+
+/* --Methode-- */
+string BRAcqConfig::OutputDirectoryFib(int ifib)
+{
+  char buff[24];
+  sprintf(buff,"/Fiber%d",param_->FiberNum[ifib]);
+  return ( param_->OutPathName + buff );
+}
Index: /trunk/AddOn/TAcq/brparam.h
===================================================================
--- /trunk/AddOn/TAcq/brparam.h	(revision 3671)
+++ /trunk/AddOn/TAcq/brparam.h	(revision 3671)
@@ -0,0 +1,160 @@
+#ifndef BRPARAM_H
+#define BRPARAM_H
+
+//---------------------------------------------------------------
+// Logiciels d'acquisition BAORadio 
+//  LAL -   2009 - 2010  ,  R. Ansari, M.Taurigna   
+//---------------------------------------------------------------
+
+//---------------------------------------------------------------
+//  Classes BRParList , BRConfList , BRAcqConfig 
+//  BRParList : Liste de parametres pour un run d'acquisition 
+//  BRConfList : Liste des parametres caracterisant une configuration 
+//       (nombre de cartes, versions firwares ...) 
+//  BRAcqConfig : Classe donnant acces a un objet global BRParList et 
+//         un objet global BRConfList
+//---------------------------------------------------------------
+
+#include "machdefs.h"
+#include <string>
+#include "brpaqu.h"
+#include "datacards.h"
+#include "bracqvers.h"
+
+using namespace std;
+using namespace SOPHYA;
+
+#define PMAXNBFIBRES 6
+
+//-----------------------------------------------------------------------------
+//---- Classe de liste des parametres d'acquisition BAORadio  
+class BRParList {
+public: 
+  BRParList (string fibres="1", unsigned int szframe= 16424, unsigned int nframeDMA = 32, 
+	     int nfiles=1, string acqmode="fft2c", int nblocfile=10,  
+	     int nmaxpr = 0, string outpath="TstAcq", 
+	     uint_4 nzon = 4, uint_4 npaqzon = 128, bool fgcntlc=false);
+
+  BRParList(BRParList const & p);
+
+  void Set(BRParList const & p);
+  ostream& Print(ostream& os) ;
+  void ReadDCFile(string file);
+
+  // Nombre de fibres 
+  inline int NFibers() { return NbFibers; } 
+  // Taille des operations DMA (en octets) 
+  inline uint_4 DMASizeBytes() { return nbFrameDMA*1024; }
+  // Taille des operations DMA (en KB=1024 bytes) 
+  inline uint_4 DMASizeKB() { return nbFrameDMA; }
+  // Taille des paquets recus sur PCIExpress 
+  inline uint_4 RecvPaquetSize() { return PaqSize; }
+  // Taille des paquets apres reduction eventuelle (donc ds memory manager)
+  inline uint_4 MMgrPaquetSize() { return (fgreducpsize)?redpqsize:PaqSize; }
+  // Operation de conversion/mise en ordre des donnees a la reception 
+  inline BRDataFmtConv GetDataConvFg() { return swapall; };
+
+  // Nombre maximum de fichiers enregistres 
+  inline uint_4 MaxNbFiles() { return NbFiles; }
+  // Nombre de blocs MMgr dans chaque fichiers 
+  inline uint_4 BlocPerFile() { return NBlocPerFile; }
+  // Nombre maximum de blocs MMgr traites 
+  inline uint_4 MaxNbBlocs() { return NbFiles*NBlocPerFile; }
+
+  //..........................................
+  void Decode();
+
+  string AcqMode;  // Mode d'acquisition (conditionne la mise en ordre/conversion des donnees lues par DMA 
+  string FiberListS ;  // liste des fibres a utiliser 1,3,4 par exemple
+  int NbFibers;  // liste des fibres a utiliser 1,3,4 par exemple
+  int FiberNum[PMAXNBFIBRES];
+
+  string OutPathName;  // directory de base
+  string ProcPathName; 
+  unsigned int PaqSize ; // taille des paquets ou sizeFrame 
+  unsigned int nbFrameDMA ; // taille du dma en multiple de 2 (2 a 56)
+  int NbFiles; // nombre de fichier produits
+  int NBlocPerFile; // nombre de bloc par fichier
+  int NMaxProc;  // Nombre de blocs traites par le thread de calcul
+  // Gestionnaire zones memoire 
+  uint_4 nZones;  // Nombre de zones memoires
+  uint_4 nPaqZone;  // 128 Paquets / zone memoire - valeur par defaut
+
+  bool fg_hard_ctrlc ; // autorise le CtrlC si true
+
+  bool savesigfits ;   // si true on prduit de sfichier fits
+  bool fgnulldev4fits ; 
+
+  BRDataFmtConv swapall ; // type de l'acquisition voir brpaqu.h
+
+  // ---- Pour gerer la reduction des tailles de paquets 
+  bool fgreducpsize;   // true -> reduction taille des paquets 
+  uint_4 redpqsize; 
+  uint_4 reducoffset; 
+
+  // Pour des tests de performances ou sans carte ADC (pattern) 
+  bool monothr ;           // pour les test mono thread 
+  bool activate_pattern;  // true -> on active le pattern du firmware au lieu de la fibre
+
+  double nopciLossRate;   // Utilise avec pour les tests sans carte pciexpress TestPCIWrapperNODMA
+};
+
+//-----------------------------------------------------------------------------
+//---- Classe de gestion des parametres d'acquisition - 
+//---- Utilise l'instance global de BRParList
+//-----------------------------------------------------------------------------
+
+class BRAcqConfig {
+ public:  
+  
+  BRAcqConfig();
+
+  inline void ReadDCFile(string file) 
+    { param_->ReadDCFile(file); }
+  inline void Set(BRParList& par)
+    { param_->Set(par); }
+  inline ostream& Print(ostream& os) 
+    { return param_->Print(os); }
+
+  int CreateOutputDirectories();
+
+  static inline double AcqVersion()  { return BAOR_ACQ_VER ; }
+  static inline const char* AcqVersionS() { return BAOR_ACQ_VER_STR ; } 
+ 
+  inline BRParList&  GetParams() { return (*param_) ;};
+  inline BRDataFmtConv GetSwapall() { return param_->swapall; };
+  inline bool GetPattern() { return param_->activate_pattern; };
+  inline bool GetMonothr() { return param_->monothr; };
+  inline bool GetSaveFits() { return param_->savesigfits; };
+  inline bool GetFileDevNull() { return param_->fgnulldev4fits; };
+
+  // Nombre de fibres 
+  inline int NFibers() { return param_->NbFibers; } 
+  // Taille des operations DMA (en octets) 
+  inline uint_4 DMASizeBytes() { return param_->DMASizeBytes(); }
+  // Taille des operations DMA (en KB=1024 bytes) 
+  inline uint_4 DMASizeKB() { return param_->DMASizeKB(); }
+  // Taille des paquets recus sur PCIExpress 
+  inline uint_4 RecvPaquetSize() { return param_->RecvPaquetSize();  }
+  // Taille des paquets apres reduction eventuelle (donc ds memory manager)
+  inline uint_4 MMgrPaquetSize() { return param_->MMgrPaquetSize(); }
+  // Operation de conversion/mise en ordre des donnees a la reception 
+  inline BRDataFmtConv GetDataConvFg() { return param_->GetDataConvFg(); };
+
+  // Nombre maximum de fichiers enregistres 
+  inline uint_4 MaxNbFiles() { return param_->MaxNbFiles(); }
+  // Nombre de blocs MMgr dans chaque fichiers 
+  inline uint_4 BlocPerFile() { return param_->BlocPerFile(); }
+  // Nombre maximum de blocs MMgr traites 
+  inline uint_4 MaxNbBlocs() { return param_->MaxNbBlocs(); }
+
+  // repertoire d'acquisition 
+  inline string& OutputDirectory() { param_->OutPathName; }
+  string OutputDirectoryFib(int fib);
+
+ protected:
+  static BRParList* param_;
+};
+
+
+#endif
Index: /trunk/AddOn/TAcq/makefile
===================================================================
--- /trunk/AddOn/TAcq/makefile	(revision 3670)
+++ /trunk/AddOn/TAcq/makefile	(revision 3671)
@@ -6,5 +6,5 @@
 # all : traidio  tmtfft tstminifits tbrpaq tpciew tmtacq tstrdfits mfits2spec tsok 
 # all : traidio  tmtfft tstminifits tmtacq tstrdfits mfits2spec tsok mcrd
-all : traidio tstminifits tmtacq mfits2spec mcrd svv2mtx tsok
+all :  mfacq tmtacq mfits2spec mcrd svv2mtx tsok traidio tstminifits
 
 clean :
@@ -18,14 +18,29 @@
 
 ##   --------------
+mfacq : $(EXE)mfacq
+	echo '---mfacq made'
+
+$(EXE)mfacq : $(OBJ)mfacq.o $(OBJ)brparam.o $(OBJ)racqumem.o $(OBJ)racqurw.o $(OBJ)racquproc.o \
+               $(OBJ)brpaqu.o $(OBJ)pciewrap.o $(OBJ)minifits.o
+	$(CXXLINK) -o $(EXE)mfacq $(OBJ)mfacq.o $(OBJ)brparam.o $(OBJ)racqumem.o $(OBJ)racqurw.o \
+	      $(OBJ)racquproc.o $(OBJ)brpaqu.o $(OBJ)pciewrap.o $(OBJ)minifits.o $(SOPHYAALLSLBLIST)
+
+$(OBJ)mfacq.o : mfacq.cc brparam.h racquproc.h racqurw.h racqumem.h brpaqu.h
+	$(CXXCOMPILE) -c -DNOPCIECARD -o $(OBJ)mfacq.o mfacq.cc 
+
+
 tmtacq : $(EXE)tmtacq
 	echo '---tmtacq made'
 
-$(EXE)tmtacq : $(OBJ)tmtacq.o  $(OBJ)racqumem.o $(OBJ)racqurw.o $(OBJ)racquproc.o \
+$(EXE)tmtacq : $(OBJ)tmtacq.o  $(OBJ)brparam.o $(OBJ)racqumem.o $(OBJ)racqurw.o $(OBJ)racquproc.o \
                $(OBJ)brpaqu.o $(OBJ)pciewrap.o $(OBJ)minifits.o
-	$(CXXLINK) -o $(EXE)tmtacq $(OBJ)tmtacq.o $(OBJ)racqumem.o $(OBJ)racqurw.o $(OBJ)racquproc.o \
-                      $(OBJ)brpaqu.o $(OBJ)pciewrap.o $(OBJ)minifits.o $(SOPHYAALLSLBLIST)
+	$(CXXLINK) -o $(EXE)tmtacq $(OBJ)tmtacq.o $(OBJ)brparam.o $(OBJ)racqumem.o $(OBJ)racqurw.o \
+	       $(OBJ)racquproc.o $(OBJ)brpaqu.o $(OBJ)pciewrap.o $(OBJ)minifits.o $(SOPHYAALLSLBLIST)
 
 $(OBJ)tmtacq.o : tmtacq.cc racquproc.h racqurw.h racqumem.h brpaqu.h
 	$(CXXCOMPILE) -c -DNOPCIECARD -o $(OBJ)tmtacq.o tmtacq.cc 
+
+$(OBJ)brparam.o : brparam.cc brparam.h
+	$(CXXCOMPILE) -c -o $(OBJ)brparam.o brparam.cc 
 
 $(OBJ)racqumem.o : racqumem.cc racqumem.h
@@ -43,7 +58,7 @@
 	echo '---mcrd made'
 
-$(EXE)mcrd : $(OBJ)mcrd.o  $(OBJ)racqumem.o $(OBJ)brfitsrd.o $(OBJ)brproc.o $(OBJ)racquproc.o $(OBJ)brpaqu.o \
+$(EXE)mcrd : $(OBJ)mcrd.o  $(OBJ)brparam.o $(OBJ)racqumem.o $(OBJ)brfitsrd.o $(OBJ)brproc.o $(OBJ)racquproc.o $(OBJ)brpaqu.o \
              $(OBJ)racqurw.o $(OBJ)pciewrap.o $(OBJ)minifits.o
-	$(CXXLINK) -o $(EXE)mcrd $(OBJ)mcrd.o $(OBJ)racqumem.o $(OBJ)brfitsrd.o $(OBJ)brproc.o $(OBJ)racquproc.o \
+	$(CXXLINK) -o $(EXE)mcrd $(OBJ)mcrd.o $(OBJ)brparam.o  $(OBJ)racqumem.o $(OBJ)brfitsrd.o $(OBJ)brproc.o $(OBJ)racquproc.o \
                       $(OBJ)brpaqu.o $(OBJ)racqurw.o $(OBJ)pciewrap.o $(OBJ)minifits.o $(SOPHYAALLSLBLIST)
 
Index: /trunk/AddOn/TAcq/mfacq.cc
===================================================================
--- /trunk/AddOn/TAcq/mfacq.cc	(revision 3671)
+++ /trunk/AddOn/TAcq/mfacq.cc	(revision 3671)
@@ -0,0 +1,183 @@
+#include "mfacq.h"
+
+//---------------------------------------------------------------
+// Programme d'acquisition BAORadio multi-fibres/multi-threads 
+//  LAL -   2009 - 2010
+//     R. Ansari, M.Taurigna
+//---------------------------------------------------------------
+
+static RAcqMemZoneMgr* pMmgr=NULL;
+static  PCIEMultiReader* pPcierThr=NULL;
+
+void Stop(int s)
+{ 
+  if (s == 9765) cout << " Stop after exception ..." << endl;
+  else printf("............. MAIN ... receive signal %d \n",s);
+  if (pMmgr != NULL) pMmgr->Stop();
+  if (pPcierThr !=NULL) pPcierThr->Stop();
+
+}
+
+
+//-----------------------------------------------------------------------
+//-------------------- le programme principal ---------------------------
+//-----------------------------------------------------------------------
+int main(int narg, char* arg[])
+{ 
+  
+  int rc = 0;
+  cout << " ============= BAORadio / Acquisition : mfacq  =================" << endl;
+  cout << " ===============================================================" << endl;
+  cout << " =========  " <<BAOR_ACQ_VER_STR <<BAOR_ACQ_VER << " ===========" << endl;
+  cout << " ===============================================================" << endl;
+  
+ 
+  InitTim();
+ 
+  // Initialisation 
+  TArrayInitiator _arri;
+  FitsIOServerInitiator _fiosi;
+
+
+  if ((narg < 2)||(strcmp(arg[1],"-h"))==0) {
+    Usage(false);
+    return 1;
+  }
+  
+ 
+  try {
+    // Creation/initialisation parametres Acq
+    BRAcqConfig acpar;
+    acpar.ReadDCFile(arg[1]);
+    // Creation des repertoires 
+    if (acpar.CreateOutputDirectories()!=0)  return 9;
+    acpar.Print(cout);
+    struct sigaction act;  
+    if (!acpar.GetParams().fg_hard_ctrlc) {
+      act.sa_handler=Stop;
+      sigaction(SIGINT,&act,NULL);        
+    }
+    rc = MultiFibreAcq();    
+  }
+  catch (MiniFITSException& exc) {
+    cerr << " mfacq.cc catched MiniFITSException " << exc.Msg() << endl;
+    rc = 77;
+  } 
+  catch (PCIEWException& exc) {
+    cerr << " mfacq.cc catched MiniFITSException " << exc.Msg() << endl;
+    rc = 75;
+  }  
+  catch (PThrowable& exc) {
+    cerr << " mfacq.cc catched Exception " << exc.Msg() << endl;
+    rc = 76;
+  }  
+  catch (std::exception& sex) {
+    cerr << "\n mfacq.cc std::exception :" 
+         << (string)typeid(sex).name() << "\n msg= " 
+         << sex.what() << endl;
+    rc = 78;
+  }
+  catch (...) {
+    cerr << "  mfacq.cc : Catched ... exception " << endl;
+    rc = 79;
+  }
+  cout << "mfacq[9] ----- END --- stopping acq program " << endl;
+  return rc;
+}
+
+
+/* --Nouvelle-Fonction-- */
+void Usage(bool fgshort) 
+{
+  if (fgshort) {
+    cout << " Usage: mfacq DataCardFile \n" << endl;
+    cout << "parameter in DataCard :Fibres PaquetSize NFrameDMA NFiles NBlocPerFile \n"
+         << "                 NMaxProc DataDirPath acqmode nZones nPaqZones fg_hard_ctrlc" << endl;
+    cout << "   type mfacq -h for detailed usage " << endl;
+    return;
+  }
+  return;
+}
+ 
+ 
+/* --Nouvelle-Fonction-- */
+int MultiFibreAcq() 
+{
+  Timer tm("mfacq/MultiFibre");
+  cout << " ---------- mfacq/ MultiFibreAcq()  ------------- " << endl;
+  PCIEWrapperInterface* pciwp[4]={NULL,NULL,NULL,NULL};
+    
+  BRAcqConfig bpar;
+  BRParList& acpar=bpar.GetParams();
+  
+  cout << " mfacq[1]/Info: Creating RAcqMemZoneMgr for" << acpar.NbFibers << " fibers , nZones=" 
+       << acpar.nZones << " NbPaquet/Zone=" << acpar.nPaqZone 
+       << " mmgrPaqSize=" << acpar.MMgrPaquetSize() << endl;
+  RAcqMemZoneMgr mmgr(acpar.nZones, bpar.NFibers(), acpar.nPaqZone, acpar.MMgrPaquetSize());
+  pMmgr=&mmgr;  
+  int stepproc = 2;  
+  int nmean = acpar.nPaqZone*acpar.NBlocPerFile/stepproc;
+
+#ifndef NOPCIECARD  
+  for (int i=0 ;i <acpar.NFibers() ;i++) {
+    UINT32 card=(acpar.FiberNum[i]-1)/2+1;
+    UINT32 cardfiber=(acpar.FiberNum[i]-1)%2
+    cout <<"mfacq[2] CreatePCIEWrapperV6- indice " << i <<  "INIT card " << card 
+	 << " fibre " << cardfiber << endl;
+    pciwp[i] =  CreatePCIEWrapperV6(card,patternSZ,dmaSize,activate_pattern,cardfiber);
+  }
+#else 
+  TestPCIWrapperNODMA pciw1(bpar.RecvPaquetSize(), acpar.nopciLossRate);
+  TestPCIWrapperNODMA pciw2(bpar.RecvPaquetSize(), acpar.nopciLossRate);
+  TestPCIWrapperNODMA pciw3(bpar.RecvPaquetSize(), acpar.nopciLossRate);
+  TestPCIWrapperNODMA pciw4(bpar.RecvPaquetSize(), acpar.nopciLossRate);
+  pciwp[0] = &pciw1;
+  pciwp[1] = &pciw2;
+  pciwp[2] = &pciw3;
+  pciwp[3] = &pciw4;  
+#endif 
+
+  cout <<"mfacq[3] Creating DataSaver and DataProc2C objects ... " << endl;
+  MultiDataSaver DsThr(mmgr, bpar.OutputDirectory(), bpar.MaxNbFiles(), 
+		       bpar.BlocPerFile(), bpar.GetSaveFits());
+  string ppath=bpar.OutputDirectory();
+  DataProc2C PrThr(mmgr, ppath, 1280, stepproc, acpar.NMaxProc);
+  vector<PCIEWrapperInterface*> vec_pciw;
+  for  (int i=0 ;i<bpar.NFibers();i++)  vec_pciw.push_back( pciwp[i]);
+  cout << "mfacq[3] Creating   PCIEMultiReader       " << endl;
+  PCIEMultiReader PcierThr(vec_pciw,bpar.DMASizeBytes(),bpar.RecvPaquetSize(),
+			   mmgr, bpar.MaxNbBlocs(), bpar.GetDataConvFg());
+  usleep(200);  // attente au cas ou ...
+  pPcierThr=&PcierThr;
+  tm.Split("Threads created");  
+  cout << "mfacq[4] - starting 3 threads pcir, ds, pr ... " << endl;
+  PcierThr.start();
+  DsThr.start();
+  if (acpar.NMaxProc>0) { // On ne demarre que si au moins NMaxProc>0
+    PrThr.start();
+  }
+  
+  // On attend avant de declencher la terminaison des threads
+  usleep(100000);
+  
+  cout << "mfacq[5] -  Waiting for threads to finish ... " << endl;  
+  PcierThr.join();
+  DsThr.join();
+  mmgr.Stop();
+  if (acpar.NMaxProc>0) { // On ne demarre que si au moins NMaxProc>0
+    PrThr.join();
+  }
+  pMmgr=NULL;  
+  cout << "mfacq[6] ---------- threads finished ---------------- " << endl;
+  tm.Split("Threads Finished");  
+ 
+#ifndef NOPCIECARD
+  for (int i=0 ;i <acpar.NbFibers ;i++) {
+    UINT32 card=(acpar.FiberNum[i]-1)/2+1;
+    UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
+    DeletePCIEWrapperV6(card,cardfiber);
+  }
+#endif    
+return 0;
+
+}
Index: /trunk/AddOn/TAcq/mfacq.h
===================================================================
--- /trunk/AddOn/TAcq/mfacq.h	(revision 3671)
+++ /trunk/AddOn/TAcq/mfacq.h	(revision 3671)
@@ -0,0 +1,45 @@
+#ifndef MFACQ_H
+#define MFACQ_H
+#include <signal.h>
+#include <iostream>
+#include <stdlib.h>
+#include <string.h>
+#include <typeinfo>
+
+#include <string>
+#include <vector>
+
+#include "racqumem.h"
+#include "racqurw.h" 
+#ifndef NOPCIECARD
+#include "racquwbin.h"
+#endif
+#include "racquproc.h"
+#include "brparam.h"
+
+#include "pciewrap.h"
+#include "brpaqu.h"
+
+#include "resusage.h"
+#include "ctimer.h"
+#include "timing.h"
+
+#include "tarrinit.h"
+#include "fiosinit.h"
+#include "datacards.h"
+
+#include "bracqvers.h"
+
+/* -------------------------------------------------------- */
+using namespace std;
+using namespace SOPHYA;
+// Fonctions appelees par le main 
+void Usage(bool fgshort=true);
+int DecodeArgs(string Fibres);
+
+
+int MultiFibreAcq();
+
+//------------------ Parametres de controle ----------------------------
+
+#endif
Index: /trunk/AddOn/TAcq/minifits.cc
===================================================================
--- /trunk/AddOn/TAcq/minifits.cc	(revision 3670)
+++ /trunk/AddOn/TAcq/minifits.cc	(revision 3671)
@@ -97,4 +97,6 @@
   if (fip != NULL) throw MiniFITSException("MiniFITSFile::Open() - fip != NULL");
   if (rwm == MF_Write) {
+    for(int i=0; i<MFITSHLEN; i++)  header[i]=' ';
+    nkeya_ = 0;
     FillHeader();
     fip = fopen(nom, "w");
@@ -119,20 +121,20 @@
 {
   if (fip) { 
-  	if (rwmode == MF_Write)  {  
-  	  // on remplit avec des zeros pour avoir une longueur multiple de 2880	
-  	  size_t padsz = MFITSHLEN-(totwsz%MFITSHLEN);
-          char zeros[160];
-  	  for(size_t k=0; k<160; k++) zeros[k]=0;
-	  while(padsz>160) {
-	    fwrite(zeros, 1, 160, fip);
-	    padsz-=160;
-	  }
-	  if (padsz>0)  fwrite(zeros, 1, padsz, fip);
-  	  // On reecrit l'entete 
-  	  FillHeader();
-  	  fseek(fip, 0, SEEK_SET);
-  	  fwrite(header, 1, MFITSHLEN, fip);
-  	}	
-  	fclose(fip);
+    if (rwmode == MF_Write)  {  
+      // on remplit avec des zeros pour avoir une longueur multiple de 2880	
+      size_t padsz = MFITSHLEN-(totwsz%MFITSHLEN);
+      char zeros[160];
+      for(size_t k=0; k<160; k++) zeros[k]=0;
+      while(padsz>160) {
+	fwrite(zeros, 1, 160, fip);
+	padsz-=160;
+      }
+      if (padsz>0)  fwrite(zeros, 1, padsz, fip);
+      // On reecrit l'entete 
+      FillHeader();
+      fseek(fip, 0, SEEK_SET);
+      fwrite(header, 1, MFITSHLEN, fip);
+    }	
+    fclose(fip);
   }
   fip = NULL;
@@ -187,5 +189,5 @@
   else if (dtype == MF_Float32) bpix = -32;
   char * buff = header+80;
-  sprintf(buff, "BITPIX  = %20d /   number of bits per data pixel", bpix);
+  sprintf(buff, "BITPIX  = %20d / number of bits per data pixel", bpix);
   buff[strlen(buff)] = ' ';
   buff = header+160;
@@ -193,8 +195,8 @@
   buff[strlen(buff)] = ' ';
   buff = header+240;
-  sprintf(buff, "NAXIS1  = %20ld /   number of bits per data pixel", (long)nax1);
+  sprintf(buff, "NAXIS1  = %20ld / nb of pixels along X = PaquetSize", (long)nax1);
   buff[strlen(buff)] = ' ';
   buff = header+320;
-  sprintf(buff, "NAXIS2  = %20ld /   number of bits per data pixel", (long)nax2);
+  sprintf(buff, "NAXIS2  = %20ld / nb of rows = NumberOfPaquets", (long)nax2);
   buff[strlen(buff)] = ' ';
   buff = header+400+nkeya_*80;
@@ -248,5 +250,5 @@
     sprintf(buff,"%s %20lg / %s", cle, val, tcom);
   }
-  else  sprintf(buff,"%s %20ld / ", cle, val);
+  else  sprintf(buff,"%s %20lg / ", cle, val);
   buff[strlen(buff)] = ' ';
   nkeya_++;
Index: /trunk/AddOn/TAcq/pciewrap.cc
===================================================================
--- /trunk/AddOn/TAcq/pciewrap.cc	(revision 3670)
+++ /trunk/AddOn/TAcq/pciewrap.cc	(revision 3671)
@@ -57,5 +57,6 @@
   paq.SetHDRMarker64(pchk_.HDRTag());
   paq.SetTRLMarker64(pchk_.TRLTag());
-  paq.SetFrameCounter(frame_counter_);
+  UInt16 cfc = (frame_counter_%65535);
+  paq.SetFrameCounter(cfc);
   paq.SetTimeTag(timetag_);
   paq.SetPaqLen((UInt16)((size_ - BRHDRSIZE - BRTRLSIZE)/4));
Index: /trunk/AddOn/TAcq/racqumem.cc
===================================================================
--- /trunk/AddOn/TAcq/racqumem.cc	(revision 3670)
+++ /trunk/AddOn/TAcq/racqumem.cc	(revision 3671)
@@ -89,5 +89,5 @@
 	for(uint_4 k=0; k<NbZones(); k++) {
 	  if ((states[k].act == MemZA_None) && 
-              (states[k].stat & MemZS_Filled) && !(states[k].stat & MemZS_Proc) ) { 
+              (states[k].stat & MemZS_Saved) && !(states[k].stat & MemZS_Proc) ) { 
             if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; } 
           }
Index: /trunk/AddOn/TAcq/racquproc.cc
===================================================================
--- /trunk/AddOn/TAcq/racquproc.cc	(revision 3670)
+++ /trunk/AddOn/TAcq/racquproc.cc	(revision 3671)
@@ -123,6 +123,6 @@
     }
   }
-  catch (PException& exc) {
-    cout << " DataProc::run()/catched PException " << exc.Msg() << endl;
+  catch (std::exception& exc) {
+    cout << " DataProc::run()/catched std::exception " << exc.what() << endl;
     setRC(3);	
     return; 
@@ -242,6 +242,6 @@
     }
   }
-  catch (PException& exc) {
-    cout << " DataProc2C::run()/catched PException " << exc.Msg() << endl;
+  catch (std::exception& exc) {
+    cout << " DataProc::run()/catched std::exception " << exc.what() << endl;
     setRC(3);	
     return; 
@@ -360,6 +360,6 @@
     }
   }
-  catch (PException& exc) {
-    cout << " DataProcFFT2C::run()/catched PException " << exc.Msg() << endl;
+  catch (std::exception& exc) {
+    cout << " DataProc::run()/catched std::exception " << exc.what() << endl;
     setRC(3);	
     return; 
Index: /trunk/AddOn/TAcq/racqurw.cc
===================================================================
--- /trunk/AddOn/TAcq/racqurw.cc	(revision 3670)
+++ /trunk/AddOn/TAcq/racqurw.cc	(revision 3671)
@@ -464,5 +464,5 @@
 
 /* --Methode-- */
-PCIEMultiReader::PCIEMultiReader(vector<PCIEWrapperInterface*> vec_pciw,uint_4 sizeFrame,uint_4 packSize ,RAcqMemZoneMgr& mem, uint_4 nmax, BRDataFmtConv swapall,int binMin, int nbBin)
+PCIEMultiReader::PCIEMultiReader(vector<PCIEWrapperInterface*> vec_pciw,uint_4 sizeFrame,uint_4 packSize ,RAcqMemZoneMgr& mem, uint_4 nmax, BRDataFmtConv swapall)
   :   memgr(mem) , vec_pciw_ (vec_pciw)
 {
@@ -473,6 +473,4 @@
   packSizeInMgr_=memgr.PaqSize();
   sizeFr_ =sizeFrame;
-  binMin_= binMin;
-  nbBin_= nbBin;
   if (vec_pciw.size() != memgr.NbFibres()) {
     cout << " PCIEMultiReader()PbArgs: vec_pciw.size()= " << vec_pciw.size() << " memgr.NbFibres()=" <<memgr.NbFibres()<< endl;
@@ -572,5 +570,6 @@
 	    setRC(9);  fgarret=true; break;
 	  }
-	  BRPaquet paq(tampon[fib], nextpaq, paqsz, swapall_,binMin_,nbBin_);
+	  BRPaquet paq(tampon[fib], nextpaq, paqsz, swapall_);
+	  // CHECK  S'il faut faire une reduction de taille de paquet
 	  npaqfait[fib]++;
 	  if (fib==nbDma_-1) npaqfaitg++;  // Ne pas oublier le compteur de paquets faits 
@@ -601,5 +600,6 @@
 	  setRC(9);  fgarret=true; break;
 	}
-	BRPaquet paq(Datas[fib]+curoff, nextpaq, paqsz, swapall_,binMin_,nbBin_);
+	BRPaquet paq(Datas[fib]+curoff, nextpaq, paqsz, swapall_);
+	// CHECK  S'il faut faire une reduction de taille de paquet
 	npaqfait[fib]++;
 	if (fib==nbDma_-1) npaqfaitg++;  // Ne pas oublier le compteur de paquets faits 
@@ -688,6 +688,6 @@
 //--------------------------------------------------------------------
 
-MultiDataSaver::MultiDataSaver(RAcqMemZoneMgr& mem, string& path, uint_4 nfiles, uint_4 nblocperfile, bool savesig)
-  :  memgr(mem) 
+MultiDataSaver::MultiDataSaver(RAcqMemZoneMgr& mem, string path, uint_4 nfiles, uint_4 nblocperfile, bool savesig)
+  :  memgr(mem)
 {
   nfiles_ = nfiles;
@@ -708,5 +708,5 @@
   setRC(1);	
   BRPaqChecker pcheck[MAXNBFIB];  // Verification/comptage des paquets 
-
+  BRAcqConfig bpar;
   try {
     TimeStamp ts; 
@@ -732,4 +732,5 @@
       fgnulldev = true;
     }
+    BRPaquet paq0(NULL, NULL, paqsz); 
     for (uint_4 nbFile=0;nbFile<nfiles_ ;nbFile++) {
       if (stop_ )   break;
@@ -742,17 +743,19 @@
 	  header[fib].open(fname);
 	}
-      BRPaquet paq0(NULL, NULL, paqsz); 
+    
       uint_4 npaqperfile = memgr.NbPaquets()*nblocperfile_;  // Nombre de paquets ecrits dans un fichier 
 
       if (savesig_) { //Reza - Ouverture conditionnel fichier 
-        for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) {
+        for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) 	  {
 	  if (fgnulldev) strcpy(fname,"/dev/null");
 	  else sprintf(fname,"%s/Fibre%d/signal%d.fits",path_.c_str(),fib+1,(int)fnum);
 	  mff[fib].Open(fname,MF_Write);  //Reza - Ouverture conditionnel fichier 
 	  // Entete correspondant a l'ecriture tout le paquet - trailer compris (modif Mai 2009)
-	  mff[fib].setDTypeNaxis(MF_Byte, paq0.PaquetSize(), npaqperfile);
-	}
+	  mff[fib].setDTypeNaxis(MF_Byte, paq0.PaquetSize(), npaqperfile);	
+        // Sans TRAILER de paquet mff.setDTypeNaxis(MF_Byte, paq0.DataSize()+paq0.HeaderSize(), npaqperfile); 
+	}
+	// Ajout mots-cle additionnels a tous les fichiers FITS
+	AddFitsKW(mff,bpar);
 	fnum++;
-        // Sans TRAILER de paquet mff.setDTypeNaxis(MF_Byte, paq0.DataSize()+paq0.HeaderSize(), npaqperfile); 
       }
       else sprintf(fname,"MemDataBloc[%d]-NoDataFile",(int)fnum++);
@@ -765,5 +768,5 @@
         if (buffg == NULL) {
 	  cout << " MultiDataSaver::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
-	  setRC(2);	
+	  setRC(21);	
 	  return;	
 	}
@@ -772,5 +775,5 @@
 	  if (buff == NULL) {  // Ceci ne devrait pas arriver - suite au test buffg ci-dessus
 	    cout << " MultiDataSaver::run()/ERROR memgr.GetMemZone(" << mid << "," << fib << ") -> NULL" << endl;
-	    setRC(2);	
+	    setRC(22);	
 	    return;	
 	  }
@@ -797,6 +800,7 @@
 	}
 	else sprintf(fname,"MemDataBloc[%d]-NoDataFile",(int)fnum-1);
-        filog << "    Fib " << fib << " -> " << fname << endl;
-        cout << "    Fib " << fib << " -> " << fname << endl;
+        string pcsum = pcheck[fib].Summary();
+        filog << "    Fib " << fib << " -> " << fname << " Stat:" << pcsum << endl;
+        cout  << "    Fib " << fib << " -> " << fname << " Stat:" << pcsum << endl;
       }
       if (savesig_)
@@ -805,4 +809,6 @@
           mff[fib].Close();	  
 	}
+    
+     
     }  // Fin de boucle sur les fichiers 
     cout << " --------------------  MultiDataSaver::run() -------------------- " << endl;
@@ -832,2 +838,17 @@
 }   
 
+
+/* --Methode-- */
+int MultiDataSaver::AddFitsKW(MiniFITSFile* mff, BRAcqConfig& acpar)
+{ 
+  TimeStamp ts;
+  string cdtu=ts.ToString();
+  for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) {
+    mff[fib].AddKeyS("DATE", cdtu.c_str(), " File Creation time(YYYY-MM-DDThh:mm:ss UT) ");	  
+    mff[fib].AddKeyS("DATEOBS", cdtu.c_str(), " Observation Time (YYYY-MM-DDThh:mm:ss UT) ");
+    mff[fib].AddKeyD("ACQVER", acpar.AcqVersion(), " BAORadio Acq Software version ") ;
+    mff[fib].AddKeyS("ACQCONF", acpar.GetParams().AcqMode, " BAORadio Acq run  mode" );
+  }
+  return 0;
+}
+
Index: /trunk/AddOn/TAcq/racqurw.h
===================================================================
--- /trunk/AddOn/TAcq/racqurw.h	(revision 3670)
+++ /trunk/AddOn/TAcq/racqurw.h	(revision 3671)
@@ -15,7 +15,8 @@
 #include "zthread.h"
 #include "pciewrap.h"
-
 #include "brtypes.h"
 #include "brpaqu.h"
+#include "brparam.h"
+#include "minifits.h"
 
 using namespace std;
@@ -61,4 +62,5 @@
   uint_4 max_targ_npaq; // =  mmgr.NbPaquets() = Max de targ_npaq_
   Byte* mmbuf_;  // Pointeur zone memoire rendu par RAcqMemZoneMgr 
+
 };
 
@@ -113,5 +115,5 @@
 public:
   PCIEMultiReader( vector<PCIEWrapperInterface*> vec_pciw , uint_4 sizeFrame,uint_4 paqSize, RAcqMemZoneMgr& mem, 
-		   uint_4 nmax=100, BRDataFmtConv swapall=BR_SwapAll,int binMin=0, int nbBin=0);  
+		   uint_4 nmax=100, BRDataFmtConv swapall=BR_SwapAll);  
   virtual void run(); 
    void Stop();
@@ -142,6 +144,4 @@
   uint_4 packSizeInMgr_;
   uint_4 nbDma_;
-  int nbBin_;
-  int binMin_;
   int mid_;  // Identificateur zone memoire
   uint_4 targ_npaq_;  // Numero de paquet dans une seule zone memoire 
@@ -160,5 +160,5 @@
 class MultiDataSaver : public ZThread {
 public:	
-  MultiDataSaver(RAcqMemZoneMgr& mem, string& path, uint_4 nfiles=100, uint_4 nblocperfile=1, bool savesig=true);
+  MultiDataSaver(RAcqMemZoneMgr& mem, string path, uint_4 nfiles=100, uint_4 nblocperfile=1, bool savesig=true);
 
   virtual void run(); 
@@ -166,4 +166,6 @@
   inline void STOP() { stop_ = true; }	
 protected:
+  int  AddFitsKW(MiniFITSFile* mff, BRAcqConfig& acpar);
+
   RAcqMemZoneMgr& memgr;
   uint_4 nfiles_;  // Nombre maxi de fichiers cree
@@ -174,5 +176,4 @@
   string path_;  
   struct sigaction act;
- 
 };
 
Index: /trunk/AddOn/TAcq/tmtacq.cc
===================================================================
--- /trunk/AddOn/TAcq/tmtacq.cc	(revision 3670)
+++ /trunk/AddOn/TAcq/tmtacq.cc	(revision 3671)
@@ -29,9 +29,10 @@
 
 
-//--------------------------------------------------------
+//-----------------------------------------------------------------------
 // Programme test acquisition BAORadio multi-thread 
 //  LAL -   R. Ansari Juillet -  2008
 //          M.Taurigna    2009
-//--------------------------------------------------------
+// == Programme reste a la version de Mai 2009 (1er tests Pittsburgh) ==
+//-----------------------------------------------------------------------
 
 
@@ -115,4 +116,5 @@
 static  bool activate_pattern=false;  // true -> on active le pattern du firmware au lieu de la fibre
 static  uint_4 NMaxBloc = 10; 
+static  double nopciLossRate = 0.; // Taux de perte simule des paquets par TestPCIWrapperNODMA 
 //---------------------------- FIN parametres de controle -----------------
 
@@ -178,5 +180,5 @@
   if (fgshort) {
     cout << " Usage: tmtacq CardNum PaquetSize NFrameDMA NFiles NBlocPerFile \n"
-         << "                 NMaxProc DataDirPath [AcqMode] [MemZoneMgr][HardCtlC]" << endl;
+        << "             NMaxProc DataDirPath [AcqMode] [MemZoneMgr] [HardCtlC] [NoPCILossRate]" << endl;
     cout << "   type tmtacq -h for detailed usage " << endl;
     return;
@@ -184,5 +186,5 @@
 
    cout << "\n Usage: tmtacq CardNum PaquetSize NFrameDMA NFiles NBlocPerFile \n"
-        << "                 NMaxProc DataDirPath [AcqMode] [MemZoneMgr][HardCtlC]" << endl;
+        << "             NMaxProc DataDirPath [AcqMode] [MemZoneMgr] [HardCtlC] [NoPCILossRate]" << endl;
    cout << " - CardNum : PCI-Express card number (=1 OR 2 OR 1,2)" << endl;
    cout << " - PaquetSize or FrameSize (=DATA+HDR+TRL_Size)  " << endl;
@@ -209,5 +211,7 @@
    cout << " - MemZoneMgr: nZones,NPaq =Number of Zones and number of paquet \n"
         << "               in each zone (Default=4,128) "<< endl;
-   cout << " -HardCtlC : Y y (direct interrpution by CtrlC ) default (no) " << endl;
+   cout << " - HardCtlC : Y y (direct interrpution by CtrlC ) or no  (default=no) " << endl;
+   cout << " - NoPCILossRate : Simulated NO-PCI loss rate (0<rate<1 default=0.) " << endl;
+
    cout << endl;
    cout << " - AcqMode for previous firmware with 32bits-byteswap"<<endl;
@@ -315,5 +319,5 @@
   }
 
-  nZones = 8;  // Nombre de zones memoires
+  nZones = 4;  // Nombre de zones memoires
   nPaqZone = 128;  // 128 Paquets / zone memoire - valeur par defaut
   if (narg > 9)  { 
@@ -333,4 +337,7 @@
     sigaction(SIGINT,&act,NULL);  	
   }
+
+  nopciLossRate = 0.; // Taux de perte simule des paquets par TestPCIWrapperNODMA 
+  if (narg > 11)  nopciLossRate=atof(arg[11]);
 
   PaqSZ =sizeFrame;  // Taille de paquets 
@@ -360,8 +367,8 @@
   if (acqmode == "nosw")   swapall = BR_Copy ;
   if (acqmode == "nof")  { swapall = BR_Copy ; savesigfits = false; }
-  if (acqmode == "fft1c")  swapall = BR_FFTOneChanNoSwap;
-  if (acqmode == "fft2c")  swapall = BR_FFTTwoChanNoSwap;
-  if (acqmode == "fft1cnof")  { swapall = BR_FFTOneChanNoSwap;  savesigfits = false; }
-  if (acqmode == "fft2cnof")  { swapall = BR_FFTTwoChanNoSwap;  savesigfits = false; }
+  if (acqmode == "fft1c")  swapall = BR_FFTOneChan;
+  if (acqmode == "fft2c")  swapall = BR_FFTTwoChan;
+  if (acqmode == "fft1cnof")  { swapall = BR_FFTOneChan;  savesigfits = false; }
+  if (acqmode == "fft2cnof")  { swapall = BR_FFTTwoChan;  savesigfits = false; }
   if (acqmode == "mono")  { monothr = true;   swapall = BR_Copy; }
   if (acqmode == "patmono")  { monothr = true;   swapall = BR_Copy; activate_pattern=true; }
@@ -370,8 +377,8 @@
 
   if (acqmode == "swapall")  swapall = BR_SwapAll;
-  if (acqmode == "fft1csw")  swapall = BR_FFTOneChan;
-  if (acqmode == "fft2csw")  swapall = BR_FFTTwoChan;
-  if (acqmode == "fft1cswnof")  { swapall = BR_FFTOneChan;  savesigfits = false; }
-  if (acqmode == "fft2cswnof")  { swapall = BR_FFTTwoChan;  savesigfits = false; }
+  if (acqmode == "fft1csw")  swapall = BR_FFTOneChanSwapAll;
+  if (acqmode == "fft2csw")  swapall = BR_FFTTwoChanSwapAll;
+  if (acqmode == "fft1cswnof")  { swapall = BR_FFTOneChanSwapAll;  savesigfits = false; }
+  if (acqmode == "fft2cswnof")  { swapall = BR_FFTTwoChanSwapAll;  savesigfits = false; }
   if ((acqmode == "swh") || (acqmode == "mxs") || (acqmode == "monoswh") )  swapall = BR_SwapHDR;
   if ((acqmode == "swapallnof") || (acqmode == "mxs") )  savesigfits = false;
@@ -381,8 +388,8 @@
   if (acqmode == "swap32")   swapall = BR_Swap32 ;
   if (acqmode == "nof32")   { swapall = BR_Swap32 ; savesigfits = false; }
-  if (acqmode == "fft1c32")  swapall = BR_FFTOneChan32;
-  if (acqmode == "fft2c32")  swapall = BR_FFTTwoChan32;
-  if (acqmode == "fft1cnof32")  { swapall = BR_FFTOneChan32;  savesigfits = false; }
-  if (acqmode == "fft2cnof32")  { swapall = BR_FFTTwoChan32;  savesigfits = false; }
+  if (acqmode == "fft1c32")  swapall = BR_FFTOneChanSwap32;
+  if (acqmode == "fft2c32")  swapall = BR_FFTTwoChanSwap32;
+  if (acqmode == "fft1cnof32")  { swapall = BR_FFTOneChanSwap32;  savesigfits = false; }
+  if (acqmode == "fft2cnof32")  { swapall = BR_FFTTwoChanSwap32;  savesigfits = false; }
 
 }
@@ -398,5 +405,5 @@
   PCIEWrapperInterface* pciwp=NULL;
 #ifdef NOPCIECARD
-  TestPCIWrapperNODMA pciw(PaqSZ);
+  TestPCIWrapperNODMA pciw(PaqSZ,nopciLossRate);
   pciwp = &pciw;
 #else
@@ -494,6 +501,6 @@
 
 #ifdef NOPCIECARD
-  TestPCIWrapperNODMA pciw1(PaqSZ);
-  TestPCIWrapperNODMA pciw2(PaqSZ);
+  TestPCIWrapperNODMA pciw1(PaqSZ,nopciLossRate);
+  TestPCIWrapperNODMA pciw2(PaqSZ,nopciLossRate);
   pciwp1 = &pciw1;
   pciwp2 = &pciw2;
Index: /trunk/AddOn/TAcq/tmtacq.h
===================================================================
--- /trunk/AddOn/TAcq/tmtacq.h	(revision 3670)
+++ /trunk/AddOn/TAcq/tmtacq.h	(revision 3671)
@@ -2,6 +2,5 @@
 #define TMTACQ_H
 #include <signal.h>
-#define BAOR_ACQ_VER 5.0
-#define BAOR_ACQ_VER_STR "BaoAcq_v5_Mai09 "
+#include "bracqvers.h"
 // ajout d'une gestion plus sure de l'arret par Controle C
 #endif
