54#define G_RESPONSE "GCOMObservation::response(GResponse&)"
55#define G_READ "GCOMObservation::read(GXmlElement&)"
56#define G_WRITE "GCOMObservation::write(GXmlElement&)"
57#define G_LOAD_DRB "GCOMObservation::load_drb(GFilename&)"
58#define G_LOAD_DRW "GCOMObservation::load_drw(GFilename&)"
59#define G_LOAD_DRG "GCOMObservation::load_drg(GFilename&)"
60#define G_CONVOLVE "GCOMObservation::convolve(GModels&)"
61#define G_DRM "GCOMObservation::drm(GModels&)"
62#define G_COMPUTE_DRB "GCOMObservation::compute_drb(std::string&, GCOMDri&, "\
63 "int&, int&, int&, int&"
64#define G_COMPUTE_DRB_PHINOR "GCOMObservation::compute_drb_phinor(GCOMDri&)"
65#define G_COMPUTE_DRB_BGDLIXA "GCOMObservation::compute_drb_bgdlixa("\
66 "GCOMDri&, int&, int&, int&, int&)"
67#define G_COMPUTE_DRB_BGDLIXE "GCOMObservation::compute_drb_bgdlixe("\
68 "GCOMDri&, int&, int&, int&, int&)"
69#define G_COMPUTE_DRB_BGDLIXF "GCOMObservation::compute_drb_bgdlixf("\
70 "GCOMDri&, int&, int&, int&, int&)"
75#define G_ONLY_VALID_PHIBAR
270 const std::vector<GFilename>& oadnames,
271 const std::vector<GFilename>& hkdnames,
278 load(evpname, timname, oadnames, hkdnames, bvcname);
405 if (comrsp == NULL) {
406 std::string cls = std::string(
typeid(&rsp).
name());
407 std::string msg =
"Response of type \""+cls+
"\" is "
408 "not a COMPTEL response. Please specify a COMPTEL "
409 "response as argument.";
467 int nevents = model_vector.
size();
470 for (
int i = 0; i < nevents; ++i) {
482 double model_value = model_vector[i] * bin->
size();
485 npred += model_value;
552 std::vector<GFilename> oadnames;
553 for (
int i = 0; i < xml.
elements(
"parameter"); ++i) {
555 if (element->
attribute(
"name") ==
"OAD") {
556 std::string oadname = element->
attribute(
"file");
563 std::vector<GFilename> hkdnames;
564 for (
int i = 0; i < xml.
elements(
"parameter"); ++i) {
566 if (element->
attribute(
"name") ==
"HKD") {
567 std::string hkdname = element->
attribute(
"file");
574 std::string bvcname =
"";
581 load(evpname, timname, oadnames, hkdnames, bvcname);
613 GFilename filename_expanded(iaqname_expanded);
614 if (filename_expanded.
is_fits()) {
713 for (
int i = 0; i < xml.
elements(
"parameter"); ++i) {
715 if (element->
attribute(
"name") ==
"OAD") {
863 const std::vector<GFilename>& oadnames,
864 const std::vector<GFilename>& hkdnames,
889 std::vector<GCOMOads>
oads;
892 for (
int i = 0; i < oadnames.size(); ++i) {
898 if (oad.
size() < 1) {
904 for (; index <
oads.
size(); ++index) {
905 if (oad[0].tstop() <
oads[index][
oads[index].size()-1].tstart()) {
921 for (
int i = 0; i <
oads.
size(); ++i) {
926 for (
int i = 0; i < hkdnames.size(); ++i) {
932 if (hdks.
size() < 1) {
976 std::string msg =
"Events of type \""+cls+
"\" is not a COMPTEL event "
977 "cube. Please specify a COMPTEL event cube when "
978 "using this method.";
989 for (
int i = 0; i < drm_cube.
size(); ++i) {
1037 if (method ==
"PHINOR") {
1040 else if (method ==
"BGDLIXA") {
1043 else if (method ==
"BGDLIXE") {
1046 else if (method ==
"BGDLIXF") {
1050 std::string msg =
"Unknown background method \""+method+
"\". "
1051 "Specify either \"PHINOR\", \"BGDLIXA\" or "
1103 result.append(
"=== GCOMObservation ===");
1123 result.append(
" - ");
1377 std::string msg =
"DRB data cube \""+
drbname+
"\" incompatible with "
1421 std::string msg =
"DRW data cube \""+
drwname+
"\" incompatible with "
1466 std::string msg =
"DRG data cube \""+
drgname+
"\" incompatible with "
1527 bool same_dimension = ((map.
nx() == ref.
nx()) &&
1528 (map.
ny() == ref.
ny()) &&
1532 bool same_projection =
false;
1535 if ((proj_ref == NULL) && (proj_map == NULL)) {
1536 same_projection =
true;
1538 else if ((proj_ref != NULL) && (proj_map != NULL)) {
1539 same_projection = (*proj_map == *proj_ref);
1543 return (same_dimension && same_projection);
1611 std::string msg =
"Observation \""+this->
name()+
"\" ("+this->
id()+
") "
1612 "does not contain a COMPTEL event cube. Please "
1613 "specify a COMPTEL observation containing and event "
1620 std::string msg =
"Specified DRM cube is incompatible with DRE. Please "
1621 "specify a DRM with a data-space definition that is "
1622 "identical to that of the DRE.";
1640 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1641 double sum_dre = 0.0;
1642 double sum_drm = 0.0;
1643 double sum_drg = 0.0;
1644 for (
int ipix = 0; ipix < npix; ++ipix) {
1645 sum_dre += map_dre(ipix, iphibar);
1646 sum_drm += map_drm(ipix, iphibar);
1647 sum_drg += map_drg(ipix, iphibar);
1649 if (sum_drg > 0.0) {
1650 double norm = (sum_dre - sum_drm) / sum_drg;
1651 for (
int ipix = 0; ipix < npix; ++ipix) {
1652 map_drb(ipix, iphibar) = map_drg(ipix, iphibar) *
norm;
1656 for (
int ipix = 0; ipix < npix; ++ipix) {
1657 map_drb(ipix, iphibar) = 0.0;
1663 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1664 for (
int ipix = 0; ipix < npix; ++ipix) {
1665 if (map_drb(ipix, iphibar) < 0.0) {
1666 map_drb(ipix, iphibar) = 0.0;
1703 std::string msg =
"Observation \""+this->
name()+
"\" ("+this->
id()+
") "
1704 "does not contain a COMPTEL event cube. Please "
1705 "specify a COMPTEL observation containing and event "
1712 std::string msg =
"Specified DRM cube is incompatible with DRE. Please "
1713 "specify a DRM with a data-space definition that is "
1714 "identical to that of the DRE.";
1733 int npix = nchi * npsi;
1736 int navgr2 = int(navgr/2);
1739 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1740 for (
int ipix = 0; ipix < npix; ++ipix) {
1741 map_drb(ipix, iphibar) = 0.0;
1742 map_dri(ipix, iphibar) = 0.0;
1747 #if defined(G_ONLY_VALID_PHIBAR)
1748 int iphibar_min = -1;
1749 int iphibar_max = -1;
1750 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1751 double sum_dre = 0.0;
1752 double sum_drm = 0.0;
1753 double sum_drg = 0.0;
1754 for (
int ipix = 0; ipix < npix; ++ipix) {
1755 sum_dre += map_dre(ipix, iphibar);
1756 sum_drm += map_drm(ipix, iphibar);
1757 sum_drg += map_drg(ipix, iphibar);
1759 if (sum_drg > 0.0) {
1760 double norm = (sum_dre - sum_drm) / sum_drg;
1761 for (
int ipix = 0; ipix < npix; ++ipix) {
1762 map_dri(ipix, iphibar) = map_drg(ipix, iphibar) *
norm;
1765 if (sum_dre > 0.0) {
1766 if (iphibar_min == -1) {
1767 iphibar_min = iphibar;
1769 iphibar_max = iphibar;
1773 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1774 double sum_dre = 0.0;
1775 double sum_drm = 0.0;
1776 double sum_drg = 0.0;
1777 for (
int ipix = 0; ipix < npix; ++ipix) {
1778 sum_dre += map_dre(ipix, iphibar);
1779 sum_drm += map_drm(ipix, iphibar);
1780 sum_drg += map_drg(ipix, iphibar);
1782 if (sum_drg > 0.0) {
1783 double norm = (sum_dre - sum_drm) / sum_drg;
1784 for (
int ipix = 0; ipix < npix; ++ipix) {
1785 map_dri(ipix, iphibar) = map_drg(ipix, iphibar) *
norm;
1799 for (
int ichi = 0; ichi < nchi; ++ichi) {
1802 int kchi_min = ichi - nrunav;
1803 int kchi_max = ichi + nrunav;
1807 if (kchi_max >= nchi) {
1808 kchi_max = nchi - 1;
1812 for (
int ipsi = 0; ipsi < npsi; ++ipsi) {
1815 int kpsi_min = ipsi - nrunav;
1816 int kpsi_max = ipsi + nrunav;
1820 if (kpsi_max >= npsi) {
1821 kpsi_max = npsi - 1;
1825 double sum_dre = 0.0;
1826 double sum_drm = 0.0;
1827 double sum_dri = 0.0;
1830 for (
int kchi = kchi_min; kchi <= kchi_max; ++kchi) {
1831 for (
int kpsi = kpsi_min; kpsi <= kpsi_max; ++kpsi) {
1832 int kpix = kchi + kpsi * nchi;
1833 #if defined(G_ONLY_VALID_PHIBAR)
1834 for (
int kphibar = iphibar_min; kphibar <= iphibar_max; ++kphibar) {
1836 for (
int kphibar = 0; kphibar < nphibar; ++kphibar) {
1838 if (map_drg(kpix, kphibar) != 0.0) {
1839 sum_dre += map_dre(kpix, kphibar);
1840 sum_drm += map_drm(kpix, kphibar);
1841 sum_dri += map_dri(kpix, kphibar);
1848 if (sum_dri != 0.0) {
1849 int ipix = ichi + ipsi * nchi;
1850 double norm = (sum_dre - sum_drm) / sum_dri;
1851 #if defined(G_ONLY_VALID_PHIBAR)
1852 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
1854 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1856 map_dri(ipix, iphibar) *=
norm;
1873 #if defined(G_ONLY_VALID_PHIBAR)
1874 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
1876 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1880 #if defined(G_ONLY_VALID_PHIBAR)
1882 &ksel1, &kex1, &kex2, &ksel2);
1885 &ksel1, &kex1, &kex2, &ksel2);
1889 for (
int ipix = 0; ipix < npix; ++ipix) {
1892 map_drb(ipix, iphibar) = 0.0;
1895 if (map_dri(ipix, iphibar) != 0.0) {
1898 double sum_dri = 0.0;
1901 #if defined(G_ONLY_VALID_PHIBAR)
1902 if (kex1 >= iphibar_min) {
1906 for (
int kphibar = ksel1; kphibar <= kex1; ++kphibar) {
1907 sum_dri += map_dri(ipix, kphibar);
1912 #if defined(G_ONLY_VALID_PHIBAR)
1913 if (kex2 <= iphibar_max) {
1915 if (kex2 < nphibar) {
1917 for (
int kphibar = kex2; kphibar <= ksel2; ++kphibar) {
1918 sum_dri += map_dri(ipix, kphibar);
1923 if (sum_dri != 0.0) {
1924 map_drb(ipix, iphibar) = map_dri(ipix, iphibar) / sum_dri;
1943 for (
int ichi = 0; ichi < nchi; ++ichi) {
1946 int kchi_min = ichi - navgr2;
1947 int kchi_max = ichi + navgr2;
1951 if (kchi_max >= nchi) {
1952 kchi_max = nchi - 1;
1956 for (
int ipsi = 0; ipsi < npsi; ++ipsi) {
1959 int kpsi_min = ipsi - navgr2;
1960 int kpsi_max = ipsi + navgr2;
1964 if (kpsi_max >= npsi) {
1965 kpsi_max = npsi - 1;
1969 #if defined(G_ONLY_VALID_PHIBAR)
1970 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
1972 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
1976 double sum_dre = 0.0;
1977 double sum_drm = 0.0;
1978 double sum_drg = 0.0;
1981 for (
int kchi = kchi_min; kchi <= kchi_max; ++kchi) {
1982 for (
int kpsi = kpsi_min; kpsi <= kpsi_max; ++kpsi) {
1983 int kpix = kchi + kpsi * nchi;
1984 sum_dre += map_dre(kpix, iphibar);
1985 sum_drm += map_drm(kpix, iphibar);
1986 sum_drg += map_drg(kpix, iphibar);
1991 int ipix = ichi + ipsi * nchi;
1992 if (sum_drg > 0.0) {
1993 double norm = (sum_dre - sum_drm) / sum_drg;
1994 map_dri(ipix, iphibar) = map_drg(ipix, iphibar) *
norm;
1997 map_dri(ipix, iphibar) = 0.0;
2009 #if defined(G_ONLY_VALID_PHIBAR)
2010 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2012 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2016 #if defined(G_ONLY_VALID_PHIBAR)
2018 &ksel1, &kex1, &kex2, &ksel2);
2021 &ksel1, &kex1, &kex2, &ksel2);
2025 for (
int ipix = 0; ipix < npix; ++ipix) {
2028 if (map_drb(ipix, iphibar) != 0.0) {
2031 double sum_dri = 0.0;
2034 #if defined(G_ONLY_VALID_PHIBAR)
2035 if (kex1 >= iphibar_min) {
2039 for (
int kphibar = ksel1; kphibar <= kex1; ++kphibar) {
2040 sum_dri += map_dri(ipix, kphibar);
2045 #if defined(G_ONLY_VALID_PHIBAR)
2046 if (kex2 <= iphibar_max) {
2048 if (kex2 < nphibar) {
2050 for (
int kphibar = kex2; kphibar <= ksel2; ++kphibar) {
2051 sum_dri += map_dri(ipix, kphibar);
2056 map_drb(ipix, iphibar) *= sum_dri;
2065 #if defined(G_ONLY_VALID_PHIBAR)
2066 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2068 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2070 double sum_dre = 0.0;
2071 double sum_drm = 0.0;
2072 double sum_drb = 0.0;
2073 for (
int ipix = 0; ipix < npix; ++ipix) {
2074 sum_dre += map_dre(ipix, iphibar);
2075 sum_drm += map_drm(ipix, iphibar);
2076 sum_drb += map_drb(ipix, iphibar);
2078 if (sum_drb > 0.0) {
2079 double norm = (sum_dre - sum_drm) / sum_drb;
2080 for (
int ipix = 0; ipix < npix; ++ipix) {
2081 map_drb(ipix, iphibar) *=
norm;
2085 for (
int ipix = 0; ipix < npix; ++ipix) {
2086 map_drb(ipix, iphibar) = 0.0;
2092 #if defined(G_ONLY_VALID_PHIBAR)
2093 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2095 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2097 for (
int ipix = 0; ipix < npix; ++ipix) {
2098 if (map_drb(ipix, iphibar) < 0.0) {
2099 map_drb(ipix, iphibar) = 0.0;
2135 std::string msg =
"Observation \""+this->
name()+
"\" ("+this->
id()+
") "
2136 "does not contain a COMPTEL event cube. Please "
2137 "specify a COMPTEL observation containing and event "
2144 std::string msg =
"Specified DRM cube is incompatible with DRE. Please "
2145 "specify a DRM with a data-space definition that is "
2146 "identical to that of the DRE.";
2165 int npix = nchi * npsi;
2168 int navgr2 = int(navgr/2);
2171 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2172 for (
int ipix = 0; ipix < npix; ++ipix) {
2173 map_drb(ipix, iphibar) = 0.0;
2174 map_dri(ipix, iphibar) = 0.0;
2179 #if defined(G_ONLY_VALID_PHIBAR)
2180 int iphibar_min = -1;
2181 int iphibar_max = -1;
2182 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2183 double sum_dre = 0.0;
2184 double sum_drm = 0.0;
2185 double sum_drg = 0.0;
2186 for (
int ipix = 0; ipix < npix; ++ipix) {
2187 sum_dre += map_dre(ipix, iphibar);
2188 sum_drm += map_drm(ipix, iphibar);
2189 sum_drg += map_drg(ipix, iphibar);
2191 if (sum_drg > 0.0) {
2192 double norm = (sum_dre - sum_drm) / sum_drg;
2193 for (
int ipix = 0; ipix < npix; ++ipix) {
2194 map_dri(ipix, iphibar) = map_drg(ipix, iphibar) *
norm;
2197 if (sum_dre > 0.0) {
2198 if (iphibar_min == -1) {
2199 iphibar_min = iphibar;
2201 iphibar_max = iphibar;
2205 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2206 double sum_dre = 0.0;
2207 double sum_drm = 0.0;
2208 double sum_drg = 0.0;
2209 for (
int ipix = 0; ipix < npix; ++ipix) {
2210 sum_dre += map_dre(ipix, iphibar);
2211 sum_drm += map_drm(ipix, iphibar);
2212 sum_drg += map_drg(ipix, iphibar);
2214 if (sum_drg > 0.0) {
2215 double norm = (sum_dre - sum_drm) / sum_drg;
2216 for (
int ipix = 0; ipix < npix; ++ipix) {
2217 map_dri(ipix, iphibar) = map_drg(ipix, iphibar) *
norm;
2224 for (
int ichi = 0; ichi < nchi; ++ichi) {
2227 int kchi_min = ichi - navgr2;
2228 int kchi_max = ichi + navgr2;
2232 if (kchi_max >= nchi) {
2233 kchi_max = nchi - 1;
2237 for (
int ipsi = 0; ipsi < npsi; ++ipsi) {
2240 int kpsi_min = ipsi - navgr2;
2241 int kpsi_max = ipsi + navgr2;
2245 if (kpsi_max >= npsi) {
2246 kpsi_max = npsi - 1;
2250 #if defined(G_ONLY_VALID_PHIBAR)
2251 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2253 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2261 #if defined(G_ONLY_VALID_PHIBAR)
2263 &ksel1, &kex1, &kex2, &ksel2);
2266 &ksel1, &kex1, &kex2, &ksel2);
2270 double sum_dre = 0.0;
2271 double sum_drm = 0.0;
2272 double sum_dri = 0.0;
2275 for (
int kchi = kchi_min; kchi <= kchi_max; ++kchi) {
2276 for (
int kpsi = kpsi_min; kpsi <= kpsi_max; ++kpsi) {
2279 int kpix = kchi + kpsi * nchi;
2282 #if defined(G_ONLY_VALID_PHIBAR)
2283 if (kex1 >= iphibar_min) {
2287 for (
int kphibar = ksel1; kphibar <= kex1; ++kphibar) {
2288 sum_dre += map_dre(kpix, kphibar);
2289 sum_drm += map_drm(kpix, kphibar);
2290 sum_dri += map_dri(kpix, kphibar);
2295 #if defined(G_ONLY_VALID_PHIBAR)
2296 if (kex2 <= iphibar_max) {
2298 if (kex2 < nphibar) {
2300 for (
int kphibar = kex2; kphibar <= ksel2; ++kphibar) {
2301 sum_dre += map_dre(kpix, kphibar);
2302 sum_drm += map_drm(kpix, kphibar);
2303 sum_dri += map_dri(kpix, kphibar);
2311 int ipix = ichi + ipsi * nchi;
2312 if (sum_dri > 0.0) {
2313 double norm = (sum_dre - sum_drm) / sum_dri;
2314 map_drb(ipix, iphibar) = map_dri(ipix, iphibar) *
norm;
2317 map_drb(ipix, iphibar) = 0.0;
2327 #if defined(G_ONLY_VALID_PHIBAR)
2328 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2330 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2332 double sum_dre = 0.0;
2333 double sum_drm = 0.0;
2334 double sum_drb = 0.0;
2335 for (
int ipix = 0; ipix < npix; ++ipix) {
2336 sum_dre += map_dre(ipix, iphibar);
2337 sum_drm += map_drm(ipix, iphibar);
2338 sum_drb += map_drb(ipix, iphibar);
2340 if (sum_drb > 0.0) {
2341 double norm = (sum_dre - sum_drm) / sum_drb;
2342 for (
int ipix = 0; ipix < npix; ++ipix) {
2343 map_drb(ipix, iphibar) *=
norm;
2347 for (
int ipix = 0; ipix < npix; ++ipix) {
2348 map_drb(ipix, iphibar) = 0.0;
2354 #if defined(G_ONLY_VALID_PHIBAR)
2355 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2357 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2359 for (
int ipix = 0; ipix < npix; ++ipix) {
2360 if (map_drb(ipix, iphibar) < 0.0) {
2361 map_drb(ipix, iphibar) = 0.0;
2398 std::string msg =
"Observation \""+this->
name()+
"\" ("+this->
id()+
") "
2399 "does not contain a COMPTEL event cube. Please "
2400 "specify a COMPTEL observation containing and event "
2407 std::string msg =
"Specified DRM cube is incompatible with DRE. Please "
2408 "specify a DRM with a data-space definition that is "
2409 "identical to that of the DRE.";
2428 int npix = nchi * npsi;
2431 int navgr2 = int(navgr/2);
2434 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2435 for (
int ipix = 0; ipix < npix; ++ipix) {
2436 map_drb(ipix, iphibar) = 0.0;
2437 map_dri(ipix, iphibar) = 0.0;
2442 #if defined(G_ONLY_VALID_PHIBAR)
2443 int iphibar_min = -1;
2444 int iphibar_max = -1;
2445 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2446 double sum_dre = 0.0;
2447 double sum_drm = 0.0;
2448 double sum_drw = 0.0;
2449 for (
int ipix = 0; ipix < npix; ++ipix) {
2450 sum_dre += map_dre(ipix, iphibar);
2451 sum_drm += map_drm(ipix, iphibar);
2452 sum_drw += map_drw(ipix, iphibar);
2454 if (sum_drw > 0.0) {
2455 double norm = (sum_dre - sum_drm) / sum_drw;
2456 for (
int ipix = 0; ipix < npix; ++ipix) {
2457 map_dri(ipix, iphibar) = map_drw(ipix, iphibar) *
norm;
2460 if (sum_dre > 0.0) {
2461 if (iphibar_min == -1) {
2462 iphibar_min = iphibar;
2464 iphibar_max = iphibar;
2468 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2469 double sum_dre = 0.0;
2470 double sum_drm = 0.0;
2471 double sum_drw = 0.0;
2472 for (
int ipix = 0; ipix < npix; ++ipix) {
2473 sum_dre += map_dre(ipix, iphibar);
2474 sum_drm += map_drm(ipix, iphibar);
2475 sum_drw += map_drw(ipix, iphibar);
2477 if (sum_drw > 0.0) {
2478 double norm = (sum_dre - sum_drm) / sum_drw;
2479 for (
int ipix = 0; ipix < npix; ++ipix) {
2480 map_dri(ipix, iphibar) = map_drw(ipix, iphibar) *
norm;
2487 for (
int ichi = 0; ichi < nchi; ++ichi) {
2490 int kchi_min = ichi - navgr2;
2491 int kchi_max = ichi + navgr2;
2495 if (kchi_max >= nchi) {
2496 kchi_max = nchi - 1;
2500 for (
int ipsi = 0; ipsi < npsi; ++ipsi) {
2503 int kpsi_min = ipsi - navgr2;
2504 int kpsi_max = ipsi + navgr2;
2508 if (kpsi_max >= npsi) {
2509 kpsi_max = npsi - 1;
2513 #if defined(G_ONLY_VALID_PHIBAR)
2514 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2516 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2524 #if defined(G_ONLY_VALID_PHIBAR)
2526 &ksel1, &kex1, &kex2, &ksel2);
2529 &ksel1, &kex1, &kex2, &ksel2);
2533 double sum_dre = 0.0;
2534 double sum_drm = 0.0;
2535 double sum_dri = 0.0;
2538 for (
int kchi = kchi_min; kchi <= kchi_max; ++kchi) {
2539 for (
int kpsi = kpsi_min; kpsi <= kpsi_max; ++kpsi) {
2542 int kpix = kchi + kpsi * nchi;
2545 #if defined(G_ONLY_VALID_PHIBAR)
2546 if (kex1 >= iphibar_min) {
2550 for (
int kphibar = ksel1; kphibar <= kex1; ++kphibar) {
2551 sum_dre += map_dre(kpix, kphibar);
2552 sum_drm += map_drm(kpix, kphibar);
2553 sum_dri += map_dri(kpix, kphibar);
2558 #if defined(G_ONLY_VALID_PHIBAR)
2559 if (kex2 <= iphibar_max) {
2561 if (kex2 < nphibar) {
2563 for (
int kphibar = kex2; kphibar <= ksel2; ++kphibar) {
2564 sum_dre += map_dre(kpix, kphibar);
2565 sum_drm += map_drm(kpix, kphibar);
2566 sum_dri += map_dri(kpix, kphibar);
2574 int ipix = ichi + ipsi * nchi;
2575 if (sum_dri > 0.0) {
2576 double norm = (sum_dre - sum_drm) / sum_dri;
2577 map_drb(ipix, iphibar) = map_dri(ipix, iphibar) *
norm;
2580 map_drb(ipix, iphibar) = 0.0;
2590 #if defined(G_ONLY_VALID_PHIBAR)
2591 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2593 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2595 double sum_dre = 0.0;
2596 double sum_drm = 0.0;
2597 double sum_drb = 0.0;
2598 for (
int ipix = 0; ipix < npix; ++ipix) {
2599 sum_dre += map_dre(ipix, iphibar);
2600 sum_drm += map_drm(ipix, iphibar);
2601 sum_drb += map_drb(ipix, iphibar);
2603 if (sum_drb > 0.0) {
2604 double norm = (sum_dre - sum_drm) / sum_drb;
2605 for (
int ipix = 0; ipix < npix; ++ipix) {
2606 map_drb(ipix, iphibar) *=
norm;
2610 for (
int ipix = 0; ipix < npix; ++ipix) {
2611 map_drb(ipix, iphibar) = 0.0;
2617 #if defined(G_ONLY_VALID_PHIBAR)
2618 for (
int iphibar = iphibar_min; iphibar <= iphibar_max; ++iphibar) {
2620 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2622 for (
int ipix = 0; ipix < npix; ++ipix) {
2623 if (map_drb(ipix, iphibar) < 0.0) {
2624 map_drb(ipix, iphibar) = 0.0;
2648 int npix =
drg.npix();
2649 int nphibar =
drg.nmaps();
2652 for (
int ipix = 0; ipix < npix; ++ipix) {
2653 double omega =
drg.solidangle(ipix);
2654 for (
int iphibar = 0; iphibar < nphibar; ++iphibar) {
2655 drg(ipix,iphibar) *= omega;
2693 int imax = nphibar - 1;
2696 int nexcl2 = int(nexcl/2);
2697 int nincl2 = int(nincl/2);
2700 *iex1 = iphibar - nexcl2 - 1;
2701 *iex2 = iphibar + nexcl2 + 1;
2702 *isel1 = iphibar - nincl2;
2703 *isel2 = iphibar + nincl2;
2716 if (*isel2 > imax) {
2728 if (*isel2 == imax) {
2729 *isel1 = nphibar - nincl;
2766 const int& iphibar_min,
2767 const int& iphibar_max,
2774 int nexcl2 = int(nexcl/2);
2775 int nincl2 = int(nincl/2);
2778 *iex1 = iphibar - nexcl2 - 1;
2779 *iex2 = iphibar + nexcl2 + 1;
2780 *isel1 = iphibar - nincl2;
2781 *isel2 = iphibar + nincl2;
2791 if (*isel1 < iphibar_min) {
2792 *isel1 = iphibar_min;
2794 if (*isel2 > iphibar_max) {
2795 *isel2 = iphibar_max;
2800 if (*isel1 == iphibar_min) {
2801 *isel2 = nincl + iphibar_min - 1;
2802 if (nincl > iphibar_max) {
2803 *isel2 = iphibar_max;
2806 if (*isel2 == iphibar_max) {
2807 *isel1 = iphibar_max + 1 - nincl;
2808 if (*isel1 < iphibar_min) {
2809 *isel1 = iphibar_min;
COMPTEL event bin class interface definition.
const GCOMObservation g_obs_com_seed
#define G_COMPUTE_DRB_BGDLIXF
#define G_COMPUTE_DRB_BGDLIXA
#define G_COMPUTE_DRB_PHINOR
#define G_COMPUTE_DRB_BGDLIXE
COMPTEL observation class interface definition.
COMPTEL instrument status class definition.
Implementation of support function used by COMPTEL classes.
Calibration database class interface definition.
Exception handler interface definition.
Abstract FITS extension base class definition.
FITS file class interface definition.
Mathematical function definitions.
Sky model class interface definition.
Constant spectral model class interface definition.
Model container class definition.
Observation registry class definition.
double norm(const GVector &vector)
Computes vector norm.
XML element node class interface definition.
void clear(void)
Clear COMPTEL Solar System Barycentre Data container.
void load(const GFilename &filename)
Load COMPTEL Solar System Barycentre Data FITS file.
bool is_empty(void) const
Signals if there are no Solar System Barycentre Data in container.
std::string print(const GChatter &chatter=NORMAL) const
Print COMPTEL Solar System Barycentre Data container.
COMPTEL Data Space class.
virtual void clear(void)
Clear COMPTEL Data Space.
int nchi(void) const
Return number of Chi bins.
const GSkyMap & map(void) const
Return DRI sky map.
int npsi(void) const
Return number of Psi bins.
int nphibar(void) const
Return number of Phibar bins.
void read(const GFitsImage &image)
Read COMPTEL Data Space from DRI FITS image.
virtual double size(void) const
Return size of event bin.
virtual double counts(void) const
Return number of counts in event bin.
COMPTEL event bin container class.
virtual int size(void) const
Return number of bins in event cube.
const GCOMDri & dre(void) const
Return reference to DRE data.
COMPTEL event list class.
COMPTEL Housekeeping Data collection class.
int size(void) const
Return number of Housekeeping parameters in collection.
void clear(void)
Clear Housekeeping Data collection.
std::string print(const GChatter &chatter=NORMAL) const
Print Housekeeping Data collection.
void extend(const GCOMHkds &hkds)
Extend Housekeeping Data collection.
bool is_empty(void) const
Signals if there are no Housekeeping Data containers in collection.
COMPTEL Orbit Aspect Data container class.
void extend(const GCOMOads &oads)
Append Orbit Aspect Data container.
std::string print(const GChatter &chatter=NORMAL) const
Print COMPTEL Orbit Aspect Data container.
void clear(void)
Clear COMPTEL Orbit Aspect Data container.
int size(void) const
Return number of Orbit Aspect Data in container.
bool is_empty(void) const
Signals if there are no Orbit Aspect Data in container.
GCOMOad & insert(const int &index, const GCOMOad &oad)
Insert Orbit Aspect Data into container.
Interface class for COMPTEL observations.
void free_members(void)
Delete class members.
GCOMDri m_drw
Weighting cube.
GCOMDri drm(const GModels &models) const
Compute DRM cube.
void init_members(void)
Initialise class members.
const GFilename & drename(void) const
Return DRE filename.
GFilename m_drgname
DRG filename.
bool is_unbinned(void) const
Check whether observation is unbinned.
void compute_drb_phinor(const GCOMDri &drm)
Compute DRB cube using PHINOR method.
void load(const GFilename &drename, const GFilename &drbname, const GFilename &drwname, const GFilename &drgname, const GFilename &drxname)
Load data for a binned observation.
GFilename m_drxname
DRX filename.
const GFilename & drgname(void) const
Return DRG filename.
const GFilename & drxname(void) const
Return DRX filename.
double m_ontime
Ontime (sec)
void compute_drb_bgdlixa(const GCOMDri &drm, const int &nrunav=3, const int &navgr=3, const int &nincl=15, const int &nexcl=0)
Compute DRB cube using BGDLIXA method.
bool check_dri(const GCOMDri &map) const
Check if DRI is compatible with event cube.
virtual double npred(const GModel &model) const
Return total number of predicted counts for one model.
const GCOMDri & drb(void) const
Return background model.
virtual double ontime(void) const
Return ontime.
virtual GCOMObservation * clone(void) const
Clone COMPTEL observation.
GCOMBvcs m_bvcs
Solar System Barycentre Data.
void read_attributes(const GFitsHDU *hdu)
Read observation attributes.
const int & phi_first(void) const
Return index of first Phibar layer to be used for likelihood fitting.
void compute_drb_bgdlixe(const GCOMDri &drm, const int &nrunav=3, const int &navgr=3, const int &nincl=15, const int &nexcl=0)
Compute DRB cube using BGDLIXE method.
const GCOMOads & oads(void) const
Return Orbit Aspect Data.
int m_phi_last
Last Phibar layer to use for likelihood.
GFilename m_drename
DRE filename.
void load_drg(const GFilename &drgname)
Load geometry factors from DRG file.
virtual std::string instrument(void) const
Return instrument.
double m_livetime
Livetime (sec)
virtual double grad_step_size(const GModelPar &par) const
Return gradient step size for a given model parameter.
std::vector< GFilename > m_hkdnames
HKD filenames.
virtual void read(const GXmlElement &xml)
Read observation from XML element.
void compute_drb_bgdlixf(const GCOMDri &drm, const int &nrunav=3, const int &navgr=3, const int &nincl=15, const int &nexcl=0)
Compute DRB cube using BGDLIXF method.
GSkyMap get_weighted_drg_map(void) const
Return weighted DRG map.
void compute_drb(const std::string &method, const GCOMDri &drm, const int &nrunav=3, const int &navgr=3, const int &nincl=15, const int &nexcl=0)
Compute DRB cube.
virtual void clear(void)
Clear COMPTEL observation.
GCOMHkds m_hkds
Housekeeping Data.
double m_obs_id
Observation ID.
virtual void write(GXmlElement &xml) const
Write observation into XML element.
GCOMOads m_oads
Orbit Aspect Data.
int m_phi_first
First Phibar layer to use for likelihood.
GCOMObservation(void)
Void constructor.
GCOMTim m_tim
COMPTEL Good Time Intervals.
GCOMDri m_drg
Geometry factors.
virtual const GCOMResponse * response(void) const
Return response function.
virtual std::string print(const GChatter &chatter=NORMAL) const
Print observation information.
const GCOMDri & drw(void) const
Return weighting cube.
GCOMDri m_drb
Background model.
bool is_binned(void) const
Check whether observation is binned.
void load_dre(const GFilename &drename)
Load event cube data from DRE file.
const int & phi_last(void) const
Return index of last Phibar layer to be used for likelihood fitting.
void write_attributes(GFitsHDU *hdu) const
Write observation attributes.
void load_drw(const GFilename &drwname)
Load weighting cube from DRW file.
const GFilename & drwname(void) const
Return DRW filename.
double m_ewidth
Energy width (MeV)
const GFilename & rspname(void) const
Return response cache filename.
GFilename m_drbname
DRB filename.
GFilename m_evpname
EVP filename.
virtual bool use_event_for_likelihood(const int &index) const
Check whether bin should be used for likelihood analysis.
const GCOMDri & drx(void) const
Return exposure.
void get_bgdlix_phibar_indices(const int &iphibar, const int &nincl, const int &nexcl, int *isel1, int *iex1, int *iex2, int *isel2) const
Compute Phibar index range for BGDLIX background methods.
double m_deadc
Deadtime correction.
const GCOMDri & drg(void) const
Return geometry factors.
virtual double livetime(void) const
Return livetime.
const GFilename & drbname(void) const
Return DRB filename.
GFilename m_timname
TIM filename.
GFilename m_drwname
DRW filename.
GCOMResponse m_response
Response functions.
std::vector< GFilename > m_oadnames
OAD filenames.
virtual ~GCOMObservation(void)
Destructor.
std::string m_instrument
Instrument name.
GFilename m_bvcname
BVC filename.
void load_drx(const GFilename &drxname)
Load exposure from DRX file.
void copy_members(const GCOMObservation &obs)
Copy class members.
void load_drb(const GFilename &drbname)
Load background model from DRB file.
virtual GCOMObservation & operator=(const GCOMObservation &obs)
Assignment operator.
GCOMDri m_drx
Exposure map.
GFilename m_rspname
Response cache filename.
Interface for the COMPTEL instrument response function.
void save_cache(const GFilename &filename) const
Save response cache.
const std::string & rspname(void) const
Return response name.
void caldb(const GCaldb &caldb)
Set calibration database.
void load_cache(const GFilename &filename)
Load response cache.
virtual void clear(void)
Clear instance.
void load(const std::string &rspname)
Load COMPTEL response.
const GGti & gti(void) const
Return Good Time Intervals.
virtual void clear(void)
Clear COMPTEL good time intervals.
virtual std::string print(const GChatter &chatter=NORMAL) const
Print COMPTEL Good Time Intervals.
void load(const GFilename &filename, const std::string &usage="YES", const std::string &mode="NORMAL")
Load COMPTEL Good Time Intervals from FITS file.
Calibration database class.
double MeV(void) const
Return energy in MeV.
Abstract interface for the event bin class.
virtual double size(void) const =0
Abstract event bin container class.
Abstract event container class.
void gti(const GGti >i)
Set Good Time Intervals.
virtual void read(const GFits &file)=0
virtual std::string print(const GChatter &chatter=NORMAL) const =0
Print content of object.
const GEnergy & emax(void) const
Return maximum energy.
const GEnergy & emin(void) const
Return minimum energy.
bool is_fits(void) const
Checks whether file is a FITS file.
bool exists(void) const
Checks whether file exists.
bool is_empty(void) const
Signal if filename is empty.
void clear(void)
Clear file name.
Abstract FITS extension base class.
bool has_card(const int &cardno) const
Check existence of header card.
double real(const std::string &keyname) const
Return card value as double precision.
std::string string(const std::string &keyname) const
Return card value as string.
Abstract FITS image base class.
GFitsImage * image(const int &extno)
Get pointer to image HDU.
void close(void)
Close FITS file.
int size(void) const
Return number of Good Time Intervals.
const double & ontime(void) const
Returns ontime.
double eval(const GEvent &event, const GObservation &obs, const bool &gradients=false) const
Evaluate sum of all models.
GModel * append(const GModel &model)
Append model to container.
Interface definition for the observation registry class.
Abstract observation base class.
const std::string & statistic(void) const
Return optimizer statistic.
virtual double model(const GModels &models, const GEvent &event, GVector *gradients=NULL) const
Return model value and (optionally) gradients.
const std::string & id(void) const
Return observation identifier.
const std::string & name(void) const
Return observation name.
virtual GEvents * events(void)
Return events.
void init_members(void)
Initialise class members.
virtual GObservation & operator=(const GObservation &obs)
Assignment operator.
GEvents * m_events
Pointer to event container.
void free_members(void)
Delete class members.
std::string m_name
Observation name.
std::string m_id
Observation identifier.
Abstract instrument response base class.
const int & nmaps(void) const
Returns number of maps.
const int & nx(void) const
Returns number of pixels in x coordinate.
const int & npix(void) const
Returns number of pixels.
const int & ny(void) const
Returns number of pixels in y coordinate.
const GSkyProjection * projection(void) const
Returns pointer to sky projection.
Abstract sky projection base class.
const int & size(void) const
Return size of vector.
const GXmlAttribute * attribute(const int &index) const
Return attribute.
bool has_attribute(const std::string &name) const
Check if element has a given attribute.
virtual GXmlNode * append(const GXmlNode &node)
Append XML child node.
virtual void remove(const int &index)
Remove XML child node.
virtual GXmlElement * element(const int &index)
Return pointer to GXMLElement child.
virtual int elements(void) const
Return number of GXMLElement children of node.
std::string parformat(const std::string &s, const int &indent=0)
Convert string in parameter format.
std::string str(const unsigned short int &value)
Convert unsigned short integer value into string.
std::string xml_get_attr(const std::string &origin, const GXmlElement &xml, const std::string &name, const std::string &attribute)
Return attribute value for a given parameter in XML element.
int toint(const std::string &arg)
Convert string into integer value.
GXmlElement * xml_need_par(const std::string &origin, GXmlElement &xml, const std::string &name)
Return pointer to parameter with given name in XML element.
GFilename xml_file_reduce(const GXmlElement &xml, const std::string &filename)
Reduce file name provided for writing as XML attribute.
void com_wcs_mer2car(GSkyMap &map)
Changes Mercator's projection to cartesian projection.
GChatter reduce(const GChatter &chatter)
Reduce chattiness by one level.
bool xml_has_par(const GXmlElement &xml, const std::string &name)
Checks if parameter with given name in XML element exists.
GFilename xml_file_expand(const GXmlElement &xml, const std::string &filename)
Expand file name provided as XML attribute for loading.