Commit 2ccf1353474a2519862a1d1eb99fe59ef5da9e2b

Authored by Jürgen Knödlseder
2 parents 733bc09f a62f95f9

Merge branch '1871-add-publish-tables' into integration

ChangeLog
1 -2016-10-05 1 +2016-10-07
2 2
3 * Version 1.2.0 released 3 * Version 1.2.0 released
4 ======================== 4 ========================
5 5
  6 + Add publish parameter and methods to ctobssim, ctselect, cslightcrv and csspec (#1871)
6 Add csviscube script (#1853) 7 Add csviscube script (#1853)
7 Add zenith and azimuth angle information to IRF caldb (#1853) 8 Add zenith and azimuth angle information to IRF caldb (#1853)
8 Fix ctbin segfault bug for varying energy thresholds (#1850) 9 Fix ctbin segfault bug for varying energy thresholds (#1850)
1 New Features and Important Changes in ctools 1.2.0 1 New Features and Important Changes in ctools 1.2.0
2 2
3 -5 October 2016 3 +7 October 2016
4 4
5 5
6 Introduction 6 Introduction
@@ -63,6 +63,9 @@ ctobssim - CTA observation simulation @@ -63,6 +63,9 @@ ctobssim - CTA observation simulation
63 The clear() method now calls GApplication::clear() to conserve the properties 63 The clear() method now calls GApplication::clear() to conserve the properties
64 of the tool (#1835). 64 of the tool (#1835).
65 65
  66 +A publish() method has been added that publishes the simulated event lists on
  67 +a VO hub (#1871).
  68 +
66 69
67 ctselect - CTA event selection 70 ctselect - CTA event selection
68 ------------------------------ 71 ------------------------------
@@ -72,6 +75,9 @@ of the tool (#1835). @@ -72,6 +75,9 @@ of the tool (#1835).
72 The time_reference() method has been removed since the method is part of the 75 The time_reference() method has been removed since the method is part of the
73 ctool base class, and exposed in Python as _time_reference(). 76 ctool base class, and exposed in Python as _time_reference().
74 77
  78 +A publish() method has been added that publishes the simulated event lists on
  79 +a VO hub (#1871).
  80 +
75 81
76 ctbin - CTA event binning 82 ctbin - CTA event binning
77 ------------------------- 83 -------------------------
@@ -200,6 +206,9 @@ of hours that a given position on the sky is observable under a given zenith @@ -200,6 +206,9 @@ of hours that a given position on the sky is observable under a given zenith
200 angle by an IACT array during a given time period. The tool implements so far 206 angle by an IACT array during a given time period. The tool implements so far
201 a Sun constraint, but no Moon constraint (#1835). 207 a Sun constraint, but no Moon constraint (#1835).
202 208
  209 +A publish() method has been added to cslightcrv and csspec that publishes the
  210 +results on a VO hub (#1871).
  211 +
203 212
204 Examples 213 Examples
205 -------- 214 --------
cscripts/cslightcrv.par
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 # ------------------------------------------------------------------------- # 5 # ------------------------------------------------------------------------- #
6 # # 6 # #
7 # File: cslightcrv.par # 7 # File: cslightcrv.par #
8 -# Version: 1.1.0 # 8 +# Version: 1.2.0 #
9 # # 9 # #
10 # Author: Juergen Knoedlseder # 10 # Author: Juergen Knoedlseder #
11 # Jurgen.Knodlseder@irap.omp.eu # 11 # Jurgen.Knodlseder@irap.omp.eu #
@@ -55,6 +55,7 @@ fix_bkg, b, h, no,,, "Fix background model parameters?" @@ -55,6 +55,7 @@ fix_bkg, b, h, no,,, "Fix background model parameters?"
55 # 55 #
56 # Standard parameters 56 # Standard parameters
57 #==================== 57 #====================
  58 +publish, b, h, no,,, "Publish light curve on VO Hub?"
58 chatter, i, h, 2,0,4, "Chattiness of output" 59 chatter, i, h, 2,0,4, "Chattiness of output"
59 clobber, b, h, yes,,, "Overwrite existing output files with new output files?" 60 clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
60 debug, b, h, no,,, "Debugging mode activated" 61 debug, b, h, no,,, "Debugging mode activated"
cscripts/cslightcrv.py
@@ -614,6 +614,10 @@ class cslightcrv(ctools.cscript): @@ -614,6 +614,10 @@ class cslightcrv(ctools.cscript):
614 self._fits = gammalib.GFits() 614 self._fits = gammalib.GFits()
615 self._fits.append(table) 615 self._fits.append(table)
616 616
  617 + # Optionally publish light curve
  618 + if self['publish'].boolean():
  619 + self.publish()
  620 +
617 # Return 621 # Return
618 return 622 return
619 623
@@ -658,6 +662,36 @@ class cslightcrv(ctools.cscript): @@ -658,6 +662,36 @@ class cslightcrv(ctools.cscript):
658 # Return 662 # Return
659 return 663 return
660 664
  665 + def publish(self, name=''):
  666 + """
  667 + Publish light curve
  668 +
  669 + Parameters
  670 + ----------
  671 + name : str, optional
  672 + Name of light curve
  673 + """
  674 + # Write header
  675 + self._log_header1(gammalib.TERSE, 'Publish light curve')
  676 +
  677 + # Continue only if light curve is valid
  678 + if self._fits.contains('LIGHTCURVE'):
  679 +
  680 + # Set default name is user name is empty
  681 + if not name:
  682 + user_name = self._name
  683 + else:
  684 + user_name = name
  685 +
  686 + # Log file name
  687 + self._log_value(gammalib.NORMAL, 'Light curve name', user_name)
  688 +
  689 + # Publish light curve
  690 + self._fits.publish('LIGHTCURVE', user_name)
  691 +
  692 + # Return
  693 + return
  694 +
661 def lightcurve(self): 695 def lightcurve(self):
662 """ 696 """
663 Return light curve FITS file 697 Return light curve FITS file
cscripts/csresmap.py
@@ -295,7 +295,7 @@ class csresmap(ctools.cscript): @@ -295,7 +295,7 @@ class csresmap(ctools.cscript):
295 295
296 def publish(self, name=''): 296 def publish(self, name=''):
297 """ 297 """
298 - Publish residual map. 298 + Publish residual map
299 299
300 Parameters 300 Parameters
301 ---------- 301 ----------
cscripts/csspec.par
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 # ------------------------------------------------------------------------- # 5 # ------------------------------------------------------------------------- #
6 # # 6 # #
7 # File: csspec.par # 7 # File: csspec.par #
8 -# Version: 1.1.0 # 8 +# Version: 1.2.0 #
9 # # 9 # #
10 # Author: Juergen Knoedlseder # 10 # Author: Juergen Knoedlseder #
11 # Jurgen.Knodlseder@irap.omp.eu # 11 # Jurgen.Knodlseder@irap.omp.eu #
@@ -45,6 +45,7 @@ fix_bkg, b, h, no,,, "Fix background parameters" @@ -45,6 +45,7 @@ fix_bkg, b, h, no,,, "Fix background parameters"
45 # 45 #
46 # Standard parameters 46 # Standard parameters
47 #==================== 47 #====================
  48 +publish, b, h, no,,, "Publish spectrum on VO Hub?"
48 chatter, i, h, 2,0,4, "Chattiness of output" 49 chatter, i, h, 2,0,4, "Chattiness of output"
49 clobber, b, h, yes,,, "Overwrite existing output files with new output files?" 50 clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
50 debug, b, h, no,,, "Debugging mode activated" 51 debug, b, h, no,,, "Debugging mode activated"
cscripts/csspec.py
@@ -268,18 +268,17 @@ class csspec(ctools.cscript): @@ -268,18 +268,17 @@ class csspec(ctools.cscript):
268 par.fix() 268 par.fix()
269 269
270 # Write header 270 # Write header
  271 + self._log_header1(gammalib.TERSE, 'Generate spectrum')
271 if self._logTerse(): 272 if self._logTerse():
272 - self._log("\n")  
273 - self._log.header1("Generate spectrum")  
274 - self._log(str(self._ebounds)) 273 + self._log(str(self._ebounds))
275 274
276 # Initialise FITS Table with extension "SPECTRUM" 275 # Initialise FITS Table with extension "SPECTRUM"
277 table = gammalib.GFitsBinTable(self._ebounds.size()) 276 table = gammalib.GFitsBinTable(self._ebounds.size())
278 - table.extname("SPECTRUM") 277 + table.extname('SPECTRUM')
279 278
280 # Add Header for compatibility with gammalib.GMWLSpectrum 279 # Add Header for compatibility with gammalib.GMWLSpectrum
281 - table.card("INSTRUME", "CTA", "Name of Instrument")  
282 - table.card("TELESCOP", "CTA", "Name of Telescope") 280 + table.card('INSTRUME', 'CTA', 'Name of Instrument')
  281 + table.card('TELESCOP', 'CTA', 'Name of Telescope')
283 282
284 # Create FITS table columns 283 # Create FITS table columns
285 nrows = self._ebounds.size() 284 nrows = self._ebounds.size()
@@ -470,12 +469,16 @@ class csspec(ctools.cscript): @@ -470,12 +469,16 @@ class csspec(ctools.cscript):
470 self._fits = gammalib.GFits() 469 self._fits = gammalib.GFits()
471 self._fits.append(table) 470 self._fits.append(table)
472 471
  472 + # Optionally publish light curve
  473 + if self['publish'].boolean():
  474 + self.publish()
  475 +
473 # Return 476 # Return
474 return 477 return
475 478
476 def execute(self): 479 def execute(self):
477 """ 480 """
478 - Execute the script. 481 + Execute the script
479 """ 482 """
480 # Open logfile 483 # Open logfile
481 self.logFileOpen() 484 self.logFileOpen()
@@ -494,24 +497,19 @@ class csspec(ctools.cscript): @@ -494,24 +497,19 @@ class csspec(ctools.cscript):
494 497
495 def save(self): 498 def save(self):
496 """ 499 """
497 - Save spectrum. 500 + Save spectrum
498 """ 501 """
499 # Write header 502 # Write header
500 - if self._logTerse():  
501 - self._log("\n")  
502 - self._log.header1("Save spectrum") 503 + self._log_header1(gammalib.TERSE, 'Save spectrum')
503 504
504 # Get outmap parameter 505 # Get outmap parameter
505 - outfile = self["outfile"].filename() 506 + outfile = self['outfile'].filename()
506 507
507 # Continue only filename and residual map are valid 508 # Continue only filename and residual map are valid
508 if self._fits != None: 509 if self._fits != None:
509 510
510 # Log file name 511 # Log file name
511 - if self._logTerse():  
512 - self._log(gammalib.parformat("Spectrum file"))  
513 - self._log(outfile.url())  
514 - self._log("\n") 512 + self._log_value(gammalib.NORMAL, 'Spectrum file', outfile.url())
515 513
516 # Save spectrum 514 # Save spectrum
517 self._fits.saveto(outfile, self._clobber) 515 self._fits.saveto(outfile, self._clobber)
@@ -519,6 +517,36 @@ class csspec(ctools.cscript): @@ -519,6 +517,36 @@ class csspec(ctools.cscript):
519 # Return 517 # Return
520 return 518 return
521 519
  520 + def publish(self, name=''):
  521 + """
  522 + Publish spectrum
  523 +
  524 + Parameters
  525 + ----------
  526 + name : str, optional
  527 + Name of spectrum
  528 + """
  529 + # Write header
  530 + self._log_header1(gammalib.TERSE, 'Publish spectrum')
  531 +
  532 + # Continue only if spectrum is valid
  533 + if self._fits.contains('SPECTRUM'):
  534 +
  535 + # Set default name is user name is empty
  536 + if not name:
  537 + user_name = self._name
  538 + else:
  539 + user_name = name
  540 +
  541 + # Log file name
  542 + self._log_value(gammalib.NORMAL, 'Spectrum name', user_name)
  543 +
  544 + # Publish spectrum
  545 + self._fits.publish('SPECTRUM', user_name)
  546 +
  547 + # Return
  548 + return
  549 +
522 def spectrum(self): 550 def spectrum(self):
523 """ 551 """
524 Return spectrum FITS file. 552 Return spectrum FITS file.
cscripts/csviscube.par
@@ -35,6 +35,7 @@ zmax, r, h, 60.0,,, "Maximum zenith angle (deg)" @@ -35,6 +35,7 @@ zmax, r, h, 60.0,,, "Maximum zenith angle (deg)"
35 # 35 #
36 # Standard parameters 36 # Standard parameters
37 #==================== 37 #====================
  38 +publish, b, h, no,,, "Publish visibility cube on VO Hub?"
38 chatter, i, h, 2,0,4, "Chattiness of output" 39 chatter, i, h, 2,0,4, "Chattiness of output"
39 clobber, b, h, yes,,, "Overwrite existing output files with new output files?" 40 clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
40 debug, b, h, no,,, "Debugging mode activated" 41 debug, b, h, no,,, "Debugging mode activated"
cscripts/csviscube.py
@@ -459,6 +459,10 @@ class csviscube(ctools.cscript): @@ -459,6 +459,10 @@ class csviscube(ctools.cscript):
459 # Compute visibility cube 459 # Compute visibility cube
460 self._visibility_cube() 460 self._visibility_cube()
461 461
  462 + # Optionally publish map
  463 + if self['publish'].boolean():
  464 + self.publish()
  465 +
462 # Return 466 # Return
463 return 467 return
464 468
@@ -481,6 +485,33 @@ class csviscube(ctools.cscript): @@ -481,6 +485,33 @@ class csviscube(ctools.cscript):
481 # Return 485 # Return
482 return 486 return
483 487
  488 + def publish(self, name=''):
  489 + """
  490 + Publish visibility cube
  491 +
  492 + Parameters
  493 + ----------
  494 + name : str, optional
  495 + Name of visibility cube
  496 + """
  497 + # Write header
  498 + self._log_header1(gammalib.TERSE, 'Publish visibility cube')
  499 +
  500 + # Set default name is user name is empty
  501 + if not name:
  502 + user_name = self._name
  503 + else:
  504 + user_name = name
  505 +
  506 + # Log cube name
  507 + self._log_value(gammalib.TERSE, 'Visibility cube name', user_name)
  508 +
  509 + # Publish cube
  510 + self._cube.publish(user_name)
  511 +
  512 + # Return
  513 + return
  514 +
484 def execute(self): 515 def execute(self):
485 """ 516 """
486 Execute the script 517 Execute the script
doc/source/users/reference_manual/cslightcrv.rst
@@ -118,6 +118,9 @@ General parameters @@ -118,6 +118,9 @@ General parameters
118 Standard parameters 118 Standard parameters
119 ------------------- 119 -------------------
120 120
  121 +``(publish = no) [boolean]``
  122 + Specifies whether the light curve should be published on VO Hub.
  123 +
121 ``(chatter = 2) [integer]`` 124 ``(chatter = 2) [integer]``
122 Verbosity of the executable: 125 Verbosity of the executable:
123 chatter = 0: no information will be logged 126 chatter = 0: no information will be logged
doc/source/users/reference_manual/csspec.rst
@@ -110,6 +110,9 @@ General parameters @@ -110,6 +110,9 @@ General parameters
110 Standard parameters 110 Standard parameters
111 ------------------- 111 -------------------
112 112
  113 +``(publish = no) [boolean]``
  114 + Specifies whether the spectrum should be published on VO Hub.
  115 +
113 ``(chatter = 2) [integer]`` 116 ``(chatter = 2) [integer]``
114 Verbosity of the executable: 117 Verbosity of the executable:
115 chatter = 0: no information will be logged 118 chatter = 0: no information will be logged
doc/source/users/reference_manual/csviscube.rst
@@ -58,6 +58,9 @@ General parameters @@ -58,6 +58,9 @@ General parameters
58 Standard parameters 58 Standard parameters
59 ------------------- 59 -------------------
60 60
  61 +``(publish = no) [boolean]``
  62 + Specifies whether the visibility cube should be published on VO Hub.
  63 +
61 ``(chatter = 2) [integer]`` 64 ``(chatter = 2) [integer]``
62 Verbosity of the executable: 65 Verbosity of the executable:
63 chatter = 0: no information will be logged 66 chatter = 0: no information will be logged
doc/source/users/reference_manual/ctobssim.rst
@@ -106,6 +106,9 @@ General parameters @@ -106,6 +106,9 @@ General parameters
106 Standard parameters 106 Standard parameters
107 ------------------- 107 -------------------
108 108
  109 +``(publish = no) [boolean]``
  110 + Specifies whether the event list(s) should be published on VO Hub.
  111 +
109 ``(chatter = 2) [integer]`` 112 ``(chatter = 2) [integer]``
110 Verbosity of the executable: 113 Verbosity of the executable:
111 chatter = 0: no information will be logged 114 chatter = 0: no information will be logged
doc/source/users/reference_manual/ctselect.rst
@@ -95,6 +95,9 @@ General parameters @@ -95,6 +95,9 @@ General parameters
95 Standard parameters 95 Standard parameters
96 ------------------- 96 -------------------
97 97
  98 +``(publish = no) [boolean]``
  99 + Specifies whether the event list(s) should be published on VO Hub.
  100 +
98 ``(chatter = 2) [integer]`` 101 ``(chatter = 2) [integer]``
99 Verbosity of the executable: 102 Verbosity of the executable:
100 chatter = 0: no information will be logged 103 chatter = 0: no information will be logged
pyext/ctobssim.i
1 /*************************************************************************** 1 /***************************************************************************
2 * ctobssim - Observation simulator tool * 2 * ctobssim - Observation simulator tool *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2011-2015 by Juergen Knoedlseder * 4 + * copyright (C) 2011-2016 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -47,6 +47,7 @@ public: @@ -47,6 +47,7 @@ public:
47 void clear(void); 47 void clear(void);
48 void run(void); 48 void run(void);
49 void save(void); 49 void save(void);
  50 + void publish(const std::string& name = "");
50 const double& max_rate(void) const; 51 const double& max_rate(void) const;
51 void max_rate(const double& max_rate); 52 void max_rate(const double& max_rate);
52 }; 53 };
pyext/ctselect.i
1 /*************************************************************************** 1 /***************************************************************************
2 * ctselect - Data selection tool * 2 * ctselect - Data selection tool *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2010-2014 by Jurgen Knodlseder * 4 + * copyright (C) 2010-2016 by Jurgen Knodlseder *
5 * ----------------------------------------------------------------------- * 5 * ----------------------------------------------------------------------- *
6 * * 6 * *
7 * This program is free software: you can redistribute it and/or modify * 7 * This program is free software: you can redistribute it and/or modify *
@@ -47,6 +47,7 @@ public: @@ -47,6 +47,7 @@ public:
47 void clear(void); 47 void clear(void);
48 void run(void); 48 void run(void);
49 void save(void); 49 void save(void);
  50 + void publish(const std::string& name = "");
50 }; 51 };
51 52
52 53
src/ctobssim/ctobssim.cpp
@@ -32,6 +32,8 @@ @@ -32,6 +32,8 @@
32 #include <typeinfo> 32 #include <typeinfo>
33 #include "ctobssim.hpp" 33 #include "ctobssim.hpp"
34 #include "GTools.hpp" 34 #include "GTools.hpp"
  35 +#include "GFits.hpp"
  36 +
35 37
36 /* __ Method name definitions ____________________________________________ */ 38 /* __ Method name definitions ____________________________________________ */
37 #define G_GET_PARAMETERS "ctobssim::get_parameters()" 39 #define G_GET_PARAMETERS "ctobssim::get_parameters()"
@@ -415,6 +417,11 @@ void ctobssim::run(void) @@ -415,6 +417,11 @@ void ctobssim::run(void)
415 // Restore energy dispersion flags of all CTA observations 417 // Restore energy dispersion flags of all CTA observations
416 restore_edisp(m_obs, save_edisp); 418 restore_edisp(m_obs, save_edisp);
417 419
  420 + // Optionally publish event list(s)
  421 + if ((*this)["publish"].boolean()) {
  422 + publish();
  423 + }
  424 +
418 // Return 425 // Return
419 return; 426 return;
420 } 427 }
@@ -459,6 +466,60 @@ void ctobssim::save(void) @@ -459,6 +466,60 @@ void ctobssim::save(void)
459 } 466 }
460 467
461 468
  469 +/***********************************************************************//**
  470 + * @brief Publish event lists
  471 + *
  472 + * @param[in] name Event list name.
  473 + ***************************************************************************/
  474 +void ctobssim::publish(const std::string& name)
  475 +{
  476 + // Write header into logger
  477 + log_header1(TERSE, gammalib::number("Publish event list", m_obs.size()));
  478 +
  479 + // Loop over all observation in the container
  480 + for (int i = 0; i < m_obs.size(); ++i) {
  481 +
  482 + // Get CTA observation
  483 + GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[i]);
  484 +
  485 + // Handle only CTA observations
  486 + if (obs != NULL) {
  487 +
  488 + // Continue only if there is an event list
  489 + if (obs->events()->size() != 0) {
  490 +
  491 + // Set default name if user name is empty
  492 + std::string user_name(name);
  493 + if (user_name.empty()) {
  494 + user_name = CTOBSSIM_NAME;
  495 + }
  496 +
  497 + // If there are several event lists then add an index
  498 + if (m_use_xml) {
  499 + user_name += gammalib::str(i);
  500 + }
  501 +
  502 + // Write event list name into logger
  503 + log_value(NORMAL, "Event list name", user_name);
  504 +
  505 + // Write events into in-memory FITS file
  506 + GFits fits;
  507 + obs->write(fits);
  508 +
  509 + // Publish
  510 + fits.publish("EVENTS", user_name);
  511 +
  512 + } // endif: there were events
  513 +
  514 + } // endif: observation was a CTA observation
  515 +
  516 + } // endfor: looped over observations
  517 +
  518 + // Return
  519 + return;
  520 +}
  521 +
  522 +
462 /*========================================================================== 523 /*==========================================================================
463 = = 524 = =
464 = Private methods = 525 = Private methods =
src/ctobssim/ctobssim.hpp
@@ -34,7 +34,7 @@ @@ -34,7 +34,7 @@
34 34
35 /* __Definitions _________________________________________________________ */ 35 /* __Definitions _________________________________________________________ */
36 #define CTOBSSIM_NAME "ctobssim" 36 #define CTOBSSIM_NAME "ctobssim"
37 -#define CTOBSSIM_VERSION "1.1.0" 37 +#define CTOBSSIM_VERSION "1.2.0"
38 38
39 39
40 /***********************************************************************//** 40 /***********************************************************************//**
@@ -65,6 +65,7 @@ public: @@ -65,6 +65,7 @@ public:
65 void clear(void); 65 void clear(void);
66 void run(void); 66 void run(void);
67 void save(void); 67 void save(void);
  68 + void publish(const std::string& name = "");
68 const double& max_rate(void) const; 69 const double& max_rate(void) const;
69 void max_rate(const double& max_rate); 70 void max_rate(const double& max_rate);
70 71
src/ctobssim/ctobssim.par
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 # ------------------------------------------------------------------------- # 5 # ------------------------------------------------------------------------- #
6 # # 6 # #
7 # File: ctobssim.par # 7 # File: ctobssim.par #
8 -# Version: 1.1.0 # 8 +# Version: 1.2.0 #
9 # # 9 # #
10 # Author: Juergen Knoedlseder # 10 # Author: Juergen Knoedlseder #
11 # Jurgen.Knodlseder@irap.omp.eu # 11 # Jurgen.Knodlseder@irap.omp.eu #
@@ -43,6 +43,7 @@ eslices, i, h, 10,1,100, &quot;Number of energy slices&quot; @@ -43,6 +43,7 @@ eslices, i, h, 10,1,100, &quot;Number of energy slices&quot;
43 # 43 #
44 # Standard parameters 44 # Standard parameters
45 #==================== 45 #====================
  46 +publish, b, h, no,,, "Publish event list on VO Hub?"
46 chatter, i, h, 2,0,4, "Chattiness of output" 47 chatter, i, h, 2,0,4, "Chattiness of output"
47 clobber, b, h, yes,,, "Overwrite existing output files with new output files?" 48 clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
48 debug, b, h, no,,, "Debugging mode activated" 49 debug, b, h, no,,, "Debugging mode activated"
src/ctselect/ctselect.cpp
@@ -348,6 +348,11 @@ void ctselect::run(void) @@ -348,6 +348,11 @@ void ctselect::run(void)
348 // Write observation(s) into logger 348 // Write observation(s) into logger
349 log_observations(NORMAL, m_obs, "Output observation"); 349 log_observations(NORMAL, m_obs, "Output observation");
350 350
  351 + // Optionally publish event list(s)
  352 + if ((*this)["publish"].boolean()) {
  353 + publish();
  354 + }
  355 +
351 // Return 356 // Return
352 return; 357 return;
353 } 358 }
@@ -392,6 +397,60 @@ void ctselect::save(void) @@ -392,6 +397,60 @@ void ctselect::save(void)
392 } 397 }
393 398
394 399
  400 +/***********************************************************************//**
  401 + * @brief Publish event lists
  402 + *
  403 + * @param[in] name Event list name.
  404 + ***************************************************************************/
  405 +void ctselect::publish(const std::string& name)
  406 +{
  407 + // Write header into logger
  408 + log_header1(TERSE, gammalib::number("Publish event list", m_obs.size()));
  409 +
  410 + // Loop over all observation in the container
  411 + for (int i = 0; i < m_obs.size(); ++i) {
  412 +
  413 + // Get CTA observation
  414 + GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[i]);
  415 +
  416 + // Handle only CTA observations
  417 + if (obs != NULL) {
  418 +
  419 + // Continue only if there is an event list
  420 + if (obs->events()->size() != 0) {
  421 +
  422 + // Set default name if user name is empty
  423 + std::string user_name(name);
  424 + if (user_name.empty()) {
  425 + user_name = CTSELECT_NAME;
  426 + }
  427 +
  428 + // If there are several event lists then add an index
  429 + if (m_use_xml) {
  430 + user_name += gammalib::str(i);
  431 + }
  432 +
  433 + // Write event list name into logger
  434 + log_value(NORMAL, "Event list name", user_name);
  435 +
  436 + // Write events into in-memory FITS file
  437 + GFits fits;
  438 + obs->write(fits);
  439 +
  440 + // Publish
  441 + fits.publish("EVENTS", user_name);
  442 +
  443 + } // endif: there were events
  444 +
  445 + } // endif: observation was a CTA observation
  446 +
  447 + } // endfor: looped over observations
  448 +
  449 + // Return
  450 + return;
  451 +}
  452 +
  453 +
395 /*========================================================================== 454 /*==========================================================================
396 = = 455 = =
397 = Private methods = 456 = Private methods =
src/ctselect/ctselect.hpp
@@ -61,6 +61,7 @@ public: @@ -61,6 +61,7 @@ public:
61 void clear(void); 61 void clear(void);
62 void run(void); 62 void run(void);
63 void save(void); 63 void save(void);
  64 + void publish(const std::string& name = "");
64 65
65 protected: 66 protected:
66 // Protected methods 67 // Protected methods
src/ctselect/ctselect.par
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 # ------------------------------------------------------------------------- # 5 # ------------------------------------------------------------------------- #
6 # # 6 # #
7 # File: ctselect.par # 7 # File: ctselect.par #
8 -# Version: 1.0.0 # 8 +# Version: 1.2.0 #
9 # # 9 # #
10 # Author: Jurgen Knodlseder # 10 # Author: Jurgen Knodlseder #
11 # Jurgen.Knodlseder@irap.omp.eu # 11 # Jurgen.Knodlseder@irap.omp.eu #
@@ -38,6 +38,7 @@ usethres,s, h, &quot;NONE&quot;,NONE|DEFAULT|USER,, &quot;Energy threshold type&quot; @@ -38,6 +38,7 @@ usethres,s, h, &quot;NONE&quot;,NONE|DEFAULT|USER,, &quot;Energy threshold type&quot;
38 # 38 #
39 # Standard parameters 39 # Standard parameters
40 #==================== 40 #====================
  41 +publish, b, h, no,,, "Publish event list on VO Hub?"
41 chatter, i, h, 2,0,4, "Chattiness of output" 42 chatter, i, h, 2,0,4, "Chattiness of output"
42 clobber, b, h, yes,,, "Overwrite existing output files with new output files?" 43 clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
43 debug, b, h, no,,, "Debugging mode activated" 44 debug, b, h, no,,, "Debugging mode activated"
src/ctskymap/ctskymap.cpp
@@ -294,7 +294,7 @@ void ctskymap::publish(const std::string&amp; name) @@ -294,7 +294,7 @@ void ctskymap::publish(const std::string&amp; name)
294 // Write header into logger 294 // Write header into logger
295 log_header1(TERSE, "Publish sky map"); 295 log_header1(TERSE, "Publish sky map");
296 296
297 - // Set default name is user name is empty 297 + // Set default name if user name is empty
298 std::string user_name(name); 298 std::string user_name(name);
299 if (user_name.empty()) { 299 if (user_name.empty()) {
300 user_name = CTSKYMAP_NAME; 300 user_name = CTSKYMAP_NAME;
test/test_cslightcrv.py
@@ -126,6 +126,7 @@ class Test(test): @@ -126,6 +126,7 @@ class Test(test):
126 lcrv['outfile'] = 'cslightcrv_py1.fits' 126 lcrv['outfile'] = 'cslightcrv_py1.fits'
127 lcrv['logfile'] = 'cslightcrv_py1.log' 127 lcrv['logfile'] = 'cslightcrv_py1.log'
128 lcrv['chatter'] = 2 128 lcrv['chatter'] = 2
  129 + lcrv['publish'] = True
129 130
130 # Run cslightcrv script and save light curve 131 # Run cslightcrv script and save light curve
131 lcrv.logFileOpen() # Make sure we get a log file 132 lcrv.logFileOpen() # Make sure we get a log file
test/test_csspec.py
@@ -130,6 +130,7 @@ class Test(test): @@ -130,6 +130,7 @@ class Test(test):
130 spec['emax'] = 100.0 130 spec['emax'] = 100.0
131 spec['logfile'] = 'csspec_py1.log' 131 spec['logfile'] = 'csspec_py1.log'
132 spec['chatter'] = 2 132 spec['chatter'] = 2
  133 + spec['publish'] = True
133 134
134 # Run csspec script 135 # Run csspec script
135 spec.logFileOpen() # Make sure we get a log file 136 spec.logFileOpen() # Make sure we get a log file
@@ -155,6 +156,7 @@ class Test(test): @@ -155,6 +156,7 @@ class Test(test):
155 spec['emax'] = 100.0 156 spec['emax'] = 100.0
156 spec['logfile'] = 'csspec_py2.log' 157 spec['logfile'] = 'csspec_py2.log'
157 spec['chatter'] = 3 158 spec['chatter'] = 3
  159 + spec['publish'] = False
158 160
159 # Execute csspec script 161 # Execute csspec script
160 spec.execute() 162 spec.execute()
test/test_csviscube.py
@@ -34,7 +34,7 @@ class Test(test): @@ -34,7 +34,7 @@ class Test(test):
34 # Constructor 34 # Constructor
35 def __init__(self): 35 def __init__(self):
36 """ 36 """
37 - Constructor. 37 + Constructor
38 """ 38 """
39 # Call base class constructor 39 # Call base class constructor
40 test.__init__(self) 40 test.__init__(self)
@@ -45,7 +45,7 @@ class Test(test): @@ -45,7 +45,7 @@ class Test(test):
45 # Set test functions 45 # Set test functions
46 def set(self): 46 def set(self):
47 """ 47 """
48 - Set all test functions. 48 + Set all test functions
49 """ 49 """
50 # Set test name 50 # Set test name
51 self.name('csviscube') 51 self.name('csviscube')
@@ -60,7 +60,7 @@ class Test(test): @@ -60,7 +60,7 @@ class Test(test):
60 # Test csviscube on command line 60 # Test csviscube on command line
61 def _test_cmd(self): 61 def _test_cmd(self):
62 """ 62 """
63 - Test csviscube on the command line. 63 + Test csviscube on the command line
64 """ 64 """
65 # Set script name 65 # Set script name
66 csviscube = self._script('csviscube') 66 csviscube = self._script('csviscube')
@@ -84,7 +84,7 @@ class Test(test): @@ -84,7 +84,7 @@ class Test(test):
84 # Test csviscube from Python 84 # Test csviscube from Python
85 def _test_python(self): 85 def _test_python(self):
86 """ 86 """
87 - Test csviscube from Python. 87 + Test csviscube from Python
88 """ 88 """
89 # Set-up csviscube 89 # Set-up csviscube
90 viscube = cscripts.csviscube() 90 viscube = cscripts.csviscube()
@@ -96,6 +96,7 @@ class Test(test): @@ -96,6 +96,7 @@ class Test(test):
96 viscube['outfile'] = 'csviscube_py1.fits' 96 viscube['outfile'] = 'csviscube_py1.fits'
97 viscube['logfile'] = 'csviscube_py1.log' 97 viscube['logfile'] = 'csviscube_py1.log'
98 viscube['chatter'] = 2 98 viscube['chatter'] = 2
  99 + viscube['publish'] = True
99 100
100 # Run script 101 # Run script
101 viscube.logFileOpen() # Make sure we get a log file 102 viscube.logFileOpen() # Make sure we get a log file
test/test_ctobssim.py
@@ -228,6 +228,7 @@ class Test(test): @@ -228,6 +228,7 @@ class Test(test):
228 cpy_sim['outevents'] = 'ctobssim_py3.xml' 228 cpy_sim['outevents'] = 'ctobssim_py3.xml'
229 cpy_sim['logfile'] = 'ctobssim_py3.log' 229 cpy_sim['logfile'] = 'ctobssim_py3.log'
230 cpy_sim['chatter'] = 4 230 cpy_sim['chatter'] = 4
  231 + cpy_sim['publish'] = True
231 cpy_sim.logFileOpen() # Needed to get a new log file 232 cpy_sim.logFileOpen() # Needed to get a new log file
232 cpy_sim.execute() 233 cpy_sim.execute()
233 234
test/test_ctselect.py
@@ -177,6 +177,7 @@ class Test(test): @@ -177,6 +177,7 @@ class Test(test):
177 cpy_select['outobs'] = 'ctselect_py2.fits' 177 cpy_select['outobs'] = 'ctselect_py2.fits'
178 cpy_select['logfile'] = 'ctselect_py2.log' 178 cpy_select['logfile'] = 'ctselect_py2.log'
179 cpy_select['chatter'] = 3 179 cpy_select['chatter'] = 3
  180 + cpy_select['publish'] = True
180 cpy_select.logFileOpen() # Needed to get a new log file 181 cpy_select.logFileOpen() # Needed to get a new log file
181 cpy_select.execute() 182 cpy_select.execute()
182 183