/**
  * Add a new geodispersion analysis in the database, in a transactional manner.
  * When successful, eturns the newly created GeoAnalysis object.
  * 
  * @param string $description geodispersion analysis title
  * @param int $analysis_level Analysis level
  * @param string $map_file Filename of the map
  * @param int $map_top_level Parent level of the map
  * @param bool $use_flags Use flag in the place display
  * @param int $gen_details Number of top places to display
  * @return GeoAnalysis
  */
 public function createGeoAnalysis($description, $analysis_level, $map_file, $map_top_level, $use_flags, $gen_details)
 {
     try {
         Database::beginTransaction();
         Database::prepare('INSERT INTO `##maj_geodispersion`' . ' (majgd_file, majgd_descr, majgd_sublevel, majgd_map, majgd_toplevel, majgd_useflagsgen, majgd_detailsgen)' . ' VALUES (:gedcom_id, :description, :analysis_level, :map, :map_top_level, :use_flags, :gen_details)')->execute(array('gedcom_id' => $this->tree->getTreeId(), 'description' => $description, 'analysis_level' => $analysis_level, 'use_flags' => $use_flags ? 'yes' : 'no', 'gen_details' => $gen_details, 'map' => $map_file, 'map_top_level' => $map_top_level));
         $id = Database::lastInsertId();
         $ga = $this->getGeoAnalysis($id, false);
         Database::commit();
     } catch (\Exception $ex) {
         Database::rollback();
         $ga = null;
         Log::addErrorLog('A new Geo Analysis failed to be created. Transaction rollbacked. Parameters [' . $description . ', ' . $analysis_level . ',' . $map_file . ',' . $map_top_level . ',' . $use_flags . ', ' . $gen_details . ']. Exception: ' . $ex->getMessage());
     }
     return $ga;
 }