Changeset 18436
- Timestamp:
- 02/14/16 16:54:44 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/FACT++/src/makeschedule.cc
r18418 r18436 1 1 #include "externals/Prediction.h" 2 2 3 //#include <unordered_map>4 3 #include <boost/algorithm/string/join.hpp> 5 4 … … 10 9 #include "Configuration.h" 11 10 12 /*13 #include <TROOT.h>14 #include <TH1.h>15 #include <TGraph.h>16 #include <TCanvas.h>17 #include <TLegend.h>18 */19 20 11 using namespace std; 21 12 using namespace Nova; 22 13 23 14 // ----------------------------------------------------------------------- 24 25 /*26 void CheckForGap(TCanvas &c, TGraph &g, double axis)27 {28 if (g.GetN()==0 || axis-g.GetX()[g.GetN()-1]<450)29 return;30 31 c.cd();32 ((TGraph*)g.DrawClone("C"))->SetBit(kCanDelete);33 while (g.GetN())34 g.RemovePoint(0);35 }36 37 void DrawClone(TCanvas &c, TGraph &g)38 {39 if (g.GetN()==0)40 return;41 42 c.cd();43 ((TGraph*)g.DrawClone("C"))->SetBit(kCanDelete);44 }45 */46 47 // ========================================================================48 // ========================================================================49 // ========================================================================50 15 51 16 void SetupConfiguration(Configuration &conf) … … 55 20 ("date", var<string>(), "SQL time (UTC), e.g. '2016-12-24'") 56 21 ("source-database", var<string>(""), "Database link as in\n\tuser:password@server[:port]/database.") 22 ("schedule-database", var<string>(""), "Database link as in\n\tuser:password@server[:port]/database.") 57 23 ("max-current", var<double>(90), "Global maximum current limit in uA") 58 24 ("max-zd", var<double>(75), "Global zenith distance limit in degree") … … 63 29 ("data-taking.start", var<double>(-12), "Begin of data-taking in degree of sun below horizon") 64 30 ("data-taking.end", var<double>(-13.75), "End of data-taking in degree of sun below horizon") 31 ("enter-schedule-into-database", var<bool>(), "Enter schedule into database (required schedule-database, false: dry-run)") 65 32 ; 66 33 … … 471 438 } 472 439 440 int FillSql(Database &db, int enter, const vector<Source> &obs, double startup_offset) 441 { 442 const string query0 = "SELECT COUNT(*) FROM Schedule WHERE DATE(ADDTIME(fStart, '-12:00')) = '"+Time(obs[0].begin).GetAsStr("%Y-%m-%d")+"'"; 443 444 const mysqlpp::StoreQueryResult res0 = db.query(query0).store(); 445 446 if (res0.num_rows()!=1) 447 { 448 cout << "Check for schedule size failed." << endl; 449 return 10; 450 } 451 452 if (uint32_t(res0[0][0])!=0) 453 { 454 cout << "Schedule not empty." << endl; 455 return 11; 456 } 457 458 const mysqlpp::StoreQueryResult res1 = db.query("SELECT fSourceName, fSourceKEY FROM Source").store(); 459 460 map<string, uint32_t> keys; 461 for (const auto &row: res1) 462 keys.emplace(string(row[0]), uint32_t(row[1])); 463 464 const mysqlpp::StoreQueryResult res2 = db.query("SELECT fMeasurementTypeName, fMeasurementTypeKEY FROM MeasurementType").store(); 465 466 map<string, uint32_t> types; 467 for (const auto &row: res2) 468 types.emplace(string(row[0]), uint32_t(row[1])); 469 470 ostringstream str; 471 str << "INSERT INTO Schedule (fStart, fUser, fMeasurementID, fMeasurementTypeKEY, fSourceKEY) VALUES\n"; 472 473 str << "('" << Time(obs[0].begin-startup_offset).GetAsStr() << "', auto, 0, " << types["Startup"] << ", NULL), [Startup]\n"; 474 for (const auto& src: obs) 475 { 476 string tm = Time(src.begin).GetAsStr(); 477 478 /* 479 if (src.preobs.size()>0) 480 { 481 for (const auto& pre: src.preobs) 482 { 483 str << tm << " " << pre << "\n"; 484 tm = " "; 485 } 486 }*/ 487 488 if (src.name!="SLEEP") 489 str << "('" << tm << "', auto, 0, " << types["Data"] << ", " << keys[src.name] << "), [Data: " << src.name << "]\n"; 490 else 491 str << "('" << tm << "', auto, 0, " << types["Sleep"] << ", NULL), [Sleep]\n"; 492 } 493 494 str << "('" << Time(obs.back().end).GetAsStr() << "', auto, 0, " << types["Shutdown"] << ", NULL) [Shutdown]"; 495 496 if (enter<0) 497 { 498 cout << str.str() << endl; 499 return 0; 500 } 501 502 db.query(str.str()); 503 504 cout << "Schedule entered successfully into database." << endl; 505 return 0; 506 } 507 473 508 int main(int argc, const char* argv[]) 474 509 { … … 484 519 // ------------------ Eval config --------------------- 485 520 521 const int enter = conf.Has("enter-schedule-into-database") ? (conf.Get<bool>("enter-schedule-into-database") ? 1 : -1) : 0; 522 if (enter && !conf.Has("schedule-database")) 523 throw runtime_error("enter-schedule-into-database required schedule-database."); 524 486 525 Time time; 487 526 if (conf.Has("date")) 488 time.SetFromStr(conf.Get<string>("date")+" 12:00:00"); 527 time.SetFromStr(conf.Get<string>("date")); 528 529 if (enter && floor(time.JD())<ceil(Time().JD())) 530 throw runtime_error("Only future schedules can be entered into the database."); 489 531 490 532 Source::max_current = conf.Get<double>("max-current"); … … 508 550 // Sun set with the same date than th provided date 509 551 // Sun rise on the following day 510 const RstTime sun_set = GetSolarRst( time.JD()-0.5, angle_sun_set);511 const RstTime sun_rise = GetSolarRst( time.JD()+0.5, angle_sun_rise);552 const RstTime sun_set = GetSolarRst(floor(time.JD())-0.5, angle_sun_set); 553 const RstTime sun_rise = GetSolarRst(floor(time.JD())+0.5, angle_sun_rise); 512 554 513 555 const double sunset = ceil(sun_set.set*24*60)/24/60; … … 530 572 query += " AND fSourceName IN ('" + boost::algorithm::join(sourcenames, "', '")+"')"; 531 573 532 const string fDatabase= conf.Get<string>("source-database");574 const string sourcedb = conf.Get<string>("source-database"); 533 575 const mysqlpp::StoreQueryResult res = 534 Database( fDatabase).query(query).store();576 Database(sourcedb).query(query).store(); 535 577 536 578 // ------------------ Eval config --------------------- … … 609 651 { 610 652 cout << "No source found." << endl; 611 return 0;653 return 1; 612 654 } 613 655 … … 637 679 // --------------------------------------------------------------------- 638 680 639 return 1; 640 641 // ------------- Create canvases and frames --------------------- 642 /* 643 // It is important to use an offset which is larger than 644 // 1970-01-01 00:00:00. This one will not work if your 645 // local time zone is positive! 646 TH1S hframe("", "", 1, Time(sunset).Mjd()*24*3600, Time(sunrise).Mjd()*24*3600); 647 hframe.SetStats(kFALSE); 648 hframe.GetXaxis()->SetTimeFormat("%Hh%M%F1995-01-01 00:00:00 GMT"); 649 hframe.GetXaxis()->SetTitle((Time(jd).GetAsStr("%d/%m/%Y")+" - "+Time(jd+1).GetAsStr("%d/%m/%Y")+" [UTC]").c_str()); 650 hframe.GetXaxis()->CenterTitle(); 651 hframe.GetYaxis()->CenterTitle(); 652 hframe.GetXaxis()->SetTimeDisplay(true); 653 hframe.GetYaxis()->SetTitleSize(0.040); 654 hframe.GetXaxis()->SetTitleSize(0.040); 655 hframe.GetXaxis()->SetTitleOffset(1.1); 656 hframe.GetYaxis()->SetLabelSize(0.040); 657 hframe.GetXaxis()->SetLabelSize(0.040); 658 659 TCanvas c1; 660 c1.SetFillColor(kWhite); 661 c1.SetBorderMode(0); 662 c1.SetFrameBorderMode(0); 663 c1.SetLeftMargin(0.085); 664 c1.SetRightMargin(0.01); 665 c1.SetTopMargin(0.03); 666 c1.SetGrid(); 667 hframe.GetYaxis()->SetTitle("Altitude [deg]"); 668 hframe.SetMinimum(15); 669 hframe.SetMaximum(90); 670 hframe.DrawCopy(); 671 672 TCanvas c2; 673 c2.SetFillColor(kWhite); 674 c2.SetBorderMode(0); 675 c2.SetFrameBorderMode(0); 676 c2.SetLeftMargin(0.085); 677 c2.SetRightMargin(0.01); 678 c2.SetTopMargin(0.03); 679 c2.SetGrid(); 680 hframe.GetYaxis()->SetTitle("Predicted Current [#muA]"); 681 hframe.SetMinimum(0); 682 hframe.SetMaximum(100); 683 hframe.DrawCopy(); 684 685 TCanvas c3; 686 c3.SetFillColor(kWhite); 687 c3.SetBorderMode(0); 688 c3.SetFrameBorderMode(0); 689 c3.SetLeftMargin(0.085); 690 c3.SetRightMargin(0.01); 691 c3.SetTopMargin(0.03); 692 c3.SetGrid(); 693 c3.SetLogy(); 694 hframe.GetYaxis()->SetTitle("Estimated relative threshold"); 695 hframe.GetYaxis()->SetMoreLogLabels(); 696 hframe.SetMinimum(0.9); 697 hframe.SetMaximum(11); 698 hframe.DrawCopy(); 699 700 TCanvas c4; 701 c4.SetFillColor(kWhite); 702 c4.SetBorderMode(0); 703 c4.SetFrameBorderMode(0); 704 c4.SetLeftMargin(0.085); 705 c4.SetRightMargin(0.01); 706 c4.SetTopMargin(0.03); 707 c4.SetGrid(); 708 hframe.GetYaxis()->SetTitle("Distance to moon [deg]"); 709 hframe.SetMinimum(0); 710 hframe.SetMaximum(180); 711 hframe.DrawCopy(); 712 Int_t color[] = { kBlack, kRed, kBlue, kGreen, kCyan, kMagenta }; 713 Int_t style[] = { kSolid, kDashed, kDotted }; 714 715 // TLegend leg(0, 0, 1, 1); 716 717 // ------------- Loop over sources --------------------- 718 719 for (vector<mysqlpp::Row>::const_iterator v=res.begin(); v<res.end(); v++, cnt++) 720 { 721 // Eval row 722 const string name = (*v)[0].c_str(); 723 724 EquPosn pos; 725 pos.ra = double((*v)[1])*15; 726 pos.dec = double((*v)[2]); 727 728 // Loop over 24 hours 729 for (double h=0; h<1; h+=1./(24*12)) 730 { 731 const SolarObjects so(jd+h); 732 733 // get local position of source 734 const HrzPosn hrz = GetHrzFromEqu(pos, so.fJD); 735 736 if (v==res.begin()) 737 cout << Time(so.fJD) <<" " << 90-so.fMoonHrz.alt << endl; 738 739 const double cur = FACT::PredictI(so, pos); 740 741 // Relative energy threshold prediction 742 const double ratio = pow(cos((90-hrz.alt)*M_PI/180), -2.664); 743 744 // Add points to curve 745 const double axis = Time(so.fJD).Mjd()*24*3600; 746 747 // If there is a gap of more than one bin, start a new curve 748 749 // Add data 750 if (no_limits || cur<max_current) 751 g1.SetPoint(g1.GetN(), axis, hrz.alt); 752 753 if (no_limits || 90-hrz.alt<max_zd) 754 g2.SetPoint(g2.GetN(), axis, cur); 755 756 if (no_limits || (cur<max_current && 90-hrz.alt<max_zd)) 757 g3.SetPoint(g3.GetN(), axis, ratio*pow(cur/6.2, 0.394)); 758 759 if (no_limits || (cur<max_current && 90-hrz.alt<max_zd)) 760 { 761 const double angle = GetAngularSeparation(so.fMoonEqu, pos); 762 g4.SetPoint(g4.GetN(), axis, angle); 763 } 764 765 if (cnt==0) 766 gm.SetPoint(gm.GetN(), axis, so.fMoonHrz.alt); 767 } 768 } 769 770 // Save three plots 771 TCanvas c5; 772 c5.SetFillColor(kWhite); 773 c5.SetBorderMode(0); 774 c5.SetFrameBorderMode(0); 775 leg.Draw(); 776 777 const string t = Time(jd).GetAsStr("%Y%m%d"); 778 779 c1.SaveAs((t+"-ZenithDistance.eps").c_str()); 780 c2.SaveAs((t+"-PredictedCurrent.eps").c_str()); 781 c3.SaveAs((t+"-RelativeThreshold.eps").c_str()); 782 c4.SaveAs((t+"-MoonDist.eps").c_str()); 783 c5.SaveAs((t+"-Legend.eps").c_str()); 784 785 c1.SaveAs((t+"-ZenithDistance.root").c_str()); 786 c2.SaveAs((t+"-PredictedCurrent.root").c_str()); 787 c3.SaveAs((t+"-RelativeThreshold.root").c_str()); 788 c4.SaveAs((t+"-MoonDist.root").c_str()); 789 790 c1.Print((t+".pdf(").c_str(), "pdf"); 791 c2.Print((t+".pdf" ).c_str(), "pdf"); 792 c3.Print((t+".pdf" ).c_str(), "pdf"); 793 c4.Print((t+".pdf" ).c_str(), "pdf"); 794 c5.Print((t+".pdf)").c_str(), "pdf"); 795 */ 796 } 681 if (!enter) 682 return 0; 683 684 const string scheduledb = conf.Get<string>("schedule-database"); 685 686 Database db(scheduledb); 687 688 if (enter>0) 689 db.query("LOCK TABLES Schedule WRITE"); 690 691 const int rc = FillSql(db, enter, obs, startup_offset); 692 693 if (enter>0) 694 db.query("UNLOCK TABLES"); 695 696 // --------------------------------------------------------------------- 697 698 return rc; 699 }
Note:
See TracChangeset
for help on using the changeset viewer.