Index: trunk/AddOn/TAcq/racqurw.cc
===================================================================
--- trunk/AddOn/TAcq/racqurw.cc	(revision 3673)
+++ trunk/AddOn/TAcq/racqurw.cc	(revision 3674)
@@ -21,4 +21,8 @@
 #include "datatable.h" // Pour sauver les entetes de paquet 
 #include <sys/time.h>  // pour gettimeofday
+
+// Si on veut que MultiDataSaver cree des fichiers avec le numero des FrameCounters...
+// define DEBUGPAQHDR  
+
 //-------------------------------------------------------
 // Classe thread de lecture PCI-Express
@@ -494,5 +498,6 @@
   
   cout << " PCIEMultiReader::run() - Starting , NMaxMemZones=" << nmax_ 
-       << " memgr.NbPaquets()=" << memgr.NbPaquets() << "Paqsize " << packSize_<< endl;	
+       << " memgr.NbPaquets()=" << memgr.NbPaquets() << "Paqsize " << packSize_
+       << "  " << BRPaquet::FmtConvToString(swapall_) << endl;	
   setRC(1);	
 
@@ -507,4 +512,5 @@
   Byte* Datas[MAXNBFIB];
   Byte* tampon[MAXNBFIB] ; 
+  Byte* predtampon=NULL;  // tampon de recopie pour la reduction des tailles de paquets 
   Byte* nextpaq=NULL;
   uint_4 off_acheval=0;
@@ -518,5 +524,13 @@
     tampon[i]=   new Byte[paqsz];
   }
- 
+  bool fgredpaq=par_.fgreducpsize;
+  if (fgredpaq) {
+    cout << " PCIEMultiReader::run() - PaquetSizeReduction - RedSize=" << par_.redpqsize 
+	 << " Offset=" << par_.reducoffset << " " << ((par_.reducneedcopy)?"NeedCopy":"NOCopy") 
+	 << "  " << BRPaquet::ReducActionToString(par_.pqreducmode) << endl;
+    predtampon = new Byte[paqsz];
+  }
+  
+#ifdef DEBUGPAQHDR  
   ofstream header[MAXNBFIB];
   for(uint_4 fib=0; fib<nbDma_; fib++) {
@@ -525,5 +539,5 @@
     header[fib].open(hfnm);
   }
-   
+#endif   
   uint_4 npaqfait[MAXNBFIB] ;
   for (int i=0;i< (int)nbDma_ ;i++) npaqfait[i]=0;
@@ -571,6 +585,15 @@
 	  }
 	  // CHECK  S'il faut faire une reduction de taille de paquet
-	  if (par_.fgreducpsize) { // reduction taille de paquet
-	    
+	  if (fgredpaq) { // reduction taille de paquet
+	    if (par_.reducneedcopy) {
+	      BRPaquet paqc1(tampon[fib], predtampon, paqsz, swapall_);
+	      BRPaquet paqc2(nextpaq, par_.redpqsize);
+	      paqc2.CopyFrom(paqc1, par_.pqreducmode, par_.reducoffset);
+	    }
+	    else {
+	      BRPaquet paqc1(tampon[fib], paqsz);
+	      BRPaquet paqc2(nextpaq, par_.redpqsize);
+	      paqc2.CopyFrom(paqc1, par_.pqreducmode, par_.reducoffset);
+	    }
 	  }
 	  else  { 
@@ -581,5 +604,7 @@
 	  if (fib==nbDma_-1) npaqfaitg++;  // Ne pas oublier le compteur de paquets faits 
 	  pcheck[fib].Check(paq);   // Verification du paquet / FrameCounter 
-	  header[fib] << dec << paq.FrameCounter()<< endl; ;
+#ifdef DEBUGPAQHDR  
+	  header[fib] << dec << paq.FrameCounter()<< endl; 
+#endif
 	}
       }
@@ -607,6 +632,15 @@
 	}
 	// CHECK  S'il faut faire une reduction de taille de paquet
-	if (par_.fgreducpsize) { // reduction taille de paquet
-	  
+	if (fgredpaq) { // reduction taille de paquet
+	  if (par_.reducneedcopy) {
+	    BRPaquet paqc1(Datas[fib]+curoff, predtampon, paqsz, swapall_);
+	    BRPaquet paqc2(nextpaq, par_.redpqsize);
+	    paqc2.CopyFrom(paqc1, par_.pqreducmode, par_.reducoffset);
+	  }
+	  else {
+	    BRPaquet paqc1(Datas[fib]+curoff, paqsz);
+	    BRPaquet paqc2(nextpaq, par_.redpqsize);
+	    paqc2.CopyFrom(paqc1, par_.pqreducmode, par_.reducoffset);
+	  }
 	}
 	else { 
@@ -617,5 +651,7 @@
 	if (fib==nbDma_-1) npaqfaitg++;  // Ne pas oublier le compteur de paquets faits 
 	pcheck[fib].Check(paq);   // Verification du paquet / FrameCounter 
-	header[fib] << dec << paq.FrameCounter()<< endl; ;
+#ifdef DEBUGPAQHDR  
+	header[fib] << dec << paq.FrameCounter()<< endl; 
+#endif
       }
       curoff += paqsz;  // On avance l'index dans le buffer du DMA
@@ -647,6 +683,10 @@
   // //// Nettoyage final
   MZoneManage(true);
+  for (int i=0;i< (int)nbDma_ ;i++) delete[] tampon[i]; 
+  if ((fgredpaq)&&predtampon) delete[] predtampon;
+#ifdef DEBUGPAQHDR  
   for(uint_4 fib=0; fib<nbDma_; fib++)  header[fib].close();
-  for (int i=0;i< (int)nbDma_ ;i++) delete[] tampon[i]; 
+#endif
+
   //DBG  cout << " fin thread ========================" <<endl;  
   return;
@@ -743,4 +783,5 @@
     uint_4 paqsz = memgr.PaqSize();
     cout << " ============================ MultiDataSaver::run() PaqSize " << paqsz <<endl;
+    bool fgfirstfctt=false;
     bool fgnulldev = bpar.GetFileDevNull(); 
     if (fgnulldev) { 
@@ -772,7 +813,5 @@
         // 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++;
+	fnum++;   fgfirstfctt=true;
       }
       else sprintf(fname,"MemDataBloc[%d]-NoDataFile",(int)fnum++);
@@ -797,5 +836,10 @@
 	  for(uint_4 i=0; i<memgr.NbPaquets(); i++) {  // boucle sur les paquets 
 	    BRPaquet paq(NULL, buff+i*paqsz, paqsz);
-	    pcheck[fib].Check(paq);   // Verification du paquet / FrameCounter 
+	    bool cpaqok=pcheck[fib].Check(paq);   // Verification du paquet / FrameCounter 
+	    if (cpaqok && fgfirstfctt) {
+	      framecnt_first_[fib] = pcheck[fib].LastFrameNum();
+	      timetag_first_[fib] = paq.TimeTag();
+	      fgfirstfctt=false;
+	    }
 	    if (savesig_)
 	      header[fib] << hex << paq.HDRMarker() << " " << paq.TRLMarker() << " " 
@@ -821,10 +865,15 @@
         cout  << "    Fib " << fib << " -> " << fname << " Stat:" << pcsum << endl;
       }
-      if (savesig_)
+      if (savesig_)  {
+	// Ajout mots-cle additionnels a tous les fichiers FITS
+	for(uint_4 fib=0; fib<memgr.NbFibres(); fib++)
+	  framecnt_last_[fib] = pcheck[fib].LastFrameNum(); 
+
+	AddFitsKW(mff,bpar);
 	for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) {
           header[fib].close();
           mff[fib].Close();	  
 	}
-    
+      }
      
     }  // Fin de boucle sur les fichiers 
@@ -861,4 +910,7 @@
   TimeStamp ts;
   string cdtu=ts.ToString();
+  string& skysrc=acpar.SkySource();
+  bool hassrc=false;
+  if (skysrc.length()>0)  hassrc=true;
   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) ");	  
@@ -866,4 +918,9 @@
     mff[fib].AddKeyD("ACQVER", acpar.AcqVersion(), " BAORadio Acq Software version ") ;
     mff[fib].AddKeyS("ACQCONF", acpar.GetParams().AcqMode, " BAORadio Acq run  mode" );
+    if (hassrc) 
+      mff[fib].AddKeyS("SKYSOURC", skysrc, " Source identification" );
+    mff[fib].AddKeyI("FCFIRST", framecnt_first_[fib], " First valid frame counter in file") ;
+    mff[fib].AddKeyI("FCLAST", framecnt_last_[fib], " Last valid frame counter in file") ;
+    mff[fib].AddKeyI("TTFIRST", timetag_first_[fib], " First valid timetag in file") ;
   }
   return 0;
