Changeset 10596 for trunk/FACT++/src/scheduler.cc
- Timestamp:
- 05/05/11 22:27:55 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/FACT++/src/scheduler.cc
r10530 r10596 2 2 #include <boost/bind.hpp> 3 3 #include <boost/thread.hpp> 4 #include <boost/regex.hpp> 4 5 #include <boost/asio/deadline_timer.hpp> 5 6 … … 34 35 string database; 35 36 37 // things to be done/checked/changed 38 // * do not use --database, but sth like --database-scheduler 39 // to be independent of the configuration database 40 // * check if the following include is really needed 41 // #include <boost/date_time/posix_time/posix_time.hpp> 42 // * string database not as global variable 43 // pass reference to conf and the string as a member of the class 44 // (see chat of 4.5.2011) 45 // * move definition of config parameters to AutoScheduler class 46 // + read in from config 47 48 // other things to do 49 // 50 // define what is error and warning 51 52 53 // config parameters 54 // mintime 55 // runtimec 56 // runtimep 57 // repostime 58 59 // missing: 60 // from / to for the time range for which the scheduling shall be done 61 // 62 // calculate time for std obs 63 // calculate sun set/rise 64 // 65 // check for double std sources 66 // 67 // return errors 68 // get input from sendcommand 36 69 37 70 // ========================================================================= … … 51 84 { 52 85 int obskey; 86 int obsmode; 87 int obstype; 88 int splitflag; 89 int telsetup; 90 float fluxweight; 91 float slope; 92 float flux; 93 float ra; 94 float dec; 53 95 boost::posix_time::ptime starttime; 54 96 boost::posix_time::ptime stoptime; 55 97 boost::posix_time::time_duration duration_db; 56 98 string sourcename; 99 int sourcekey; 57 100 }; 58 101 … … 63 106 string sourcename_fixed; 64 107 int obsmode_fixed; 108 int obstype_fixed; 109 int telsetup_fixed; 110 float ra_fixed; 111 float dec_fixed; 65 112 boost::posix_time::ptime obsfixedstart; 66 113 boost::posix_time::ptime obsfixedstop; 67 114 }; 115 116 // will need other types of obs 117 // FloatingObs (duration < stop-start + splitflag no) 118 // FloatingSplittedObs (duration < stop-start + splitflag yes) 119 // FixedSlot, i.e. just block a time slot 68 120 69 121 struct StdObs … … 73 125 string sourcename_std; 74 126 int obsmode_std; 127 int obstype_std; 128 int telsetup_std; 129 float fluxweight_std; 130 float slope_std; 131 float flux_std; 132 float ra_std; 133 float dec_std; 75 134 boost::posix_time::ptime obsstdstart; 76 135 boost::posix_time::ptime obsstdstop; … … 82 141 string sourcename_obs; 83 142 int obsmode_obs; 143 int obstype_obs; 144 int telsetup_obs; 84 145 boost::posix_time::ptime obsstart; 85 146 boost::posix_time::ptime obsstop; … … 88 149 struct ScheduledRun 89 150 { 90 int runnumber;151 //int runnumber; // to be seen, if runnumber is needed 91 152 int runtype; 92 int sourcekey; 93 int obsmode; 153 int sourcekey_run; 154 string sourcename_run;//for convenience 155 int obsmode_run; 156 int obstype_run; 157 int telsetup_run; 94 158 boost::posix_time::ptime runstart; 95 159 boost::posix_time::ptime runstop; … … 98 162 int fSessionId; 99 163 164 165 100 166 int Schedule() 101 167 { 168 boost::posix_time::time_duration runtimec(0, 3, 0); 169 boost::posix_time::time_duration runtimep(0, 3, 0); 170 boost::posix_time::time_duration mintime(1, 0, 0); 171 boost::posix_time::time_duration repostime(0, 5, 0); 172 102 173 stringstream str; 103 174 str << "Scheduling started -> Preview (id=" << fSessionId << ")"; 104 175 T::Message(str); 105 176 106 //static const boost::regex expr("(([[:word:].-]+)(:(.+))?@)?([[:word:].-]+)(:([[:digit:]]+))?(/([[:word:].-]+))?");107 177 static const boost::regex expr("(([[:word:].-]+)(:(.+))?@)?([[:word:].-]+)(:([[:digit:]]+))?(/([[:word:].-]+))"); 108 178 // 2: user … … 112 182 // 9: db 113 183 114 //string database="root:Ihtp4aDB@localhost:3306/Scheduling";115 184 boost::smatch what; 116 185 if (!boost::regex_match(database, what, expr, boost::match_extra)) … … 148 217 throw; 149 218 } 150 //mysqlpp::Connection conn(db.c_str(), server.c_str(), user.c_str(), passwd.c_str(), port);151 //mysqlpp::Connection conn("Scheduling", "localhost", "root", "Ihtp4aDB", 3306);152 if (!conn.connected())153 {154 cout << "MySQL connection error: " << conn.error() << endl;155 throw;156 }157 219 158 220 // get observation parameters from DB 159 mysqlpp::Query query = conn.query("SELECT fObservationKEY, fStartTime, fStopTime, fDuration, fSourceName, fSourceKEY, fSplitFlag, fFluxWeight, fObservationModeKEY, fObservationTypeKEY FROM ObservationParameters LEFT JOIN Source USING(fSourceKEY) ORDER BY fObservationKEY");160 //maybe order by priority?221 // maybe order by priority? 222 mysqlpp::Query query = 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"); 161 223 162 224 mysqlpp::StoreQueryResult res = query.store(); … … 185 247 cout << " T1 " << (*v)[1].c_str() << " T2: " << (*v)[2].c_str() << " (c " << counter << " " << counter2 << ")" << endl; 186 248 249 /* 250 cout << " 0 " << (*v)[0].c_str() << endl; 251 cout << " 1 " << (*v)[1].c_str() << endl; 252 cout << " 2 " << (*v)[2].c_str() << endl; 253 cout << " 3 " << (*v)[3].c_str() << endl; 254 cout << " 4 " << (*v)[4].c_str() << endl; 255 cout << " 5 " << (*v)[5].c_str() << endl; 256 cout << " 6 " << (*v)[6].c_str() << endl; 257 cout << " 7 " << (*v)[7].c_str() << endl; 258 cout << " 8 " << (*v)[8].c_str() << endl; 259 cout << " 9 " << (*v)[9].c_str() << endl; 260 cout << " 10 " << (*v)[10].c_str() << endl; 261 cout << " 11 " << (*v)[11].c_str() << endl; 262 cout << " 12 " << (*v)[12].c_str() << endl; 263 cout << " 13 " << (*v)[13].c_str() << endl; 264 cout << " 14 " << (*v)[14].c_str() << endl; 265 */ 266 //0: obskey 267 //1: startime 268 //2: stoptime 269 //3: duration 270 //4: sourcename 271 //5: sourcekey 272 //6: splitflag 273 //7: fluxweight 274 //8: slope 275 //9: flux 276 //10: ra 277 //11: dec 278 //12: obsmode 279 //13: obstype 280 //14: telsetup 187 281 stringstream t1; 188 282 stringstream t2; … … 193 287 194 288 //boost::posix_time::time_duration mintime(0,conf.Get<int>("mintime"), 0); 195 boost::posix_time::time_duration mintime(1, 0, 0);196 289 t1 >> Time::sql >> olist[counter].starttime; 197 290 t2 >> Time::sql >> olist[counter].stoptime; … … 199 292 boost::posix_time::time_period period(olist[counter].starttime, olist[counter].stoptime); 200 293 olist[counter].sourcename=(*v)[4].c_str(); 201 olist[counter].obskey=(*v)[0]; 294 olist[counter].sourcekey=(*v)[5]; 295 296 if (!(*v)[0].is_null()) 297 olist[counter].obskey=(*v)[0]; 298 //else 299 // cout << "no obskey" << endl; 300 if (!(*v)[12].is_null()) 301 olist[counter].obsmode=(*v)[12]; 302 //else 303 // cout << "no obsmode" << endl; 304 if (!(*v)[13].is_null()) 305 olist[counter].obstype=(*v)[13]; 306 //else 307 // cout << "no obstype" << endl; 308 if (!(*v)[14].is_null()) 309 olist[counter].telsetup=(*v)[14]; 310 //else 311 // cout << "no telsetup" << endl; 312 if (!(*v)[6].is_null()) 313 olist[counter].splitflag=(*v)[6]; 314 //else 315 //{ 316 // cout << "no splitflag" << endl; 317 ////stringstream str; 318 ////str << "no splitflag"; 319 //T::Message("no splitflag"); 320 //T::Error("---> no splitflag"); 321 //T::Warn("+++ no splitflag"); 322 //} 323 if (!(*v)[7].is_null()) 324 olist[counter].fluxweight=(*v)[7]; 325 else 326 { 327 olist[counter].fluxweight=0; 328 // cout << "no fluxweight" << endl; 329 } 330 if (!(*v)[8].is_null()) 331 olist[counter].slope=(*v)[8]; 332 //else 333 // cout << "no slope" << endl; 334 if (!(*v)[9].is_null()) 335 olist[counter].flux=(*v)[9]; 336 //else 337 // cout << "no flux" << endl; 338 if (!(*v)[10].is_null()) 339 olist[counter].ra=(*v)[10]; 340 //else 341 // cout << "no ra" << endl; 342 if (!(*v)[11].is_null()) 343 olist[counter].dec=(*v)[11]; 344 //else 345 // cout << "no dec" << endl; 202 346 203 347 // time_duration cannot be used, as only up to 99 hours are handeled … … 224 368 */ 225 369 226 // if start and stop time are available, it is a fixed observation 227 if (!(olist[counter].stoptime.is_not_a_date_time() && olist[counter].starttime.is_not_a_date_time())) 370 // always filled: obstype 371 // 372 // fixed observations: 373 // filled: starttime, stoptime 374 // not filled: fluxweight 375 // maybe filled: obsmode, telsetup, source (not filled for FixedSlotObs) 376 // maybe filled: duration (filled for FloatingObs and FloatingSplittedObs) 377 // maybe filled: splitflag (filled for FloatingSplittedObs) 378 // 379 // std observations: 380 // filled: fluxweight, telsetup, obsmore, source 381 // not filled: starttime, stoptime, duration 382 383 // fixed observations 384 if (!(olist[counter].stoptime.is_not_a_date_time() 385 && olist[counter].starttime.is_not_a_date_time()) 386 && olist[counter].fluxweight==0 387 ) 228 388 { 229 389 obsfixedlist.resize(counter2+1); … … 232 392 obsfixedlist[counter2].sourcename_fixed=olist[counter].sourcename; 233 393 obsfixedlist[counter2].obskey_fixed=olist[counter].obskey; 394 obsfixedlist[counter2].obstype_fixed=olist[counter].obstype; 395 obsfixedlist[counter2].obsmode_fixed=olist[counter].obsmode; 396 obsfixedlist[counter2].telsetup_fixed=olist[counter].telsetup; 397 obsfixedlist[counter2].sourcekey_fixed=olist[counter].sourcekey; 398 obsfixedlist[counter2].ra_fixed=olist[counter].ra; 399 obsfixedlist[counter2].dec_fixed=olist[counter].dec; 234 400 counter2++; 235 401 } 236 else 402 403 // std obs 404 if (olist[counter].stoptime.is_not_a_date_time() 405 && olist[counter].starttime.is_not_a_date_time() 406 && olist[counter].fluxweight>0 407 ) 237 408 { 238 409 obsstdlist.resize(counter3+1); 239 410 obsstdlist[counter3].sourcename_std=olist[counter].sourcename; 240 411 obsstdlist[counter3].obskey_std=olist[counter].obskey; 412 obsstdlist[counter3].obsmode_std=olist[counter].obsmode; 413 obsstdlist[counter3].obstype_std=olist[counter].obstype; 414 obsstdlist[counter3].telsetup_std=olist[counter].telsetup; 415 obsstdlist[counter3].sourcekey_std=olist[counter].sourcekey; 416 obsstdlist[counter3].fluxweight_std=olist[counter].fluxweight; 417 obsstdlist[counter3].flux_std=olist[counter].flux; 418 obsstdlist[counter3].slope_std=olist[counter].slope; 419 obsstdlist[counter3].ra_std=olist[counter].ra; 420 obsstdlist[counter3].dec_std=olist[counter].dec; 241 421 counter3++; 242 422 } … … 247 427 cout << obsstdlist.size() << " standard observations found. " << endl; 248 428 249 // in this loop the fixed observations shall be 250 // checked, evaluated and added to the ScheduledObs list 429 // loop to add the fixed observations to the ScheduledObs list 430 // missing: checks and evaluation 431 // * check for sun 432 // * check for moon 433 counter2=0; 434 boost::posix_time::ptime finalobsfixedstart; 435 boost::posix_time::ptime finalobsfixedstop; 436 boost::posix_time::time_duration delta1; 437 boost::posix_time::time_duration delta2; 438 boost::posix_time::time_duration delta0(0,0,0); 251 439 struct vector<FixedObs>::iterator vobs; 440 struct vector<FixedObs>::iterator vobs5; 252 441 cout << "Fixed Observations: " << endl; 253 442 for (vobs=obsfixedlist.begin(); vobs!=obsfixedlist.end(); vobs++) 254 443 { 255 cout << " " << (*vobs).sourcename_fixed << " " << (*vobs).obsfixedstart << flush; 256 cout << " - " << (*vobs).obsfixedstop << endl; 444 counter3=0; 445 delta1=delta0; 446 delta2=delta0; 447 finalobsfixedstart=obsfixedlist[counter2].obsfixedstart; 448 finalobsfixedstop=obsfixedlist[counter2].obsfixedstop; 449 //cout << "final: " << finalobsfixedstart << " - " << finalobsfixedstop << endl; 450 451 for (vobs5=obsfixedlist.begin(); vobs5!=obsfixedlist.end(); vobs5++) 452 { 453 //cout << "startc" << obsfixedlist[counter2].obsfixedstart << " -- " << flush; 454 //cout << "stopc" << obsfixedlist[counter2].obsfixedstop << " -- " << flush; 455 //cout << "start" << (*vobs5).obsfixedstart << " -- " << flush; 456 //cout << "stop" << (*vobs5).obsfixedstop << " -- " << flush; 457 458 //if (obsfixedlist[counter2].obsfixedstart < (*vobs5).obsfixedstop 459 // && (*vobs5).obsfixedstop < obsfixedlist[counter2].obsfixedstop 460 // && counter2!=counter3) 461 if ((*vobs5).obsfixedstart < obsfixedlist[counter2].obsfixedstop 462 && obsfixedlist[counter2].obsfixedstop <= (*vobs5).obsfixedstop 463 && obsfixedlist[counter2].obsfixedstart <= (*vobs5).obsfixedstart 464 && counter2!=counter3) 465 { 466 //delta1=((*vobs5).obsfixedstop-obsfixedlist[counter2].obsfixedstart)/2; 467 delta1=(obsfixedlist[counter2].obsfixedstop-(*vobs5).obsfixedstart)/2; 468 finalobsfixedstop=obsfixedlist[counter2].obsfixedstop-delta1; 469 //cout << "delta1 " << delta1 << endl; 470 stringstream warndelta1; 471 warndelta1 << "Overlap between two fixed observations (" << obsfixedlist[counter2].obskey_fixed << " " << (*vobs5).obskey_fixed << "). The stoptime of " << obsfixedlist[counter2].obskey_fixed << " has been changed."; 472 T::Warn(warndelta1); 473 } 474 //if (obsfixedlist[counter2].obsfixedstart < (*vobs5).obsfixedstart 475 // && (*vobs5).obsfixedstart < obsfixedlist[counter2].obsfixedstop 476 // && counter2!=counter3) 477 if ((*vobs5).obsfixedstart <= obsfixedlist[counter2].obsfixedstart 478 && obsfixedlist[counter2].obsfixedstart < (*vobs5).obsfixedstop 479 && obsfixedlist[counter2].obsfixedstop >= (*vobs5).obsfixedstop 480 && counter2!=counter3) 481 { 482 delta2=((*vobs5).obsfixedstop-obsfixedlist[counter2].obsfixedstart)/2; 483 finalobsfixedstart=obsfixedlist[counter2].obsfixedstart+delta2; 484 //cout << "delta2 " << delta2 << endl; 485 stringstream warndelta2; 486 warndelta2 << "Overlap between two fixed observations (" << obsfixedlist[counter2].obskey_fixed << " " << (*vobs5).obskey_fixed << "). The starttime of " << obsfixedlist[counter2].obskey_fixed << " has been changed."; 487 T::Warn(warndelta2); 488 } 489 counter3++; 490 //cout << endl; 491 } 492 493 //cout << "-> final: " << finalobsfixedstart << " - " << finalobsfixedstop << endl; 494 obslist.resize(counter2+1); 495 //obslist[counter2].obsstart=obsfixedlist[counter2].obsfixedstart; 496 obslist[counter2].obsstart=finalobsfixedstart; 497 //obslist[counter2].obsstop=obsfixedlist[counter2].obsfixedstop; 498 obslist[counter2].obsstop=finalobsfixedstop; 499 obslist[counter2].sourcename_obs=obsfixedlist[counter2].sourcename_fixed; 500 obslist[counter2].obsmode_obs=obsfixedlist[counter2].obsmode_fixed; 501 obslist[counter2].obstype_obs=obsfixedlist[counter2].obstype_fixed; 502 obslist[counter2].telsetup_obs=obsfixedlist[counter2].telsetup_fixed; 503 obslist[counter2].sourcekey_obs=obsfixedlist[counter2].sourcekey_fixed; 504 counter2++; 505 //cout << " " << (*vobs).sourcename_fixed << " " << (*vobs).obsfixedstart << flush; 506 //cout << " - " << (*vobs).obsfixedstop << endl; 257 507 } 258 508 … … 270 520 // in this loop from the scheduled observations the list 271 521 // of scheduled runs shall be calculated 522 counter2=0; 272 523 struct vector<ScheduledObs>::iterator vobs3; 273 524 for (vobs3=obslist.begin(); vobs3!=obslist.end(); vobs3++) 274 525 { 526 // add runtype and runtime calculations 527 runlist.resize(counter2+1); 528 runlist[counter2].runstart=obslist[counter2].obsstart; 529 runlist[counter2].runstop=obslist[counter2].obsstop; 530 runlist[counter2].sourcename_run=obslist[counter2].sourcename_obs; 531 runlist[counter2].obsmode_run=obslist[counter2].obsmode_obs; 532 runlist[counter2].obstype_run=obslist[counter2].obstype_obs; 533 runlist[counter2].telsetup_run=obslist[counter2].telsetup_obs; 534 runlist[counter2].sourcekey_run=obslist[counter2].sourcekey_obs; 535 counter2++; 275 536 cout << (*vobs3).sourcename_obs << endl; 276 537 } 277 538 539 //delete old scheduled runs from the DB 540 mysqlpp::Query query0 = conn.query("DELETE FROM ScheduledRun"); 541 542 mysqlpp::SimpleResult res0 = query0.execute(); 543 if (!res0) 544 { 545 cout << "MySQL query failed: " << query0.error() << endl; 546 throw; 547 } 548 549 counter3=0; 550 boost::posix_time::ptime finalstarttime; 551 boost::posix_time::ptime finalstoptime; 552 struct vector<ScheduledRun>::iterator vobs4; 553 for (vobs4=runlist.begin(); vobs4!=runlist.end(); vobs4++) 554 { 555 for (int i=2; i<5; i++) 556 { 557 switch(i) 558 { 559 case 2: 560 finalstarttime=runlist[counter3].runstart+repostime+runtimec+runtimep; 561 finalstoptime=runlist[counter3].runstop; 562 break; 563 case 3: 564 finalstarttime=runlist[counter3].runstart+repostime; 565 finalstoptime=runlist[counter3].runstart+runtimep+repostime; 566 break; 567 case 4: 568 finalstarttime=runlist[counter3].runstart+runtimep+repostime; 569 finalstoptime=runlist[counter3].runstart+repostime+runtimep+runtimec; 570 break; 571 } 572 stringstream q1; 573 //cout << (*vobs4).sourcename_run << endl; 574 q1 << "INSERT ScheduledRun set fStartTime='" << Time::sql << finalstarttime; 575 q1 << "', fStopTime='" << Time::sql << finalstoptime; 576 q1 << "', fSourceKEY='" << (*vobs4).sourcekey_run; 577 q1 << "', fRunTypeKEY='" << i; 578 q1 << "', fTelescopeSetupKEY='" << (*vobs4).telsetup_run; 579 q1 << "', fObservationTypeKEY='" << (*vobs4).obstype_run; 580 q1 << "', fObservationModeKEY='" << (*vobs4).obsmode_run; 581 q1 << "'"; 582 583 //cout << "executing query: " << q1.str() << endl; 584 585 mysqlpp::Query query1 = conn.query(q1.str()); 586 587 mysqlpp::SimpleResult res1 = query1.execute(); 588 if (!res1) 589 { 590 cout << "MySQL query failed: " << query1.error() << endl; 591 throw; 592 } 593 } 594 counter3++; 595 } 278 596 //usleep(3000000); 279 597 T::Message("Scheduling done.");
Note:
See TracChangeset
for help on using the changeset viewer.