/**
  * @return array
  */
 protected function computeZones()
 {
     // TODO
     // - move this a calculation class
     // - make zones configurable
     $Zones = array();
     $SmoothTrackdata = clone $this->Context->trackdata();
     $Smoother = new PaceSmoother($SmoothTrackdata, true);
     $SmoothTrackdata->set(Trackdata\Object::PACE, $Smoother->smooth(self::STEP_SIZE, PaceSmoother::MODE_STEP));
     $hasHR = $this->Context->trackdata()->has(Trackdata\Object::HEARTRATE);
     $Distribution = new TimeSeriesForTrackdata($SmoothTrackdata, Trackdata\Object::PACE, array(Trackdata\Object::DISTANCE), $hasHR ? array(Trackdata\Object::HEARTRATE) : array());
     $Data = $Distribution->data();
     foreach ($Distribution->histogram() as $paceInSeconds => $seconds) {
         $pace = $this->zoneFor($paceInSeconds);
         if (!isset($Zones[$pace])) {
             $Zones[$pace] = array('time' => $seconds, 'distance' => $Data[$paceInSeconds][Trackdata\Object::DISTANCE], 'hr' => $hasHR ? $Data[$paceInSeconds][Trackdata\Object::HEARTRATE] * $seconds : 0);
         } else {
             $Zones[$pace]['time'] += $seconds;
             $Zones[$pace]['distance'] += $Data[$paceInSeconds][Trackdata\Object::DISTANCE];
             $Zones[$pace]['hr'] += $hasHR ? $Data[$paceInSeconds][Trackdata\Object::HEARTRATE] * $seconds : 0;
         }
     }
     ksort($Zones, SORT_NUMERIC);
     return $Zones;
 }
 /**
  * @return array
  */
 protected function computeZones()
 {
     // TODO
     // - move this a calculation class
     // - make zones configurable
     $Zones = array();
     $hrMax = Runalyze\Configuration::Data()->HRmax();
     $hasDistance = $this->Context->trackdata()->has(Trackdata\Entity::DISTANCE);
     $Distribution = new TimeSeriesForTrackdata($this->Context->trackdata(), Trackdata\Entity::HEARTRATE, $hasDistance ? array(Trackdata\Entity::DISTANCE) : array());
     $Data = $Distribution->data();
     foreach ($Distribution->histogram() as $bpm => $seconds) {
         $hf = $this->zoneFor($bpm, $hrMax);
         if (!isset($Zones[$hf])) {
             $Zones[$hf] = array('time' => $seconds, 'distance' => $hasDistance ? $Data[$bpm][Trackdata\Entity::DISTANCE] : 0);
         } else {
             $Zones[$hf]['time'] += $seconds;
             $Zones[$hf]['distance'] += $hasDistance ? $Data[$bpm][Trackdata\Entity::DISTANCE] : 0;
         }
     }
     ksort($Zones, SORT_NUMERIC);
     return $Zones;
 }
 public function testSimpleArray()
 {
     $Dist = new TimeSeriesForTrackdata(new Trackdata\Object(array(Trackdata\Object::TIME => array(30, 60, 90, 120, 150, 180, 210, 240, 270, 300), Trackdata\Object::HEARTRATE => array(120, 120, 150, 150, 150, 180, 150, 180, 150, 120), Trackdata\Object::DISTANCE => array(0.1, 0.2, 0.35, 0.5, 0.65, 0.85, 1.0, 1.2, 1.35, 1.45), Trackdata\Object::CADENCE => array(80, 84, 85, 90, 95, 100, 95, 100, 95, 85), Trackdata\Object::GROUNDCONTACT => array(200, 185, 170, 160, 150, 120, 200, 120, 200, 200))), Trackdata\Object::HEARTRATE, array(Trackdata\Object::DISTANCE), array(Trackdata\Object::CADENCE, Trackdata\Object::GROUNDCONTACT));
     $this->assertEquals(array(120 => 90, 150 => 150, 180 => 60), $Dist->histogram());
     $this->assertEquals(array(120 => array(Trackdata\Object::DISTANCE => 0.3, Trackdata\Object::CADENCE => 83, Trackdata\Object::GROUNDCONTACT => 195), 150 => array(Trackdata\Object::DISTANCE => 0.75, Trackdata\Object::CADENCE => 92, Trackdata\Object::GROUNDCONTACT => 176), 180 => array(Trackdata\Object::DISTANCE => 0.4, Trackdata\Object::CADENCE => 100, Trackdata\Object::GROUNDCONTACT => 120)), $Dist->data());
 }