158 time_duration mintime(1, 0, 0);
160 const ptime startsched(microsec_clock::local_time());
161 const ptime stopsched=startsched+years(1);
164 str <<
"Scheduling for the period from " << startsched <<
" to " << stopsched;
167 static const boost::regex expr(
"([[:word:].-]+):(.+)@([[:word:].-]+)(:([[:digit:]]+))?/([[:word:].-]+)");
175 if (!boost::regex_match(
fDatabase, what, expr, boost::match_extra))
178 msg <<
"Regex to parse database '" <<
fDatabase <<
"' empty.";
186 msg <<
"Parsing database name failed: '" <<
fDatabase <<
"'";
191 const string user = what[1];
192 const string passwd = what[2];
193 const string server = what[3];
195 const int port = stoi(what[5]);
197 ostringstream dbnamemsg;
198 dbnamemsg <<
"Scheduling started -> using database " << db <<
".";
199 T::Message(dbnamemsg);
202 str <<
"Connecting to '";
213 mysqlpp::Connection conn(db.c_str(), server.c_str(), user.c_str(), passwd.c_str(), port);
225 const mysqlpp::StoreQueryResult res =
226 conn.query(
"SELECT fObservationKEY, fStartTime, fStopTime, fDuration, fSourceName, fSourceKEY, fSplitFlag, fFluxWeight, fSlope, fFlux, fRightAscension, fDeclination, fObservationModeKEY, fObservationTypeKEY , fTelescopeSetupKEY FROM ObservationParameters LEFT JOIN Source USING(fSourceKEY) ORDER BY fStartTime").store();
239 str <<
"Found " << res.num_rows() <<
" Observation Parameter sets.";
242 ObservationParameters olist[res.num_rows()];
243 vector<FixedObs> obsfixedlist;
244 vector<StdObs> obsstdlist;
245 vector<ScheduledObs> obslist;
246 vector<ScheduledRun> runlist;
253 cout <<
"Obs: <obskey> <sourcename>(<sourcekey>, <fluxweight>) from <starttime> to <stoptime>" << endl;
254 for (vector<mysqlpp::Row>::const_iterator v=res.begin(); v<res.end(); v++)
256 cout <<
" Obs: " << (*v)[0].c_str() <<
" " << (*v)[4].c_str() <<
"(" << (*v)[5].c_str() << flush;
257 cout <<
", " << (*v)[7].c_str() <<
")" << flush;
258 cout <<
" from " << (*v)[1].c_str() <<
" to " << (*v)[2].c_str() << endl;
278 t1 << (*v)[1].c_str();
279 t2 << (*v)[2].c_str();
280 t3 << (*v)[3].c_str();
285 t3 >> olist[
counter].duration_db;
286 const time_period
period(olist[counter].
start, olist[counter].stop);
288 olist[
counter].sourcename=(*v)[4].c_str();
289 olist[
counter].sourcekey=(*v)[5];
291 if (!(*v)[0].is_null())
293 if (!(*v)[12].is_null())
294 olist[
counter].obsmode=(*v)[12];
295 if (!(*v)[13].is_null())
296 olist[
counter].obstype=(*v)[13];
297 if (!(*v)[14].is_null())
298 olist[
counter].telsetup=(*v)[14];
299 if (!(*v)[6].is_null())
300 olist[
counter].splitflag=(*v)[6];
301 if (!(*v)[7].is_null())
302 olist[
counter].fluxweight=(*v)[7];
305 if (!(*v)[8].is_null())
307 if (!(*v)[9].is_null())
309 if (!(*v)[10].is_null())
311 if (!(*v)[11].is_null())
351 if (!(olist[counter].stop.is_not_a_date_time()
352 && olist[
counter].start.is_not_a_date_time())
353 && olist[counter].fluxweight==0
356 obsfixedlist.resize(counter2+1);
357 obsfixedlist[counter2].start=olist[
counter].start;
358 obsfixedlist[counter2].stop=olist[
counter].stop;
359 obsfixedlist[counter2].sourcename=olist[
counter].sourcename;
360 obsfixedlist[counter2].obskey=olist[
counter].obskey;
361 obsfixedlist[counter2].obstype=olist[
counter].obstype;
362 obsfixedlist[counter2].obsmode=olist[
counter].obsmode;
363 obsfixedlist[counter2].telsetup=olist[
counter].telsetup;
364 obsfixedlist[counter2].sourcekey=olist[
counter].sourcekey;
365 obsfixedlist[counter2].ra=olist[
counter].ra;
366 obsfixedlist[counter2].dec=olist[
counter].dec;
371 if (olist[counter].stop.is_not_a_date_time()
372 && olist[
counter].start.is_not_a_date_time()
376 obsstdlist.resize(counter3+1);
377 obsstdlist[counter3].sourcename_std=olist[
counter].sourcename;
378 obsstdlist[counter3].obskey_std=olist[
counter].obskey;
379 obsstdlist[counter3].obsmode_std=olist[
counter].obsmode;
380 obsstdlist[counter3].obstype_std=olist[
counter].obstype;
381 obsstdlist[counter3].telsetup_std=olist[
counter].telsetup;
382 obsstdlist[counter3].sourcekey_std=olist[
counter].sourcekey;
383 obsstdlist[counter3].fluxweight_std=olist[
counter].fluxweight;
384 obsstdlist[counter3].flux_std=olist[
counter].flux;
385 obsstdlist[counter3].slope_std=olist[
counter].slope;
386 obsstdlist[counter3].ra_std=olist[
counter].ra;
387 obsstdlist[counter3].dec_std=olist[
counter].dec;
393 ostringstream fixedobsmsg;
394 fixedobsmsg << obsfixedlist.size() <<
" fixed observations found. ";
395 T::Message(fixedobsmsg);
396 cout << obsfixedlist.size() <<
" fixed observations found. " << endl;
398 ostringstream stdobsmsg;
399 stdobsmsg << obsstdlist.size() <<
" standard observations found. ";
400 T::Message(stdobsmsg);
401 cout << obsstdlist.size() <<
" standard observations found. " << endl;
413 ptime finalobsfixedstart;
414 ptime finalobsfixedstop;
415 time_duration delta0(0,0,0);
417 cout <<
"Fixed Observations: " << endl;
418 for (
struct vector<FixedObs>::const_iterator vobs=obsfixedlist.begin(); vobs!=obsfixedlist.end(); vobs++)
420 if (obsfixedlist[counter2].
start < startsched
421 || obsfixedlist[counter2].stop > stopsched)
423 ostringstream skipfixedobsmsg;
424 skipfixedobsmsg <<
"Skip 1 fixed observation (obskey ";
425 skipfixedobsmsg << obsfixedlist[counter2].obskey;
426 skipfixedobsmsg <<
") as it is out of scheduling time range.";
427 T::Message(skipfixedobsmsg);
435 time_duration delta1=delta0;
436 time_duration delta2=delta0;
438 finalobsfixedstart=obsfixedlist[counter2].start;
439 finalobsfixedstop=obsfixedlist[counter2].stop;
441 for (
struct vector<FixedObs>::const_iterator vobs5=obsfixedlist.begin(); vobs5!=obsfixedlist.end(); vobs5++)
443 if (vobs5->start < obsfixedlist[counter2].stop
444 && obsfixedlist[counter2].stop <= vobs5->stop
445 && obsfixedlist[counter2].start <= vobs5->start
446 && counter2!=counter3)
448 delta1=(obsfixedlist[counter2].stop-vobs5->start)/2;
449 finalobsfixedstop=obsfixedlist[counter2].stop-delta1;
451 ostringstream warndelta1;
452 warndelta1 <<
"Overlap between two fixed observations (";
453 warndelta1 << obsfixedlist[counter2].obskey <<
" ";
454 warndelta1 << vobs5->obskey <<
"). The stoptime of ";
455 warndelta1 << obsfixedlist[counter2].obskey <<
" has been changed.";
458 if (vobs5->start <= obsfixedlist[counter2].start
459 && obsfixedlist[counter2].start < vobs5->stop
460 && obsfixedlist[counter2].stop >= vobs5->stop
461 && counter2!=counter3)
463 delta2=(vobs5->stop-obsfixedlist[counter2].start)/2;
464 finalobsfixedstart=obsfixedlist[counter2].start+delta2;
466 ostringstream warndelta2;
467 warndelta2 <<
"Overlap between two fixed observations (";
468 warndelta2 << obsfixedlist[counter2].obskey <<
" ";
469 warndelta2 << vobs5->obskey <<
"). The starttime of ";
470 warndelta2 << obsfixedlist[counter2].obskey <<
" has been changed.";
477 const int num=counter2-skipcounter;
478 obslist.resize(num+1);
479 obslist[num].obsstart=finalobsfixedstart;
480 obslist[num].obsstop=finalobsfixedstop;
481 obslist[num].sourcename_obs=obsfixedlist[counter2].sourcename;
482 obslist[num].obsmode_obs=obsfixedlist[counter2].obsmode;
483 obslist[num].obstype_obs=obsfixedlist[counter2].obstype;
484 obslist[num].telsetup_obs=obsfixedlist[counter2].telsetup;
485 obslist[num].sourcekey_obs=obsfixedlist[counter2].sourcekey;
486 obslist[num].obskey_obs=obsfixedlist[counter2].obskey;
489 cout <<
" " << vobs->sourcename <<
" " << vobs->start;
490 cout <<
" - " << vobs->stop << endl;
492 ostringstream obsmsg;
493 obsmsg <<
"Added " << obslist.size() <<
" fixed observations to ScheduledObs. ";
495 cout <<
"Added " << obslist.size() <<
" fixed observations to ScheduledObs. " << endl;
497 for (
int i=0;
i<(int)obsstdlist.size();
i++)
499 for (
int j=0; j<(int)obsstdlist.size(); j++)
501 if (obsstdlist[
i].sourcekey_std == obsstdlist[j].sourcekey_std &&
i!=j)
503 cout <<
"One double sourcekey in std observations: " << obsstdlist[j].sourcekey_std << endl;
504 ostringstream errdoublestd;
505 errdoublestd <<
"One double sourcekey in std observations: " << obsstdlist[j].sourcekey_std <<
" (" << obsstdlist[j].sourcename_std <<
").";
507 T::Message(
"Scheduling stopped.");
508 return error ? T::kSM_Error : T::kSM_Ready;
522 cout <<
"Standard Observations: " << endl;
523 for (
struct vector<StdObs>::const_iterator vobs2=obsstdlist.begin(); vobs2!=obsstdlist.end(); vobs2++)
525 cout <<
" " << vobs2->sourcename_std << endl;
532 for (
struct vector<ScheduledObs>::const_iterator vobs3=obslist.begin(); vobs3!=obslist.end(); vobs3++)
534 runlist.resize(counter2+1);
535 runlist[counter2].runstart=obslist[counter2].obsstart;
536 runlist[counter2].runstop=obslist[counter2].obsstop;
537 runlist[counter2].sourcename_run=obslist[counter2].sourcename_obs;
538 runlist[counter2].obsmode_run=obslist[counter2].obsmode_obs;
539 runlist[counter2].obstype_run=obslist[counter2].obstype_obs;
540 runlist[counter2].telsetup_run=obslist[counter2].telsetup_obs;
541 runlist[counter2].sourcekey_run=obslist[counter2].sourcekey_obs;
542 runlist[counter2].obskey_run=obslist[counter2].obskey_obs;
548 const mysqlpp::SimpleResult res0 =
549 conn.query(
"DELETE FROM ScheduledRun").execute();
566 ptime finalstarttime;
568 for (
struct vector<ScheduledRun>::const_iterator vobs4=runlist.begin(); vobs4!=runlist.end(); vobs4++)
570 for (
int i=2;
i<5;
i++)
575 finalstarttime=runlist[counter3].runstart+repostime+runtimec+runtimep;
576 finalstoptime=runlist[counter3].runstop;
579 finalstarttime=runlist[counter3].runstart+repostime;
580 finalstoptime=runlist[counter3].runstart+runtimep+repostime;
583 finalstarttime=runlist[counter3].runstart+runtimep+repostime;
584 finalstoptime=runlist[counter3].runstart+repostime+runtimep+runtimec;
589 q1 <<
"INSERT ScheduledRun set fStartTime='" <<
Time::sql << finalstarttime;
590 q1 <<
"', fStopTime='" <<
Time::sql << finalstoptime;
591 q1 <<
"', fSourceKEY='" << (*vobs4).sourcekey_run;
592 q1 <<
"', fObservationKEY='" << (*vobs4).obskey_run;
593 q1 <<
"', fRunTypeKEY='" <<
i;
594 q1 <<
"', fTelescopeSetupKEY='" << (*vobs4).telsetup_run;
595 q1 <<
"', fObservationTypeKEY='" << (*vobs4).obstype_run;
596 q1 <<
"', fObservationModeKEY='" << (*vobs4).obsmode_run;
601 const mysqlpp::SimpleResult res1 = conn.query(q1.str()).
execute();
616 ostringstream insertmsg;
617 insertmsg <<
"Inserted " << insertcount <<
" runs into the DB.";
618 T::Message(insertmsg);
620 T::Message(
"Scheduling done.");
static const _time_format sql
set to format to the iso standard
int execute(Configuration &conf, bool dummy=false)