49 namespace population {
58 using namespace utils;
61 if( color_map_.empty() ) {
62 throw std::runtime_error(
63 "ColorMap has to be assigned a palette before using HeatmapColorization."
66 if( log_scale_ && diverging_scale_ ) {
67 throw std::runtime_error(
68 "Cannot use log and divergnig scale with HeatmapColorization."
73 if( spectrum.
values.empty() ) {
79 assert( ! spectrum.
values.empty() );
80 size_t rows = spectrum.
values[0].size();
85 for(
size_t c = 0; c < spectrum.
values.size(); ++c ) {
86 auto& col = spectrum.
values[c];
87 if( col.size() != rows ) {
88 throw std::runtime_error(
89 "Invalid allele frequency spectrum with inconsistent number of rows."
103 for(
auto& val : col ) {
104 abs_max = std::max( abs_max, val );
110 auto image = Matrix<Color>( rows, spectrum.
values.size() );
111 for(
size_t c = 0; c < spectrum.
values.size(); ++c ) {
112 auto const& col = spectrum.
values[c];
113 assert( col.size() == rows );
116 double col_max = 0.0;
117 for(
auto const& val : col ) {
118 col_max = std::max( col_max, val );
122 double const used_max =
static_cast<double>( max_per_column_ ? col_max : abs_max );
127 for(
size_t r = 0; r < col.size(); ++r ) {
128 assert( col[r] <= abs_max );
129 assert( col[r] <= col_max );
132 size_t row_idx = invert_vertically_ ? rows - r - 1 : r;
133 assert( row_idx < image.rows() );
138 if( col_max == 0.0 && use_empty_window_color_ ) {
139 image( row_idx, c ) = color_map_( std::numeric_limits<double>::quiet_NaN() );
157 assert( std::isfinite(col[r]) );
170 if( used_max <= 1.0 ) {
171 image( row_idx, c ) = color_map_( std::numeric_limits<double>::quiet_NaN() );
175 auto norm = ColorNormalizationLogarithmic( 1.0, used_max );
176 image( row_idx, c ) = color_map_( norm(col[r]) );
178 }
else if( diverging_scale_ ) {
180 auto norm = ColorNormalizationDiverging( -used_max, used_max );
181 image( row_idx, c ) = color_map_( norm(col[r]) );
184 double frac =
static_cast<double>( col[r] ) / used_max;
185 image( row_idx, c ) = color_map_( frac );
191 return { image, max_per_column_ ? 1 : abs_max };
202 return {
make_svg_matrix( spec_img_and_max.first, settings ), spec_img_and_max.second };
207 std::shared_ptr<utils::BaseOutputTarget> target
215 return spec_img_and_max.second;