| [534] | 1 | // sststarfinder.cc
 | 
|---|
 | 2 | // Eric Aubourg & Dominique Yvon        CEA/DAPNIA/SPP   octobre 1999
 | 
|---|
 | 3 | 
 | 
|---|
 | 4 | #include "sststarfinder.h"
 | 
|---|
 | 5 | #include "pisteetoile.h"
 | 
|---|
 | 6 | #include "toimanager.h"
 | 
|---|
 | 7 | #include "archparam.h"
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | ofstream SSTStarFinder::sstchass("SSTChassLogFile");
 | 
|---|
 | 10 | bool     SSTStarFinder::sstchassinit=false;
 | 
|---|
 | 11 | 
 | 
|---|
 | 12 | #define sstStarCount "sstStarCount"
 | 
|---|
 | 13 | #define sstStarZ     "sstStarZ"
 | 
|---|
 | 14 | #define sstStarF     "sstStarF"
 | 
|---|
 | 15 | #define sstStarSN    "sstStarSN"
 | 
|---|
 | 16 | #define sstStarUTC   "sstStarUTC"
 | 
|---|
 | 17 | 
 | 
|---|
| [555] | 18 | bool  SSTStarFinder::has2bars=false;
 | 
|---|
 | 19 | int   SSTStarFinder::elecOffset=0;
 | 
|---|
| [534] | 20 | 
 | 
|---|
| [555] | 21 | 
 | 
|---|
 | 22 | 
 | 
|---|
| [534] | 23 | SSTStarFinder::SSTStarFinder() {
 | 
|---|
 | 24 |   lastFedSample = -1;
 | 
|---|
 | 25 |   lastAnaSample = -1;
 | 
|---|
 | 26 |   lastContSample = -1;
 | 
|---|
 | 27 |   lastKeptSample = -1;
 | 
|---|
 | 28 |     
 | 
|---|
 | 29 |   findStarConstruct();
 | 
|---|
 | 30 |   
 | 
|---|
 | 31 |   TOIProducer* prod = TOIManager::findTOIProducer(TOI("sstDiode",0));
 | 
|---|
 | 32 |   if (!prod) {
 | 
|---|
 | 33 |     cerr << "SSTStarFinder : cannot find producer for sstDiode" << endl;
 | 
|---|
 | 34 |     exit(-1);
 | 
|---|
 | 35 |   }
 | 
|---|
 | 36 |   
 | 
|---|
 | 37 |   sstprod = dynamic_cast<TOILLSSTProducer*>(prod);
 | 
|---|
 | 38 |   if (!sstprod) {
 | 
|---|
 | 39 |     cerr << "SSTStarFinder : producer for sstDiode is not a TOILLSSTProducer" << endl;
 | 
|---|
 | 40 |     exit(-1);
 | 
|---|
 | 41 |   }
 | 
|---|
 | 42 |   
 | 
|---|
 | 43 |   sstprod->registerProcessor(this);
 | 
|---|
 | 44 | 
 | 
|---|
 | 45 |   possibleTOIs.insert(TOI(sstStarCount,   TOI::all, "", "integer"));  
 | 
|---|
 | 46 |   possibleTOIs.insert(TOI(sstStarZ,       TOI::all, "", "integer"));  
 | 
|---|
 | 47 |   possibleTOIs.insert(TOI(sstStarF,       TOI::all, "", "ADU"));  
 | 
|---|
 | 48 |   possibleTOIs.insert(TOI(sstStarSN,      TOI::all, "", "samplenum"));  
 | 
|---|
 | 49 |   possibleTOIs.insert(TOI(sstStarUTC,     TOI::all, "", "hours"));  
 | 
|---|
 | 50 | 
 | 
|---|
 | 51 | }
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 | SSTStarFinder::~SSTStarFinder(){
 | 
|---|
 | 54 |   findStarDestruct();
 | 
|---|
 | 55 | }
 | 
|---|
 | 56 | 
 | 
|---|
 | 57 | string SSTStarFinder::getName() {
 | 
|---|
 | 58 |   return("SSTStarFinder 1.0");
 | 
|---|
 | 59 | }
 | 
|---|
 | 60 | 
 | 
|---|
 | 61 | void SSTStarFinder::addTOI(TOI& toi, TOIAbsorber* client) {
 | 
|---|
 | 62 |   TOIProducer::addTOI(toi, client);
 | 
|---|
 | 63 |   TOIManager::activateLLProducer(sstprod);
 | 
|---|
 | 64 | }
 | 
|---|
 | 65 | 
 | 
|---|
 | 66 | void SSTStarFinder::Has2Bars(bool has, int eo)
 | 
|---|
 | 67 | {
 | 
|---|
 | 68 |   has2bars = has;
 | 
|---|
 | 69 |   elecOffset = eo;
 | 
|---|
 | 70 | }
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 | #ifdef SSTStatLog
 | 
|---|
 | 73 |         static ofstream sststat("SSTStatLog");
 | 
|---|
 | 74 |         static int compteurBlock=0;
 | 
|---|
 | 75 |         static int nbStar=0;
 | 
|---|
 | 76 |         #include "ssthardware.h"
 | 
|---|
 | 77 |         #include "archparam.h"
 | 
|---|
 | 78 | #endif
 | 
|---|
 | 79 | 
 | 
|---|
 | 80 | void SSTStarFinder::findStarConstruct() {
 | 
|---|
 | 81 |         PisteBar=new PisteEtoile*[NbPhotDiodBarette];
 | 
|---|
 | 82 |         for(int i=0; i<NbPhotDiodBarette; i++) PisteBar[i]=new PisteEtoile(i);
 | 
|---|
 | 83 |         StarHistoryMap.clear();
 | 
|---|
 | 84 |         if (!sstchassinit) {
 | 
|---|
 | 85 |           sstchass<<SSTEtoile::printHeader()<<endl;
 | 
|---|
 | 86 |           sstchassinit = true;
 | 
|---|
 | 87 |         }
 | 
|---|
 | 88 | }
 | 
|---|
 | 89 | 
 | 
|---|
 | 90 | void SSTStarFinder::findStarDestruct() {
 | 
|---|
 | 91 |         for(int i=0; i<NbPhotDiodBarette; i++) {
 | 
|---|
 | 92 |                 delete PisteBar[i];
 | 
|---|
 | 93 |         }
 | 
|---|
 | 94 |         delete[] PisteBar;
 | 
|---|
 | 95 | }
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | void SSTStarFinder::dataFeed(long sampleNum, int* diodeSignal) {
 | 
|---|
| [555] | 98 |   if (producedTOIs.empty() && processors.empty()) return;
 | 
|---|
| [534] | 99 |   if (sampleNum == lastFedSample+1) {
 | 
|---|
 | 100 |         for(int i=0;i<NbPhotDiodBarette; i++) { 
 | 
|---|
 | 101 |       PisteBar[i]->push(diodeSignal+i,1);
 | 
|---|
 | 102 |     }
 | 
|---|
 | 103 |     lastFedSample++;
 | 
|---|
 | 104 |   } else {
 | 
|---|
 | 105 |         for(int i=0;i<NbPhotDiodBarette; i++) { 
 | 
|---|
 | 106 |       PisteBar[i]->fill(diodeSignal+i,sampleNum,1);
 | 
|---|
 | 107 |     }
 | 
|---|
 | 108 |     lastFedSample = lastContSample = sampleNum;
 | 
|---|
 | 109 |   }
 | 
|---|
 | 110 |   
 | 
|---|
 | 111 |   if ((sampleNum >= lastAnaSample+8) && (sampleNum - lastContSample >= 40)) {
 | 
|---|
 | 112 |     lastAnaSample = sampleNum;
 | 
|---|
 | 113 |     if (lastKeptSample<0) lastKeptSample = sampleNum-8;
 | 
|---|
 | 114 |         for(int i=0;i<NbPhotDiodBarette; i++) { 
 | 
|---|
 | 115 |       if (PisteBar[i]->traque()) {                              // On a trouve!
 | 
|---|
 | 116 |         SSTEtoile star = PisteBar[i]->DonneEtoile();
 | 
|---|
 | 117 |         StarHistoryMap[star.TEchan]=star;
 | 
|---|
 | 118 |         gotStar(star);
 | 
|---|
 | 119 |       }
 | 
|---|
 | 120 |     }
 | 
|---|
 | 121 |   }
 | 
|---|
 | 122 | }
 | 
|---|
 | 123 | 
 | 
|---|
 | 124 | void SSTStarFinder::registerProcessor(SSTStarProcessor* p) {
 | 
|---|
 | 125 |   processors.push_back(p);
 | 
|---|
 | 126 |   TOIManager::activateLLProducer(sstprod);
 | 
|---|
 | 127 | }
 | 
|---|
 | 128 | 
 | 
|---|
 | 129 | int SSTStarFinder::getNumbStar(int iSampl) {
 | 
|---|
 | 130 |         StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
 | 
|---|
 | 131 |         StarHistIter IterHigh=StarHistoryMap.upper_bound((double)(iSampl+1.));
 | 
|---|
 | 132 |         int Compteur=0;
 | 
|---|
 | 133 |         while (!(IterLow==IterHigh)) {IterLow++; Compteur++;}
 | 
|---|
 | 134 |         return Compteur;
 | 
|---|
 | 135 | }
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 | double SSTStarFinder::getStarF(int iSampl, int istar){ 
 | 
|---|
 | 138 |         if( (getNumbStar(iSampl)==0)||(getNumbStar(iSampl)<=istar)) return -1;
 | 
|---|
 | 139 |         else {
 | 
|---|
 | 140 |                 StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
 | 
|---|
 | 141 |                 while(!(istar==0)) {
 | 
|---|
 | 142 |                         IterLow++;
 | 
|---|
 | 143 |                         istar--;
 | 
|---|
 | 144 |                 }
 | 
|---|
 | 145 |         return (double) ((*IterLow).second).InpCurrent;
 | 
|---|
 | 146 |         }
 | 
|---|
 | 147 | }
 | 
|---|
 | 148 | 
 | 
|---|
 | 149 | 
 | 
|---|
 | 150 | int SSTStarFinder::getStarZ(int iSampl, int istar) {
 | 
|---|
 | 151 |         if( (getNumbStar(iSampl)==0)||(getNumbStar(iSampl)<=istar)) return -1;
 | 
|---|
 | 152 |         StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
 | 
|---|
 | 153 |         while(!(istar==0)) {
 | 
|---|
 | 154 |                 IterLow++;
 | 
|---|
 | 155 |                 istar--;
 | 
|---|
 | 156 |         }
 | 
|---|
 | 157 |         return ((*IterLow).second).NoDiode;
 | 
|---|
 | 158 | }
 | 
|---|
 | 159 | 
 | 
|---|
 | 160 | double SSTStarFinder::getStarTime(int iSampl, int istar) {
 | 
|---|
 | 161 |         if( (getNumbStar(iSampl)==0)||(getNumbStar(iSampl)<=istar)) return -1;
 | 
|---|
 | 162 |         StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
 | 
|---|
 | 163 |         while(!(istar==0)) {
 | 
|---|
 | 164 |                 IterLow++;
 | 
|---|
 | 165 |                 istar--;
 | 
|---|
 | 166 |         }
 | 
|---|
 | 167 |         return ((*IterLow).second).TEchan;
 | 
|---|
 | 168 | }
 | 
|---|
 | 169 | 
 | 
|---|
 | 170 | 
 | 
|---|
 | 171 | void SSTStarFinder::gotStar(SSTEtoile const& star) {
 | 
|---|
 | 172 |   for (vector<SSTStarProcessor*>::iterator i = processors.begin(); 
 | 
|---|
 | 173 |        i != processors.end(); i++) {
 | 
|---|
 | 174 |       (*i)->dataFeed(star);    
 | 
|---|
 | 175 |   }
 | 
|---|
 | 176 | }
 | 
|---|
 | 177 | 
 | 
|---|
 | 178 | 
 | 
|---|
 | 179 | // $CHECK$ we handle correctly only the first star
 | 
|---|
 | 180 | long SSTStarFinder::firstSampleNum(TOI const&) {
 | 
|---|
 | 181 |   if (StarHistoryMap.empty()) return -1;
 | 
|---|
 | 182 |   StarHistIter i = StarHistoryMap.begin();
 | 
|---|
| [635] | 183 |   return long(floor((*i).second.TEchan));
 | 
|---|
| [534] | 184 | }
 | 
|---|
 | 185 | 
 | 
|---|
 | 186 | long SSTStarFinder::lastSampleNum(TOI const&) {
 | 
|---|
 | 187 |   if (StarHistoryMap.empty()) return -1;
 | 
|---|
 | 188 |   StarHistIter i = StarHistoryMap.end();
 | 
|---|
 | 189 |   i--;
 | 
|---|
| [635] | 190 |   return long(floor((*i).second.TEchan));
 | 
|---|
| [534] | 191 | }
 | 
|---|
 | 192 |   
 | 
|---|
 | 193 | bool SSTStarFinder::canGetValue(long sampleNum, TOI const& toi) {
 | 
|---|
 | 194 |   if (sampleNum < lastKeptSample) return false;
 | 
|---|
 | 195 |   if (sampleNum > lastAnaSample) return false;
 | 
|---|
 | 196 |   if (toi.name == sstStarCount) return true;
 | 
|---|
 | 197 |   if (getNumbStar(sampleNum) > toi.index) return true;
 | 
|---|
 | 198 |   return false;
 | 
|---|
 | 199 | }
 | 
|---|
 | 200 | 
 | 
|---|
 | 201 | // $CHECK$ not done properly, complicated !!!
 | 
|---|
 | 202 | bool SSTStarFinder::canGetPrevValue(long sampleNum, TOI const& toi) {
 | 
|---|
 | 203 |   return canGetValue(sampleNum-1, toi);
 | 
|---|
 | 204 | }
 | 
|---|
 | 205 | 
 | 
|---|
 | 206 | bool SSTStarFinder::canGetNextValue(long sampleNum, TOI const& toi) {
 | 
|---|
 | 207 |   return canGetValue(sampleNum+1, toi);
 | 
|---|
 | 208 | }
 | 
|---|
 | 209 | 
 | 
|---|
 | 210 | bool SSTStarFinder::canGetValueLater(long sampleNum, TOI const&) {
 | 
|---|
 | 211 |   return sampleNum > lastAnaSample;
 | 
|---|
 | 212 | }
 | 
|---|
 | 213 |   
 | 
|---|
 | 214 | double SSTStarFinder::getPrevValue(long& sampleNum, TOI const& toi) {
 | 
|---|
 | 215 |   return getValue(--sampleNum, toi);
 | 
|---|
 | 216 | }
 | 
|---|
 | 217 | 
 | 
|---|
 | 218 | double SSTStarFinder::getNextValue(long& sampleNum, TOI const& toi) {
 | 
|---|
 | 219 |   return getValue(++sampleNum, toi);
 | 
|---|
 | 220 | }
 | 
|---|
 | 221 | 
 | 
|---|
 | 222 | double SSTStarFinder::getValue(long sampleNum, TOI const& toi) {
 | 
|---|
 | 223 |   if (sampleNum < lastKeptSample) return -1;
 | 
|---|
 | 224 |   if (sampleNum > lastAnaSample) return -1;
 | 
|---|
 | 225 |   if (toi.name == sstStarCount) {
 | 
|---|
 | 226 |     return getNumbStar(sampleNum);
 | 
|---|
 | 227 |   }
 | 
|---|
 | 228 |   if (toi.name == sstStarF) {
 | 
|---|
 | 229 |     return getStarF(sampleNum, toi.index);
 | 
|---|
 | 230 |   }
 | 
|---|
 | 231 |   if (toi.name == sstStarZ) {
 | 
|---|
 | 232 |     return getStarZ(sampleNum, toi.index);
 | 
|---|
 | 233 |   }
 | 
|---|
 | 234 |   if (toi.name == sstStarSN) {
 | 
|---|
 | 235 |     return getStarTime(sampleNum, toi.index);
 | 
|---|
 | 236 |   }
 | 
|---|
 | 237 |   if (toi.name == sstStarUTC) {
 | 
|---|
 | 238 |     return archParam.acq.SN2UTC(getStarTime(sampleNum, toi.index));
 | 
|---|
 | 239 |   }
 | 
|---|
 | 240 | 
 | 
|---|
 | 241 |   return -1;
 | 
|---|
 | 242 | }
 | 
|---|
 | 243 | 
 | 
|---|
 | 244 | long SSTStarFinder::wontNeedEarlier(TOI const& toi, TOIAbsorber* client, long t) {
 | 
|---|
 | 245 |   long oldT = lastNeededSample[toi.ref][client];
 | 
|---|
 | 246 |   if (t<oldT) return -1;
 | 
|---|
 | 247 |   lastNeededSample[toi.ref][client] = t;
 | 
|---|
 | 248 |   map<TOIAbsorber*, long> m = lastNeededSample[toi.ref];
 | 
|---|
 | 249 |   long min=999999999L;
 | 
|---|
 | 250 |   for (map<TOIAbsorber*, long>::iterator i = m.begin(); i != m.end(); i++) {
 | 
|---|
 | 251 |     if ((*i).second < min) min = (*i).second;
 | 
|---|
 | 252 |   }
 | 
|---|
 | 253 |   while(!StarHistoryMap.empty() && (*StarHistoryMap.begin()).first < min) StarHistoryMap.erase(StarHistoryMap.begin());
 | 
|---|
 | 254 |   lastKeptSample=min;
 | 
|---|
 | 255 |   return min;
 | 
|---|
 | 256 | }
 | 
|---|