Commit f6150a99c46b9e50cb37806238fe047c60b7a05d

Authored by Jürgen Knödlseder
1 parent f4dea160

Add csbkgmodel script (#2694)

ChangeLog
1   -2018-10-17
  1 +2018-10-18
2 2  
3 3 * Version 1.6.0 released
4 4 ========================
5 5  
  6 + Add csbkgmodel script (#2694)
6 7 Compute DETX and DETY in ctmodel if they are not available (#2694)
7 8 Do no longer set missing boundaries in ctool::get_observations and
8 9 ctool::setup_observations (#2686)
... ...
1 1 New Features and Important Changes in ctools 1.6.0
2 2  
3   -17 October 2018
  3 +18 October 2018
4 4  
5 5  
6 6 Introduction
... ... @@ -200,6 +200,13 @@ support - Support classes
200 200 None
201 201  
202 202  
  203 +csbkgmodel - Generate background model for 3D analysis
  204 +------------------------------------------------------
  205 +Introduced the script that generates a background for a 3D analysis. This
  206 +script is particularly useful to generate a background model for the analysis
  207 +of the H.E.S.S. public data release (#2694).
  208 +
  209 +
203 210 cscaldb - Inspect calibration database
204 211 --------------------------------------
205 212 None
... ...
cscripts/Makefile.am
... ... @@ -21,6 +21,7 @@
21 21  
22 22 # Scripts to be distributed in $(pyexecdir)/cscripts
23 23 pythonscripts = $(top_builddir)/cscripts/__init__.py \
  24 + $(srcdir)/csbkgmodel.py \
24 25 $(srcdir)/cscaldb.py \
25 26 $(srcdir)/csebins.py \
26 27 $(srcdir)/csinfo.py \
... ... @@ -58,7 +59,8 @@ pythonscripts = $(top_builddir)/cscripts/__init__.py \
58 59 $(srcdir)/mputils.py
59 60  
60 61 # Parfiles to be distributed in $(prefix)/syspfiles
61   -parfiles = $(srcdir)/cscaldb.par \
  62 +parfiles = $(srcdir)/csbkgmodel.par \
  63 + $(srcdir)/cscaldb.par \
62 64 $(srcdir)/csebins.par \
63 65 $(srcdir)/cslightcrv.par \
64 66 $(srcdir)/csmodelinfo.par \
... ... @@ -89,7 +91,8 @@ parfiles = $(srcdir)/cscaldb.par \
89 91 $(srcdir)/csiactobs.par
90 92  
91 93 # Scripts for which symbolic links will be created in bindir
92   -linkscripts = cscaldb \
  94 +linkscripts = csbkgmodel \
  95 + cscaldb \
93 96 csebins \
94 97 csinfo \
95 98 cslightcrv \
... ...
cscripts/__init__.py.in
... ... @@ -24,6 +24,7 @@ cur_version = sys.version_info
24 24  
25 25 # List all scripts in this module
26 26 __all__ = [
  27 + "csbkgmodel",
27 28 "cscaldb",
28 29 "csebins",
29 30 "csinfo",
... ... @@ -63,9 +64,10 @@ if cur_version > req_version:
63 64 "csiactobs"])
64 65  
65 66 # Import
  67 +from cscripts.csbkgmodel import csbkgmodel
66 68 from cscripts.cscaldb import cscaldb
67   -from cscripts.csinfo import csinfo
68 69 from cscripts.csebins import csebins
  70 +from cscripts.csinfo import csinfo
69 71 from cscripts.cslightcrv import cslightcrv
70 72 from cscripts.csmodelinfo import csmodelinfo
71 73 from cscripts.csmodelmerge import csmodelmerge
... ...
cscripts/csbkgmodel.par 0 → 100755
  1 +#############################################################################
  2 +# #
  3 +# CTA Science Analysis Tools #
  4 +# #
  5 +# ------------------------------------------------------------------------- #
  6 +# #
  7 +# File: csbkgmodel.par #
  8 +# #
  9 +# Author: Juergen Knoedlseder #
  10 +# Jurgen.Knodlseder@irap.omp.eu #
  11 +# IRAP #
  12 +# #
  13 +# Purpose: Parameter file for the csbkgmodel script #
  14 +# #
  15 +#############################################################################
  16 +#
  17 +# Input and output parameters
  18 +#============================
  19 +inobs, f, a, obs.xml,,, "Input observation definition XML file"
  20 +outmodel, f, a, model.xml,,, "Output model definition XML file"
  21 +
  22 +#
  23 +# Script parameters
  24 +#==================
  25 +instrument, s, a, CTA,,, "Instrument name (for multi-instrument analysis)"
  26 +spatial, s, a, GAUSS,IRF|AEFF|GAUSS,, "Spatial model component"
  27 +gradient, b, a, yes,,, "Allow for spatial gradient?"
  28 +spectral, s, a, HESS,PLAW|HESS,, "Spectral model component"
  29 +runwise, b, a, yes,,, "Generate runwise background model?"
  30 +rad, r, h, 2.0,,, "Radius for event selection (degrees)"
  31 +
  32 +#
  33 +# Standard parameters
  34 +#====================
  35 +chatter, i, h, 2,0,4, "Chattiness of output"
  36 +clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
  37 +debug, b, h, no,,, "Activate debugging mode?"
  38 +mode, s, h, ql,,, "Mode of automatic parameters"
  39 +logfile, f, h, csbkgmodel.log,,, "Log filename"
... ...
cscripts/csbkgmodel.py 0 → 100755
  1 +#! /usr/bin/env python
  2 +# ==========================================================================
  3 +# Generates background model
  4 +#
  5 +# Copyright (C) 2018 Juergen Knoedlseder
  6 +#
  7 +# This program is free software: you can redistribute it and/or modify
  8 +# it under the terms of the GNU General Public License as published by
  9 +# the Free Software Foundation, either version 3 of the License, or
  10 +# (at your option) any later version.
  11 +#
  12 +# This program is distributed in the hope that it will be useful,
  13 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 +# GNU General Public License for more details.
  16 +#
  17 +# You should have received a copy of the GNU General Public License
  18 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  19 +#
  20 +# ==========================================================================
  21 +import sys
  22 +import math
  23 +import gammalib
  24 +import ctools
  25 +
  26 +
  27 +# ================ #
  28 +# csbkgmodel class #
  29 +# ================ #
  30 +class csbkgmodel(ctools.csobservation):
  31 + """
  32 + Generates background model
  33 + """
  34 +
  35 + # Constructor
  36 + def __init__(self, *argv):
  37 + """
  38 + Constructor
  39 + """
  40 + # Initialise application by calling the appropriate class constructor
  41 + self._init_csobservation(self.__class__.__name__, ctools.__version__, argv)
  42 +
  43 + # Set members
  44 + self._models = gammalib.GModels()
  45 + self._instrument = ''
  46 +
  47 + # Return
  48 + return
  49 +
  50 +
  51 + # Private methods
  52 + def _get_parameters(self):
  53 + """
  54 + Get parameters from parfile
  55 + """
  56 + # Setup observations (do not require response, allow event list and
  57 + # counts cube)
  58 + self._setup_observations(self.obs(), False, True, True)
  59 +
  60 + # Set instrument name
  61 + self._instrument = self._get_instrument()
  62 +
  63 + # Query input parameters
  64 + spatial = self['spatial'].string()
  65 + if self['spatial'].string() == 'GAUSS':
  66 + self['gradient'].boolean()
  67 + self['spectral'].string()
  68 + self['runwise'].boolean()
  69 + self['rad'].real()
  70 +
  71 + # Query ahead output model filename
  72 + if self._read_ahead():
  73 + self['outmodel'].filename()
  74 +
  75 + # Write input parameters into logger
  76 + self._log_parameters(gammalib.TERSE)
  77 +
  78 + # Return
  79 + return
  80 +
  81 + def _get_instrument(self):
  82 + """
  83 + Get instrument name
  84 +
  85 + Extracts the instrument name from the observation container. If there
  86 + are multiple instruments in the container then use the "instrument"
  87 + parameter to set the instrument name.
  88 +
  89 + Returns
  90 + -------
  91 + instrument : str
  92 + Instrument name
  93 + """
  94 + # Initialise instrument
  95 + instrument = ''
  96 +
  97 + # Loop over all observations
  98 + for obs in self.obs():
  99 + if instrument == '':
  100 + instrument = obs.instrument()
  101 + elif instrument != obs.instrument():
  102 + instrument = self['instrument'].string()
  103 + break
  104 +
  105 + # Return instrument
  106 + return instrument
  107 +
  108 + def _generate_initial_model(self):
  109 + """
  110 + Generate initial background model
  111 +
  112 + Returns
  113 + -------
  114 + model : `~gammalib.GModelData()`
  115 + Background model
  116 + """
  117 + # Handle IRF model
  118 + if self['spatial'].string() == 'IRF':
  119 + epivot = gammalib.GEnergy(1.0, 'TeV')
  120 + spectral = gammalib.GModelSpectralPlaw(1.0, 0.0, epivot)
  121 + model = gammalib.GCTAModelIrfBackground(spectral)
  122 +
  123 + # Handle AEFF model
  124 + elif self['spatial'].string() == 'AEFF':
  125 + epivot = gammalib.GEnergy(1.0, 'TeV')
  126 + spectral = gammalib.GModelSpectralPlaw(1.0e-13, -2.5, epivot)
  127 + model = gammalib.GCTAModelAeffBackground(spectral)
  128 +
  129 + # Handle GAUSS model
  130 + elif self['spatial'].string() == 'GAUSS':
  131 + if self['gradient'].boolean():
  132 + spatial = gammalib.GCTAModelSpatialMultiplicative()
  133 + factor1 = gammalib.GCTAModelRadialGauss(3.0)
  134 + factor2 = gammalib.GCTAModelSpatialGradient()
  135 + spatial.append(factor1)
  136 + spatial.append(factor2)
  137 + else:
  138 + spatial = gammalib.GCTAModelRadialGauss(3.0)
  139 + epivot = gammalib.GEnergy(1.0, 'TeV')
  140 + spectral = gammalib.GModelSpectralPlaw(3.0e-4, -1.5, epivot)
  141 + spectral['Prefactor'].min(1.0e-8)
  142 + model = gammalib.GCTAModelBackground(spatial, spectral)
  143 +
  144 + # Any other strings (should never occur)
  145 + else:
  146 + model = None
  147 +
  148 + # Set background name and instrument
  149 + if model is not None:
  150 + model.name('Background')
  151 + model.instruments(self._instrument)
  152 +
  153 + # Return model
  154 + return model
  155 +
  156 + def _select_events(self, obs):
  157 + """
  158 + Select events within a given RoI radius
  159 +
  160 + Parameters
  161 + ----------
  162 + obs : `~gammalib.GObservations()`
  163 + Observation container
  164 +
  165 + Returns
  166 + -------
  167 + obs : `~gammalib.GObservations()`
  168 + Observation container
  169 + """
  170 + # Setup task parameters
  171 + select = ctools.ctselect(obs)
  172 + select['ra'] = 'UNDEF'
  173 + select['dec'] = 'UNDEF'
  174 + select['rad'] = self['rad'].real()
  175 + select['tmin'] = 'UNDEF'
  176 + select['tmax'] = 'UNDEF'
  177 + select['emin'] = 'UNDEF'
  178 + select['emax'] = 'UNDEF'
  179 + select['usethres'] = 'DEFAULT'
  180 +
  181 + # Select events
  182 + select.run()
  183 +
  184 + # Extract observation
  185 + obs = select.obs().copy()
  186 +
  187 + # Return observation
  188 + return obs
  189 +
  190 + def _create_nodes(self, model):
  191 + """
  192 + Replace spectral model by node function
  193 +
  194 + Parameters
  195 + ----------
  196 + model : `~gammalib.GModelData()`
  197 + Input background model
  198 +
  199 + Returns
  200 + -------
  201 + model : `~gammalib.GModelData()`
  202 + Background model with spectral node function
  203 + """
  204 + # Extract spectral model of background component
  205 + spectrum = model.spectral()
  206 +
  207 + # Define 8 node energies
  208 + energies = gammalib.GEnergies()
  209 + energies.append(gammalib.GEnergy(0.1, 'TeV'))
  210 + energies.append(gammalib.GEnergy(0.2, 'TeV'))
  211 + energies.append(gammalib.GEnergy(0.4, 'TeV'))
  212 + energies.append(gammalib.GEnergy(0.8, 'TeV'))
  213 + energies.append(gammalib.GEnergy(1.6, 'TeV'))
  214 + energies.append(gammalib.GEnergy(3.2, 'TeV'))
  215 + energies.append(gammalib.GEnergy(6.4, 'TeV'))
  216 + energies.append(gammalib.GEnergy(12.8, 'TeV'))
  217 +
  218 + # Create node spectrum
  219 + nodes = gammalib.GModelSpectralNodes(spectrum, energies)
  220 + nodes.autoscale()
  221 +
  222 + # Set minimum node intensities (this avoids NaNs during model fitting)
  223 + for i in range(nodes.size()):
  224 + nodes[i].min(1.0e-6*nodes[i].value())
  225 +
  226 + # Set node spectrum
  227 + model.spectral(nodes)
  228 +
  229 + # Return
  230 + return model
  231 +
  232 + def _generate_bkg(self, obs):
  233 + """
  234 + Generate background models
  235 +
  236 + Parameters
  237 + ----------
  238 + obs : `~gammalib.GObservations()`
  239 + Observations container
  240 +
  241 + Returns
  242 + -------
  243 + model : `~gammalib.GModelData()`
  244 + Background model component
  245 + """
  246 + # Write header for event selection
  247 + self._log_header3(gammalib.EXPLICIT, 'Select events from observation')
  248 +
  249 + # Select events
  250 + obs = self._select_events(obs)
  251 +
  252 + # Write header for initial background model generation
  253 + self._log_header3(gammalib.EXPLICIT, 'Generate initial background model')
  254 +
  255 + # Generate initial background model
  256 + model = self._generate_initial_model()
  257 +
  258 + # Attach initial background model
  259 + models = gammalib.GModels()
  260 + models.append(model)
  261 + obs.models(models)
  262 +
  263 + # Write header for initial model fitting
  264 + self._log_header3(gammalib.EXPLICIT, 'Fit initial background model')
  265 +
  266 + # Perform maximum likelihood fitting with initial model
  267 + like = ctools.ctlike(obs)
  268 + like.run()
  269 +
  270 + # Extract fitted model
  271 + model = like.obs().models()[0].copy()
  272 +
  273 + # If a HESS model is requested then refit a node spectrum
  274 + if self['spectral'].string() == 'HESS':
  275 +
  276 + # Create nodes spectrum from fitted initial model
  277 + model = self._create_nodes(model)
  278 +
  279 + # Attach node spectrum
  280 + models = gammalib.GModels()
  281 + models.append(model)
  282 + obs.models(models)
  283 +
  284 + # Write header for node model fitting
  285 + self._log_header3(gammalib.EXPLICIT, 'Fit nodes background model')
  286 +
  287 + # Perform maximum likelihood fitting with node model
  288 + like = ctools.ctlike(obs)
  289 + like.run()
  290 +
  291 + # Extract fitted model
  292 + model = like.obs().models()[0].copy()
  293 +
  294 + # Return model
  295 + return model
  296 +
  297 + def _generate_runwise_bkg(self):
  298 + """
  299 + Generate background models
  300 +
  301 + Parameters
  302 + ----------
  303 + responses : list of dict
  304 + List of response dictionaries
  305 + energy : float
  306 + Energy to insert (TeV)
  307 + comment : str
  308 + Reason for energy insertion
  309 + """
  310 + # Loop over observations
  311 + for run in self.obs():
  312 +
  313 + # Write header
  314 + self._log_header2(gammalib.TERSE, self._get_obs_header(run))
  315 +
  316 + # Build observation container with single run
  317 + obs = gammalib.GObservations()
  318 + obs.append(run)
  319 +
  320 + # Generate background model for
  321 + model = self._generate_bkg(obs)
  322 +
  323 + # Set model attributes
  324 + model.name(('Background_%s' % run.id()))
  325 + model.ids(run.id())
  326 +
  327 + # Write model
  328 + self._log_string(gammalib.NORMAL, str(model))
  329 +
  330 + # Append background model
  331 + self._models.append(model)
  332 +
  333 + # Return
  334 + return
  335 +
  336 +
  337 + # Public methods
  338 + def run(self):
  339 + """
  340 + Run the script
  341 + """
  342 + # Switch screen logging on in debug mode
  343 + if self._logDebug():
  344 + self._log.cout(True)
  345 +
  346 + # Get parameters
  347 + self._get_parameters()
  348 +
  349 + # Write observation into logger
  350 + self._log_observations(gammalib.NORMAL, self.obs(), 'Input observation')
  351 +
  352 + # Write header
  353 + self._log_header1(gammalib.TERSE, 'Generate background models')
  354 +
  355 + # Clear models
  356 + self._models.clear()
  357 +
  358 + # Generate background models
  359 + if self['runwise'].boolean():
  360 + self._generate_runwise_bkg()
  361 + else:
  362 + model = self._generate_bkg(self.obs())
  363 + self._models.append(model)
  364 +
  365 + # Write models
  366 + self._log_models(gammalib.NORMAL, self._models, 'Output models')
  367 +
  368 + # Return
  369 + return
  370 +
  371 + def save(self):
  372 + """
  373 + Save models
  374 + """
  375 + # Write header
  376 + self._log_header1(gammalib.TERSE, 'Save models')
  377 +
  378 + # Get models filename
  379 + outmodel = self['outmodel'].filename()
  380 +
  381 + # Log file name
  382 + self._log_value(gammalib.NORMAL, 'Models file', outmodel.url())
  383 +
  384 + # Save models
  385 + self._models.save(outmodel)
  386 +
  387 + # Return
  388 + return
  389 +
  390 + def models(self):
  391 + """
  392 + Return background models
  393 +
  394 + Returns
  395 + -------
  396 + ebounds : `~gammalib.GModels()`
  397 + Background models
  398 + """
  399 + # Return
  400 + return self._models
  401 +
  402 +
  403 +# ======================== #
  404 +# Main routine entry point #
  405 +# ======================== #
  406 +if __name__ == '__main__':
  407 +
  408 + # Create instance of application
  409 + app = csbkgmodel(sys.argv)
  410 +
  411 + # Execute application
  412 + app.execute()
... ...
doc/source/admin/release_history/1.6.rst
... ... @@ -10,6 +10,7 @@ ctools 1.6 is a major release that adds significant functionality.
10 10  
11 11 In particular, this release provides:
12 12  
  13 +* Support for H.E.S.S. public data release analysis
13 14 * Support for Xspec spectral analysis
14 15 * Improved computation speed for :ref:`ctskymap` and :ref:`csphagen`
15 16 * Parallelisation of various cscripts
... ... @@ -89,6 +90,8 @@ Improvements
89 90 New features
90 91 ------------
91 92  
  93 +* [`2694 <https://cta-redmine.irap.omp.eu/issues/2694>`_] -
  94 + Add :ref:`csbkgmodel` script
92 95 * [`2421 <https://cta-redmine.irap.omp.eu/issues/2421>`_] -
93 96 Parallelise :ref:`cslightcrv`, :ref:`csphasecrv`, :ref:`csspec`, :ref:`cssens`,
94 97 :ref:`csphagen`, :ref:`cspull` and :ref:`cstsdist`
... ...
doc/source/users/reference_manual/csbkgmodel.rst 0 → 100755
  1 +.. _csbkgmodel:
  2 +
  3 +csbkgmodel
  4 +==========
  5 +
  6 +Generates background model for 3D analysis.
  7 +
  8 +
  9 +Synopsis
  10 +--------
  11 +
  12 +This script generates a background model for a 3D analysis.
  13 +
  14 +:ref:`csbkgmodel` writes an model definition XML file.
  15 +
  16 +
  17 +General parameters
  18 +------------------
  19 +
  20 +``inobs [file]``
  21 + Event list, counts cube or input observation definition XML file.
  22 +
  23 +``outmodel [file]``
  24 + Output model XML file.
  25 +
  26 +``instrument [string]``
  27 + Instrument name for which background models should be generated. If the
  28 + input observation definition XML contains only observations for a given
  29 + instrument, the instrument name will be extracted from the observation
  30 + definition XML file.
  31 +
  32 +``spatial <IRF|AEFF|GAUSS> [string]``
  33 + Spatial model component. So far IRF template, effective area and radial
  34 + Gaussian models are supported.
  35 +
  36 +``gradient [boolean]``
  37 + Allow for a spatial gradient in the background event distribution?
  38 + This option only applies to the ``GAUSS`` spatial model component.
  39 +
  40 +``spectral <PLAW|HESS> [string]``
  41 + Spectral model component. ``PLAW`` specifies a simple power law model,
  42 + ``HESS`` specifies a piecewise broken power-law using 8 energy nodes
  43 + spread over the energy range from 100 GeV to 12.8 TeV.
  44 +
  45 +``runwise [boolean]``
  46 + Generate runwise background model? If ``yes`` is specified a background
  47 + model component for each observation in the observation definition XML
  48 + file will be added to the output model XML file.
  49 +
  50 +``(rad = 2.0) [real]``
  51 + Radius for event selection. Only events within this radius around the
  52 + pointing direction will be used for model fitting.
  53 +
  54 +
  55 +Standard parameters
  56 +-------------------
  57 +
  58 +``(chatter = 2) [integer]``
  59 + Verbosity of the executable:
  60 + ``chatter = 0``: no information will be logged
  61 +
  62 + ``chatter = 1``: only errors will be logged
  63 +
  64 + ``chatter = 2``: errors and actions will be logged
  65 +
  66 + ``chatter = 3``: report about the task execution
  67 +
  68 + ``chatter = 4``: detailed report about the task execution
  69 +
  70 +``(clobber = yes) [boolean]``
  71 + Specifies whether an existing energy boundaries output file should be overwritten.
  72 +
  73 +``(debug = no) [boolean]``
  74 + Enables debug mode. In debug mode the executable will dump any log file output to the console.
  75 +
  76 +``(mode = ql) [string]``
  77 + Mode of automatic parameters (default is ``ql``, i.e. "query and learn").
  78 +
  79 +``(logfile = csbkgmodel.log) [filename]``
  80 + Log filename.
  81 +
  82 +
  83 +Related tools or scripts
  84 +------------------------
  85 +
  86 +:doc:`ctlike`
... ...
doc/source/users/reference_manual/csmodelinfo.rst
... ... @@ -28,28 +28,28 @@ General parameters
28 28 ------------------
29 29  
30 30 ``inmodel [file]``
31   - Event list, counts cube, or observation definition file
  31 + Input model XML file.
32 32  
33 33 ``outds9file [file]``
34   - Output DS9 region file containing soucre positions
  34 + Output DS9 region file containing soucre positions.
35 35  
36 36 ``(pnt_type=cross) <circle|box|diamond|cross|x|arrow|boxcircle> [string]``
37   - Marker type for point sources
  37 + Marker type for point sources.
38 38  
39 39 ``(pnt_mark_size=12) [integer]``
40   - Marker size for point sources
  40 + Marker size for point sources.
41 41  
42 42 ``(show_labels=yes) [boolean]``
43 43 Add source labels?
44 44  
45 45 ``(width=2) [integer]``
46   - Line width for regions
  46 + Line width for regions.
47 47  
48 48 ``(fontfamily=helvetica) <helvetica|times|courier> [string]``
49   - Font for source labels
  49 + Font for source labels.
50 50  
51 51 ``(fontsize=12) [integer]``
52   - Font size for source labels
  52 + Font size for source labels.
53 53  
54 54 ``(fontweight=normal) <normal|bold> [string]``
55 55 Use normal or bold font?
... ... @@ -61,10 +61,10 @@ General parameters
61 61 Show type of extended model in source name?
62 62  
63 63 ``(free_color=green) [string]``
64   - Color for sources with free parameters (any ds9 color or hex code)
  64 + Color for sources with free parameters (any ds9 color or hex code).
65 65  
66 66 ``(fixed_color=magenta) [string]``
67   - Color for sources without free parameters (any ds9 color or hex code)
  67 + Color for sources without free parameters (any ds9 color or hex code).
68 68  
69 69  
70 70 Standard parameters
... ...
doc/source/users/reference_manual/index.rst
... ... @@ -43,6 +43,7 @@ cscripts
43 43 .. toctree::
44 44 :maxdepth: 1
45 45  
  46 + csbkgmodel --- Generates background model for 3D analysis <csbkgmodel>
46 47 cscaldb --- Lists available instrument response functions <cscaldb>
47 48 csebins --- Generates energy boundaries for stacked analysis <csebins>
48 49 cslightcrv --- Computes light curve <cslightcrv>
... ...