Index: trunk/Poubelle/archTOI.old/ssthandler.cc
===================================================================
--- trunk/Poubelle/archTOI.old/ssthandler.cc	(revision 315)
+++ trunk/Poubelle/archTOI.old/ssthandler.cc	(revision 342)
@@ -7,9 +7,15 @@
 // free parameters = period + phase
 
-#define DIODE_UNUSED_1 3
-#define DIODE_UNUSED_2 7
-
 #include <math.h>
 #include "ssthandler.h"
+
+// diodpermut[i] = channel de la diode i
+int SSTHandler::diodpermut[46]=
+ { 8,24,40, 9,25,41,10,26,42,11,
+  27,43,16,32, 1,17,33, 2,18,34,
+   3,19,35,12,28,44,13,29,45,14,
+  30,46,15,31,47,20,36, 5,21,37,
+   6,22,38, 7,23,39};
+ // voies 0 et 4 non connectees, voie 1 en panne.
 
 SSTHandler::SSTHandler()
@@ -21,6 +27,8 @@
   lastBlkNum = -1;
   
-  Has2Bars(false);
+  //Has2Bars(false);
   prcTodo=0;
+  seuil=100;
+  
 }
 
@@ -36,7 +44,8 @@
     
   prcTodo    = x.prcTodo;
-  has2bars   = x.has2bars;
-  elecOffset = x.elecOffset;
+ // has2bars   = x.has2bars;
+ // elecOffset = x.elecOffset;
   lastBlkNum = x.lastBlkNum;
+  seuil      = x.seuil;
 }
 
@@ -53,7 +62,8 @@
     
   prcTodo    = x.prcTodo;
-  has2bars   = x.has2bars;
-  elecOffset = x.elecOffset;
+ // has2bars   = x.has2bars;
+ // elecOffset = x.elecOffset;
   lastBlkNum = x.lastBlkNum;
+  seuil      = x.seuil;
   
   return *this;
@@ -74,4 +84,7 @@
 }
 
+bool SSTHandler::has2bars = false;
+int  SSTHandler::elecOffset = 1;
+
 void SSTHandler::Has2Bars(bool has, int eo)
 {
@@ -89,5 +102,7 @@
     RemoveOffset();
   }
-  
+  if (prcTodo & findStars) {
+    FindStars();
+  }
 }
 
@@ -101,5 +116,5 @@
   // numero de la diode (0-47) = j*8+l;
   // indice dans le bloc sst du mot de 32 bits (0-17) = j*3+k;
-  // indice dans mot de 32 bits du premier bit utile = 28-4*l;
+  // indice dans mot de 32 bits du premier bit utile = 4*l;
     
   for (j=0; j<48; j++) diod[j] = 0;
@@ -108,9 +123,13 @@
     for (k=0; k<3; k++)
       for (l=0; l<8; l++) {
-        long word = blk->sst[i][j*3+k];
-        word = (word >> (28-4*l)) & 0xF;
-        //printf("diode %d mot %d valeur %d\n", j*8+l, k, word);
+        int4 word = blk->sst[i][j*3+k];
+        word = (word >> (4*l)) & 0xF;
+	// printf("diode %d mot %d valeur %d\n", j*8+l, k, word);
         diod[j*8+l] = (diod[j*8+l] << 4) + word;
       }
+
+  //for (j=0; j<48; j++) if (diod[j]>2047) diod[j] -= 4096;
+  for (j=0; j<48; j++)  diod[j] -= 2048;
+  
 }
 
@@ -124,10 +143,9 @@
   
   for (int j=0; j<nb_per_block*2; j++) {
-    // suppression des positions non utilisees. 3 et 7 ?
-    for (int i=0; i<DIODE_UNUSED_1; i++)
-      diode(j+j0,i) = diodeRaw[j][i];
-    for (int i=DIODE_UNUSED_1; i<46; i++)
-      diode(j+j0,i) = diodeRaw[j][ i<DIODE_UNUSED_2-1 ? i+1 : i+2 ];
-  
+    // permutation des diodes
+    for (int i=0; i<46; i++)
+      diode(j+j0,i) = diodeRaw[j][diodpermut[i]];
+  
+    /*
     // calcul d'un fond sur la rangee. Moyenne clippee.
     float m = 0; float sig = 1.e10;
@@ -147,4 +165,5 @@
     for (int i=0; i<46; i++) 
       diode(j+j0,i) -= m;
+    */
   }
 }
@@ -164,3 +183,66 @@
 }
 
-
+int SSTHandler::getStarZ(int imesure, int istar) // for last block
+{
+  int j0 = starHistLength-(nb_per_block*2);
+  if (imesure+j0<0 || imesure>=nb_per_block*2) return -99999;
+  if (istar < 0 || istar >= stars[imesure+j0].size()) return -99999;
+  return stars[imesure+j0][istar].z;
+}
+
+int SSTHandler::getStarF(int imesure, int istar) // for last block
+{
+  int j0 = starHistLength-(nb_per_block*2);
+  if (imesure+j0<0 || imesure>=nb_per_block*2) return -99999;
+  if (istar < 0 || istar >= stars[imesure+j0].size()) return -99999;
+  return stars[imesure+j0][istar].m;
+}
+
+
+void SSTHandler::FindStars()  // sur les 72 derniers echantillons dans diode.
+{
+  int js0 = starHistLength-(nb_per_block*2);
+  int jd0 = diodeHistLength-(nb_per_block*2);
+  // Decalage vers la gauche de la taille d'un bloc
+  for (int i=0; i<js0; i++) {
+    stars[i] = stars[i+(nb_per_block*2)];
+  }
+  
+  // Recherche d'etoiles
+  for (int i=0; i<(nb_per_block*2); i++) {
+    stars[js0+i].clear();
+    for (int idiode=0; idiode<46; idiode++) {
+      if (diode(jd0+i,idiode) < -seuil) {
+        if (has2bars) {
+          for (int j=-2; j>=-5; j--) {
+            if (diode(jd0+i+j,(idiode+elecOffset)%46) < -seuil) {
+              star s;
+              s.z = idiode;
+              s.m = -diode(jd0+i,idiode);
+              s.t = i; // $CHECK$ need absolute time...
+              stars[js0+i].push_back(s);
+              break;
+            } else if (idiode<45 && diode(jd0+i+j,(idiode+1+elecOffset)%46) > seuil) {
+              star s;
+              s.z = idiode+.5;
+              s.m = -diode(jd0+i,idiode);
+              s.t = i; // $CHECK$ need absolute time...
+              stars[js0+i].push_back(s);
+              break;
+            }
+          }
+        } else {
+          if (diode(jd0+i,idiode) > diode(jd0+i-1,idiode)) {
+            star s;
+            s.z = idiode;
+            s.m = -diode(jd0+i-1,idiode);
+            s.t = i; // $CHECK$ need absolute time...
+            stars[js0+i].push_back(s);
+          }
+        }
+      }
+    }
+  }
+
+
+}
