Index: /trunk/AddOn/TAcq/acqparam_exemple.d
===================================================================
--- /trunk/AddOn/TAcq/acqparam_exemple.d	(revision 3875)
+++ /trunk/AddOn/TAcq/acqparam_exemple.d	(revision 3876)
@@ -55,4 +55,17 @@
 #  @nosavesigfits
 nosavesigfits
+######################
+### Parametres pour calcul des visibilites 
+### Le calcul des visibilites ne peut etre active qu'avec le parametre de ligne de commande de mfacq
+#  @visicalc NbPaqMean  NbCalcGrp   NbThrPerCalc
+#  - NbPaqMean : nb de paquets moyennes 
+#  - NbCalcGrp : Nombre de calculateurs de visibilites s'executant en parallele ds le BRVisCalcGroup
+#  - NbThrPerCalc : Nombre de thread dans chaque calculateur ( laisser a 1 de preference ) 
+#  Defaut : visicalc 1024  1 1 
+visicalc 5000  2 1 
+##  Binning en frequence lors du calcul (parametre en numero des frequences)
+#  @visicfreq freqmin freqmax nbinfreq 
+#  Defaut: visicfreq 0 0 1   (aucun binning, toutes les frequences) 
+visicfreq 0 0 1 
 #  Taux de perte de paquets en simulation (Sans carte PCIExpress) 
 #  @nopcilossrate Perte     (0<=Perte<1)
Index: /trunk/AddOn/TAcq/bracqvers.h
===================================================================
--- /trunk/AddOn/TAcq/bracqvers.h	(revision 3875)
+++ /trunk/AddOn/TAcq/bracqvers.h	(revision 3876)
@@ -5,6 +5,6 @@
    Software version     LAL - 2008-2010 
 */
-#define BAOR_ACQ_VER 7.1
-#define BAOR_ACQ_VER_STR "BaoAcq_v7r1_Avr10 "
+#define BAOR_ACQ_VER 7.2
+#define BAOR_ACQ_VER_STR "BaoAcq_v7r2_Sep10 "
 
 #endif
Index: /trunk/AddOn/TAcq/brbaseproc.cc
===================================================================
--- /trunk/AddOn/TAcq/brbaseproc.cc	(revision 3875)
+++ /trunk/AddOn/TAcq/brbaseproc.cc	(revision 3876)
@@ -161,4 +161,5 @@
 int BRBaseProcessor::Process()
 {
+  // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
   // la methode par defaut ne fait rien 
   // if (fgokallfibers_) { faire le traitement }
@@ -166,5 +167,5 @@
   /*    Exemple de code test  */
   if ( totprocnpaq_ % 1000 == 0 ) {
-    cout << " BRVisibilityCalculator::Process() " << totprocnpaq_ << " FrameCnt=" ;
+    cout << " BRBaseProcessor::Process() " << totprocnpaq_ << " FrameCnt=" ;
     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)   
       cout << curfc_[fib] << "," ;
Index: /trunk/AddOn/TAcq/brparam.cc
===================================================================
--- /trunk/AddOn/TAcq/brparam.cc	(revision 3875)
+++ /trunk/AddOn/TAcq/brparam.cc	(revision 3876)
@@ -139,9 +139,18 @@
   skysource="";
 
+//  --- variables de controle pour le monitoring 
   fgdoProc=false;
   nmeanProc=512;
   stepProc=5;
   nmaxProc=0;
-
+//  --- variables de controle pour le calcul des visibilites  
+  fgdoVisiC = false;
+  nmeanVisiC=1024;
+  nbcalgrpVisiC=1;
+  nthrVisiC=1;
+  freqminVisiC=freqmaxVisiC=0;
+  nbinfreqVisiC=1;  
+
+// Autres variables / variables speciales 
   monothr=false;
   activate_pattern=false;
@@ -237,5 +246,5 @@
   ethr_nlink=conf.IParam("ethrnlink",0,0);   // Nombre de sources de paquets en reception ethernet 
 
-
+  //  Parametre de controle du monitoring 
   if (conf.HasKey("monitor")) {
     fgdoProc=true;
@@ -244,4 +253,17 @@
     nmaxProc=conf.IParam("monitor",2,0);
   }
+  // Parametres pour le calcul des visibilites - le flag fgdoVisiC ne peut etre active 
+  // qu'avec l'option de ligne de commande de mfacq 
+  if (conf.HasKey("visicalc")) {
+    nmeanVisiC=conf.IParam("visicalc",0,1024);
+    nbcalgrpVisiC=conf.IParam("visicalc",1,1);
+    nthrVisiC=conf.IParam("visicalc",2,1);
+  }
+  if (conf.HasKey("visicfreq")) {
+    freqminVisiC=conf.IParam("visicfreq",0,0);
+    freqmaxVisiC=conf.IParam("visicfreq",1,0);
+    nbinfreqVisiC=conf.IParam("visicfreq",2,1);
+  }
+
   nopciLossRate=conf.DParam("nopcilossrate",0,0.);
   fg_hard_ctrlc=conf.HasKey("hard_ctrlc");
@@ -354,4 +376,9 @@
     os << " Monitoring  NMeanProc=" << nmeanProc << " StepProc=" << stepProc << " NMaxProc=" << nmaxProc << endl;
   else os << " No monotoring thread " << endl;
+  if (fgdoVisiC) {
+    os << " Visibility calculation, nbCalGrp=" << nbcalgrpVisiC << " NThr/VisCal=" << nthrVisiC << endl;
+    os << " ... VisiCalc FrequencyBinning FreqMin= " << freqminVisiC << " FreqMax= " << freqmaxVisiC 
+       << " NBinFreq= " << nbinfreqVisiC<< endl;
+  }
   os << " fg_hard_ctrlc=" << ((fg_hard_ctrlc)?"true":"false");
   os << " Save to fits " << ((savesigfits)?"true":"false") << endl;
Index: /trunk/AddOn/TAcq/brparam.h
===================================================================
--- /trunk/AddOn/TAcq/brparam.h	(revision 3875)
+++ /trunk/AddOn/TAcq/brparam.h	(revision 3876)
@@ -175,4 +175,12 @@
   uint_4 nmaxProc;  // Nombre de blocs traites par le thread de traitement/monitoring (0-> MaxNbBlocs())
  
+  //  Variables pour le calcul de visibilites
+  bool fgdoVisiC;           // true -> calcul des visibilites 
+  uint_4 nmeanVisiC;        // nombre de paquets moyennes pour les calculs de visibilites 
+  uint_4 nbcalgrpVisiC;     // Nb d'objets/threads dans BRVisCalcGroup 
+  uint_4 nthrVisiC;         // Nb de threads pour l'execution parallele ds BRVisibilityCalculator
+  uint_4 freqminVisiC, freqmaxVisiC, nbinfreqVisiC;  // si zone de frequence/rebinning pour visibilites
+
+   
   // Pour des tests de performances ou sans carte ADC (pattern) 
   bool monothr ;           // pour les test mono thread 
Index: /trunk/AddOn/TAcq/brviscalc.cc
===================================================================
--- /trunk/AddOn/TAcq/brviscalc.cc	(revision 3875)
+++ /trunk/AddOn/TAcq/brviscalc.cc	(revision 3876)
@@ -68,6 +68,8 @@
 BRVisibilityCalculator::~BRVisibilityCalculator()
 {
+  if (totnbpaq_<1)   return; 
   cout << " BRVisibilityCalculator - Visibility Datatable : " << endl;
   cout << visdt_;
+  
   string filename;
   filename = outpath_+"visdt.ppf";
@@ -82,5 +84,5 @@
     POutPersist poc(outpath_+"chanum.ppf");
     poc << chanum_;
-  
+    
     if (fgcktt_) {
       cout << " BRVisibilityCalculator -  Check TimeTag done: TotNPaqProc= " << totnbpaq_ << endl;
@@ -137,7 +139,7 @@
   if ((jf1_<1)||(jf1_>=vismtx_.NCols()))  jf1_=1;
   if ((jf2_<1)||(jf2_>=vismtx_.NCols())||(jf2_<jf1_))  jf2_=vismtx_.NCols()-1;
-  if (nbfreq<1) nbfreq=1;
+  if (nbfreq<1) nbfreq=(jf2_-jf1_);
   djf_=(jf2_-jf1_)/nbfreq;
-  if (djf_<1) djf_=0;
+  if (djf_<1) djf_=1;
   cout << " BRVisibilityCalculator::SelectFreqBinning/Info  JF1=" << jf1_ 
        << " JF2=" << jf2_ << " DJF=" << djf_ << endl;
Index: /trunk/AddOn/TAcq/brviscalc.h
===================================================================
--- /trunk/AddOn/TAcq/brviscalc.h	(revision 3875)
+++ /trunk/AddOn/TAcq/brviscalc.h	(revision 3876)
@@ -43,5 +43,6 @@
   uint_4 SelectPairs(uint_4 pair1=0, uint_4 nbpairs=99999999);
   // pour definir le binning en frequence pour la VisibDataTable 
-  int SelectFreqBinning(uint_4 freq1=0, uint_4 freq2=0, uint_4 nbfreq=1);
+  // par defaut, toutes les frequences avec un pas de 1 
+  int SelectFreqBinning(uint_4 freq1=0, uint_4 freq2=0, uint_4 nbfreq=0);
 
   // Pour activer la verification des timetag
Index: /trunk/AddOn/TAcq/mfacq.cc
===================================================================
--- /trunk/AddOn/TAcq/mfacq.cc	(revision 3875)
+++ /trunk/AddOn/TAcq/mfacq.cc	(revision 3876)
@@ -52,14 +52,15 @@
   }
   
-  const char* desact[3] = {"PCIE_To_Ethernet", "Ethernet_To_Disk", "PCIE_DMA_To_Disk"};
+  const char* desact[4] = {"PCIE_To_Ethernet", "Ethernet_To_Disk", "Ethernet_To_Visibilities","PCIE_DMA_To_Disk"};
   string action=arg[1];
   int act = 0;
-  if ((action != "-pci2eth")&&(action != "-pci2disk")&&(action != "-eth2disk")) {
+  if ((action != "-pci2eth")&&(action != "-pci2disk")&&(action != "-eth2disk")&&(action != "-eth2visib")) {
     cout << " mfacq/Error , Bad action argument : " << action << endl;
     return 2;
   }
   if (action == "-pci2eth")  act=0;
-  else if (action == "-eth2disk") act=1;
-  else if (action == "-pci2disk")  act=2;
+  else if (action == "-eth2disk") act=1;  
+  else if (action == "-eth2visib") act=2; 
+  else if (action == "-pci2disk")  act=3;
 
   string pardcfile=arg[2];
@@ -84,4 +85,7 @@
     if (act > 0) 
       if (acpar.CreateOutputDirectories()!=0)  return 9;
+    acpar.GetParams().fgdoVisiC=false;
+    if (act == 2)  acpar.GetParams().fgdoVisiC=true;
+
     acpar.Print(cout);
     struct sigaction siact;  
@@ -94,8 +98,11 @@
       rc = PCIEToEthernetTransfer();
       break;
-    case 1:
-      rc = EthernetToMemoryAcq();
+    case 1:    // ethernet --> disk 
+      rc = EthernetToMemoryAcq(false);
       break;
-    case 2:
+    case 2:   // ethernet --> visibility calculation 
+      rc = EthernetToMemoryAcq(true);
+      break;
+    case 3:
       rc = MultiFibreAcq();
       break;
@@ -134,5 +141,5 @@
   cout << " Usage: mfacq Action DataCardFile [BaseDirectory / TargetMachines]" << endl;
   if (fgshort) return;
-  cout << " o Action = -pci2disk , -pci2eth , -eth2disk \n " 
+  cout << " o Action = -pci2disk , -pci2eth , -eth2disk , -eth2visib \n " 
        << "   DataCardFile : File name for parameters list (DataCards) : \n"
        << "     fibres outpathname skysource paqsize dmasizekb nbfiles \n" 
@@ -262,5 +269,4 @@
        << acpar.nZones << " NbPaquet/Zone=" << acpar.nPaqZone 
        << " MmgrPaqSize=" << acpar.MMgrPaquetSize() << endl;
-  
 #ifndef NOPCIECARD  
   for (int i=0 ;i <acpar.NFibers() ;i++) {
@@ -319,6 +325,10 @@
 }
 
+
+/* Fonction-Utilitaire : Voir en fin de fichier  */
+MemZaction ConvertMemZ_Status2Action( MemZStatus st );
+
 /* --Nouvelle-Fonction-- */
-int EthernetToMemoryAcq() 
+int EthernetToMemoryAcq(bool fgviscal) 
 {
   Timer tm("mfacq/EthernetToMemoryAcq");
@@ -327,5 +337,7 @@
   BRAcqConfig bpar;
   BRParList& acpar=bpar.GetParams();
-  
+
+  if (fgviscal)  cout << "mfacq[0]/EthernetToMemoryAcq() : On the fly Visibility Calculation " << endl;
+  else cout << "mfacq[0]/EthernetToMemoryAcq() : data dumped to disk  " << endl;  
   cout << " mfacq[1]/Info: Creating RAcqMemZoneMgr for" << acpar.NbEthLinks() << " Eth-links , nZones=" 
        << acpar.nZones << " NbPaquet/Zone=" << acpar.nPaqZone 
@@ -333,16 +345,45 @@
   RAcqMemZoneMgr mmgr(acpar.nZones, acpar.NbEthLinks(), acpar.nPaqZone, acpar.MMgrPaquetSize());
   pMmgr=&mmgr;  
-  if (acpar.fgdoProc && (acpar.stepProc>0)) {
+
+
+  string strfmask;
+  uint_4 fmask=0;
+  MemZStatus mskmon=MemZS_Proc;
+  if (fgviscal) {  // gestion de finalized_mask lors du calcul de visibilites 
+    if (acpar.nbcalgrpVisiC<1)  acpar.nbcalgrpVisiC=1;
+    if (acpar.nbcalgrpVisiC>4)  acpar.nbcalgrpVisiC=4;
+    cout << " mfacq[1.b]/Info: NbCalGrpVisiC = " << acpar.nbcalgrpVisiC << " (1<=NbCalGrpVisiC<=4)" << endl;
+    fmask=(uint_4)MemZS_ProcA;   strfmask="MemZS_ProcA";  mskmon=MemZS_ProcB;
+    if (acpar.nbcalgrpVisiC>1) 
+      { fmask |= (uint_4)MemZS_ProcB;  strfmask+=" | MemZS_ProcB";  mskmon=MemZS_ProcC; }
+    if (acpar.nbcalgrpVisiC>2) 
+      { fmask |= (uint_4)MemZS_ProcC;  strfmask+=" | MemZS_ProcC";  mskmon=MemZS_ProcD; }
+    if (acpar.nbcalgrpVisiC>3) 
+      { fmask |= (uint_4)MemZS_ProcD;  strfmask+=" | MemZS_ProcD";  mskmon=MemZS_ProcE; }
+  }
+  else { 
+    fmask=(uint_4)MemZS_Saved;  strfmask="MemZS_Saved";  mskmon=MemZS_Proc;
+  }
+  if (acpar.fgdoProc) 
+    { fmask |= (uint_4)mskmon; strfmask+=" | MemZS_Proc[Monotoring]"; }
     // Dans ce cas, toutes les zones doivent passer ds le thread de monitoring 
     // pour etre au moins marque comme traite - seul 1/acpar.stepProc sont effectivement traite 
-    mmgr.SetFinalizedMask(((uint_4)MemZS_Saved) | ((uint_4)MemZS_Proc));
-    cout << " mfacq[1.b]/Info: Mmgr.SetFinalizedMask( MemZS_Saved | MemZS_Proc )" << endl;
-  }
-  
-
-  cout <<"mfacq[2] Creating MultiDataSaver and  MonitorProc thread objects ... " << endl;
+
+  mmgr.SetFinalizedMask(fmask);
+  cout << " mfacq[1.b]/Info: Mmgr.SetFinalizedMask( " <<  strfmask << " )" << endl;
+  
+  if (fgviscal) 
+    cout <<"mfacq[2] Creating BRVisCalcGroup, NbVisibCalculator=" << acpar.nbcalgrpVisiC 
+	 << " and MonitorProc " << endl;
+  else 
+    cout <<"mfacq[2] Creating MultiDataSaver and  MonitorProc thread objects ... " << endl;
   MultiDataSaver DsThr(mmgr);   //   Utilise les parametres globaux BRAcqConfig
   string ppath=bpar.OutputDirectory();
   MonitorProc PrThr(mmgr);
+  PrThr.SetMemZAction( ConvertMemZ_Status2Action( mskmon ) );
+  BRVisCalcGroup VCGThr(acpar.nbcalgrpVisiC, mmgr, bpar.OutputDirectory(), acpar.nmeanVisiC, acpar.nthrVisiC);
+  VCGThr.SelectFreqBinning(acpar.freqminVisiC, acpar.freqmaxVisiC, acpar.nbinfreqVisiC);
+
+
   cout << "mfacq[3] Creating   EthernetReader thread object     " << endl;
   EthernetReader ethrdr(mmgr, bpar.GetParams(), bpar.GetParams().tcpportid, false);
@@ -350,13 +391,17 @@
   //  usleep(200);  attente au cas ou ...
   pEthRdr=&ethrdr;
-  tm.Split("Threads created");  
-  if (acpar.fgdoProc>0) 
-    cout << "mfacq[4] - starting three threads: EthernetReader, MultiDataSaver, MonitorProc ... " << endl;
-  else 
-    cout << "mfacq[4] - starting two threads: EthernetReader, MultiDataSaver  ... " << endl;
-
+  tm.Split("Threads created"); 
+  cout << "mfacq[4] - starting EthernetReader thread object ..." << endl;
   ethrdr.start();
-  DsThr.start();
-  if (acpar.fgdoProc>0) { // On ne demarre que si au moins NMaxProc>0
+  if (fgviscal) {
+    cout << "mfacq[4.b] - starting  Visibility calculator threads " << endl;
+    VCGThr.start();
+  }
+  else {
+    cout << "mfacq[4.b] - starting  MultiDataSaver  " << endl;
+    DsThr.start();
+  }
+  if (acpar.fgdoProc) { // demarrage (optionnel) du thread de monitoring
+    cout << " mfacq[4.c] - starting MonitorProc thread object " << endl;
     PrThr.start();
   }
@@ -367,5 +412,6 @@
   cout << "mfacq[5] -  Waiting for threads to finish ... " << endl;  
   ethrdr.join();
-  DsThr.join();
+  if (fgviscal)  VCGThr.join();
+  else DsThr.join();
   mmgr.Stop();
   if (acpar.fgdoProc) { // On n'attend la fin que si le thread a ete demarre (NMaxProc>0)
@@ -381,2 +427,42 @@
 
 }
+
+
+/* --Nouvelle-Fonction-Utilitaire */
+MemZaction ConvertMemZ_Status2Action( MemZStatus st )
+{
+  MemZaction ra=MemZA_None;
+  switch (st) {
+  case MemZS_Filled:
+    ra=MemZA_Fill;
+    break;
+  case MemZS_Saved:
+    ra=MemZA_Save;
+    break;
+  case MemZS_Proc:
+    ra=MemZA_Proc;
+    break;
+  case MemZS_ProcA:
+    ra=MemZA_ProcA;
+    break;
+  case MemZS_ProcB:
+    ra=MemZA_ProcB;
+    break;
+  case MemZS_ProcC:
+    ra=MemZA_ProcC;
+    break;
+  case MemZS_ProcD:
+    ra=MemZA_ProcD;
+    break;
+  case MemZS_ProcE:
+    ra=MemZA_ProcE;
+    break;
+  case MemZS_ProcF:
+    ra=MemZA_ProcF;
+    break;
+  default:
+    ra=MemZA_None;
+    break;
+  }
+  return ra;
+}
Index: /trunk/AddOn/TAcq/mfacq.h
===================================================================
--- /trunk/AddOn/TAcq/mfacq.h	(revision 3875)
+++ /trunk/AddOn/TAcq/mfacq.h	(revision 3876)
@@ -23,4 +23,6 @@
 #include "brpaqu.h"
 
+#include "brviscalc.h"   // calcul de visibilites 
+
 #include "resusage.h"
 #include "ctimer.h"
@@ -42,5 +44,5 @@
 
 int PCIEToEthernetTransfer();
-int EthernetToMemoryAcq();
+int EthernetToMemoryAcq(bool fgviscal=false);
 int MultiFibreAcq();
 
Index: /trunk/AddOn/TAcq/racquproc.cc
===================================================================
--- /trunk/AddOn/TAcq/racquproc.cc	(revision 3875)
+++ /trunk/AddOn/TAcq/racquproc.cc	(revision 3876)
@@ -58,4 +58,5 @@
   curfc_.SetSize(memgr.NbFibres(), memgr.NbPaquets());
   cpaqok_.SetSize(memgr.NbFibres(), memgr.NbPaquets());
+  SetMemZAction();
 }
 
@@ -64,4 +65,36 @@
 {
   //  cout << " **** DBG ***** MonitorProc::~MonitorProc() " << endl;
+}
+
+/* --Methode-- */
+MemZStatus MonitorProc::SetMemZAction(MemZaction mmact)
+{
+  mmact_=mmact;
+  mmsta_=MemZS_Proc;
+  switch (mmact) {
+  case MemZA_ProcA:
+    mmsta_=MemZS_ProcA;    
+    break;
+  case MemZA_ProcB:
+    mmsta_=MemZS_ProcB;    
+    break;
+  case MemZA_ProcC:
+    mmsta_=MemZS_ProcC;    
+    break;
+  case MemZA_ProcD:
+    mmsta_=MemZS_ProcD;    
+    break;
+  case MemZA_ProcE:
+    mmsta_=MemZS_ProcE;    
+    break;
+  case MemZA_ProcF:
+    mmsta_=MemZS_ProcF;    
+    break;
+  default:
+    mmact_=MemZA_Proc;
+    mmsta_=MemZS_Proc;
+    break;
+  }
+  return mmsta_;
 }
 
@@ -166,5 +199,5 @@
     if (memgr.GetRunState() == MemZR_Stopped) break;
 
-    int mid = memgr.FindMemZoneId(MemZA_Proc);
+    int mid = memgr.FindMemZoneId(mmact_);  // MemZA_Proc
     Byte* buffg = memgr.GetMemZone(mid);
     if (buffg == NULL) {
@@ -173,5 +206,5 @@
     }
     if ((step_>1)&&(kmz%step_ != 0))  {
-      memgr.FreeMemZone(mid, MemZS_Proc);
+      memgr.FreeMemZone(mid, mmsta_);  //  MemZS_Proc);
       continue;
     }
@@ -237,5 +270,5 @@
       }  // FIN de la boucle sur les paquets 
     }   // Boucle sur les fibres 
-    memgr.FreeMemZone(mid, MemZS_Proc);
+    memgr.FreeMemZone(mid, mmsta_);  // MemZS_Proc);
     CheckFrameCounters();
 
Index: /trunk/AddOn/TAcq/racquproc.h
===================================================================
--- /trunk/AddOn/TAcq/racquproc.h	(revision 3875)
+++ /trunk/AddOn/TAcq/racquproc.h	(revision 3876)
@@ -39,4 +39,5 @@
   MonitorProc(RAcqMemZoneMgr& mem);
   virtual ~MonitorProc();
+  MemZStatus SetMemZAction(MemZaction mmact=MemZA_Proc);
   virtual void run(); 
   void Stop();
@@ -48,4 +49,6 @@
 
   RAcqMemZoneMgr& memgr;
+  MemZaction mmact_;    // Definition de l'action sur les paquets (defaut=MemZA_Proc)
+  MemZStatus mmsta_;    // Statut associe a mmact_ (defaut=MemZS_Proc)
   BRParList par_;
   bool stop_;  
