// ssthandler.cc // Eric Aubourg CEA/DAPNIA/SPP juillet 1999 // Prediction mouvement d'etoiles entre un tour et le suivant... // si TS -> TS + dT, H -> H + dT, dT=dH // // dz = - cos phi sin az dH (check sign) // daz = (sin phi - cos az cotg z cos phi) dH (check sign) // // free parameters = period + phase #include #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() { diodeHistLength = nb_per_block*2+10; diodeT = new int[diodeHistLength*nb_photo_diodes]; starHistLength = 300; stars = new (vector[starHistLength]); lastBlkNum = -1; //Has2Bars(false); prcTodo=0; seuil=100; } SSTHandler::SSTHandler(SSTHandler const& x) { diodeHistLength = x.diodeHistLength; diodeT = new int[diodeHistLength*nb_photo_diodes]; memcpy(diodeT, x.diodeT, diodeHistLength*nb_photo_diodes); starHistLength = x.starHistLength; stars = new (vector[starHistLength]); for (int i=0; i[starHistLength]); for (int i=0; isst[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; } void SSTHandler::RemoveOffset() { int j0 = diodeHistLength-(nb_per_block*2); // Decalage vers la gauche de la taille d'un bloc memcpy(diodeT, diodeT + (nb_per_block*2)*nb_photo_diodes, j0*nb_photo_diodes); for (int j=0; j0) { m = s/n; sig = sqrt(s2/n - m*m); } else { m = 0; break; } } for (int i=0; i<46; i++) diode(j+j0,i) -= m; */ } } int SSTHandler::getRawSignal(int imesure, int idiode) // for last block { if (imesure<0 || imesure>=nb_per_block*2 || idiode<0 || idiode>=48) return -99999; return diodeRaw[imesure][idiode]; } int SSTHandler::getSignal(int imesure, int idiode) // for last block { int j0 = diodeHistLength-(nb_per_block*2); if (imesure+j0<0 || imesure>=nb_per_block*2 || idiode<0 || idiode>=nb_photo_diodes) return -99999; return diode(imesure+j0, idiode); } 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=-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); } } } } } }