Commit 6f602f417bd591b6a1b884c5e6173c8d09fad682

Authored by Jürgen Knödlseder
1 parent bc55d6e1

Remove ctools from Python rst file

doc/source/users/tutorials/quickstart/python.rst deleted
1   -.. _start_python:
2   -
3   -Using ctools from Python
4   -------------------------
5   -
6   - .. admonition:: What you will learn
7   -
8   - You will learn how to **use the ctools and cscripts from Python** instead
9   - of typing the commands in the console.
10   -
11   -ctools provides two Python modules that allow using all tools and scripts as
12   -Python classes. To use ctools from Python you have to import the ``ctools``
13   -and ``cscripts`` modules into Python. You should also import the ``gammalib``
14   -module, as ctools without GammaLib is generally not very useful.
15   -
16   - .. warning::
17   -
18   - Always import ``gammalib`` before you import ``ctools`` and ``cscripts``.
19   -
20   -To simulate the event data from Python you have to type the following (recall
21   -:ref:`how to simulate event data from the command line <start_simulating>` for
22   -comparison) :
23   -
24   -.. code-block:: python
25   -
26   - >>> import gammalib
27   - >>> import ctools
28   - >>> import cscripts
29   - >>> sim = ctools.ctobssim()
30   - >>> sim['inmodel'] = '${CTOOLS}/share/models/crab.xml'
31   - >>> sim['outevents'] = 'events.fits'
32   - >>> sim['caldb'] = 'prod2'
33   - >>> sim['irf'] = 'South_0.5h'
34   - >>> sim['ra'] = 83.63
35   - >>> sim['dec'] = 22.01
36   - >>> sim['rad'] = 5.0
37   - >>> sim['tmin'] = '2020-01-01T00:00:00'
38   - >>> sim['tmax'] = '2020-01-01T01:00:00'
39   - >>> sim['emin'] = 0.03
40   - >>> sim['emax'] = 200.0
41   - >>> sim.execute()
42   -
43   -The first line after the ``import`` statements generates an instance of the
44   -:ref:`ctobssim` tool as a Python class. User parameters are then set using the
45   -``[ ]`` operator. After setting all parameters the ``execute()`` method is called to
46   -execute the :ref:`ctobssim` tool. On output the ``events.fits`` FITS file is
47   -created. Until now everything is identical to running the tool from the command
48   -line.
49   -
50   - .. note::
51   -
52   - See the :ref:`reference` for a list of parameters and their types for
53   - all tools and scripts. You can also inspect all parameters of a specific
54   - tool by calling the tool follwed by ``--help`` from the command line, e.g.
55   -
56   - .. code-block:: bash
57   -
58   - $ ctobssim --help
59   -
60   -Instead of executing the tool you may also *run* the tool using
61   -
62   -.. code-block:: python
63   -
64   - >>> sim.run()
65   -
66   -The main difference to the ``execute()`` method is that the ``run()`` method
67   -will not write the simulated event file to disk. Why is this useful? Well,
68   -after having typed ``sim.run()`` the :ref:`ctobssim` class still exists as an
69   -object in memory, including all the simulated events. The :ref:`ctobssim`
70   -class has an ``obs()`` method that returns an observation container that holds
71   -the simulated CTA observation with its associated events. To visualise this
72   -container, type:
73   -
74   -.. code-block:: python
75   -
76   - >>> print(sim.obs())
77   - === GObservations ===
78   - Number of observations ....: 1
79   - Number of models ..........: 2
80   - Number of observed events .: 202766
81   - Number of predicted events : 0
82   -
83   -There is one CTA observation in the container and to visualise that observation
84   -type:
85   -
86   -.. code-block:: python
87   -
88   - >>> print(sim.obs()[0])
89   - === GCTAObservation ===
90   - Name ......................:
91   - Identifier ................:
92   - Instrument ................: CTA
93   - Event file ................: events.fits
94   - Event type ................: EventList
95   - Statistics ................: Poisson
96   - Ontime ....................: 3599.99999976158 s
97   - Livetime ..................: 3527.99999976635 s
98   - Deadtime correction .......: 0.98
99   - User energy range .........: undefined
100   - === GCTAPointing ===
101   - Pointing direction ........: (RA,Dec)=(83.63,22.01)
102   - === GCTAResponseIrf ===
103   - Caldb mission .............: cta
104   - Caldb instrument ..........: prod2
105   - Response name .............: South_0.5h
106   - Energy dispersion .........: Not used
107   - Save energy range .........: undefined
108   - === GCTAEventList ===
109   - Number of events ..........: 202766 (disposed in "events.fits")
110   - Time interval .............: 58849.0008007407 - 58849.0424674074 days
111   - Energy interval ...........: 0.03 - 200 TeV
112   - Region of interest ........: RA=83.63, DEC=22.01 [0,0] Radius=5 deg
113   -
114   -The observation contains a CTA event list that is implement by the GammaLib
115   -class ``GCTAEventList``. You can access the event list using the ``events()``
116   -method. To visualise the individual events you can iterate over the events
117   -using a for loop. This will show the simulated celestial coordinates (RA, DEC),
118   -the coordinate in the camera system [DETX, DETY], the energies and the
119   -terrestrial times (TT) of all events. To do this, type:
120   -
121   -.. code-block:: python
122   -
123   - >>> events = sim.obs()[0].events()
124   - >>> for event in events:
125   - ... print(event)
126   - ...
127   - Dir=RA=83.6182556152344, DEC=22.2843074798584 [0.00478756989312195,-0.000189682185722814] Energy=63.157357275486 GeV Time=315532804.699509 s (TT)
128   - Dir=RA=83.8212127685547, DEC=21.9629154205322 [-0.000819836781619686,0.0030950360932479] Energy=53.25997620821 GeV Time=315532805.889628 s (TT)
129   - Dir=RA=83.6474838256836, DEC=22.0208301544189 [0.000189049359871014,0.000282857291220907] Energy=69.6808248758316 GeV Time=315532806.050809 s (TT)
130   - ...
131   -
132   -You can now benefit from the fact that you have some simulated events in
133   -memory to fit a model to these events using the :ref:`ctlike` class.
134   -You will do this in unbinned mode. Here is what you have to type:
135   -
136   -.. code-block:: python
137   -
138   - >>> like = ctools.ctlike(sim.obs())
139   - >>> like.run()
140   -
141   -This is pretty compact. Where are the user parameters?
142   -:ref:`ctlike` doesn't in fact need any parameters as all the relevant
143   -information is already contained in the observation container produced by the
144   -:ref:`ctobssim` class.
145   -And you may have recognised that you constructed the :ref:`ctlike`
146   -instance by using the :ref:`ctobssim` observation container as constructor
147   -argument.
148   -
149   - .. note::
150   -
151   - An observation container, implemented by the ``GObservations`` class
152   - of GammaLib, is the fundamental brick of any ctools analysis. Many tools
153   - and scripts handle observation containers, and accept them upon
154   - construction and return them after running the tool via the ``obs()``
155   - method.
156   -
157   - Passing observation containers between ctools classes is a very
158   - convenient and powerful way of building in-memory analysis pipelines.
159   - However, this implies that you need some computing ressources when
160   - dealing with large observation containers (for example if you want to
161   - analyse a few 100 hours of data at once). Also, if the script crashes
162   - the information is lost.
163   -
164   -To check how the fit went you can inspect the optimiser used by
165   -:ref:`ctlike` by typing:
166   -
167   -.. code-block:: python
168   -
169   - >>> print(like.opt())
170   - === GOptimizerLM ===
171   - Optimized function value ..: 757618.425
172   - Absolute precision ........: 0.005
173   - Acceptable value decrease .: 2
174   - Optimization status .......: converged
175   - Number of parameters ......: 10
176   - Number of free parameters .: 4
177   - Number of iterations ......: 2
178   - Lambda ....................: 1e-05
179   -
180   -You see that the fit converged after 2 iterations. Out of 10 parameters in the
181   -model 4 have been fitted (the others were kept fixed). To inspect the fit
182   -results you can print the model container that can be access using the
183   -``models()`` method of the observation container:
184   -
185   -.. code-block:: python
186   -
187   - >>> print(like.obs().models())
188   - === GModels ===
189   - Number of models ..........: 2
190   - Number of parameters ......: 10
191   - === GModelSky ===
192   - Name ......................: Crab
193   - Instruments ...............: all
194   - Instrument scale factors ..: unity
195   - Observation identifiers ...: all
196   - Model type ................: PointSource
197   - Model components ..........: "PointSource" * "PowerLaw" * "Constant"
198   - Number of parameters ......: 6
199   - Number of spatial par's ...: 2
200   - RA .......................: 83.6331 [-360,360] deg (fixed,scale=1)
201   - DEC ......................: 22.0145 [-90,90] deg (fixed,scale=1)
202   - Number of spectral par's ..: 3
203   - Prefactor ................: 5.73901839854211e-16 +/- 5.75150678022232e-18 [1e-23,1e-13] ph/cm2/s/MeV (free,scale=1e-16,gradient)
204   - Index ....................: -2.46442704108736 +/- 0.00738985717701118 [-0,-5] (free,scale=-1,gradient)
205   - PivotEnergy ..............: 300000 [10000,1000000000] MeV (fixed,scale=1000000,gradient)
206   - Number of temporal par's ..: 1
207   - Normalization ............: 1 (relative value) (fixed,scale=1,gradient)
208   - === GCTAModelIrfBackground ===
209   - Name ......................: CTABackgroundModel
210   - Instruments ...............: CTA
211   - Instrument scale factors ..: unity
212   - Observation identifiers ...: all
213   - Model type ................: "PowerLaw" * "Constant"
214   - Number of parameters ......: 4
215   - Number of spectral par's ..: 3
216   - Prefactor ................: 0.995734795709415 +/- 0.00725726198557001 [0.001,1000] ph/cm2/s/MeV (free,scale=1,gradient)
217   - Index ....................: -0.00198344390952578 +/- 0.00257263793207067 [-5,5] (free,scale=1,gradient)
218   - PivotEnergy ..............: 1000000 [10000,1000000000] MeV (fixed,scale=1000000,gradient)
219   - Number of temporal par's ..: 1
220   - Normalization ............: 1 (relative value) (fixed,scale=1,gradient)
221   -
222   -Suppose you want to repeat the fit by optimising also the position of the
223   -point source. This is easy from Python. Type the following:
224   -
225   -.. code-block:: python
226   -
227   - >>> like.obs().models()['Crab']['RA'].free()
228   - >>> like.obs().models()['Crab']['DEC'].free()
229   - >>> like.run()
230   - >>> print(like.obs().models())
231   - ...
232   - RA .......................: 83.6334964430607 +/- 0.000614768905318078 [-360,360] deg (free,scale=1)
233   - DEC ......................: 22.0149467750683 +/- 0.000559548446961086 [-90,90] deg (free,scale=1)
234   -
235   -
236   -The ``like.obs().models()`` method provides the model container, using the
237   -``['Crab']`` operator you access the Crab model in that container and using
238   -the ``['RA']`` and ``['DEC']`` operators you access the relevant model
239   -parameters. The ``free()`` method frees a parameter, the opposite would be a
240   -call to the ``fix()`` method.