source: Sophya/trunk/Poubelle/archTOI.old/ssthandler.cc@ 393

Last change on this file since 393 was 393, checked in by ansari, 26 years ago

Deplacement init toiiter pour eviter 2 archeopsfiles

File size: 6.8 KB
Line 
1// ssthandler.cc
2// Eric Aubourg CEA/DAPNIA/SPP juillet 1999
3
4
5// Prediction mouvement d'etoiles entre un tour et le suivant...
6// si TS -> TS + dT, H -> H + dT, dT=dH
7//
8// dz = - cos phi sin az dH (check sign)
9// daz = (sin phi - cos az cotg z cos phi) dH (check sign)
10//
11// free parameters = period + phase
12
13#include <math.h>
14#include "ssthandler.h"
15#include <iostream.h>
16
17// diodpermut[i] = channel de la diode i
18int SSTHandler::diodpermut[46]=
19 { 8,24,40, 9,25,41,10,26,42,11,
20 27,43,16,32, 1,17,33, 2,18,34,
21 3,19,35,12,28,44,13,29,45,14,
22 30,46,15,31,47,20,36, 5,21,37,
23 6,22,38, 7,23,39};
24 // voies 0 et 4 non connectees, voie 1 en panne.
25
26SSTHandler::SSTHandler()
27{
28 diodeHistLength = nb_per_block*2+10;
29 diodeT = new int[diodeHistLength*nb_photo_diodes];
30 starHistLength = 300;
31 stars = new (vector<star>[starHistLength]);
32 lastBlkNum = -1;
33
34 //Has2Bars(false);
35 prcTodo=0;
36 seuil=100;
37}
38
39SSTHandler::SSTHandler(SSTHandler const& x)
40{
41 diodeHistLength = x.diodeHistLength;
42 diodeT = new int[diodeHistLength*nb_photo_diodes];
43 memcpy(diodeT, x.diodeT, diodeHistLength*nb_photo_diodes);
44 starHistLength = x.starHistLength;
45 stars = new (vector<star>[starHistLength]);
46 for (int i=0; i<starHistLength; i++)
47 stars[i] = x.stars[i];
48
49 prcTodo = x.prcTodo;
50 // has2bars = x.has2bars;
51 // elecOffset = x.elecOffset;
52 lastBlkNum = x.lastBlkNum;
53 seuil = x.seuil;
54}
55
56SSTHandler& SSTHandler::operator = (SSTHandler const& x) {
57 delete[] stars;
58 delete[] diodeT;
59 diodeHistLength = x.diodeHistLength;
60 diodeT = new int[diodeHistLength*nb_photo_diodes];
61 memcpy(diodeT, x.diodeT, diodeHistLength*nb_photo_diodes);
62 starHistLength = x.starHistLength;
63 stars = new (vector<star>[starHistLength]);
64 for (int i=0; i<starHistLength; i++)
65 stars[i] = x.stars[i];
66
67 prcTodo = x.prcTodo;
68 // has2bars = x.has2bars;
69 // elecOffset = x.elecOffset;
70 lastBlkNum = x.lastBlkNum;
71 seuil = x.seuil;
72
73 return *this;
74}
75
76SSTHandler::~SSTHandler()
77{
78 delete[] stars;
79 delete[] diodeT;
80}
81
82void SSTHandler::NeedProcess(int prcMask)
83{
84 prcTodo |= prcMask;
85 if (prcTodo & findAxis) prcTodo |= findPeriod;
86 if (prcTodo & findPeriod) prcTodo |= findStars;
87 if (prcTodo & findStars) prcTodo |= rmveOffset;
88}
89
90bool SSTHandler::has2bars = false;
91int SSTHandler::elecOffset = 1;
92
93void SSTHandler::Has2Bars(bool has, int eo)
94{
95 has2bars = has;
96 elecOffset = eo;
97}
98
99void SSTHandler::ProcessBlock(block_type_sst* blk)
100{
101 lastBlkNum = numero_block(blk);
102 for (int i = 0; i<nb_per_block*2; i++) {
103 DecodeTMBlock(blk, i, diodeRaw[i]);
104 }
105 if (prcTodo & rmveOffset) {
106 RemoveOffset();
107 }
108 if (prcTodo & findStars) {
109 FindStars();
110 }
111}
112
113
114void SSTHandler::DecodeTMBlock(block_type_sst* blk, int i, int* diod)
115{
116 int j; // 0-5 : numero du bloc de 8 diodes
117 int k; // 0-2 : indice du bloc de 4 bits (une diode = 12 bits = 3 blocs de 4 bits)
118 int l; // 0-7 : indice de la diode dans son bloc (8 diodes * 4 bits = 1 mot de 32 bits)
119
120 // numero de la diode (0-47) = j*8+l;
121 // indice dans le bloc sst du mot de 32 bits (0-17) = j*3+k;
122 // indice dans mot de 32 bits du premier bit utile = 4*l;
123
124 for (j=0; j<48; j++) diod[j] = 0;
125
126 for (j=0; j<6; j++)
127 for (k=0; k<3; k++)
128 for (l=0; l<8; l++) {
129 int4 word = blk->sst[i][j*3+k];
130 word = (word >> (4*l)) & 0xF;
131 // printf("diode %d mot %d valeur %d\n", j*8+l, k, word);
132 diod[j*8+l] = (diod[j*8+l] << 4) + word;
133 }
134
135 //for (j=0; j<48; j++) if (diod[j]>2047) diod[j] -= 4096;
136 for (j=0; j<48; j++) diod[j] -= 2048;
137
138}
139
140
141void SSTHandler::RemoveOffset()
142{
143 int j0 = diodeHistLength-(nb_per_block*2);
144
145 // Decalage vers la gauche de la taille d'un bloc
146 memcpy(diodeT, diodeT + (nb_per_block*2)*nb_photo_diodes, j0*nb_photo_diodes);
147
148 for (int j=0; j<nb_per_block*2; j++) {
149 // permutation des diodes
150 for (int i=0; i<46; i++)
151 diode(j+j0,i) = diodeRaw[j][diodpermut[i]];
152
153 /*
154 // calcul d'un fond sur la rangee. Moyenne clippee.
155 float m = 0; float sig = 1.e10;
156 for (int k=0; k<2; k++) {
157 float s=0; float s2=0; int n=0;
158 for (int i=0; i<46; i++) {
159 if (fabs(diode(j+j0,i)-m)<3*sig+1) {
160 s += diode(j+j0,i); s2 += diode(j+j0,i)*diode(j+j0,i); n++;
161 }
162 }
163 if (n>0) {
164 m = s/n; sig = sqrt(s2/n - m*m);
165 } else {
166 m = 0; break;
167 }
168 }
169 for (int i=0; i<46; i++)
170 diode(j+j0,i) -= m;
171 */
172 }
173}
174
175int SSTHandler::getRawSignal(int imesure, int idiode) // for last block
176{
177 if (imesure<0 || imesure>=nb_per_block*2 || idiode<0 || idiode>=48) return -99999;
178 return diodeRaw[imesure][idiode];
179}
180
181int SSTHandler::getSignal(int imesure, int idiode) // for last block
182{
183 int j0 = diodeHistLength-(nb_per_block*2);
184 if (imesure+j0<0 || imesure>=nb_per_block*2 ||
185 idiode<0 || idiode>=nb_photo_diodes) return -99999;
186 return diode(imesure+j0, idiode);
187}
188
189int SSTHandler::getStarZ(int imesure, int istar) // for last block
190{
191 int j0 = starHistLength-(nb_per_block*2);
192 if (imesure+j0<0 || imesure>=nb_per_block*2) return -99999;
193 if (istar < 0 || istar >= stars[imesure+j0].size()) return -99999;
194 return stars[imesure+j0][istar].z;
195}
196
197int SSTHandler::getStarF(int imesure, int istar) // for last block
198{
199 int j0 = starHistLength-(nb_per_block*2);
200 if (imesure+j0<0 || imesure>=nb_per_block*2) return -99999;
201 if (istar < 0 || istar >= stars[imesure+j0].size()) return -99999;
202 return stars[imesure+j0][istar].m;
203}
204
205
206void SSTHandler::FindStars() // sur les 72 derniers echantillons dans diode.
207{
208 int js0 = starHistLength-(nb_per_block*2);
209 int jd0 = diodeHistLength-(nb_per_block*2);
210 // Decalage vers la gauche de la taille d'un bloc
211 for (int i=0; i<js0; i++) {
212 stars[i] = stars[i+(nb_per_block*2)];
213 }
214
215 // Recherche d'etoiles
216 for (int i=0; i<(nb_per_block*2); i++) {
217 stars[js0+i].clear();
218 for (int idiode=0; idiode<46; idiode++) {
219 if (diode(jd0+i,idiode) < -seuil) {
220 if (has2bars) {
221 for (int j=-2; j>=-5; j--) {
222 if (diode(jd0+i+j,(idiode+elecOffset)%46) < -seuil) {
223 star s;
224 s.z = idiode;
225 s.m = -diode(jd0+i,idiode);
226 s.t = i; // $CHECK$ need absolute time...
227 stars[js0+i].push_back(s);
228 break;
229 } else if (idiode<45 && diode(jd0+i+j,(idiode+1+elecOffset)%46) > seuil) {
230 star s;
231 s.z = idiode+.5;
232 s.m = -diode(jd0+i,idiode);
233 s.t = i; // $CHECK$ need absolute time...
234 stars[js0+i].push_back(s);
235 break;
236 }
237 }
238 } else {
239 if (diode(jd0+i,idiode) > diode(jd0+i-1,idiode)) {
240 star s;
241 s.z = idiode;
242 s.m = -diode(jd0+i-1,idiode);
243 s.t = i; // $CHECK$ need absolute time...
244 stars[js0+i].push_back(s);
245 }
246 }
247 }
248 }
249 }
250
251
252}
Note: See TracBrowser for help on using the repository browser.