diff --git a/cscripts/csphasecrv.par b/cscripts/csphasecrv.par
new file mode 100644
index 0000000..7e08f68
--- /dev/null
+++ b/cscripts/csphasecrv.par
@@ -0,0 +1,54 @@
+#############################################################################
+# #
+# CTA Science Analysis Tools #
+# #
+# ------------------------------------------------------------------------- #
+# #
+# File: csphasecrv.par #
+# #
+# Author: Rolf Buehler #
+# rolf.buehler@desy.de #
+# DESY #
+# #
+# Purpose: Parameter file for the csphasecrv script #
+# #
+#############################################################################
+#
+# Input and output parameters
+#============================
+inobs, f, a, phased_events.fits,,, "Input event list or observation definition XML file"
+inmodel, f, a, $CTOOLS/share/models/crab.xml,,, "Input model definition XML file"
+srcname, s, a, Crab,,, "Source name"
+caldb, s, a, prod2,,, "Calibration database"
+irf, s, a, South_0.5h,,, "Instrument response function"
+edisp, b, h, no,,, "Apply energy dispersion?"
+outfile, f, a, phasecrv.fits,,, "Output fits file name."
+
+#
+# Script parameters
+#==================
+tbinalg, s, a, LIN,LIN|FILE,, "Algorithm for defining time bins"
+phbins, i, a, 5,1,10000, "Number of phase bins"
+phbinfile, f, a, NONE,,, "File defining the phase binning"
+emin, r, a, 0.1,,, "Lower energy limit of events (TeV)"
+emax, r, a, 100.0,,, "Upper energy limit of events (TeV)"
+enumbins, i, a, 0,0,100, "Number of energy bins for binned (0=unbinned)"
+coordsys, s, a, CEL,CEL|GAL,, "Coordinate System"
+proj, s, a, CAR,AIT|AZP|CAR|MER|MOL|STG|TAN,, "Projection method"
+xref, r, a, 83.63,0,360, "First coordinate of image center in degrees (RA or galactic l)"
+yref, r, a, 22.01,-90,90, "Second coordinate of image center in degrees (DEC or galactic b)"
+nxpix, i, a, 200,,, "Size of the X axis in pixels"
+nypix, i, a, 200,,, "Size of the Y axis in pixels"
+binsz, r, a, 0.02,,, "Pixel size (deg/pixel)"
+
+#
+# Standard parameters
+#====================
+chatter, i, h, 2,0,4, "Chattiness of output"
+clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
+debug, b, h, no,,, "Debugging mode activated"
+mode, s, h, ql,,, "Mode of automatic parameters"
+logfile, f, h, csphasecrv.log,,, "Log filename"
+
+
+
diff --git a/cscripts/csphasecrv.py b/cscripts/csphasecrv.py
new file mode 100755
index 0000000..fa3d769
--- /dev/null
+++ b/cscripts/csphasecrv.py
@@ -0,0 +1,527 @@
+#! /usr/bin/env python
+# ==========================================================================
+# Generates pulsar spectra as a function of phase
+#
+# Copyright (C) 2014-2017 Rolf Buehler
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# ==========================================================================
+import sys
+import gammalib
+import ctools
+from cscripts import obsutils
+
+
+# ================ #
+# csphasecrv class #
+# ================ #
+class csphasecrv(ctools.cscript):
+ """
+ Generates a spectra in phase bins
+
+ This script computes spectra by performing a maximum likelihood fit
+ using :doc:`ctlike` in a series of phase bins for pulsars.
+ The phase bins can be either specified in an ASCII file, as an interval
+ divided into equally sized phase bins.
+
+ Examples:
+ >>> phrv = csphasecrv()
+ >>> phrv.run()
+ >>> ... (querying for parameters) ...
+ >>> phrv = phrv.phasecrv()
+ Generates phase fits and retrieves dictionary with best fit models.
+
+ >>> lcrv = csphasecrv(obs)
+ >>> lcrv.execute()
+ >>> ... (querying for parameters) ...
+ Generates phase fits from the observations
+ and saves results in XML files.
+ """
+
+ # Constructor
+ def __init__(self, *argv):
+ """
+ Constructor
+ """
+ # Set name
+ self._name = 'csphasecrv'
+ self._version = '1.0.0'
+
+ # Initialise some members
+ self._srcname = ''
+ # Phases are stored in a nested list [[ph1min,ph1max], [ph2min,ph2max],..]
+ self._phbins = [[0.0,1.0]]
+ self._stacked = False
+
+ # Initialise observation container from constructor arguments.
+ self._obs, argv = self._set_input_obs(argv)
+
+ # Initialise script by calling the appropriate class constructor.
+ self._init_cscript(argv)
+
+ # Return
+ return
+
+ # Private methods
+ def _get_parameters(self):
+ """
+ Get parameters from parfile
+ """
+ # Setup observations (require response and allow event list, don't
+ # allow counts cube)
+ self._setup_observations(self._obs, True, True, False)
+
+ # Set models if there are none in the container
+ if self._obs.models().size() == 0:
+ self._obs.models(self['inmodel'].filename())
+
+ # Get source name
+ self._srcname = self['srcname'].string()
+
+ # Get time boundaries
+ self._phbins = self._create_tbounds()
+
+ # Set stacked analysis flag to True if the requested number of
+ # energy bins is positive. Otherwise an unbinned analysis will
+ # be done and the stacked analysis flag will be set to False.
+ if self['enumbins'].integer() > 0:
+ self._stacked = True
+ else:
+ self._stacked = False
+
+ # Make sure that remaining user parameters are queried now. We
+ # do not store the actual parameter values as we do not want
+ # too many instance attributes with enhances the maintenance
+ # costs.
+ self['emin'].real()
+ self['emax'].real()
+ if self._stacked:
+ self['coordsys'].string()
+ self['proj'].string()
+ self['xref'].real()
+ self['yref'].real()
+ self['nxpix'].integer()
+ self['nypix'].integer()
+ self['binsz'].real()
+
+ # Do the same for the hidden parameters, just in case
+ self['edisp'].boolean()
+
+ # Read ahead output parameters
+ if self._read_ahead():
+ self['outfile'].filename()
+
+ # Write input parameters into logger
+ self._log_parameters(gammalib.TERSE)
+
+ # Return
+ return
+
+ def _create_tbounds(self):
+ """
+ Creates phase bins
+
+ Returns
+ -------
+ phbins : `[]`
+ List of phase bins
+ """
+ # Initialise Good Time Intervals
+ phbins = []
+
+ # Get algorithm to use for defining the time intervals. Possible
+ # values are "FILE" or "LIN". This is enforced at
+ # parameter file level, hence no checking is needed.
+ algorithm = self['tbinalg'].string()
+
+ # If the algorithm is "FILE" then handle a FITS or an ASCII file for
+ # the time bin definition
+ if algorithm == 'FILE':
+
+ # Get the filename
+ filename = self['phbinfile'].filename()
+
+ # Load ASCII file as CSV file and construct
+ # the GTIs from the rows of the CSV file. It is expected that the
+ # CSV file has two columns containing the "START" and "STOP"
+ # values of the phase bins. No header row is expected.
+ csv = gammalib.GCsv(filename)
+ for i in range(csv.nrows()):
+ phmin = csv.real(i,0)
+ phmax = csv.real(i,1)
+ phbins.append([phmin,phmax])
+
+ # If the algorithm is "LIN" then use a linear time binning, defined by
+ # the "phbins" user parameters
+ elif algorithm == 'LIN':
+
+ # Get start and stop time and number of time bins
+ nbins = self['phbins'].integer()
+
+ # Compute time step and setup the GTIs
+ ph_step = 1.0 / float(nbins)
+ for i in range(nbins):
+ phmin = i *ph_step
+ phmax = (i+1)*ph_step
+ phbins.append([phmin,phmax])
+
+ # Return Good Time Intervals
+ return phbins
+
+ def _bin_observation(self, obs):
+ """
+ Bin an observation if a binned analysis was requested
+
+ Parameters
+ ----------
+ obs : `~gammalib.GObservations`
+ Observation container
+
+ Returns
+ -------
+ obs : `~gammalib.GObservations`
+ Observation container where the first observation is a binned observation
+ """
+ # Header
+ if self._logExplicit():
+ self._log.header3('Binning events')
+
+ # Bin events
+ cntcube = ctools.ctbin(obs)
+ cntcube['usepnt'] = False
+ cntcube['ebinalg'] = 'LOG'
+ cntcube['xref'] = self['xref'].real()
+ cntcube['yref'] = self['yref'].real()
+ cntcube['binsz'] = self['binsz'].real()
+ cntcube['nxpix'] = self['nxpix'].integer()
+ cntcube['nypix'] = self['nypix'].integer()
+ cntcube['enumbins'] = self['enumbins'].integer()
+ cntcube['emin'] = self['emin'].real()
+ cntcube['emax'] = self['emax'].real()
+ cntcube['coordsys'] = self['coordsys'].string()
+ cntcube['proj'] = self['proj'].string()
+ cntcube.run()
+
+ # Header
+ if self._logExplicit():
+ self._log.header3('Creating stacked response')
+
+ # Get stacked response
+ response = obsutils.get_stacked_response(obs,
+ self['xref'].real(),
+ self['yref'].real(),
+ binsz=self['binsz'].real(),
+ nxpix=self['nxpix'].integer(),
+ nypix=self['nypix'].integer(),
+ emin=self['emin'].real(),
+ emax=self['emax'].real(),
+ enumbins=self['enumbins'].integer(),
+ edisp=self['edisp'].boolean(),
+ coordsys=self['coordsys'].string(),
+ proj=self['proj'].string())
+
+ # Retrieve a new oberservation container
+ new_obs = cntcube.obs().copy()
+
+ # Set stacked response
+ if self['edisp'].boolean():
+ new_obs[0].response(response['expcube'], response['psfcube'],
+ response['edispcube'], response['bkgcube'])
+ else:
+ new_obs[0].response(response['expcube'], response['psfcube'],
+ response['bkgcube'])
+
+ # Get new models
+ models = response['models']
+
+ # Set models for new oberservation container
+ new_obs.models(models)
+
+ # Return new oberservation container
+ return new_obs
+
+
+ # Public methods
+ def run(self):
+ """
+ Run the script
+ """
+ # Switch screen logging on in debug mode
+ if self._logDebug():
+ self._log.cout(True)
+
+ # Get parameters
+ self._get_parameters()
+
+ # Write observation into logger
+ if self._logTerse():
+ self._log('\n')
+ self._log.header1(gammalib.number('Input observation',len(self._obs)))
+ self._log(str(self._obs))
+ self._log('\n')
+
+ #Store and clear observations to split them in phase
+ orig_obs = self._obs.copy()
+ #self._obs.clear()
+
+ #Dictionary to save phase fitted models
+ self._fitmodels = {}
+
+ #Loop over all phases
+ for phbin in self._phbins:
+
+ # Select events
+ select = ctools.ctselect(orig_obs)
+ select['emin'] = self['emin'].real()
+ select['emax'] = self['emax'].real()
+ select['tmin'] = 'UNDEFINED'
+ select['tmax'] = 'UNDEFINED'
+ select['rad'] = 'UNDEFINED'
+ select['ra'] = 'UNDEFINED'
+ select['dec'] = 'UNDEFINED'
+ select['expr'] = "PHASE>"+str(phbin[0])+" && PHASE<"+str(phbin[1])
+ select.run()
+
+ #Add phase to observation id
+ for i in range(0,select.obs().size()):
+ oldid = select.obs()[i].id()
+ select.obs()[i].id(oldid+"_"+str(phbin[0])+"-"+str(phbin[1]))
+ obs = select.obs()
+
+ # If a stacked analysis is requested then bin the events
+ # and compute the stacked response functions and setup
+ # an observation container with a single stacked observation.
+ if self._stacked:
+ obs = self._bin_observation(select.obs())
+
+ # Header
+ if self._logExplicit():
+ self._log.header3('Fitting the data')
+
+ # Do maximum likelihood model fitting
+ like = ctools.ctlike(obs)
+ like['edisp'] = self['edisp'].boolean()
+ like.run()
+
+ # Renormalize models to phase selection
+ # TODO move the scaling from the temporal to the spectral component
+ for model in like.obs().models():
+ scaled_norm = model["Normalization"].value()/(phbin[1] - phbin[0])
+ model["Normalization"].value(scaled_norm)
+
+ #Store fit model
+ self._fitmodels[str(phbin[0])+"-"+str(phbin[1])] = like.obs().models().copy()
+
+ ## Store observations
+ #for ob in select.obs():
+ #self._obs.append(ob.copy())
+
+ # Return
+ return
+
+ def execute(self):
+ """
+ Execute the script
+ """
+ # Open logfile
+ self.logFileOpen()
+
+ # Read ahead output parameters
+ self._read_ahead(True)
+
+ # Run the script
+ self.run()
+
+ # Save fitted models
+ self.save()
+
+ # Return
+ return
+
+ def saveXML(self):
+ """
+ Save phase fits into one XML model each
+ """
+ # Write header
+ self._log_header1(gammalib.TERSE, 'Save phase XML')
+
+ # Get out filename
+ outfile = str()
+
+ # Save XMLs
+ for phbin in self._phbins:
+ phname = str(phbin[0])+"-"+str(phbin[1])
+ outname = self['outfile'].filename()
+ outname_ph = (outname.file()).replace(".fits","_ph_"+phname+".xml")
+ outfile = outname.path()+outname_ph
+ print outfile
+ self._fitmodels[phname].save(outfile)
+
+ # Return
+ return
+
+ def save(self):
+ """
+ Saves results to fits and XML
+ """
+ print "SAVING"
+ self.savefits()
+ self.saveXML()
+
+ # Return
+ return
+
+ def phaserv(self):
+ """
+ Return dictionary with best fit models
+ """
+ # Return
+ return self._fitmodels
+
+ def _get_free_par_names(self):
+ """
+ Return list of free parameter names
+
+ Returns
+ -------
+ names : list of str
+ List of free parameter names.
+ """
+ # Initialise empty list of free parameter names
+ names = []
+
+ # Collect list of free parameter names
+ for par in self._obs.models()[self._srcname]:
+ if par.is_free():
+ names.append(par.name())
+
+ # Return names
+ return names
+
+ def savefits(self):
+ """
+ Saved phase fit results to a fits file
+ """
+ # Initialise list of result dictionaries
+ results = []
+
+ # Get source parameters
+ pars = self._get_free_par_names()
+
+ # Loop over time bins
+ for i in range(len(self._phbins)):
+
+ # Get time boundaries
+ phmin = self._phbins[i][0]
+ phmax = self._phbins[i][1]
+
+ # Write time bin into header
+ if self._logTerse():
+ self._log.header2('PHASE '+str(phmin)+'-'+str(phmax))
+
+ # Initialise result dictionary
+ result = {'phmin': phmin,
+ 'phmax': phmax,
+ 'pars': pars,
+ 'values': {}}
+ # Extract parameter values
+
+ #Store fit results
+ phname = str(phmin)+"-"+str(phmax)
+ source = self._fitmodels[phname][self._srcname]
+ for par in pars:
+ result['values'][par] = source[par].value()
+ result['values']['e_'+par] = source[par].error()
+
+ # Append result to list of dictionaries
+ results.append(result)
+
+ # Create FITS table from results
+ table = self._create_fits_table(results)
+
+ # Create FITS file and append FITS table to FITS file
+ self._fits = gammalib.GFits()
+ self._fits.append(table)
+
+ # Save to fits
+ outfile = self['outfile'].filename()
+ print outfile
+ self._fits.saveto(outfile, self._clobber())
+
+ #Return
+ return
+
+ def _create_fits_table(self, results):
+ """
+ Creates FITS binary table containing light curve results
+
+ Parameters
+ ----------
+ results : list of dict
+ List of result dictionaries
+
+ Returns
+ -------
+ table : `~gammalib.GFitsBinTable`
+ FITS binary table containing light curve
+ """
+ # Determine number of rows in FITS table
+ nrows = len(results)
+
+ # Create FITS Table with extension "LIGHTCURVE"
+ table = gammalib.GFitsBinTable(nrows)
+ table.extname('PHASESPEC')
+
+ # Append time columns "MJD" and "e_MJD"
+ phmin = gammalib.GFitsTableDoubleCol('PHMIN', nrows)
+ phmax = gammalib.GFitsTableDoubleCol('PHMAX', nrows)
+ #mjd.unit('days')
+ #e_mjd.unit('days')
+ for i, result in enumerate(results):
+ phmin[i] = result['phmin']
+ phmax[i] = result['phmax']
+ table.append(phmin)
+ table.append(phmax)
+
+ # Create parameter columns
+ for par in self._obs.models()[self._srcname]:
+ if par.is_free():
+ name = par.name()
+ e_name = 'e_'+par.name()
+ col = gammalib.GFitsTableDoubleCol(name, nrows)
+ e_col = gammalib.GFitsTableDoubleCol(e_name, nrows)
+ col.unit(par.unit())
+ e_col.unit(par.unit())
+ for i, result in enumerate(results):
+ col[i] = result['values'][name]
+ e_col[i] = result['values'][e_name]
+ table.append(col)
+ table.append(e_col)
+
+ # Return table
+ return table
+
+
+
+# ======================== #
+# Main routine entry point #
+# ======================== #
+if __name__ == '__main__':
+
+ # Create instance of application
+ app = csphasecrv(sys.argv)
+
+ # Execute application
+ app.execute()
diff --git a/doc/source/users/reference_manual/csphasecrv.rst b/doc/source/users/reference_manual/csphasecrv.rst
new file mode 100644
index 0000000..ae1e624
--- /dev/null
+++ b/doc/source/users/reference_manual/csphasecrv.rst
@@ -0,0 +1,115 @@
+.. _csphasecrv:
+
+csphasecrv
+==========
+
+Computes phase dependent spectra for a given source.
+
+
+Synopsis
+--------
+
+This script computes spectra by performing a maximum likelihood fit
+using :doc:`ctlike` in a series of phase bins for pulsars.
+The phase bins can be either specified in an ASCII file, as an interval
+divided into equally sized time bins.
+The format of the ASCII file is one row per time bin, each specifying the
+start of stop value of the phase bin, separated by a whitespace. The phase
+goes from 0.0 to 1.0 .
+
+
+General parameters
+------------------
+
+``inobs [file]``
+ Input event list or observation definition XML file.
+
+``inmodel [file]``
+ Input model XML file.
+
+``srcname [string]``
+ Name of the periodic source in the source model XML file
+
+``caldb [string]``
+ Calibration database.
+
+``irf [string]``
+ Instrumental response function.
+
+``(edisp = no) [boolean]``
+ Applies energy dispersion to response computation.
+
+``outfile [file]``
+ Name of the XML output file. The phase intervall will be automatically appended to the name.
+
+``(tbinalg = LIN) [string]``
+ Algorithm for defining time bins.
+
+``phbins [integer]``
+ Number of phase bins.
+
+``phbinfile [file]``
+ File defining the phase binning.
+
+``emin [real]``
+ Lower energy limit of events (in TeV).
+
+``emax [real]``
+ Upper energy limit of events (in TeV).
+
+``enumbins [integer]``
+ Number of energy bins per phase bin (0=unbinned).
+
+``coordsys [string]``
+ Coordinate system (CEL - celestial, GAL - galactic).
+
+``proj [string]``
+ Projection method.
+
+``xref [real]``
+ Right Ascension / Galactic longitude of image centre (J2000, in degrees).
+
+``yref [real]``
+ Declination / Galactic latitude of image centre (J2000, in degrees).
+
+``nxpix [integer]``
+ Size of the Right Ascension / Galactic longitude axis (in pixels).
+
+``nypix [integer]``
+ Size of the Declination / Galactic latitude axis (in pixels).
+
+``binsz [real]``
+ Pixel size (in degrees/pixel).
+
+Standard parameters
+-------------------
+
+``(chatter = 2) [integer]``
+ Verbosity of the executable:
+ chatter = 0: no information will be logged
+
+ chatter = 1: only errors will be logged
+
+ chatter = 2: errors and actions will be logged
+
+ chatter = 3: report about the task execution
+
+ chatter = 4: detailed report about the task execution
+
+``(clobber = yes) [boolean]``
+ Specifies whether an existing light curve output file should be overwritten.
+
+``(debug = no) [boolean]``
+ Enables debug mode. In debug mode the executable will dump any log file output to the console.
+
+``(mode = ql) [string]``
+ Mode of automatic parameters (default is "ql", i.e. "query and learn").
+
+``(logfile = csphasecrv.log) [filename]``
+ Log filename.
+
+
+Related tools or scripts
+------------------------
+
+:doc:`ctlike`
diff --git a/test/data/phased_events.fits b/test/data/phased_events.fits
new file mode 100644
index 0000000..1c2b9d4
--- /dev/null
+++ b/test/data/phased_events.fits
@@ -0,0 +1,577 @@
+SIMPLE = T / file does conform to FITS standard BITPIX = 8 / number of bits per data pixel NAXIS = 0 / number of data axes EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 36 / width of table in bytes NAXIS2 = 3813 / number of rows in table PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 8 / number of fields in each row TTYPE1 = 'EVENT_ID' / label for field 1 TFORM1 = '1J ' / data format of field: 4-byte INTEGER TZERO1 = 2147483648 / offset for unsigned integers TSCAL1 = 1 / data are not scaled TTYPE2 = 'TIME ' / label for field 2 TFORM2 = '1D ' / data format of field: 8-byte DOUBLE TUNIT2 = 's ' / physical unit of field TTYPE3 = 'RA ' / label for field 3 TFORM3 = '1E ' / data format of field: 4-byte REAL TUNIT3 = 'deg ' / physical unit of field TTYPE4 = 'DEC ' / label for field 4 TFORM4 = '1E ' / data format of field: 4-byte REAL TUNIT4 = 'deg ' / physical unit of field TTYPE5 = 'ENERGY ' / label for field 5 TFORM5 = '1E ' / data format of field: 4-byte REAL TUNIT5 = 'TeV ' / physical unit of field TTYPE6 = 'DETX ' / label for field 6 TFORM6 = '1E ' / data format of field: 4-byte REAL TUNIT6 = 'deg ' / physical unit of field TTYPE7 = 'DETY ' / label for field 7 TFORM7 = '1E ' / data format of field: 4-byte REAL TUNIT7 = 'deg ' / physical unit of field TTYPE8 = 'PHASE ' / label for field 8 TFORM8 = '1E ' / data format of field: 4-byte REAL EXTNAME = 'EVENTS ' / name of this extension DSTYP1 = 'TIME ' / Data sub-space type DSUNI1 = 's ' / Data sub-space unit DSVAL1 = 'TABLE ' / Data sub-space value DSREF1 = ':GTI ' / Data sub-space reference DSTYP2 = 'ENERGY ' / Data sub-space type DSUNI2 = 'TeV ' / Data sub-space unit DSVAL2 = '0.1:100 ' / Data sub-space value DSTYP3 = 'POS(RA,DEC)' / Data sub-space type DSUNI3 = 'deg ' / Data sub-space unit DSVAL3 = 'CIRCLE(83.63,22.01,5)' / Data sub-space value NDSKEYS = 3 / Number of data sub-space keys CREATOR = 'GammaLib' / Program which created the file TELESCOP= 'CTA ' / Telescope OBS_ID = 0 / Observation identifier DATE_OBS= '2000-01-01' / Observation start date TIME_OBS= '11:58:56' / Observation start time DATE_END= '2000-01-01' / Observation end date TIME_END= '12:28:56' / Observation end time TSTART = 0.0000000000E+00 / [s] Mission time of start of observation TSTOP = 1.8000000000E+03 / [s] Mission time of end of observation MJDREFI = 51544 / [days] Integer part of time reference MJD MJDREFF = 5.0000000000E-01 / [days] Fractional part of time reference MJD TIMEUNIT= 's ' / Time unit TIMESYS = 'TT ' / Time system TIMEREF = 'LOCAL ' / Time reference TELAPSE = 1.8000000000E+03 / [s] Mission elapsed time ONTIME = 1.8000000000E+03 / [s] Total good time including deadtime LIVETIME= 1.7640000000E+03 / [s] Total livetime DEADC = 9.8000000000E-01 / Deadtime correction factor TIMEDEL = 1.0000000000E+00 / Time resolution OBJECT = ' ' / Observed object RA_OBJ = 0.0000000000E+00 / [deg] Target Right Ascension DEC_OBJ = 0.0000000000E+00 / [deg] Target Declination RA_PNT = 8.3630000000E+01 / [deg] Pointing Right Ascension DEC_PNT = 2.2010000000E+01 / [deg] Pointing Declination ALT_PNT = 9.0000000000E+01 / [deg] Average altitude of pointing AZ_PNT = 0.0000000000E+00 / [deg] Average azimuth of pointing RADECSYS= 'FK5 ' / Coordinate system EQUINOX = 2.0000000000E+03 / Epoch CONV_DEP= 0.0000000000E+00 / Convergence depth of telescopes CONV_RA = 0.0000000000E+00 / [deg] Convergence Right Ascension CONV_DEC= 0.0000000000E+00 / [deg] Convergence Declination OBSERVER= 'string ' / Observer N_TELS = 0 / Number of telescopes in event list TELLIST = 'string ' / Telescope IDs GEOLAT = 0.0000000000E+00 / [deg] Geographic latitude of array centre GEOLON = 0.0000000000E+00 / [deg] Geographic longitude of array centre ALTITUDE= 0.0000000000E+00 / [km] Altitude of array centre EUNIT = 'TeV ' / Energy unit EVTVER = 'draft1 ' / Event list version number END € ?µ(Ö B§BüA¯Ó=Ú
+c½ù§Ñ:HÁ=„§ € @ƒ B§€îA®sˆ=ñ¾Pm”=ç¡R?]D(€ @ú‡� B§åA°¿>
ó�=ª–y½�L¬?dFB€ @,?à B§- A¯‘˜>B¨½‚ྲྀÇ?œè€ @`î B§§A¯ÚZ>"SS¼è1?½Ú.>OgL€ @È B§!A¯Ñi=úÒU½öä½ãßÅ?%�€ @lh B§DÊA¯–4>
¿)½|�˜;„9�?nï€ @"ëÚø B§w A°^�>ñ4=EY=ÂŒ=?N³F€ @#^ B§
+ŽA°/i=Ð>û