| [350] | 1 | // toisvr.cc | 
|---|
|  | 2 | // Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999 | 
|---|
|  | 3 |  | 
|---|
| [407] | 4 | #include <iostream.h> | 
|---|
| [310] | 5 | #include "toisvr.h" | 
|---|
| [407] | 6 | #include "archparam.h" | 
|---|
|  | 7 | #include "asigps.h" | 
|---|
| [310] | 8 |  | 
|---|
| [417] | 9 |  | 
|---|
|  | 10 |  | 
|---|
| [310] | 11 | TOISvr::TOISvr() | 
|---|
| [416] | 12 | { | 
|---|
| [417] | 13 | initDone = false; | 
|---|
| [416] | 14 | } | 
|---|
| [310] | 15 |  | 
|---|
| [407] | 16 | // To avoid special copy constructor handling, we will not | 
|---|
|  | 17 | // register ourself to us... Special dealing in readReq. | 
|---|
|  | 18 |  | 
|---|
|  | 19 | void TOISvr::setDirectory(string d) { | 
|---|
| [310] | 20 | iter.directory = d; | 
|---|
|  | 21 | } | 
|---|
|  | 22 |  | 
|---|
| [407] | 23 | void TOISvr::addFile(string f) { | 
|---|
| [342] | 24 | iter.files.insert(f); | 
|---|
|  | 25 | } | 
|---|
|  | 26 |  | 
|---|
| [407] | 27 | void TOISvr::useAuxGPS(AuxGPS* gps) { | 
|---|
| [358] | 28 | if (iter.auxGPS) delete iter.auxGPS; | 
|---|
|  | 29 | iter.auxGPS = gps; | 
|---|
|  | 30 | } | 
|---|
|  | 31 |  | 
|---|
|  | 32 |  | 
|---|
| [407] | 33 | void TOISvr::onBoardRecorderFiles(bool x) { | 
|---|
| [342] | 34 | iter.isOnBoardRecorder = x; | 
|---|
|  | 35 | } | 
|---|
|  | 36 |  | 
|---|
| [310] | 37 |  | 
|---|
| [432] | 38 | void TOISvr::setMJDInterval(double tStart, double tEnd) { | 
|---|
| [342] | 39 | if (tStart>0) iter.tStart = tStart; | 
|---|
|  | 40 | if (tEnd>0)   iter.tEnd = tEnd; | 
|---|
| [310] | 41 | } | 
|---|
| [426] | 42 |  | 
|---|
| [432] | 43 | void TOISvr::setUTCInterval(double tStart, double tEnd) { | 
|---|
|  | 44 | if (tStart>0) iter.utcStart = tStart; | 
|---|
|  | 45 | if (tEnd>0)   iter.utcEnd = tEnd; | 
|---|
|  | 46 | } | 
|---|
|  | 47 |  | 
|---|
|  | 48 | void TOISvr::setSNInterval(long tStart, long tEnd) { | 
|---|
|  | 49 | if (tStart>0) iter.sStart = tStart; | 
|---|
|  | 50 | if (tEnd>0)   iter.sEnd = tEnd; | 
|---|
|  | 51 | } | 
|---|
|  | 52 |  | 
|---|
|  | 53 |  | 
|---|
| [426] | 54 | void TOISvr::setUnderSample(int n) { | 
|---|
|  | 55 | if (n<=1) n=1; | 
|---|
|  | 56 | iter.underSample = n; | 
|---|
|  | 57 | } | 
|---|
|  | 58 |  | 
|---|
| [310] | 59 |  | 
|---|
| [407] | 60 | void TOISvr::addInfo(TOIKind kind, int index, bool triggering, bool interp) { | 
|---|
| [310] | 61 | TOIIter::info i; | 
|---|
|  | 62 | i.kind = kind; | 
|---|
|  | 63 | i.index = index; | 
|---|
|  | 64 | i.triggering = triggering; | 
|---|
|  | 65 | i.interpolated= interp; | 
|---|
|  | 66 | iter.infos.push_back(i); | 
|---|
|  | 67 | } | 
|---|
|  | 68 |  | 
|---|
| [407] | 69 | void TOISvr::addInfo(TOIKind kind, bool triggering, bool interp) { | 
|---|
|  | 70 | addInfo(kind,0,triggering,interp); | 
|---|
| [310] | 71 | } | 
|---|
|  | 72 |  | 
|---|
| [407] | 73 | TOIIter TOISvr::doQuery() { | 
|---|
| [393] | 74 | //iter.Init(); | 
|---|
| [310] | 75 | return iter; | 
|---|
|  | 76 | } | 
|---|
| [407] | 77 |  | 
|---|
|  | 78 | void TOISvr::registerReqHandler(RequestHandler* h) { | 
|---|
|  | 79 | handlers.push_back(h); | 
|---|
|  | 80 | } | 
|---|
|  | 81 |  | 
|---|
|  | 82 |  | 
|---|
|  | 83 | void TOISvr::readReq(istream& str) { | 
|---|
| [417] | 84 | if (!initDone) defaultInclude(); | 
|---|
| [407] | 85 | string line; | 
|---|
|  | 86 | while (str) { | 
|---|
|  | 87 | getline(str,line); | 
|---|
|  | 88 | if (!str) break; | 
|---|
|  | 89 | if (line.substr(0,4)=="#END") break; | 
|---|
|  | 90 | if (line[0] != '@' && line[0] != '#') continue; | 
|---|
|  | 91 | bool handled=processRequest(line); | 
|---|
|  | 92 | if (!handled) { | 
|---|
|  | 93 | cerr << "*Warning, unrecognized directive " << line << endl; | 
|---|
|  | 94 | } | 
|---|
|  | 95 | } | 
|---|
|  | 96 | } | 
|---|
|  | 97 |  | 
|---|
|  | 98 | #define tsttoi(toi)   if (keyw == "@"#toi) kind = toi; | 
|---|
|  | 99 |  | 
|---|
|  | 100 | bool TOISvr::processRequest(string line) { | 
|---|
|  | 101 | int x = line.find(' '); | 
|---|
|  | 102 | string keyw = line.substr(0, x); | 
|---|
|  | 103 | string args = (x>0) ? line.substr(x) : string(""); | 
|---|
|  | 104 | if (keyw[0] == '#') { | 
|---|
|  | 105 | bool handled = processOption(keyw,args); | 
|---|
|  | 106 | for (list<RequestHandler*>::iterator i = handlers.begin(); | 
|---|
|  | 107 | i != handlers.end(); i++) { | 
|---|
|  | 108 | handled |= (*i)->processOption(keyw,args); | 
|---|
|  | 109 | } | 
|---|
|  | 110 | return handled; | 
|---|
|  | 111 | } | 
|---|
|  | 112 | if (keyw[0] == '@') { | 
|---|
|  | 113 | // find TOI kind, index and options | 
|---|
|  | 114 | TOIKind kind= (TOIKind)-1; | 
|---|
|  | 115 | int index=-1; | 
|---|
|  | 116 | bool interp=false; | 
|---|
|  | 117 | bool repet =false; | 
|---|
|  | 118 | bool flag  =false; | 
|---|
|  | 119 | bool notrig=false; | 
|---|
|  | 120 | tsttoi(sampleNum) | 
|---|
|  | 121 | else tsttoi(internalTime) | 
|---|
|  | 122 | else tsttoi(mjd) | 
|---|
| [432] | 123 | else tsttoi(mutc) | 
|---|
|  | 124 | else tsttoi(boloMuV) | 
|---|
|  | 125 | else tsttoi(boloMuV2) | 
|---|
|  | 126 | else tsttoi(boloRawMuV) | 
|---|
| [407] | 127 | else tsttoi(boloRes) | 
|---|
|  | 128 | else tsttoi(boloTemp) | 
|---|
|  | 129 | else tsttoi(boloGainAmpli) | 
|---|
| [408] | 130 | else tsttoi(boloDACV) | 
|---|
|  | 131 | else tsttoi(boloDACI) | 
|---|
| [432] | 132 | else tsttoi(boloMuV2T) | 
|---|
|  | 133 | else tsttoi(boloRawMuVCN) | 
|---|
| [410] | 134 | else tsttoi(dilDAC) | 
|---|
|  | 135 | else tsttoi(dilSwitch) | 
|---|
| [432] | 136 | else tsttoi(serviceTemp) | 
|---|
| [407] | 137 | else tsttoi(sstDiode) | 
|---|
|  | 138 | else tsttoi(sstChannel) | 
|---|
|  | 139 | else tsttoi(sstDiodeCN) | 
|---|
|  | 140 | else tsttoi(sstChannelCN) | 
|---|
|  | 141 | else tsttoi(sstStarCnt) | 
|---|
|  | 142 | else tsttoi(sstStarZ) | 
|---|
|  | 143 | else tsttoi(sstStarF) | 
|---|
|  | 144 | else tsttoi(sstStarT) | 
|---|
|  | 145 | else tsttoi(gyroRaw) | 
|---|
| [432] | 146 | else tsttoi(gyroV) | 
|---|
| [407] | 147 | else tsttoi(gyroSpeed) | 
|---|
|  | 148 | else tsttoi(gpsTime) | 
|---|
|  | 149 | else tsttoi(longitude) | 
|---|
|  | 150 | else tsttoi(latitude) | 
|---|
|  | 151 | else tsttoi(altitude) | 
|---|
|  | 152 | else tsttoi(tsid) | 
|---|
| [432] | 153 | else tsttoi(azimuthBolo) | 
|---|
|  | 154 | else tsttoi(alphaRotAxis) | 
|---|
|  | 155 | else tsttoi(deltaRotAxis) | 
|---|
| [407] | 156 | else tsttoi(alphaSst) | 
|---|
|  | 157 | else tsttoi(deltaSst) | 
|---|
| [432] | 158 | else tsttoi(alphaZenith) | 
|---|
|  | 159 | else tsttoi(deltaZenith) | 
|---|
|  | 160 | else tsttoi(alphaFPAxis) | 
|---|
|  | 161 | else tsttoi(deltaFPAxis) | 
|---|
| [407] | 162 | else tsttoi(alphaBolo) | 
|---|
|  | 163 | else tsttoi(deltaBolo) | 
|---|
|  | 164 | else { | 
|---|
|  | 165 | // cerr << "*Warning, unrecognized TOI " << line << endl; | 
|---|
|  | 166 | return false; | 
|---|
|  | 167 | } | 
|---|
| [432] | 168 | if (kind  == sampleNum || kind == mjd || kind == mutc) notrig = true; | 
|---|
| [407] | 169 | string toiname = keyw.substr(1); | 
|---|
|  | 170 | while (args != "") { | 
|---|
|  | 171 | if (args[0] == ' ') { | 
|---|
| [432] | 172 | x = args.find_first_not_of(' '); | 
|---|
|  | 173 | if (x==string::npos) break; | 
|---|
|  | 174 | args = args.substr(x); | 
|---|
| [407] | 175 | if (args == "") break; | 
|---|
|  | 176 | } | 
|---|
|  | 177 | x = args.find(' '); | 
|---|
|  | 178 | string opt = args.substr(0, x); | 
|---|
|  | 179 | args = (x>0) ? args.substr(x) : string(""); | 
|---|
|  | 180 | if (opt[0]>='0' && opt[0]<='9') { | 
|---|
|  | 181 | index = atoi(opt.c_str()); | 
|---|
|  | 182 | } else if (opt == "notrig") { | 
|---|
|  | 183 | notrig = true; | 
|---|
|  | 184 | } else if (opt == "repet") { | 
|---|
|  | 185 | repet = true; interp = false; | 
|---|
|  | 186 | } else if (opt == "interp") { | 
|---|
|  | 187 | interp = true; repet = false; | 
|---|
|  | 188 | } else if (opt == "flag") { | 
|---|
|  | 189 | flag = true; | 
|---|
|  | 190 | } | 
|---|
|  | 191 | } | 
|---|
|  | 192 | bool handled = processTOIReq(line, toiname, kind, index, interp, repet, flag, notrig); | 
|---|
|  | 193 | for (list<RequestHandler*>::iterator i = handlers.begin(); | 
|---|
|  | 194 | i != handlers.end(); i++) { | 
|---|
|  | 195 | handled |= (*i)->processTOIReq(line, toiname, kind, index, interp, repet, flag, notrig); | 
|---|
|  | 196 | } | 
|---|
|  | 197 | return handled; | 
|---|
|  | 198 | } | 
|---|
|  | 199 | return false; | 
|---|
|  | 200 | } | 
|---|
|  | 201 |  | 
|---|
|  | 202 |  | 
|---|
|  | 203 | bool TOISvr::processTOIReq(string /*line*/, string /*toiname*/, TOIKind kind, int index, | 
|---|
|  | 204 | bool interp, bool /*repet*/, bool /*flag*/, bool notrig) | 
|---|
|  | 205 | { | 
|---|
|  | 206 | if (index<0) index=0; | 
|---|
|  | 207 | addInfo(kind, index, !notrig, interp); | 
|---|
|  | 208 | return true; | 
|---|
|  | 209 | } | 
|---|
|  | 210 |  | 
|---|
|  | 211 | bool TOISvr::processOption(string key, string arg) | 
|---|
|  | 212 | { | 
|---|
|  | 213 | if (arg.length()>0 && arg[0] == ' ') { | 
|---|
|  | 214 | arg = arg.substr(arg.find_first_not_of(' ')); | 
|---|
|  | 215 | } | 
|---|
| [432] | 216 | if (key == "#MJDRANGE") { | 
|---|
| [407] | 217 | double tmin, tmax; | 
|---|
|  | 218 | sscanf(arg.c_str(), "%lg %lg", &tmin, &tmax); | 
|---|
| [432] | 219 | setMJDInterval(tmin, tmax); | 
|---|
|  | 220 | } else if (key == "#UTCRANGE") { | 
|---|
|  | 221 | double tmin, tmax; | 
|---|
|  | 222 | sscanf(arg.c_str(), "%lg %lg", &tmin, &tmax); | 
|---|
|  | 223 | setUTCInterval(tmin, tmax); | 
|---|
|  | 224 | } else if (key == "#SNRANGE") { | 
|---|
|  | 225 | long tmin, tmax; | 
|---|
|  | 226 | sscanf(arg.c_str(), "%ld %ld", &tmin, &tmax); | 
|---|
|  | 227 | setSNInterval(tmin, tmax); | 
|---|
| [407] | 228 | } else if (key == "#PATH") { | 
|---|
|  | 229 | setDirectory(arg); | 
|---|
|  | 230 | } else if (key == "#FILE") { | 
|---|
|  | 231 | addFile(arg); | 
|---|
| [426] | 232 | } else if (key == "#UNDERSAMPLE") { | 
|---|
|  | 233 | setUnderSample(atoi(arg.c_str())); | 
|---|
| [407] | 234 | } else if (key == "#RECORDER") { | 
|---|
|  | 235 | onBoardRecorderFiles(true); | 
|---|
|  | 236 | } else if (key == "#MJD0") { | 
|---|
|  | 237 | double t0; | 
|---|
|  | 238 | sscanf(arg.c_str(), "%lg", &t0); | 
|---|
|  | 239 | archParam.acq.tBlock0 = t0; | 
|---|
| [432] | 240 | } else if (key == "#UTCORIGIN") { | 
|---|
|  | 241 | double t0; | 
|---|
|  | 242 | sscanf(arg.c_str(), "%lg", &t0); | 
|---|
|  | 243 | archParam.acq.utcOrigin = t0; | 
|---|
| [407] | 244 | } else if (key == "#PERECH") { | 
|---|
|  | 245 | double t0; | 
|---|
|  | 246 | sscanf(arg.c_str(), "%lg", &t0); | 
|---|
|  | 247 | archParam.acq.perEch = t0; | 
|---|
|  | 248 | } else if (key == "#ASIGPS") { | 
|---|
|  | 249 | ASIGPS* gps = new ASIGPS(arg); | 
|---|
| [636] | 250 | //    gps->FitsDump("GPSDump.fits"); | 
|---|
| [407] | 251 | useAuxGPS(gps); | 
|---|
| [408] | 252 | } else if (key == "#INCLUDE") { | 
|---|
| [414] | 253 | ifstream f(arg.c_str()); | 
|---|
|  | 254 | readReq(f); | 
|---|
| [407] | 255 | } else { | 
|---|
|  | 256 | // cerr << "*Warning, unrecognized option " << line << endl; | 
|---|
|  | 257 | return false; | 
|---|
|  | 258 | } | 
|---|
|  | 259 | return true; | 
|---|
|  | 260 | } | 
|---|
| [416] | 261 |  | 
|---|
|  | 262 | void TOISvr::defaultInclude() { | 
|---|
| [417] | 263 | initDone = true; | 
|---|
| [443] | 264 | processRequest("#REQVERSION V_270999"); | 
|---|
| [416] | 265 | processRequest("#MJD0 1376.8358818"); | 
|---|
|  | 266 | processRequest("#PERECH 0.005836818076"); | 
|---|
| [432] | 267 | processRequest("#UTCORIGIN 1376.5"); | 
|---|
| [420] | 268 | processRequest("#ASIGPS ASI_GPS_archeops1999.ascii"); | 
|---|
| [443] | 269 | processRequest("#COMMENT Archtoi -- 27 september 1999 -- Eric Aubourg CEA/DAPNIA"); | 
|---|
| [416] | 270 | processRequest("#COMMENT ***WARNING***"); | 
|---|
|  | 271 | processRequest("#COMMENT ***SOME TOI'S ARE PRELIMINARY***"); | 
|---|
|  | 272 | processRequest("#COMMENT gyroSpeed is not calibrated"); | 
|---|
| [426] | 273 | processRequest("#COMMENT azimut/alpha/delta use galaxy crossings and ASI GPS data"); | 
|---|
| [443] | 274 | processRequest("#COMMENT   and assume no pendulation"); | 
|---|
|  | 275 | processRequest("#COMMENT Focal plane center elevation found at 41.5 deg"); | 
|---|
|  | 276 | processRequest("#COMMENT   with Jupiter"); | 
|---|
|  | 277 | processRequest("#COMMENT boloMuV2 is not protected against glitches"); | 
|---|
| [426] | 278 | processRequest("#COMMENT sst software has not been updated to last DY code"); | 
|---|
|  | 279 | processRequest("#COMMENT trajectory info only while italian TM got GPS info"); | 
|---|
| [416] | 280 |  | 
|---|
|  | 281 | } | 
|---|