Index: /trunk/AddOn/TAcq/acqparam_exemple.d
===================================================================
--- /trunk/AddOn/TAcq/acqparam_exemple.d	(revision 3908)
+++ /trunk/AddOn/TAcq/acqparam_exemple.d	(revision 3909)
@@ -2,9 +2,13 @@
 #   ------------ Soft BAORadio --------------
 #   ------ Exemple de datacard pour les parametres d'acquisition
-#            Octobre/novembre 2009
+#          2009 - 2010 
 #################################################################
-#   Liste des fibres  - @fibres I[,J,K...]
-#  Par defaut  @fibres 1
-@fibres 1,2
+#   Liste des fibres  - @fibres I[,J,K...]  ou @fibers 
+#   @fibers 1,2,3   OU   @fibres 1,2,3
+#  Par defaut  @fibres 1 
+@fibers 1,2
+#   Numero (absolu) d'identification des fibres 
+#  Defaut:  @fiberids 1,2,3,4,5,6,7,8
+@fiberids 1,2,3,4,5,6,7,8
 #  Nom du Repertoire pour les fichiers d'acquisition 
 #  Par defaut  @outpathname TstAcq
@@ -16,7 +20,14 @@
 #  Par defaut  @paqsize 16424 
 @paqsize 8192
+### Parametres du DMA 
 #   Taille des DMA en kb (=1024 bytes) 
 #  Par defaut @dmasizekb 32
 @dmasizekb 32
+#   Parametres du timeout
+#   @waitenddma maxkloop_check_enddma maxretry first_maxkloop_check_enddma first_maxretry
+#     maxkloop_check_enddma : taille de boucle d'attente de fin DMA, en unite de 1000 (max_loop=1000*maxkloop)
+#     first_maxkloop...,first_maxretry : parametres pour le premier DMA (attente debut trigger)
+#   Defaut : @waitenddma 1000 3 20000 9
+waitenddma 1000 3 20000 9
 #   Nombre total (maximum) de fichiers fits produits (/fibre)
 #  Par defaut  @nbfiles 1
@@ -27,6 +38,7 @@
 #   Mode d'acquisition   
 #  Par defaut  @acqmode std
-#   Modes standard:  [std=raw data] [fft2c=fft 2 canaux] 
-#   Autres modes:  [nof=std,NoFitsFile] pattern,patnof,fft2cnof ...]
+#   Modes standard:  [std=raw2c : 2 channels raw data] [fft2c: fft 2 canaux - NOT reordered] 
+#   Autres modes:  raw1c , fft1c , ordfft2c , ordfft1c  
+#                  [nof=std+NoFitsFile] pattern,patnof,fft2cnof ...
 @acqmode std
 #  Parametres MemmoryManager    @memmgr  NZones,NPaqPerZone 
@@ -51,11 +63,19 @@
 #  @ethrnlink 4
 ethrnlink 4
-#  En mode reception de paquets sur ethernet,  On peut forcer la lecture
-#   de paquets avec meme compteur de paquet (Force SameFrameCounter )
-#  @ethrforcesamefc  MaxDiffNumPaq   MaxNbResync
-#  Le parametre MaxDiffNumPaq (50 par defaut) est la difference maximum entre nombre de 
-#  paquets lus sur les differents liens et MaxNbResync (def=50) est le nombre maximum de tentatives 
+#  En mode reception de paquets sur ethernet,  On peut activer la lecture
+#   de paquets avec alignement du compteur (FrameCounter) avec la carte @ethrforcesamefc
+#  @ethrforcesamefc  maxdiff_paqnum   maxresync
+#  Le parametre maxdiff_paqnum (0 par defaut) est la difference maximum entre nombre de 
+#  paquets lus sur les differents liens et maxresync (0 par defaut) est le nombre maximum de tentatives 
 #  de resynchronisation succesive
-ethrforcesamefc 50 50 
+#  - force_samefc=false : lecture des paquet sans alignement des FrameCounter 
+#  - force_samefc=true : lecture paquets avec alignement des FrameCounter
+#    + mode par defaut : maxdiff_paqnum=0, maxresync=0 -> on cherche a aligner FrameCounter sur les 
+#    differents liens ethernet 
+#    + maxdiff_paqnum>0 : difference maximum de nombre de paquets entre les differents liens
+#    + maxresync>0 : Mode de lecture avec resynchronisation du nombre de paquets ,  
+#      nombre maxi de resynchronisation 
+#  Modes conseilles : false  ;  @ethrforcesamefc 0 0   ;  @ethrforcesamefc 10 0 ;  @ethrforcesamefc 50 0
+ethrforcesamefc 0 0 
 #####
 # En activant la carte suivante, le lecteur (EthernetReader) attend les messages END sur chaque lien 
@@ -83,6 +103,7 @@
 visicfreq 0 0 0
 ########################
-#  Taux de perte de paquets en simulation (Sans carte PCIExpress) 
-#  @nopcilossrate Perte     (0<=Perte<1)
+#  Taux de perte de paquets en simulation / nombre maxi de paquets generes (Sans carte PCIExpress) 
+#  @nopcilossrate MaxCount.LossRate     (0<=LossRate<1)  - Defaut MaxCount=0 -> Non limite 
+#  MaxCount=Partie_Entiere ,   LossRate=Partie_Fractionnaire
 #  Defaut @nopcilossrate 0. 
 ########################
Index: /trunk/AddOn/TAcq/bracqvers.h
===================================================================
--- /trunk/AddOn/TAcq/bracqvers.h	(revision 3908)
+++ /trunk/AddOn/TAcq/bracqvers.h	(revision 3909)
@@ -5,6 +5,6 @@
    Software version     LAL - 2008-2010 
 */
-#define BAOR_ACQ_VER 7.2
-#define BAOR_ACQ_VER_STR "BaoAcq_v7r2_Sep10 "
+#define BAOR_ACQ_VER 7.3
+#define BAOR_ACQ_VER_STR "BaoAcq_v7r3_Nov10 "
 
 #endif
Index: /trunk/AddOn/TAcq/brbaseproc.cc
===================================================================
--- /trunk/AddOn/TAcq/brbaseproc.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/brbaseproc.cc	(revision 3909)
@@ -97,4 +97,5 @@
 	break;	
       }
+      cts_=memgr_.GetAuxData(mid)->FillTime();   // get associated date/time (DATEOBS)
       for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
 	fbuff_[fib] = memgr_.GetMemZone(mid,fib);
Index: /trunk/AddOn/TAcq/brbaseproc.h
===================================================================
--- /trunk/AddOn/TAcq/brbaseproc.h	(revision 3908)
+++ /trunk/AddOn/TAcq/brbaseproc.h	(revision 3909)
@@ -14,4 +14,5 @@
 
 #include "brpaqu.h"
+#include "timestamp.h"  // include SOPHYA
 
 using namespace std;
@@ -57,4 +58,5 @@
 
   uint_8 totprocnpaq_; 
+  SOPHYA::TimeStamp cts_;   // current time stamp, get from MemZoneMgr
 
   string bpnom_;    // nom du processeur
Index: /trunk/AddOn/TAcq/brfitsrd.cc
===================================================================
--- /trunk/AddOn/TAcq/brfitsrd.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/brfitsrd.cc	(revision 3909)
@@ -55,4 +55,16 @@
       throw BAORadioException("BRMultiFitsReader::BRMultiFitsReader/ mff.NAxis1() != memgr_.PaqSize() "); 
     }
+    // Extraction de qques parametres utiles depuis les fichiers FITS 
+    string fkvs;
+    if (fib==0) {
+      fkvs=mff_[fib].GetKeyValue("DATEOBS");
+      if (fkvs.length()>0) { 
+	cdateobs_.Set(fkvs);
+	cout << " BRMultiFitsReader/First file (for fiber 0) DATEOBS=" << fkvs << endl;
+      }
+    }
+    fkvs=mff_[fib].GetKeyValue("DATEOBS");
+    memgr_.FiberId(fib) = atoi( fkvs.c_str() );
+
     vfilenum_.push_back(imin_);
     vfpos_.push_back(0);
@@ -207,4 +219,8 @@
 	throw BAORadioException("BRMultiFitsReader::ReadNext()/ mff.NAxis1() != memgr_.PaqSize() "); 
       }
+      if (fib==0) {  // updating current date from file (fiber 0) 
+	string fkvs=mff_[fib].GetKeyValue("DATEOBS");
+	if (fkvs.length()>0)  cdateobs_.Set(fkvs);
+      } 
       vfpos_[fib]=0;
     }
Index: /trunk/AddOn/TAcq/brfitsrd.h
===================================================================
--- /trunk/AddOn/TAcq/brfitsrd.h	(revision 3908)
+++ /trunk/AddOn/TAcq/brfitsrd.h	(revision 3909)
@@ -14,4 +14,5 @@
 #include "brpaqu.h"
 #include "minifits.h"
+#include "timestamp.h"
 
 using namespace std;
@@ -79,4 +80,6 @@
   Byte* mmbufib_[MAXANAFIB];  // Pointeurs zone memoire de chaque fibre rendu par RAcqMemZoneMgr 
 
+  SOPHYA::TimeStamp cdateobs_;    // current time/date read from file 
+ 
   int prtlev_;         // print level 
   uint_8 prtmodulo_;   // print periodicity (modulo) 
Index: /trunk/AddOn/TAcq/brparam.cc
===================================================================
--- /trunk/AddOn/TAcq/brparam.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/brparam.cc	(revision 3909)
@@ -98,4 +98,5 @@
 
 // Classe qui memorise tous les parametres importants de l'acquisition
+#define PMAXNBFIBRES 64
 
 /* --Methode-- */
@@ -109,8 +110,13 @@
 
   FiberListS=fibres;
-  NbFibers=0;
-  for (int fib=0; fib<PMAXNBFIBRES;fib++)  FiberNum[fib]=0;
+  FiberIdsS="1,2,3,4,5,6,7,8";
+
   PaqSize=paqsz;
+
   dmasizekb=dmaszkb;
+  maxkwedma_=1000;
+  nretrydma_=3;
+  first_maxkwedma_=20000;
+  first_nretrydma_=9;
 
   NbFiles=nfiles;
@@ -181,9 +187,15 @@
 
   FiberListS=p.FiberListS;
-  NbFibers=p.NbFibers;
-  for (int fib=0; fib<PMAXNBFIBRES;fib++)  FiberNum[fib]=p.FiberNum[fib];
+  FiberNum=p.FiberNum;
+  FiberIdsS=p.FiberIdsS;
+  FiberIds=p.FiberIds;
 
   PaqSize=p.PaqSize;
+
   dmasizekb=p.dmasizekb;
+  maxkwedma_=p.maxkwedma_;
+  nretrydma_=p.nretrydma_;
+  first_maxkwedma_=p.first_maxkwedma_;
+  first_nretrydma_=p.first_nretrydma_;
 
   NbFiles=p.NbFiles;
@@ -237,9 +249,21 @@
 {
   DataCards conf(file);
-  FiberListS= conf.SParam("fibres",0,"1");
+  if(conf.HasKey("fibres")) 
+    FiberListS= conf.SParam("fibres",0,"1");
+  else if(conf.HasKey("fibers")) 
+    FiberListS= conf.SParam("fibers",0,"1");
+  if(conf.HasKey("fiberids"))   
+    FiberIdsS= conf.SParam("fiberids",0,"1");
+
   OutPathName= conf.SParam("outpathname",0,"TstAcq");
   skysource= conf.SParam("skysource",0,"");
   PaqSize=(uint_4)conf.IParam("paqsize",0,16424);
+
   dmasizekb =(uint_4) conf.IParam("dmasizekb",0,32);
+  maxkwedma_=(unsigned int)conf.IParam("waitenddma",0,1000);
+  nretrydma_=(unsigned int)conf.IParam("waitenddma",1,3);
+  first_maxkwedma_=(unsigned int)conf.IParam("waitenddma",2,20*maxkwedma_);
+  first_nretrydma_=(unsigned int)conf.IParam("waitenddma",3,3*nretrydma_);
+
   NbFiles=conf.IParam("nbfiles",0,1);
   NBlocPerFile=conf.IParam("nblocperfile",0,10);
@@ -303,8 +327,13 @@
   vector<string> fiblist;
   FillVStringFrString(FiberListS, fiblist, ',');
-  NbFibers=fiblist.size();
   for (int fib=0; fib<fiblist.size(); fib++) {
-    FiberNum[fib]=atoi(fiblist[fib].c_str()); 
-  }
+    FiberNum.push_back(atoi(fiblist[fib].c_str())); 
+  }
+  vector<string> fibids;
+  FillVStringFrString(FiberIdsS, fibids, ',');
+  for (int fib=0; fib<fibids.size(); fib++) {
+    FiberIds.push_back(atoi(fibids[fib].c_str())); 
+  }
+
   if (OutPathName == "/dev/null") { 
     fgnulldev4fits=true;
@@ -318,9 +347,13 @@
   fgdatafft=false;  fgsinglechannel=false;
   reducneedcopy=false;  pqreducmode=BR_TwoChanReduc;
-  if ((acqmode == "std")||(acqmode=="raw2c"))   swapall = BR_Copy ;  
+  if ((acqmode == "std")||(acqmode=="raw2c"))   swapall = BR_Copy ; 
+  if (acqmode=="raw1c") { swapall = BR_Copy ;  fgsinglechannel=true;  pqreducmode=BR_OneChanReduc; }
+
+  if ((acqmode == "fft2c")||(acqmode == "fft1c"))   swapall = BR_Copy ;  
   if (acqmode == "nosw")   swapall = BR_Copy ;
   if (acqmode == "nof")  { swapall = BR_Copy ; savesigfits = false; }
-  if (acqmode == "fft1c")  { swapall = BR_FFTOneChan; reducneedcopy=true;  pqreducmode=BR_OneChanReducK0; }
-  if (acqmode == "fft2c")  { swapall = BR_FFTTwoChan;  reducneedcopy=true;  pqreducmode=BR_TwoChanReducK0; }
+  if (acqmode == "ordfft1c")  { swapall = BR_FFTOneChan; reducneedcopy=true;  pqreducmode=BR_OneChanReducK0; }
+  if (acqmode == "ordfft2c")  { swapall = BR_FFTTwoChan;  reducneedcopy=true;  pqreducmode=BR_TwoChanReducK0; }
+
   if (acqmode == "fft1cnof")  
     { swapall = BR_FFTOneChan;  savesigfits = false; reducneedcopy=true;  pqreducmode=BR_OneChanReducK0;  }
@@ -379,6 +412,11 @@
   os << " ------ BRParList::Print() ----- " << endl;
   os << " FiberListS=" << FiberListS ;
+  os << " FiberIdsS=" << FiberIdsS ;
+  os << " Fibers (Num->Id): ";
+  for(size_t f=0; f<NbFibers(); f++)   cout << FiberNum[f] << " -> " << FiberIds[f] << " ; " ;
+  os << endl;
   os << " PaqSize=" <<PaqSize;
-  os << " DMA_Size_kb=" <<dmasizekb << endl;
+  os << " DMA_Size_kb=" <<dmasizekb << " (EndDMA: Maxkw=" << maxkwedma_ << " NRetry=" << nretrydma_ 
+     << " FirstDMA: Maxkw=" << first_maxkwedma_ << " NRetry=" << first_nretrydma_ << ")" << endl;
   os << " AcqMode="<<AcqMode;
   os << " Type of acquisition :" << BRPaquet::FmtConvToString( swapall) << endl;
Index: /trunk/AddOn/TAcq/brparam.h
===================================================================
--- /trunk/AddOn/TAcq/brparam.h	(revision 3908)
+++ /trunk/AddOn/TAcq/brparam.h	(revision 3909)
@@ -71,5 +71,4 @@
 };
 
-#define PMAXNBFIBRES 32
 
 //-----------------------------------------------------------------------------
@@ -88,5 +87,6 @@
 
   // Nombre de fibres 
-  inline int NFibers() { return NbFibers; } 
+  inline size_t NFibers() { return FiberNum.size(); } 
+  inline size_t NbFibers() { return FiberNum.size(); } 
   // Taille des operations DMA (en octets) 
   inline uint_4 DMASizeBytes() { return dmasizekb*1024; }
@@ -130,12 +130,20 @@
   bool fgsinglechannel; // true -> un seul canal par fibre (par defaut=2 canaux/fibres)
 
-  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 FiberListS ;    // String_liste des fibres a utiliser 1,3,4 par exemple
+  vector<int> FiberNum;  // liste des fibres a utiliser {1,3,4} par exemple
+  string FiberIdsS ;     // String_liste des numeros 'absolu' des fibres 12,13,14,15 par exemple
+  vector<int> FiberIds;  // liste des numero d'identification 'absolu' des fibres {12,13,14,15} par ex.
 
   string OutPathName;  // directory de base
   string ProcPathName; 
   uint_4 PaqSize ; // taille des paquets ou sizeFrame 
+
+  // Controle/gestion  du DMA 
   uint_4 dmasizekb ; // taille du dma en multiple de 2 (2 a 56)
+  unsigned int maxkwedma_;   // Nombre d'iterations de la boucle d'attente de fin de DMA (en unite de 1000)
+  unsigned int nretrydma_;   // nombre maxi de tentatives pour terminer le DMA 
+  unsigned int first_maxkwedma_;   // Nombre d'iterations de la boucle d'attente de fin du PREMIER DMA (u 1000)
+  unsigned int first_nretrydma_;   // nombre maxi de tentatives pour terminer le PREMIER DMA 
+
   int NbFiles; // nombre de fichier produits
   int NBlocPerFile; // nombre de bloc par fichier
@@ -234,5 +242,7 @@
 
   // Nombre de fibres 
-  inline int NFibers() { return param_->NbFibers; } 
+  inline int  NFibers() { return param_->NbFibers(); } 
+  inline int  NbFibers() { return param_->NbFibers(); } 
+
   // Taille des operations DMA (en octets) 
   inline uint_4 DMASizeBytes() { return param_->DMASizeBytes(); }
Index: /trunk/AddOn/TAcq/brviscalc.cc
===================================================================
--- /trunk/AddOn/TAcq/brviscalc.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/brviscalc.cc	(revision 3909)
@@ -32,12 +32,8 @@
 
   uint_4 maxnpairs = (2*memgr_.NbFibres()+1)*memgr_.NbFibres();
-  chanum_.SetSize(maxnpairs);
-  sa_size_t k=0;
-  for(size_t i=0; i<2*memgr_.NbFibres(); i++)  vpdata_[i]=NULL;
-  for(size_t i=0; i<2*memgr_.NbFibres(); i++) {
-    for(size_t j=i; j<2*memgr_.NbFibres(); j++) {
-      chanum_(k) = (i+1)*100+(j+1);  k++;
-    }
-  }
+  chanids_.SetSize(2*memgr_.NbFibres());
+  chanpairnumall_.SetSize(maxnpairs);
+  chanpairsall_.SetSize(maxnpairs,2);
+  for(size_t i=0; i<2*memgr_.NbFibres(); i++)   vpdata_[i]=NULL;
   SelectPairs();
 
@@ -82,6 +78,4 @@
   po << visdt_;
   if (calcid_ == 0) {
-    POutPersist poc(outpath_+"chanum.ppf");
-    poc << chanum_;
     
     if (fgcktt_) {
@@ -130,4 +124,8 @@
   nbpairs_=nbpairs;
   vismtx_.SetSize(nbpairs_, paq.DataSize()/4); 
+
+  chanpairnum_.SetSize(nbpairs_);
+  chanpairs_.SetSize(nbpairs_,2);
+
   return nbpairs_;
 }
@@ -147,4 +145,47 @@
 }
 
+/* --Methode-- */
+void BRVisibilityCalculator::UpdateChanIds()
+{
+
+  for(size_t i=0; i<memgr_.NbFibres(); i++) { 
+    chanids_(2*i)=memgr_.FiberId(i)*2-1; 
+    chanids_(2*i+1)=memgr_.FiberId(i)*2; 
+  } 
+  sa_size_t k=0;     // numero de ligne dans la matrice des visibilites 
+  for(size_t i=0; i<vpdata_.size(); i++) {
+    for(size_t j=i; j<vpdata_.size(); j++) {
+      chanpairnumall_(k)=chanids_(i)*CHANPAIRCONVFAC+chanids_(j);
+      chanpairsall_(k,0)=chanids_(i);  chanpairsall_(k,1)=chanids_(j);     k++;
+    }
+  }
+  sa_size_t kpair=0;  
+  k=0;  // numero de ligne dans la matrice des visibilites 
+  for(size_t i=0; i<vpdata_.size(); i++) {
+    for(size_t j=i; j<vpdata_.size(); j++) {
+      kpair++;
+      if (kpair<(pairst_+1))  continue;
+      if (kpair>=(pairst_+nbpairs_+1))  break;
+      chanpairnum_(k)=chanids_(i)*CHANPAIRCONVFAC+chanids_(j);
+      chanpairs_(k,0)=chanids_(i);  chanpairs_(k,1)=chanids_(j);     k++;
+    }
+  }
+
+  string filename;
+  filename = outpath_+"chanum.ppf";
+  if (nbcalc_>1) {
+    char sbuff[32];
+    sprintf(sbuff,"chanum_%d.ppf",(int)calcid_);
+    filename = outpath_+sbuff;
+  }
+  POutPersist poc(outpath_+"chanum.ppf");
+  poc << PPFNameTag("chanids") << chanids_; 
+  poc << PPFNameTag("chanpairs") << chanpairs_; 
+  poc << PPFNameTag("chanpairnum") << chanpairnum_; 
+  poc << PPFNameTag("chanpairsall") << chanpairsall_; 
+  poc << PPFNameTag("chanpairnumal") << chanpairnumall_; 
+  cout << "BRVisibilityCalculator::UpdateChanIds() Channel Ids/Pairs saved to PPF file " << filename << endl; 
+  return;
+}
 
 /* --Methode-- */
@@ -207,4 +248,6 @@
 	break;	
       }
+      cts_=memgr_.GetAuxData(mid)->FillTime();   // get associated date/time (DATEOBS)
+
       for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
 	fbuff_[fib] = memgr_.GetMemZone(mid,fib);
@@ -238,5 +281,6 @@
 	vismtx_ = complex<r_4>((r_4)0.,(r_4)0.);
 	moyfc_=moytt_=0.;
-	first_tmstamp_.SetNow();  // Current date and time 
+	//	first_tmstamp_.SetNow();  // Current date and time 
+	first_tmstamp_=cts_;  // Current date and time 
       }
 
@@ -326,5 +370,6 @@
     first_fc_=curfc_[0];
     first_tt_= (vpaq_[0].TimeTag()-ttfirst_[0]);
-    first_tmstamp_.SetNow();  // Current date and time 
+    // first_tmstamp_.SetNow();  // Current date and time 
+    first_tmstamp_=cts_;  // Current date and time 
   }
 
@@ -439,5 +484,5 @@
       for(sa_size_t jf=jf1_; jf<jf2_; jf++) {
 	xnt[2]=jf;
-	xnt[3]=chanum_(rv+pairst_);
+	xnt[3]=chanpairnumall_(rv+pairst_);
 	xnt[4]=vismtx_(rv,jf).real()/(r_4)(nmean_);
 	xnt[5]=vismtx_(rv,jf).imag()/(r_4)(nmean_);
@@ -458,5 +503,5 @@
 	}
 	xnt[2]=jf+djf_/2;
-	xnt[3]=chanum_(rv+pairst_);
+	xnt[3]=chanpairnumall_(rv+pairst_);
 	xnt[4]=moyreal/(r_4)(nmean_*djf_);
 	xnt[5]=moyimag/(r_4)(nmean_*djf_);
Index: /trunk/AddOn/TAcq/brviscalc.h
===================================================================
--- /trunk/AddOn/TAcq/brviscalc.h	(revision 3908)
+++ /trunk/AddOn/TAcq/brviscalc.h	(revision 3909)
@@ -32,4 +32,7 @@
 // Classe de traitement - calcul de visibilite pour n fibres 
 //---------------------------------------------------------------------
+// Pour convertir une paire de numeros de canaux en un seul entier C1*CHANPAIRCONVFAC+C2
+#define  CHANPAIRCONVFAC  1000 
+
 class BRVisibilityCalculator : public BRBaseProcessor, ParallelTaskInterface {
 public:	
@@ -62,4 +65,5 @@
 
 protected:
+  virtual void UpdateChanIds(); 
   virtual int Process(); 
   virtual void UpdateVisMtxInfo();
@@ -85,5 +89,10 @@
   
   TMatrix< complex<r_4> > vismtx_; 
-  TVector< uint_4 > chanum_;
+  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
+
   //  FitsInOutFile dtfos_;
   DataTable visdt_;
Index: /trunk/AddOn/TAcq/mfacq.cc
===================================================================
--- /trunk/AddOn/TAcq/mfacq.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/mfacq.cc	(revision 3909)
@@ -162,5 +162,5 @@
   BRParList& acpar=bpar.GetParams();
   
-  cout << " mfacq[1]/Info: Creating RAcqMemZoneMgr for" << acpar.NbFibers << " fibers , nZones=" 
+  cout << " mfacq[1]/Info: Creating RAcqMemZoneMgr for" << acpar.NbFibers() << " fibers , nZones=" 
        << acpar.nZones << " NbPaquet/Zone=" << acpar.nPaqZone 
        << " MmgrPaqSize=" << acpar.MMgrPaquetSize() << endl;
@@ -177,5 +177,5 @@
   
 #ifndef NOPCIECARD  
-  for (int i=0 ;i <acpar.NFibers() ;i++) {
+  for (size_t i=0 ;i <acpar.NFibers() ;i++) {
     UINT32 card=(acpar.FiberNum[i]-1)/2+1;
     UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
@@ -209,5 +209,6 @@
   cout << "mfacq[3] Creating   PCIEMultiReader thread object     " << endl;
   vector<PCIEWrapperInterface*> vec_pciw;
-  for  (int i=0 ;i<bpar.NFibers();i++)  {
+  for  (size_t i=0 ;i<bpar.NFibers();i++)  {
+    pciwp[i]->SetFiberNumId(acpar.FiberNum[i], acpar.FiberIds[i]);
     vec_pciw.push_back( pciwp[i]);
     //    cout << " mfacq[3.b]/Debug - pciwp[" << i << "] " << hex << pciwp[i] << dec << endl;
@@ -244,5 +245,5 @@
   mmgr.Print(cout);
 #ifndef NOPCIECARD
-  for (int i=0 ;i <acpar.NbFibers ;i++) {
+  for (size_t i=0; i<acpar.NbFibers(); i++) {
     UINT32 card=(acpar.FiberNum[i]-1)/2+1;
     UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
@@ -266,9 +267,9 @@
   BRParList& acpar=bpar.GetParams();
   
-  cout << " mfacq[1]/Info: PCIEToEthernet for" << acpar.NbFibers << " fibers , nZones=" 
+  cout << " mfacq[1]/Info: PCIEToEthernet for" << acpar.NbFibers() << " fibers , nZones=" 
        << acpar.nZones << " NbPaquet/Zone=" << acpar.nPaqZone 
        << " MmgrPaqSize=" << acpar.MMgrPaquetSize() << endl;
 #ifndef NOPCIECARD  
-  for (int i=0 ;i <acpar.NFibers() ;i++) {
+  for (size_t i=0 ;i <acpar.NFibers() ;i++) {
     UINT32 card=(acpar.FiberNum[i]-1)/2+1;
     UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
@@ -297,5 +298,8 @@
 
   vector<PCIEWrapperInterface*> vec_pciw;
-  for  (int i=0 ;i<bpar.NFibers();i++)  vec_pciw.push_back( pciwp[i]);
+  for  (size_t i=0 ;i<bpar.NFibers();i++)  { 
+    pciwp[i]->SetFiberNumId(acpar.FiberNum[i], acpar.FiberIds[i]);
+    vec_pciw.push_back( pciwp[i]);
+  }
   cout <<"mfacq[2] Creating PCIEToEthernet  thread object " << endl;
   PCIEToEthernet pci2eth(vec_pciw, bpar.GetParams().GetEthTargets(), bpar.GetParams(), bpar.GetParams().tcpportid);
@@ -316,5 +320,5 @@
  
 #ifndef NOPCIECARD
-  for (int i=0 ;i <acpar.NbFibers ;i++) {
+  for (size_t i=0; i<acpar.NbFibers(); i++) {
     UINT32 card=(acpar.FiberNum[i]-1)/2+1;
     UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
Index: /trunk/AddOn/TAcq/pciewrap.cc
===================================================================
--- /trunk/AddOn/TAcq/pciewrap.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/pciewrap.cc	(revision 3909)
@@ -12,4 +12,29 @@
 using namespace SOPHYA;
 
+//-----------------------------------------------------------------------
+//  Classe PCIEWrapperInterface  ( virtuelle pure ) 
+//-----------------------------------------------------------------------
+
+/* --Methode-- */
+PCIEWrapperInterface::PCIEWrapperInterface()
+{
+  SetMaxWaitEndDMA();
+}
+
+/* --Methode-- */
+PCIEWrapperInterface::~PCIEWrapperInterface()
+{
+}
+
+/* --Methode-- */
+unsigned long PCIEWrapperInterface::SetMaxWaitEndDMA(unsigned int maxkwedma, unsigned int nretry)
+{
+  if (maxkwedma>1) { maxwaitenddmaloop_=maxkwedma*1000; maxretryenddma_=nretry; } 
+  return maxwaitenddmaloop_;
+}
+
+//------------------------------------------------------------------
+// Classe TestPCIWrapperNODMA : genere des paquets sans appel au DMA
+//------------------------------------------------------------------
 /* --Methode-- */
 TestPCIWrapperNODMA::TestPCIWrapperNODMA(UInt32 sz, double lossrate) 
@@ -23,6 +48,10 @@
   timetag_ = 0;
   tottransfer_ = 0;
-  lossrate_ = lossrate;
-  cout << " TestPCIWrapperNODMA(PaqSz=" << sz << ",LossRate=" << lossrate << ")" << endl;
+  if (lossrate<0.)  lossrate=-lossrate;
+  max_frcount_=(UInt32)lossrate;
+  lossrate_ = lossrate-(double)max_frcount_;
+  if (lossrate_<1.e-9) lossrate_=0.;
+  cout << " TestPCIWrapperNODMA(PaqSz=" << sz << ",LossRate=" << lossrate 
+       << " MaxFrameCount=" << max_frcount_ << ")" << endl;
 }
 
@@ -49,5 +78,6 @@
 Byte* TestPCIWrapperNODMA::GetData()
 {
-  if (lossrate_ > 1.e-19) {
+  if (frame_counter_>max_frcount_)  return NULL;
+  if (lossrate_ > 1.e-9) {
     UInt32 dfc = 1; 
     while (rg_.Flat01()<lossrate_)  dfc++;
Index: /trunk/AddOn/TAcq/pciewrap.h
===================================================================
--- /trunk/AddOn/TAcq/pciewrap.h	(revision 3908)
+++ /trunk/AddOn/TAcq/pciewrap.h	(revision 3909)
@@ -32,7 +32,7 @@
  public:
   // Constructeur - fait l'initialisation
-  PCIEWrapperInterface() { } 
+  PCIEWrapperInterface();
   // destructeur - libere la memoire allouee
-  virtual ~PCIEWrapperInterface() { } 
+  virtual ~PCIEWrapperInterface();
 
   virtual UInt32 TransferSize() = 0;
@@ -41,4 +41,16 @@
   virtual UInt64 TotTransferBytes() = 0;    
   virtual void PrintStatus(ostream& os) = 0;
+  // Identification de fibres / voies 
+  inline void SetFiberNumId(int fibnum=1, int fibid=1)
+  { fiber_num_=fibnum;  fiber_id_=fibid; }
+  inline int FiberNum() { return fiber_num_; }
+  inline int FiberId() { return fiber_id_; }
+  // Parametre de controle de la boucle d'attente de fin de DMA (en unite de 1000 pour maxkwedma)
+  virtual unsigned long SetMaxWaitEndDMA(unsigned int maxkwedma=1000, unsigned int nretry=3);
+protected:
+  unsigned long maxwaitenddmaloop_;  // Nombre d'iterations de la boucle d'attente de fin de DMA
+  unsigned int maxretryenddma_;      // nombre maxi de tentatives pour terminer le DMA 
+  int fiber_num_;                    // numero de fibre sur la machine
+  int fiber_id_;                     // identificateur de fibre - numero absolu sur l'ensemble des machines
 };
 
@@ -46,4 +58,5 @@
 class TestPCIWrapperNODMA : public PCIEWrapperInterface {
 public:	
+  // lossrate_=partie_fractionnaire[lossrate], max_frcount_=partie entiere[lossrate]  
   TestPCIWrapperNODMA(UInt32 sz, double lossrate=0.);
   virtual ~TestPCIWrapperNODMA();
@@ -62,4 +75,5 @@
   UInt64 tottransfer_;
   double lossrate_;
+  UInt32 max_frcount_; 
   BRPaqChecker pchk_;
 //  FMTRandGen rg_;
Index: /trunk/AddOn/TAcq/racqueth.cc
===================================================================
--- /trunk/AddOn/TAcq/racqueth.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/racqueth.cc	(revision 3909)
@@ -55,5 +55,6 @@
       for(int ii=0; ii<BRTCPMSGLEN; ii++) msg[ii]='\0';
       uint_4 dmasz = (fgdirectsend_)  ? vec_pciw_[0]->TransferSize() : 0;
-      sprintf(msg,"BAORadio-PCIEToEthernet  %d %d %d %d %d", par_.MMgrNbPaquet(), par_.MMgrPaquetSize(), dmasz, 0,i);
+      sprintf(msg,"BAORadio-PCIEToEthernet  %d %d %d %d %d", par_.MMgrNbPaquet(), par_.MMgrPaquetSize(), 
+	      vec_pciw_[i]->FiberId(), dmasz, i);
       //           123456789012345678901234567890
       sok.SendAll(msg,BRTCPMSGLEN);
@@ -72,4 +73,6 @@
     vvec_errorcnt_.push_back(verrcnt);
     vec_cntpaq_.push_back(0);
+    vfgmsgfin_.push_back(false);
+
   }
   totrdsnd_ = 0;
@@ -119,6 +122,4 @@
   uint_4 off_acheval=0;
   
-  int nerrdma = 0;
-  int maxerrdma = 10;
   bool fgarret = false;
   
@@ -170,10 +171,20 @@
   uint_4 npaqfaitg = 0; 
 
+  for (int i=0;i< (int)nbDma_ ;i++)
+    vec_pciw_[i]->SetMaxWaitEndDMA(par_.first_maxkwedma_,par_.first_nretrydma_);
+
   while (npaqfaitg < nmaxpaq_) {  // Boucle global G 
     if (fgarret) break;
     if (stop_) break;
+
+    if ((prtlev_>0)&&(npaqfaitg>1)&&((npaqfaitg-1)%prtmodulo_==0)) 
+      cout << " PCIEToEthernet::run()/Info NPaqFait= " << npaqfaitg << endl;
     
     // Lancement des DMA 
     for (int dma=0; dma < (int)nbDma_ ;dma++) vec_pciw_[dma]->StartTransfers();
+    if (npaqfaitg==1)  { 
+      for (int i=0;i< (int)nbDma_ ;i++)
+	vec_pciw_[i]->SetMaxWaitEndDMA(par_.maxkwedma_,par_.nretrydma_);
+    }
     
     // On pointe vers le debut de la zone a remplir aver le prochain DMA
@@ -185,13 +196,12 @@
       Datas[dma]=vec_pciw_[dma]->GetData();
       if (Datas[dma] == NULL) { // No data Read in DMA 
-	nerrdma ++;   fgbaddma=true;
-	cout << "PCIEToEthernetChecker/Erreur Waiting for datas ..." << endl;
+	fgbaddma=true;
+	cout << "PCIEToEthernetChecker/Error Waiting for datas ..." << endl;
 	vec_pciw_[dma]->PrintStatus(cout);
-	if (nerrdma>=maxerrdma) { fgarret = true; break; }
+	fgarret = true;  break; 
       }
     }
     if (fgbaddma) continue;  
-    if ((prtlev_>0)&&(npaqfaitg%prtmodulo_==0)) 
-      cout << " PCIEToEthernet::run()/Info NPaqFait= " << npaqfaitg << endl;
+
     if (fgdirectsend_) {  // Pas de copie / reduction de taille de paquet, on rebalance tel quel ...
       for (int fib=0; fib<(int) nbDma_ ;fib++) {
@@ -283,4 +293,6 @@
   }  //   FIN  Boucle global G 
  
+  // ----- Nettoyage final et impression de resume -------
+  CleanUpEndSendAllLinks();
   setRC(0);
   gettimeofday(&tv2, NULL);
@@ -326,5 +338,5 @@
 static long cnt_prt=0;
 /* --Methode-- */
-size_t PCIEToEthernet::SendToTargets(int fib, Byte* data, size_t len)
+size_t PCIEToEthernet::SendToTargets(int fib, Byte* data, size_t len, bool fgfin)
 {
   //DBG    cout << " SendToTargets/DBG" << cnt_prt << " len=" << len << " data=" << hex << (unsigned long)data << dec << endl; cnt_prt++; 
@@ -360,13 +372,27 @@
   }
 #endif
-  if (vec_cntpaq_[fib]==nmaxpaq_) {  // fin de l'envoi pour cette fibre 
+  if ((vec_cntpaq_[fib]==nmaxpaq_)||(fgfin&&(vec_cntpaq_[fib]%par_.MMgrNbPaquet()==0))) {  // fin de l'envoi pour cette fibre 
     sprintf(msg,"PCIEToEthernet-Send-END %d",vec_cntpaq_[fib]);
     for(size_t j=0; j<vskt.size(); j++) {
       vskt[j].SendAll(msg, BRTCPMSGLEN2);
     }
-    
+    vfgmsgfin_[fib]=true;
   }
   return rc;
 }
+
+/* --Methode-- */
+void PCIEToEthernet::CleanUpEndSendAllLinks()
+{
+  cout << " PCIEToEthernet::CleanUpEndSendAllLinks() - Ending transmission on links ..." << endl;
+  Byte* tampon = new Byte[par_.MMgrPaquetSize()];
+  memset(tampon,0,(size_t)par_.MMgrPaquetSize());
+  for(size_t fib=0; fib<vfgmsgfin_.size(); fib++) {
+    while (!vfgmsgfin_[fib])  SendToTargets(fib,tampon,par_.MMgrPaquetSize(),true);
+    cout << " ... Ended transmission on links for Fiber " << fib << endl;
+  }
+  delete[] tampon;
+}
+
 //------------------------------------------------------------------
 // Classe thread de lecture sur interface reseau (Ethernet) 
@@ -429,8 +455,33 @@
     sok.SendAll(msg,BRTCPMSGLEN);
     vsok_.push_back(sok);
-    cout << " EthernetReader/Info connection/link" << fib << " established." << endl; 
+    vfibid_.push_back(ic);
+    cout << " EthernetReader/Info connection/link" << fib << " established - FiberId= " << ic << endl; 
     vec_cntpaq_.push_back(0);
     vec_fgsokend_.push_back(false);
   }
+  if (vsok_.size()>1) {
+    cout << " EthernetReader/Info: sorting socket according to FiberIds ..." << endl;
+    bool encore=true;
+    Socket tmpskt;
+    int tmpid;
+    while(encore) {
+      encore=false;
+      for(size_t ii=0; ii<vsok_.size()-1; ii++) {
+	if (vfibid_[ii]<vfibid_[ii+1]) {
+	  tmpskt=vsok_[ii];  tmpid=vfibid_[ii];
+	  vsok_[ii]=vsok_[ii+1];  vfibid_[ii]=vfibid_[ii+1];
+	  vsok_[ii+1]=tmpskt;  vfibid_[ii+1]=tmpid;
+	  encore=true;
+	}
+      }
+    }
+  }
+  cout << " EthernetReader/Info: Setting FiberIds in RAcqMemZoneMgr \n ... FiberIds= " ;
+  for(size_t ii=0; ii<vsok_.size(); ii++)  { 
+    memgr_.FiberId(ii)=vfibid_[ii];
+    cout << vfibid_[ii] << " ; ";
+  }
+  cout << endl;
+
   gl_fgsokend = true;
   stopreason_="??Unknown??";
Index: /trunk/AddOn/TAcq/racqueth.h
===================================================================
--- /trunk/AddOn/TAcq/racqueth.h	(revision 3908)
+++ /trunk/AddOn/TAcq/racqueth.h	(revision 3909)
@@ -61,5 +61,6 @@
 
 protected: 
-  virtual size_t SendToTargets(int fib, Byte* data, size_t len);
+  virtual size_t SendToTargets(int fib, Byte* data, size_t len, bool fgfin=false);
+  virtual void CleanUpEndSendAllLinks();
 
   BRParList par_;   // Parametres divers d'acquisition 
@@ -75,4 +76,5 @@
   vector< vector<uint_8> > vvec_errorcnt_;
   vector< uint_8 > vec_cntpaq_; 
+  vector< bool > vfgmsgfin_;   // true -> message fin envoye pour la fibre correspondante  
   uint_4 packSize_;
   uint_4 packSizeInMgr_;
@@ -96,4 +98,12 @@
   // Si force_samefc=true, on essaye de lire des paquets avec meme FrameCounter, sans depasser une 
   // difference maximum de maxdiff_paqnum entre nombre de paquets lus sur chaque fibre
+  //  - force_samefc=false : lecture des paquet sans alignement des FrameCounter 
+  //  - force_samefc=true : lecture paquets avec alignement des FrameCounter
+  //     + mode par defaut : maxdiff_paqnum=0, maxresync=0 -> on cherche a aligner FrameCounter sur les 
+  //     differents liens ethernet 
+  //     + maxdiff_paqnum>0 : difference maximum de nombre de paquets entre les differents liens
+  //     + maxresync>0 : Mode de lecture avec resynchronisation du nombre de paquets , nombre 
+  //       maxi de resynchronisation - 
+  //  Modes conseilles : false   -  true,0,0  - true,10,0        
   inline void SetReadMode(bool force_samefc=false, uint_4 maxdiff_paqnum=0, uint_4 maxresync=0)
   { rdsamefc_=force_samefc; sfc_maxdpc_=maxdiff_paqnum; sfc_maxresync_=maxresync; }
@@ -138,4 +148,5 @@
   ServerSocket* srv_sokp_;  // Le socket serveur  
   vector< Socket > vsok_;  //  Les sockets de lecture pour chaque lien ethernet (1 lien= 1 fibre a l'envoi) 
+  vector< int > vfibid_;   //  Identificateur des fibres transmis par l'emetteur 
   vector< uint_8 > vec_cntpaq_;   // vecteur de compteurs de paquet ( 1 compteur / lien ) 
   vector< uint_4 > vec_fgsokend_;    // vecteur de flag, >0 : fin de reception (ou ereur) sur le lien 
Index: /trunk/AddOn/TAcq/racqumem.cc
===================================================================
--- /trunk/AddOn/TAcq/racqumem.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/racqumem.cc	(revision 3909)
@@ -38,6 +38,9 @@
      memzones.push_back(new Byte[mzsz] );
      states.push_back(st);
+     auxdatap.push_back(new RAcqMZAuxData );
+     fiber_id.push_back(0);
      if (procmzsz > 0)  procmemzones.push_back(new Byte[procmzsz] );
    }
+  dummy_=0;
   serial_ = 0;
   SetFinalizedMask();
@@ -50,4 +53,5 @@
   for(uint_4 k=0; k<NbZones(); k++) { 
     delete[] memzones[k]; 
+    delete auxdatap[k];
     if (procpaqsz > 0) delete[] procmemzones[k];
   }
Index: /trunk/AddOn/TAcq/racqumem.h
===================================================================
--- /trunk/AddOn/TAcq/racqumem.h	(revision 3908)
+++ /trunk/AddOn/TAcq/racqumem.h	(revision 3909)
@@ -16,4 +16,5 @@
 #include <iostream>
 #include "brtypes.h"
+#include "timestamp.h"
 
 using namespace std;
@@ -63,4 +64,15 @@
 
 
+// ---------------------------------------------------------
+//  Classe pour donnees auxiliaires associees a chaque zone
+// ---------------------------------------------------------
+class RAcqMZAuxData {
+public:
+  RAcqMZAuxData() { }
+  inline SOPHYA::TimeStamp& FillTime() { return filltime_; }
+
+  SOPHYA::TimeStamp filltime_;
+};
+
 // -------------------------------------------------------------------
 // Classe de gestion de zones memoire partagee (des buffers) entre
@@ -80,7 +92,7 @@
   ~RAcqMemZoneMgr();
   
+  // Retourne le nombre de zones memoire
+  inline uint_4 NbZones() { return nzones; }
   // Retourne le nombre de fibres dans chaque zone
-  inline uint_4 NbZones() { return nzones; }
-  // Retourne le nombre de zones memoire
   inline uint_4 NbFibres() { return nfibres; }
   // Retourne la taille de paquet
@@ -136,5 +148,15 @@
     return procmemzones[id];  
     }
-  
+  // Retourne le pointeur sur les donnees auxiliaire associee a une zone 
+  inline RAcqMZAuxData* GetAuxData(int id)   {
+    if ((id < 0) || (id >=(int) auxdatap.size()))  return NULL;
+    return auxdatap[id];  
+    }  
+  // Retourne l'identificateur (numero absolu) de la fibre 
+  inline int& FiberId(int fib) {
+    if ((fib < 0) || (fib >=(int) nfibres))  return dummy_;
+    return fiber_id[fib];
+  }
+
   ostream& Print(ostream& os);
   inline ostream& Print() { return Print(cout); }
@@ -153,8 +175,11 @@
   SOPHYA::ZMutex mex;   
   uint_4  nzones, nfibres, npaq, paqsz, procpaqsz;
-//  DMAMgrInterface &dma_;
-  vector< Byte* > memzones;
-  vector< St_MemZ > states; 
-  vector< Byte* > procmemzones;
+  vector< Byte* > memzones;            // pointeur de donnees de chaque zone 
+  vector< St_MemZ > states;            // etat de chaque zone 
+  vector< RAcqMZAuxData* > auxdatap;   // pointeur de donnees auxiliaires associees a chaque zone
+  vector< Byte* > procmemzones;        // pointeur de donnees traitees de chaque zone  
+// Identificateur (numero absolu) des fibres 
+  vector< int > fiber_id;
+  int dummy_;
   bool stop_;
   MemZRunState runstate_;
Index: /trunk/AddOn/TAcq/racqurw.cc
===================================================================
--- /trunk/AddOn/TAcq/racqurw.cc	(revision 3908)
+++ /trunk/AddOn/TAcq/racqurw.cc	(revision 3909)
@@ -487,5 +487,8 @@
   mmbuf_=NULL;
   max_targ_npaq = memgr.NbPaquets();
-  for (int fid=0 ; fid<(int)nbDma_ ;fid++) mmbufib_[fid]=NULL;
+  for (int fid=0 ; fid<(int)nbDma_ ;fid++) { 
+    memgr.FiberId(fid)=vec_pciw[fid]->FiberId(); 
+    mmbufib_[fid]=NULL;
+  }
 }
 
@@ -507,5 +510,5 @@
   uint_4 paqsz =  packSize_;
   uint_4 dmasz = vec_pciw_[0]->TransferSize();
-  vec_pciw_[0]->StartTransfers();
+  //DEL   vec_pciw_[0]->StartTransfers();
 
   BRPaqChecker pcheck[MAXNBFIB];  // Verification/comptage des paquets  
@@ -516,6 +519,4 @@
   uint_4 off_acheval=0;
   
-  int nerrdma = 0;
-  int maxerrdma = 10;
   bool fgarret = false;
   
@@ -523,4 +524,5 @@
   for (int i=0;i< (int)nbDma_ ;i++) {  
     tampon[i]=   new Byte[paqsz];
+    vec_pciw_[i]->SetMaxWaitEndDMA(par_.first_maxkwedma_,par_.first_nretrydma_);
   }
   bool fgredpaq=par_.fgreducpsize;
@@ -551,5 +553,8 @@
     // Lancement des DMA 
     for (int dma=0; dma < (int)nbDma_ ;dma++) vec_pciw_[dma]->StartTransfers();
-    
+    if (npaqfaitg==1)  { 
+      for (int i=0;i< (int)nbDma_ ;i++)
+	vec_pciw_[i]->SetMaxWaitEndDMA(par_.maxkwedma_,par_.nretrydma_);
+    }
     // On pointe vers le debut de la zone a remplir aver le prochain DMA
     //-- Zone memoire locale Byte* nextdma = buff+i*paqsz;
@@ -560,8 +565,8 @@
       Datas[dma]=vec_pciw_[dma]->GetData();
       if (Datas[dma] == NULL) { // No data Read in DMA 
-	nerrdma ++;   fgbaddma=true;
-	cout << "PCIEMultiReaderChecker/Erreur Waiting for datas ..." << endl;
+	fgbaddma=true;
+	cout << "PCIEMultiReaderChecker/Error Waiting for datas ..." << endl;
 	vec_pciw_[dma]->PrintStatus(cout);
-	if (nerrdma>=maxerrdma) { fgarret = true; break; }
+	fgarret = true;  break; 
       }
     }
@@ -681,6 +686,8 @@
   cout << " --------------------------------------------------------------------" << endl;
 
-  // //// Nettoyage final
+  //---- Nettoyage final et arret 
   MZoneManage(true);
+  memgr.Stop();   // Pour arreter les autres threads 
+
   for (int i=0;i< (int)nbDma_ ;i++) delete[] tampon[i]; 
   if ((fgredpaq)&&predtampon) delete[] predtampon;
@@ -700,5 +707,8 @@
        << " max_targ_npaq=" << max_targ_npaq << endl;
   */
-  if (mid_ >= 0)  memgr.FreeMemZone(mid_, MemZS_Filled);
+  if (mid_ >= 0)  { 
+    memgr.GetAuxData(mid_)->filltime_.SetNow(); 
+    memgr.FreeMemZone(mid_, MemZS_Filled);
+  }
   mmbuf_ = NULL;  targ_npaq_ = 0;  mid_ = -2;
   for (int fid=0;fid<(int)nbDma_ ;fid++) mmbufib_[fid]=NULL;
@@ -790,4 +800,5 @@
     }
     BRPaquet paq0(NULL, NULL, paqsz); 
+    TimeStamp tsmz;
     for (uint_4 nbFile=0;nbFile<nfiles_ ;nbFile++) {
       if (stop_ )   break;
@@ -813,5 +824,4 @@
         // Sans TRAILER de paquet mff.setDTypeNaxis(MF_Byte, paq0.DataSize()+paq0.HeaderSize(), npaqperfile); 
 	}
-	AddFitsKWStart(mff,bpar);
 	fnum++;   fgfirstfctt=true;
       }
@@ -828,4 +838,5 @@
 	  return;	
 	}
+	tsmz = memgr.GetAuxData(mid)->filltime_;
 	for(uint_4 fib=0; fib<memgr.NbFibres(); fib++)  {  // Boucle sur les fibres 
 	  Byte* buff = memgr.GetMemZone(mid,fib);
@@ -841,4 +852,5 @@
 	      framecnt_first_[fib] = pcheck[fib].LastFrameNum();
 	      timetag_first_[fib] = paq.TimeTag();
+	      AddFitsKWStart(mff,bpar,tsmz);
 	      fgfirstfctt=false;
 	    }
@@ -871,5 +883,5 @@
 	  framecnt_last_[fib] = pcheck[fib].LastFrameNum(); 
 
-	AddFitsKWEnd(mff,bpar);
+	AddFitsKWEnd(mff,bpar,tsmz);
 	for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) {
           header[fib].close();
@@ -907,7 +919,6 @@
 
 /* --Methode-- */
-int MultiDataSaver::AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar)
+int MultiDataSaver::AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts)
 { 
-  TimeStamp ts;
   string cdtu=ts.ToString();
   string& skysrc=acpar.SkySource();
@@ -922,5 +933,6 @@
     mff[fib].AddKeyS("BRPAQCFMT", BRPaquet::FmtConvToString(acpar.GetParams().GetDataConvFg()), 
 		         " BAORadio BRPaquet DataFormatConversion" );
-    mff[fib].AddKeyI("FIBERNUM", acpar.GetParams().FiberNum[fib], " Fiber number/id") ;
+    mff[fib].AddKeyI("FIBERNUM", acpar.GetParams().FiberNum[fib], " Fiber number") ;
+    mff[fib].AddKeyI("FIBERID",memgr.FiberId(fib), " Fiber identifier (absolute id)"); 
     if (hassrc) 
       mff[fib].AddKeyS("SKYSOURC", skysrc, " Source identification" );
@@ -935,7 +947,6 @@
 
 /* --Methode-- */
-int MultiDataSaver::AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar)
+int MultiDataSaver::AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts)
 { 
-  TimeStamp ts;
   string cdtu=ts.ToString();
   for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) {
Index: /trunk/AddOn/TAcq/racqurw.h
===================================================================
--- /trunk/AddOn/TAcq/racqurw.h	(revision 3908)
+++ /trunk/AddOn/TAcq/racqurw.h	(revision 3909)
@@ -170,6 +170,6 @@
   inline void STOP() { stop_ = true; }	
 protected:
-  int  AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar);
-  int  AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar);
+  int  AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts);
+  int  AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts);
 
   RAcqMemZoneMgr& memgr;
