Commit 780828a8f84541a50d539e1cd71059bf9bcf7f81

Authored by Goutte
1 parent 3c2b15fc

Prepare horizontal lines in the time series and change the default time interval.

@@ -5,7 +5,6 @@ @@ -5,7 +5,6 @@
5 - [ ] rajouter MAVEN, New Horizons, Cassini, Galileo, ExoMars comme spacecraft cible 5 - [ ] rajouter MAVEN, New Horizons, Cassini, Galileo, ExoMars comme spacecraft cible
6 - [ ] prévoir la possibilité à l'utilisateur d'afficher le temps en Day Of Year 6 - [ ] prévoir la possibilité à l'utilisateur d'afficher le temps en Day Of Year
7 - [ ] modifier le bandeau vertical d'affichage des choix utilisateurs pour qu'il soit plus petit (en particulier les champs paramètres) 7 - [ ] modifier le bandeau vertical d'affichage des choix utilisateurs pour qu'il soit plus petit (en particulier les champs paramètres)
8 -- [ ] ajouter dans le bandeau vertical un onglet LAYERS avec 3 choix possibles: Jupiter Thermosphere Model, HST Jupiter Observations, HST Saturn Observations  
9 - [ ] ajouter un bouton ALERT qui permet d'ouvrir une nouvelle page de formulaire ou l'utilisateur entrerait les données suivantes: 8 - [ ] ajouter un bouton ALERT qui permet d'ouvrir une nouvelle page de formulaire ou l'utilisateur entrerait les données suivantes:
10 * email 9 * email
11 * target (= planète, spacecraft, comet) 10 * target (= planète, spacecraft, comet)
@@ -14,6 +13,7 @@ @@ -14,6 +13,7 @@
14 - [ ] juno/rosetta doivent aussi bouger le long de leur orbite lorsque l'on parcourt à la souris les données de la série temporelle; pour les intervalles de temps où rosetta n'existe plus (crash à la surface de la comète) il faut qu'elle disparaisse; pour les intervalles de temps où juno est en orbite autour de jupiter il faut que juno suive jupiter 13 - [ ] juno/rosetta doivent aussi bouger le long de leur orbite lorsque l'on parcourt à la souris les données de la série temporelle; pour les intervalles de temps où rosetta n'existe plus (crash à la surface de la comète) il faut qu'elle disparaisse; pour les intervalles de temps où juno est en orbite autour de jupiter il faut que juno suive jupiter
15 -> tout ceci est configurable dans le fichier de configuration, je n'ai pas les ids ! 14 -> tout ceci est configurable dans le fichier de configuration, je n'ai pas les ids !
16 15
  16 +- [ ] ajouter dans le bandeau vertical un onglet LAYERS avec 3 choix possibles: Jupiter Thermosphere Model, HST Jupiter Observations, HST Saturn Observations
17 17
18 ## Future ? 18 ## Future ?
19 19
@@ -33,6 +33,8 @@ @@ -33,6 +33,8 @@
33 ## 1.0.0-rc7 33 ## 1.0.0-rc7
34 34
35 - [ ] Give the future data another color 35 - [ ] Give the future data another color
  36 +- [x] Change the default interval (from 2 months in the past to one in the future)
  37 +- [x] Prepare horizontal lines in the time series
36 - [x] Add buttons to the orbits plot zoom to inner or outer heliosphere 38 - [x] Add buttons to the orbits plot zoom to inner or outer heliosphere
37 - [x] Make the Y-Axis of time series dynamic (at the expense of animations) 39 - [x] Make the Y-Axis of time series dynamic (at the expense of animations)
38 40
@@ -1148,8 +1148,8 @@ def cache_warmup(): @@ -1148,8 +1148,8 @@ def cache_warmup():
1148 Linked to SpaceWeather#edit in swapp.ls to get the default time interval. 1148 Linked to SpaceWeather#edit in swapp.ls to get the default time interval.
1149 If you edit this code you'll need to edit the other as well and vice versa. 1149 If you edit this code you'll need to edit the other as well and vice versa.
1150 """ 1150 """
1151 - before = relativedelta(years=1)  
1152 - after = relativedelta(weeks=3) 1151 + before = relativedelta(months=2)
  1152 + after = relativedelta(months=1)
1153 today = datetime.datetime.now().replace(hour=0, minute=0, second=0) 1153 today = datetime.datetime.now().replace(hour=0, minute=0, second=0)
1154 started_at = today - before 1154 started_at = today - before
1155 stopped_at = today + after 1155 stopped_at = today + after
web/static/js/swapp.js
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 return Target; 14 return Target;
15 }()); 15 }());
16 out$.SpaceWeather = SpaceWeather = (function(){ 16 out$.SpaceWeather = SpaceWeather = (function(){
17 - "The main app, instanciated from an inline script.\nIt defaults to an interval starting a year ago, and ending in seven days.\n(both at midnight)"; 17 + "The main app, instanciated from an inline script.\nIt defaults to an interval starting a month ago, and ending in a month.\n(both at midnight)";
18 SpaceWeather.displayName = 'SpaceWeather'; 18 SpaceWeather.displayName = 'SpaceWeather';
19 var API_TIME_FORMAT, INPUT_TIME_FORMAT, prototype = SpaceWeather.prototype, constructor = SpaceWeather; 19 var API_TIME_FORMAT, INPUT_TIME_FORMAT, prototype = SpaceWeather.prototype, constructor = SpaceWeather;
20 API_TIME_FORMAT = "YYYY-MM-DDTHH:mm:ss"; 20 API_TIME_FORMAT = "YYYY-MM-DDTHH:mm:ss";
@@ -42,8 +42,8 @@ @@ -42,8 +42,8 @@
42 SpaceWeather.prototype.init = function(){ 42 SpaceWeather.prototype.init = function(){
43 "This is called by the inline bootstrap javascript code.\nThis ain't in the constructor because it might return a Promise later on.\n(for the loader, for example)"; 43 "This is called by the inline bootstrap javascript code.\nThis ain't in the constructor because it might return a Promise later on.\n(for the loader, for example)";
44 var started_at, stopped_at, this$ = this; 44 var started_at, stopped_at, this$ = this;
45 - started_at = moment().subtract(1, 'year').hours(0).minutes(0).seconds(0);  
46 - stopped_at = moment().add(3, 'week').hours(0).minutes(0).seconds(0); 45 + started_at = moment().subtract(2, 'month').hours(0).minutes(0).seconds(0);
  46 + stopped_at = moment().add(1, 'month').hours(0).minutes(0).seconds(0);
47 this.setStartAndStop(started_at, stopped_at); 47 this.setStartAndStop(started_at, stopped_at);
48 this.loadAndCreatePlots(started_at, stopped_at); 48 this.loadAndCreatePlots(started_at, stopped_at);
49 window.addEventListener('resize', function(){ 49 window.addEventListener('resize', function(){
@@ -472,7 +472,7 @@ @@ -472,7 +472,7 @@
472 return this.title + " of " + this.target.name; 472 return this.title + " of " + this.target.name;
473 }; 473 };
474 TimeSeries.prototype.init = function(){ 474 TimeSeries.prototype.init = function(){
475 - var formatMillisecond, formatSecond, formatMinute, formatHour, formatDay, formatWeek, formatMonth, formatYear, multiFormat, clipId, dx, this$ = this; 475 + var formatMillisecond, formatSecond, formatMinute, formatHour, formatDay, formatWeek, formatMonth, formatYear, multiFormat, clipId, i$, ref$, len$, line, lineElement, dx, this$ = this;
476 console.info("Initializing plot of " + this + "…"); 476 console.info("Initializing plot of " + this + "…");
477 this.xDataExtent = d3.extent(this.data, function(d){ 477 this.xDataExtent = d3.extent(this.data, function(d){
478 return d.x; 478 return d.x;
@@ -543,6 +543,17 @@ @@ -543,6 +543,17 @@
543 this.pathWrapper = this.plotWrapper.append('g'); 543 this.pathWrapper = this.plotWrapper.append('g');
544 this.pathWrapper.attr("clip-path", "url(#" + clipId + ")"); 544 this.pathWrapper.attr("clip-path", "url(#" + clipId + ")");
545 this.path = this.pathWrapper.append('path').datum(this.data).classed('line', true); 545 this.path = this.pathWrapper.append('path').datum(this.data).classed('line', true);
  546 + this.horizontalLines = [];
  547 + if (this.options['horizontalLines']) {
  548 + for (i$ = 0, len$ = (ref$ = this.options['horizontalLines']).length; i$ < len$; ++i$) {
  549 + line = ref$[i$];
  550 + lineElement = this.svg.append("line").attr("class", "line horitonal-line").style("stroke", "orange").style("stroke-dasharray", "3, 2");
  551 + this.horizontalLines.push({
  552 + 'element': lineElement,
  553 + 'config': line
  554 + });
  555 + }
  556 + }
546 this.brush = this.plotWrapper.append("g").attr("class", "brush"); 557 this.brush = this.plotWrapper.append("g").attr("class", "brush");
547 this.mouseCanvas = this.plotWrapper.append("rect").style("fill", "none"); 558 this.mouseCanvas = this.plotWrapper.append("rect").style("fill", "none");
548 this.plotWrapper.append('g').classed('x axis', true); 559 this.plotWrapper.append('g').classed('x axis', true);
@@ -560,7 +571,7 @@ @@ -560,7 +571,7 @@
560 }; 571 };
561 RATIO = GOLDEN_RATIO * GOLDEN_RATIO * GOLDEN_RATIO * GOLDEN_RATIO; 572 RATIO = GOLDEN_RATIO * GOLDEN_RATIO * GOLDEN_RATIO * GOLDEN_RATIO;
562 TimeSeries.prototype.resize = function(){ 573 TimeSeries.prototype.resize = function(){
563 - var width, height; 574 + var width, height, i$, ref$, len$, line, lineValue;
564 width = Math.ceil($(this.container).width() - this.margin.left - this.margin.right); 575 width = Math.ceil($(this.container).width() - this.margin.left - this.margin.right);
565 height = Math.ceil(RATIO * width); 576 height = Math.ceil(RATIO * width);
566 this.plotWidth = width; 577 this.plotWidth = width;
@@ -571,6 +582,11 @@ @@ -571,6 +582,11 @@
571 this.svg.attr('width', width + this.margin.right + this.margin.left).attr('height', height + this.margin.top + this.margin.bottom); 582 this.svg.attr('width', width + this.margin.right + this.margin.left).attr('height', height + this.margin.top + this.margin.bottom);
572 this.clip.attr("width", width).attr("height", height); 583 this.clip.attr("width", width).attr("height", height);
573 this.path.attr('d', this.line); 584 this.path.attr('d', this.line);
  585 + for (i$ = 0, len$ = (ref$ = this.horizontalLines).length; i$ < len$; ++i$) {
  586 + line = ref$[i$];
  587 + lineValue = this.yScale(line['config']['value']) + this.margin.top;
  588 + line['element'].attr("x1", this.margin.left).attr("y1", lineValue).attr("x2", this.margin.left + width).attr("y2", lineValue);
  589 + }
574 this.xAxis.scale(this.xScale); 590 this.xAxis.scale(this.xScale);
575 this.yAxis.scale(this.yScale); 591 this.yAxis.scale(this.yScale);
576 this.xAxis.ticks(Math.floor(width / 80.0)); 592 this.xAxis.ticks(Math.floor(width / 80.0));
web/static/js/swapp.ls
@@ -31,7 +31,7 @@ class Target @@ -31,7 +31,7 @@ class Target
31 export class SpaceWeather 31 export class SpaceWeather
32 """ 32 """
33 The main app, instanciated from an inline script. 33 The main app, instanciated from an inline script.
34 - It defaults to an interval starting a year ago, and ending in seven days. 34 + It defaults to an interval starting two months ago, and ending in a month.
35 (both at midnight) 35 (both at midnight)
36 """ 36 """
37 37
@@ -75,8 +75,8 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE @@ -75,8 +75,8 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE
75 # Default time interval is from one year ago to three weeks ahead. 75 # Default time interval is from one year ago to three weeks ahead.
76 # We set the h/m/s to zero to benefit from a daily cache. 76 # We set the h/m/s to zero to benefit from a daily cache.
77 # If you edit these values you need to change the cache warmup too (run.py) 77 # If you edit these values you need to change the cache warmup too (run.py)
78 - started_at = moment().subtract(1, 'year').hours(0).minutes(0).seconds(0)  
79 - stopped_at = moment().add(3, 'week').hours(0).minutes(0).seconds(0) 78 + started_at = moment().subtract(2, 'month').hours(0).minutes(0).seconds(0)
  79 + stopped_at = moment().add(1, 'month').hours(0).minutes(0).seconds(0)
80 @setStartAndStop(started_at, stopped_at) 80 @setStartAndStop(started_at, stopped_at)
81 @loadAndCreatePlots(started_at, stopped_at) 81 @loadAndCreatePlots(started_at, stopped_at)
82 window.addEventListener 'resize', ~> @resize() 82 window.addEventListener 'resize', ~> @resize()
@@ -434,6 +434,15 @@ export class TimeSeries @@ -434,6 +434,15 @@ export class TimeSeries
434 .datum(@data) 434 .datum(@data)
435 .classed('line', true) 435 .classed('line', true)
436 436
  437 + @horizontalLines = []
  438 + if @options['horizontalLines']
  439 + for line in @options['horizontalLines']
  440 + lineElement = @svg.append("line")
  441 + .attr("class", "line horitonal-line")
  442 + .style("stroke", "orange") # move to CSS
  443 + .style("stroke-dasharray", ("3, 2")) # idem
  444 + @horizontalLines.push({'element': lineElement, 'config': line})
  445 +
437 @brush = @plotWrapper.append("g") 446 @brush = @plotWrapper.append("g")
438 .attr("class", "brush") 447 .attr("class", "brush")
439 448
@@ -505,6 +514,13 @@ export class TimeSeries @@ -505,6 +514,13 @@ export class TimeSeries
505 514
506 @path.attr('d', @line) 515 @path.attr('d', @line)
507 516
  517 + for line in @horizontalLines
  518 + lineValue = @yScale(line['config']['value']) + @margin.top
  519 + line['element'].attr("x1", @margin.left)
  520 + .attr("y1", lineValue)
  521 + .attr("x2", @margin.left + width)
  522 + .attr("y2", lineValue)
  523 +
508 @xAxis.scale(@xScale) 524 @xAxis.scale(@xScale)
509 @yAxis.scale(@yScale) 525 @yAxis.scale(@yScale)
510 526