Feature #1733
Handle >3 dimensional maps in GSkyMap
Status: | Closed | Start date: | 03/05/2016 | |
---|---|---|---|---|
Priority: | Normal | Due date: | ||
Assigned To: | Knödlseder Jürgen | % Done: | 100% | |
Category: | - | |||
Target version: | 1.1.0 | |||
Duration: |
Description
The GTuple
class should implement an integer tuple that can be used to pass an arbitrary number of indices as argument to a method. Use cases for this class are the map
argument of the GSkyMap
class to allow the creation of n-dimensional map cubes, and the FITS image pixel access operators.
Here a draft of the class:
class GTuple : public GBase {
public:
// Constructors
GTuple(void);
GTuple(const int& i1);
GTuple(const int& i1, const int& i2);
GTuple(const int& i1, const int& i2, const int& i3);
GTuple(const std::vector<int>& index);
// Operators
int& operator[](const int& i);
const int& operator[](const int& i) const;
// Methods
int size(void) const
protected:
// Data members
int m_size;
int m_index1;
int m_index2;
int m_index3;
std::vector<int> m_index;
Recurrence
No recurrence.
History
#1 Updated by Knödlseder Jürgen over 8 years ago
I’m not fully sure that a GTuple
class is indeed needed. An alternative approach would be to use a variadic function (see http://en.cppreference.com/w/cpp/utility/variadic) to define an arbitrary number of additional dimensions in GSkyMap
. The advantage of this approach would be that the current GSkyMap
interface could be basically kept, and that GSkyMap
would have additional methods for higher map dimensions.
Here some C++ use cases that use an extension of the current format:
GSkyPixel pix;
GSkyDir dir;
GSkyMap map("CAR", "CEL", 0.0, 0.0, 0.1, 0.1, 100, 100, 10, 10);
double value1 = map(pix,0,1);
double value2 = map(dir,0,1);
and Python use casespix = gammalib.GSkyPixel()
dir = gammalib.GSkyDir()
map = gammalib.GSkyMap("CAR", "CEL", 0.0, 0.0, 0.1, 0.1, 100, 100, 10, 10)
value1 = map(pix,0,1)
value2 = map(dir,0,1)
#2 Updated by Knödlseder Jürgen over 8 years ago
- Subject changed from Create GTuple class to Handle >3 dimensional than maps in GSkyMap
#3 Updated by Knödlseder Jürgen over 8 years ago
- Subject changed from Handle >3 dimensional than maps in GSkyMap to Handle >3 dimensional maps in GSkyMap
#4 Updated by Knödlseder Jürgen over 8 years ago
It’s maybe sufficient (at least for now) to add a shape()
method, along the logic that numpy uses, to define the shape of the maps. For example
GSkyMap map("CAR", "CEL", 0.0, 0.0, 0.1, 0.1, 100, 100, 10);
map.shape(5,2);
would organise the 10 maps in the objects into a two-dimensional array with axes lengths of 5 times 2 (the
shape()
method would throw an exception in case that the total number of maps in the GSkyMap
object is not equal to the product of the shape arguments.
When GSkyMap
loads a map it will automatically determine the shape from the FITS file dimension, and compute the total number of maps as the product of the shape parameters.
A method ndim()
should be added that returns the dimension of the shape part (in analogy to numpy again).
#5 Updated by Knödlseder Jürgen over 8 years ago
- Status changed from New to Closed
- Assigned To set to Knödlseder Jürgen
- Target version set to 1.1.0
- % Done changed from 0 to 100
The change has been implemented, unit tests have been added, is now in devel
.