<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Solar Image Processing</title>
	<atom:link href="http://www.sipwork.org/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.sipwork.org</link>
	<description>A Solar Physics Data Analysis Community</description>
	<lastBuildDate>Tue, 15 Jun 2010 16:37:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Solar Image Processing Workshop V &#8211; Second Announcement</title>
		<link>http://www.sipwork.org/?p=126</link>
		<comments>http://www.sipwork.org/?p=126#comments</comments>
		<pubDate>Tue, 15 Jun 2010 02:06:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Latest News]]></category>
		<category><![CDATA[Meetings]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=126</guid>
		<description><![CDATA[Second Announcement
Fifth Solar Image Processing Workshop
Eurotel Victorio, Les Diablerets, Switzerland
September 12-16, 2010
http://sipworkv.sipwork.org/

This series of workshops brings together members of the solar physics and image processing communities to present and discuss advances in solar image processing techniques. The design and implementation of existing algorithms as reliable and robust tools are discussed, as well as automated techniques for processing very large [...]]]></description>
			<content:encoded><![CDATA[<h2>Second Announcement</h2>
<h1>Fifth Solar Image Processing Workshop</h1>
<address>Eurotel Victorio, Les Diablerets, Switzerland</address>
<address>September 12-16, 2010</address>
<p><a href="http://sipworkv.sipwork.org/">http://sipworkv.sipwork.org/</a></p>
<p><span id="more-126"></span></p>
<p>This series of workshops brings together members of the solar physics and image processing communities to present and discuss advances in solar image processing techniques. The design and implementation of existing algorithms as reliable and robust tools are discussed, as well as automated techniques for processing very large amounts of data.</p>
<p>The fifth Solar Image Processing Workshop will concentrate on the role played by solar image processing as we enter the petabyte era of solar physics. For example, the Solar Dynamics Observatory vastly increases the amount of data we have about our Sun, and solar image processing is taking a central role in reducing SDO and other data into useful information about the underlying physics.  We are pleased to confirm at this time two invited speakers &#8211; Piet Martens (Harvard-Smithsonian), discussing the SDO Science Center and the image processing techniques being used there, and Michaele Piana (University of Genoa), discussing inverse problems in relation to image processing.</p>
<p>The structure of the workshop is as follows.  The morning is given over to talks presentations, with all breaks also being poster sessions. Participants are expected to attend all talks and poster sessions.  In the afternoons, the conference splits into splinter sessions, where the following subject areas are covered.  We solicit contributions in these areas.</p>
<p>(1) Solar Eruptive Events</p>
<p>This session examines solar eruptive events of all types such as flares and coronal mass ejections, including:</p>
<ul>
<li>detectable precursors</li>
<li>automated tracking of events via image processing algorithms</li>
<li>physics of eruptive events</li>
<li>energy and mass storage in the corona</li>
<li>flow into the extended solar atmosphere</li>
<li>prediction of eruption</li>
</ul>
<p>(2) Solar Disk Features</p>
<p>This session deals with all types of features and events on the solar disk and how they may be tracked in time, space and wavelength.</p>
<p>Topics of particular interest are:</p>
<ul>
<li>prediction of the emergence of active regions</li>
<li>automated tracking of features in time, space and wavelength during their passage across the disc.</li>
<li>cataloging of features and the comparison of feature catalogs</li>
<li>detection of changes to solar features with time as precursors to shorter time-scale behavior such as flares and prominence eruptions.</li>
<li>physics of sunspots, coronal holes, filaments/prominences and other solar features</li>
</ul>
<p>(3) Reconstruction of the 3-D solar atmosphere</p>
<p>This session deals with the reconstruction of the true structure of the solar atmosphere from multiple viewpoints, wavelengths and times.</p>
<p>Topics of particular interest are:</p>
<ul>
<li>reconstruction of the three-dimensional dynamics of coronal mass ejections as a function of time</li>
<li>propagation of 3-dimensional structures in the extended solar atmosphere</li>
<li>three-dimensional structure of coronal magnetic fields</li>
<li>changes in three-dimensional structure in time as a precursor to subsequent events</li>
</ul>
<p>(4) Differential emission measure, solar activity and irradiance reconstruction</p>
<p>This session deals with the differential emission measure (DEM) of various solar features; how solar activity changes the DEM, and the reconstruction of the solar irradiance spectrum from the spatial features we see on the Sun.  Topics of particular interest are:</p>
<ul>
<li>DEM reconstruction methods</li>
<li>using DEM to recover the physics of solar features</li>
<li>connecting DEM to the observed spatial and temporal behavior of solar features</li>
<li>reconstruction of the irradiance spectrum.</li>
</ul>
<p>VERY limited funding is available for students who wish to attend the conference.  Please contact the Chair of the Science Organizing Committee (Jack.Ireland@nasa.gov) stating</p>
<ul>
<li>name</li>
<li>institution</li>
<li>proposed contribution (title + abstract + presentation type &#8211; talk or poster)</li>
</ul>
<p>Students will be selected for funding on a first come, first served basis and on the suitability of their work with respect to the stated areas of interest of the workshop.</p>
<p>Registration is now open at</p>
<p><a href="http://www.sipwork.org/sipworkV/registration/">http://www.sipwork.org/sipworkV/registration/</a></p>
<p>We have negotiated a special rate at the conference hotel; for CHF230/night ($200, EUR165, GBP136) we provide accommodation, breakfast, lunch, dinner and coffee/tea for the duration of the meeting.  The meeting location is in a village in the Swiss Alps, so alternative accommodation is sparse.  Participants are strongly encouraged to register at the conference hotel to take advantage of this rate.</p>
<p>If you have any further questions please do not hesitate to contact the SOC and LOC chairs at the email addresses below.</p>
<p>See you in Switzerland in September!</p>
<p>LOC Chair: Andre Csillaghy, University of Applied Sciences Northwestern Switzerland (andre.csillaghy@fhnw.ch)</p>
<p>SOC Chair: Jack Ireland, ADNET Systems Inc./NASA GSFC (Jack.Ireland@nasa.gov)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=126</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming IDL Objects: Why and how to do it</title>
		<link>http://www.sipwork.org/?p=117</link>
		<comments>http://www.sipwork.org/?p=117#comments</comments>
		<pubDate>Tue, 06 Apr 2010 20:09:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Information Technologies]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=117</guid>
		<description><![CDATA[D. M. Zarro (ADNET/GSFC)

CONTENTS

1. INTRODUCTION

1.1 Creating an IDL object
1.2 Putting data into an object
1.3 Getting data out of an object
1.4 Destroying an object
 2. WORKING WITH OBJECTS
 2.1 Modifying object properties
 2.2 Adding object methods
 2.3 How does inheritance work? 
 3. APPLYING OBJECTS TO SOLAR IMAGES 
 3.1 Using MAP objects 
 3.2 Image [...]]]></description>
			<content:encoded><![CDATA[<h1><strong>D. M. Zarro (ADNET/GSFC)</strong></h1>
<hr />
<h3>CONTENTS</h3>
<p><strong><br />
<a href="#s1">1. INTRODUCTION</a></strong></p>
<p><span id="more-117"></span></p>
<p><strong><a href="#s1.1">1.1 Creating an IDL object</a></p>
<p><a href="#s1.2">1.2 Putting data into an object</a></p>
<p><a href="#s1.3">1.3 Getting data out of an object</a></p>
<p><a href="#s1.4">1.4 Destroying an object</a></p>
<p><a href="#s2"> 2. WORKING WITH OBJECTS</a></p>
<p><a href="#s2.1"> 2.1 Modifying object properties</a></p>
<p><a href="#s2.2"> 2.2 Adding object methods</a></p>
<p><a href="#s2.3"> 2.3 How does inheritance work? </a></p>
<p><a href="#s3"> 3. APPLYING OBJECTS TO SOLAR IMAGES </a></p>
<p><a href="#s3.1"> 3.1 Using <cite>MAP</cite> objects </a></p>
<p><a href="#s3.2"> 3.2 Image analysis with objects </a></p>
<p></strong></p>
<hr />
<p><a name="s1"></a></p>
<h3>1. INTRODUCTION</h3>
<p>IDL objects were first introduced in version 5.0. The concept of object<br />
oriented programming (OOP) is not new. It is the basis of many modern<br />
languages such as C++ and Java. The idea behind OOP is that operations and data<br />
go hand in hand. Why? Because if you are handed a piece of data without any way<br />
of operating on it, then it would not be very useful to you. Furthermore, even if you<br />
were given software to operate on the data, the data may still not be<br />
useful without a set of rules to describe how the software interacts with it.</p>
<p>Consequently, the main thrust of OOP techniques is to keep operations and data<br />
married together so that they understand each other. This concept is called<br />
<strong>encapsulation</strong>. A valid question to ask is: what is wrong with<br />
non-OOP programming techniques in which procedures (or functions) are written to<br />
operate on data? For example, one can develop a reader to read a file, a plotter<br />
to plot it, and a writer to save it, as in the following pseudocode:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; read,file,data
IDL&gt; plot,data
IDL&gt; write,file,data</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The short answer is that there is nothing wrong with<br />
using non-OOP techniques. The long answer is that,<br />
as data sets become complicated and operations more complex, simple<br />
procedures are no longer simple. Procedures often become a series of<br />
steps that are called repeatedly or they require enhancements to support<br />
different datasets, which were not originally considered.<br />
In the OOP world, these procedures are called <strong>methods</strong>.<br />
These methods operate on data in exactly the same way as regular<br />
non-OOP procedures but they are special in that they function<br />
differently depending on the data in question. This concept is called<br />
<strong>polymorphism</strong> and will be described in more detail in<br />
<strong><a href="#s2.3">section 2.3</a></strong></p>
<p>The purpose of this tutorial is not to make the case for using OOP<br />
techniques in IDL, but to illustrate situations in which such techniques are<br />
more advantageous than non-OOP techniques. We start with demonstrating how<br />
to create a very basic IDL data object, followed by how to interact and<br />
manipulate it, and finally how to apply it to a real world example of reading<br />
and displaying a FITS image. Although not a strong pre-requisite, we assume<br />
that the reader is familiar with the use of IDL pointers and structures.</p>
<p><a name="s1.1"></a></p>
<h3>1.1 Creating an IDL object</h3>
<p>An IDL object is simply a container in memory space. This container holds:</p>
<ul>
<li> data</li>
<li> descriptions of the data</li>
<li> procedures for operating on the data</li>
</ul>
<p>The descriptions are called <strong>properties</strong>, and the procedures are<br />
called <strong>methods</strong>. The interesting twist is that<br />
both properties and methods can change as the data changes.</p>
<p>The first step in creating an object is deciding a name.<br />
The name is important because it should signify something about the<br />
the data. For example, if we are developing software to<br />
sell different types of cars, such as Fords, Toyotas, and Hondas, then<br />
the logical object name is probably <cite>car</cite>. This<br />
generic name is<br />
referred to as the object <cite>class</cite>. There is nothing special<br />
or magic about the name, although it should be unique.<br />
However, the name does become important later when we develop<br />
different objects.</p>
<p>Since we are keeping things simple &#8211; and are already thinking in terms<br />
of data &#8211; we name our object class <cite>data</cite>.<br />
We define this class in a file named<br />
<cite> data__define.pro </cite> that contains the following code:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>function data::init

 return,1

end

pro data__define

 void={data,ptr:ptr_new()}
 return 

end</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>So, what does the above all mean. Let&#8217;s take it in steps:</p>
<ol>
<li> <strong>CLASS filename:</strong> naming the file<br />
<cite>data__define.pro</cite> is an IDL convention<br />
for writing a class definition file.  The class name has to be part<br />
of the file name, followed by double underscore and the word<br />
<cite>define</cite>.<br />
If we were defining a <cite>car</cite> class, then the car class definition file<br />
would be named <cite>car__define.pro</cite>.</li>
<li> <strong>INIT method:</strong> the first line in the file defines a method to initialize<br />
the object. It is mandatory for all definition files.<br />
The naming convention for this (and all methods) is class name, followed<br />
by double colon and the method name <cite>(::init)</cite>.<br />
In this example, the <cite>init</cite> method doesn&#8217;t do very much.  We will modify it<br />
later to actually do something useful. For now, it simply returns<br />
unity, which signifies that the object is successfully created.</li>
<li> <strong>CLASS definition:</strong> the second line defines an IDL structure in<br />
which the data will be<br />
contained. An IDL structure is a variable that can hold different data types such<br />
as strings, floats, integers, and even other structures. In this example, it<br />
contains a pointer field (called <cite>ptr</cite>) that we create with the<br />
command:<br />
<cite>ptr_new()</cite>. The latter function creates an address in memory where<br />
future data will reside. The advantage of using a pointer is that we can<br />
dynamically insert data even though we don&#8217;t know its size ahead of time.<br />
In general, the class definition file is where the attributes<br />
of the object are defined as structure tags.<br />
These attributes are called properties.<br />
In our <cite>data</cite> object example, we have a single property namely<br />
<cite>ptr</cite>.</li>
</ol>
<p>Having written and saved the above file into the current IDL<br />
working directory, we create a <cite>data</cite> object as follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong> </strong></p>
<p><strong></p>
<pre>IDL&gt; a=obj_new('data')
IDL&gt; help,a
A               OBJREF    = ObjHeapVar37(DATA)</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>Creating the <cite>data</cite> object is called <strong>instantiation</strong>.<br />
The IDL function call to <cite>obj_new(&#8216;data&#8217;)</cite> looks for the<br />
file <cite>data__define.pro</cite>, compiles it, and executes the<br />
init and structure definition code that creates the <cite>data</cite> object.<br />
Calling help on the output variable <cite>a</cite> shows<br />
that it is an object of class type <cite>data</cite>.<br />
In the language of OOP, the variable <cite>a</cite> is an<br />
<strong>instance</strong> of the <cite>data</cite> class.<br />
Currently, this object doesn&#8217;t<br />
do very much other than waiting around for some data to<br />
come along and some operations to perform on the data.</p>
<p><a name="s1.2"></a></p>
<h3>1.2 Putting data into an object</h3>
<p>As currently defined, we cannot interact with the <cite>data</cite> object because<br />
we have not defined any methods to communicate with it.<br />
The next step is to write a method that allows us to insert data into<br />
the object. We re-edit the file <cite>data__define.pro</cite> as follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>function data::init

;-- allocate memory to pointer when initializing object

 self.ptr=ptr_new(/allocate)
 return,1

end

;----------------------------------------------------------------

pro data::set,value

;-- if data value exists, then insert into pointer location

 if n_elements(value) ne 0 then *(self.ptr)=value
 return 

end

;------------------------------------------------------------------

pro data__define

 void={data,ptr:ptr_new()}
 return 

end</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>Several things are going on that require explanation:</p>
<ol>
<li> <strong>SELF variable:</strong><br />
we have added the following line to <cite>data::init</cite>,</p>
<p><cite>self.ptr=ptr_new(/allocate)</cite></p>
<p>What is <cite>self</cite>? When we are working inside an object, we reference the object using the variable name <cite>self</cite>.<br />
The above line says:</p>
<p><em> &#8220;Take the structure field named <cite>ptr</cite>,<br />
which we have defined to be a pointer, and allocate new memory to it using<br />
the IDL pointer function <cite>ptr_new(/allocate)</cite>.&#8221;<br />
</em></p>
<p>We only need to do<br />
this once when the <cite>data</cite> object is first created.</li>
<li><strong>SET method</strong>: we name the method for inserting data<br />
<cite>set</cite>. Any name will do, but following IDL convention<br />
we precede it with the class name <cite>data::</cite>. This method<br />
is a procedure that takes the variable <cite>data</cite> as a<br />
command line argument. As is always good practice, we check that<br />
the variable <cite>value</cite> exists before proceeding<br />
by calling <cite>n_elements(value)</cite>. If the latter returns a<br />
non-zero value, then we insert the value into the pointer value<br />
<cite>ptr</cite>.</li>
<li> <strong>Inserting data</strong>:<br />
if you are confused by the syntax<br />
<cite>*(self.ptr)=value</cite>, don&#8217;t worry. Here is the simple breakdown.<br />
Recall that <cite>self</cite> is an internal reference to the<br />
<cite>data</cite> object, which<br />
is defined to be a structure with a tag (or field) named <cite>ptr</cite>.<br />
We reference this pointer as <cite>self.ptr</cite>. The latter is not<br />
an actual data value but an address to where data is located (or stored).<br />
The asterisk symbol references the value of the data stored at the<br />
pointer location. When the <cite>data</cite> object is first initialized, there is<br />
no data at this location. The IDL statement<br />
<cite>*(self.ptr)=value</cite> says:</p>
<p><em> &#8220;Take my input data value and<br />
insert (or copy) it to this pointer location.&#8221;<br />
</em></p>
<p>In the language of OOP, this action is called<br />
<em>setting the object property</em>.</li>
</ol>
<p><a name="s1.3"></a></p>
<h3>1.3 Getting data out of an object</h3>
<p>In addition to inserting data, we need a method for extracting data<br />
from the object. We shall call this method <cite>data::get</cite>,<br />
and include it in the file <cite>data__define.pro</cite> as follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>function data::init

;-- allocate memory to pointer when initializing object

 self.ptr=ptr_new(/allocate)
 return,1

end

;----------------------------------------------------------------

pro data::set,value

;-- if data value exists, then insert into pointer location

 if n_elements(value) ne 0 then *(self.ptr)=value
 return 

end

;----------------------------------------------------------------

function data::get,value

;-- if data value is stored in object pointer, then copy it out

 if n_elements(*(self.ptr)) ne 0 then value=*(self.ptr)

 return,value

end

;------------------------------------------------------------------

pro data__define

 void={data,ptr:ptr_new()}
 return 

end</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The <cite>get</cite> method differs from<br />
<cite>set</cite> in that we have defined it to be a function.<br />
The choice of function versus procedure is more of a matter<br />
of convenience than convention.<br />
The function first checks<br />
for the existence of a data value at the pointer location<br />
<cite>self.ptr</cite>. If data is present, then the value<br />
<cite>*(self.ptr)</cite><br />
is copied to the output variable <cite>value</cite>.<br />
If there is no data value, then an undefined value is returned.</p>
<p><a name="s1.4"></a></p>
<h3>1.4 Destroying an object</h3>
<p>When finished with using an object, it is recommended that the<br />
memory allocated to the object be released. All objects should therefore<br />
have a method that will take care of cleaning up after themselves.<br />
The IDL naming convention for this method is <cite>::cleanup</cite>. In the case<br />
of the <cite>data</cite> object, this cleanup method would involve freeing the pointer<br />
property of any allocated data. To implement a cleanup method, we include<br />
the following lines in the file <cite>data__define.pro</cite>:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>function data::cleanup

;-- free memory allocated to pointer when destroying object

 ptr_free,self.ptr
 return

end</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The IDL procedure <cite>ptr_free</cite> flushes the pointer<br />
variable <cite>self.ptr</cite> of any saved data and re-initializes it.<br />
This method is not called directly. Instead it is called automatically<br />
when the object is destroyed using the IDL <cite>obj_destroy</cite> procedure<br />
as follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; obj_destroy,a                             ;-- destroy object
IDL&gt; help,a
A               OBJREF    = ObjHeapVar4        ;-- object is now null</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p><a name="s2"></a></p>
<h3>2. WORKING WITH OBJECTS</h3>
<p>Having defined a <cite>data</cite> class, we next demonstrate how it can be<br />
used in common applications, and how it can be extended to<br />
perform different functions.</p>
<p><a name="s2.1"></a></p>
<h3>2.1 Modifying object properties</h3>
<p>Because we have used a pointer as its property,<br />
the <cite>data</cite> object can accomodate any data type.<br />
For example, let&#8217;s create a 2-dimensional float array<br />
and insert it and extract it as follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; image=findgen(512,512)
IDL&gt; a=obj_new('data')        ;-- create object variable a
IDL&gt; a-&gt;set,image             ;-- insert image
IDL&gt; image2=a-&gt;get()          ;-- extract image
IDL&gt; help,image2
IMAGE2            FLOAT     = Array[512, 512]</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>This example introduces the <strong>arrow</strong> syntax for calling methods.<br />
The statement <cite>a-&gt;set,image</cite> says:</p>
<p><em>&#8220;Call the method named<br />
<cite>set</cite> on the object variable named <cite>a</cite>, and pass<br />
the argument variable named <cite>image</cite>.&#8221; </em></p>
<p>We apply the same syntax when calling the <cite>get</cite> method<br />
except that we invoke it as a function and return the value into the<br />
output variable <cite>image2</cite>.</p>
<p>Next, let&#8217;s try inserting and extracting a data structure such as the<br />
system variable <cite>!d</cite>:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; a-&gt;set,!d
IDL&gt; var=a-&gt;get()
IDL&gt; help,var,/st
** Structure !DEVICE, 17 tags, length=88:
   NAME            STRING    'X'
   X_SIZE          LONG               640
   Y_SIZE          LONG               512
   X_VSIZE         LONG               640
   Y_VSIZE         LONG               512
   X_CH_SIZE       LONG                 6
   Y_CH_SIZE       LONG                12
   X_PX_CM         FLOAT           40.0000
   Y_PX_CM         FLOAT           40.0000
   N_COLORS        LONG          16777216
   TABLE_SIZE      LONG               256
   FILL_DIST       LONG                 1
   WINDOW          LONG                 0
   UNIT            LONG                 0
   FLAGS           LONG            328124
   ORIGIN          LONG      Array[2]
   ZOOM            LONG      Array[2]</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>In this example, we insert the variable <cite>!d</cite> into the<br />
object and then retrieve it into the variable <cite>var</cite>.<br />
Note that we only create the object variable once, and recycle it as<br />
necessary. We can of course create as many data objects as we like<br />
and store different data types accordingly. Just remember to give them<br />
different variable names.</p>
<p><a name="s2.2"></a></p>
<h3>2.2 Adding object methods</h3>
<p>As we have already seen, we can add new methods to an object by<br />
editing its class definition file. We can make the <cite>data</cite> object<br />
more useful by giving it the ability to read data<br />
from a file and plot the data. In the following example, we open the file<br />
<cite>data__define.pro</cite> and add two methods<br />
that we conveniently call <cite>data::read</cite> and<br />
<cite>data::plot</cite>:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>pro data::read,file

 if n_elements(file) ne 1 then return ;-- at least one file name entered
 check=findfile(file,count=count)     ;-- check if file exists
 if count ne 1 then return            ;-- bail if not there
 image=fltarr(512,512)                ;-- assume a 512x512 image file
 openr,lun,file,/get_lun              ;-- open file
 readf,lun,image                      ;-- read image
 free_lun,lun                         ;-- close file
 self-&gt;set,image                      ;-- insert image into object
 return

end

;---------------------------------------------------------------------

pro data::plot

 value=self-&gt;get()                                    ;-- extract data value from object
 dsize=size(value)                                    ;-- determine data dimensions
 if dsize[0] eq 2 then tvscl,congrid(value,512,512)   ;-- if 2-dimensional, CONGRID and TVSCL it
 return

end</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The <cite>read</cite> method accepts a file name as its argument. As is good<br />
practice, we check if the filename argument is entered and<br />
use IDL&#8217;s <cite>findfile</cite> to test if the file actually<br />
exists. We subsequently open the file, read the data,<br />
and insert into the object using the<br />
<cite>set</cite> method call: <cite>self-&gt;set,value</cite>. Note that because we are<br />
referencing the object itself, we use the <cite>self</cite> variable<br />
name for the object.</p>
<p>The <cite>plot</cite> method extracts the data value from<br />
itself via the <cite>get</cite> method call: <cite>self-&gt;get()</cite>.<br />
It checks that the data is a 2-dimensional image using the<br />
IDL <cite>size</cite> function, and<br />
plots it with a call to IDL&#8217;s <cite>tvscl</cite> command<br />
and <cite>congrid</cite>, which expands the image to a 512&#215;512 array size.<br />
To demonstrate this sequence of steps,<br />
let&#8217;s create an image file <cite>image.dat</cite> in the current directory and<br />
deploy the <cite>data</cite> object as follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; image=findgen(512,512)        ;-- create 512x512 image array
IDL&gt; file='image.dat'
IDL&gt; openw,lun,file,/get_lun       ;-- write image to file
IDL&gt; printf,lun,image
IDL&gt; free_lun,lun

IDL&gt; .run data__define             ;-- recompile class definition file
IDL&gt; a-&gt;read,file                  ;-- read image and display it
IDL&gt; a-&gt;plot</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The call to the <cite>plot</cite> method produces the following simple image:<br />
<img src="./back.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="350" height="350" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./back.jpeg" class="broken_link"><strong><cite>Sample data plot</cite></strong></a></p>
<p>Note that it is not necessary to reinitialize the <cite>data</cite> object since<br />
we are using the same object variable to store the image data.<br />
However, it is necessary to recompile the class definition file<br />
since we have added new methods to it.</p>
<p><a name="s2.3"></a></p>
<h3>2.3. How does inheritance work?</h3>
<p>Looking at the last two lines in the previous example, it doesn&#8217;t appear from<br />
our <cite>data</cite> object example that we have advanced very far using OOP techniques.<br />
In particular, compared to the opening example of reading and plotting<br />
data using non-OOP procedures, it seems that a lot of effort was invested in<br />
writing object methods that essentially reproduce the same functionality as<br />
conventional procedure calls.</p>
<p>The real power of OOP techniques comes not in what we have just<br />
done, but in what we are about to do. The <cite>data</cite> object that we have created<br />
is a building block that can be used to develop objects that<br />
perform more complicated functions. Consider the following problem:</p>
<p><em><br />
&#8220;I have an image in a FITS file that I would like to read and display. I would<br />
also like to remember the name of the FITS file so that I can track<br />
it.&#8221;</em></p>
<p>The <cite>data</cite> object that we have created provides a convenient storage facility<br />
for FITS image data, but it lacks the required FITS file reader<br />
and it doesn&#8217;t have a way of remembering the file name. We could<br />
of course re-edit the <cite>data</cite> class definition file to add this functionality,<br />
but that would involve much more work.<br />
The OOP solution to the problem is to define a new class that somehow<br />
inherits the functionality of the <cite>data</cite> class. The following is how to do it.</p>
<p>We define a new class called <cite>fits</cite> by creating<br />
a file named <cite>fits__define.pro</cite>, which contains the<br />
lines:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>pro fits::read,file

 if n_elements(file) ne 1 then return   ;-- at least one file name entered
 check=findfile(file,count=count)       ;-- check that file exists
 if count eq 0 then return
 image=mrdfits(file)                    ;-- call Astronomy library FITS reader
 self-&gt;set,image                        ;-- insert image data into property
 self.filename=file                     ;-- save filename in property
 return

end

;-------------------------------------------------------------------------

pro fits__define

 void={fits,filename:'', inherits data} ;-- inherit from data class
 return 

end</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>Several new concepts are happening here. Let&#8217;s start<br />
from the bottom up.</p>
<ol>
<li> <strong>FITS__DEFINE</strong>: the procedure that defines our fits data<br />
structure looks very different from the original data structure in<br />
<cite>data__define.pro</cite>. It appears to be missing<br />
the data pointer property. Actually, the latter is<br />
is not missing. In OOP language, it is <strong>inherited</strong> from the<br />
<cite>data</cite> class via the statement <cite>inherits data</cite>.<br />
In addition<br />
to inheriting data&#8217;s property, the <cite>fits</cite> class inherits all of its<br />
methods: <cite>init, cleanup, set, get, read, </cite> and <cite>plot.</cite><br />
Hence, inheritance has saved us from writing a lot of extra code.<br />
Note that the fits data structure contains a new property called<br />
<cite>filename</cite>, which is a string data type. This<br />
property will be used to store the FITS file name.</li>
<li> <strong>FITS::READ</strong>: object inheritance<br />
imports data&#8217;s simple <cite>read</cite> method<br />
<cite>data::read</cite>, which clearly will not work on a FITS file.<br />
To overcome this problem, we write a new method that uses the<br />
Astronomy library routine<br />
<strong><a href="javascript:reformat('mrdfits.pro');"><br />
<cite>mrdfits.pro</cite></a></strong><br />
to read<br />
the FITS file and insert the resulting image data into the object pointer<br />
by using the inherited <cite>set</cite> method.<br />
The fits <cite>read</cite> method thus <strong>overrides</strong> data&#8217;s<br />
<cite>read</cite> method.<br />
This new method also saves the FITS filename as a property of the<br />
<cite>fits</cite> object once the data is saved.</li>
</ol>
<p>In OOP language, the <cite>fits</cite> class is<br />
a <strong>derived</strong> class of <cite>data</cite>,<br />
and a <cite>fits</cite> object is referred to as <strong>child</strong> of<br />
the <strong>parent</strong> <cite>data</cite> object.<br />
The following example demonstrates how to use the <cite>fits</cite> class to create<br />
an object to read a Big Bear H-alpha image<br />
contained in the file <a href="./bbso_halph_fl_20040310_173531.fts" class="broken_link"><br />
<strong>bbso_halph_fl_20040310_173531.fts</strong></a>:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; file='bbso_halph_fl_20040310_173531.fts'
IDL&gt; f=obj_new('fits')                 ;-- create object
IDL&gt; help,f
F             OBJREF    = ObjHeapVar37(FITS)

IDL&gt; f-&gt;read,file                      ;-- read file
IDL&gt; f-&gt;plot                           ;-- plot data
IDL&gt; image=f-&gt;get()                    ;-- extract image
IDL&gt; help,image
IMAGE            INT       = Array[512, 512]</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p><img src="./halpha.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="350" height="350" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./halpha.jpeg" class="broken_link"><strong><cite>BBSO H-alpha</cite></strong></a></p>
<p>We create a <cite>fits</cite> object using<br />
the <cite>obj_new</cite> function, and feed it the FITS file name.<br />
After<br />
reading, we plot the image, and<br />
extract the image data using the <cite>get</cite> method.<br />
As defined, the <cite>get</cite> method inherited from the <cite>data</cite> class<br />
only allows us to extract the data value from the property pointer. However,<br />
we would also like to extract the filename that is associated with the<br />
data, which is also a property. To include this functionality, we<br />
override the <cite>get</cite> method in <cite>data__define.pro</cite><br />
with a new <cite>get</cite> method in <cite>fits__define.pro</cite> as follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>function fits::get,filename

 filename=self.filename             ;-- copy filename in variable
 image=self-&gt;data::get()            ;-- call DATA's GET method to return data
 return,image 

end</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The above lines illustrate the simplicity and elegance of inheritance.<br />
We have added a new output argument <cite>filename</cite> in which we<br />
return the string value of the filename, which is saved in<br />
the property <cite>self.filename</cite>. Since we also wish to<br />
return the data value, we include a call to the <cite>get</cite> method that we have<br />
already defined for the <cite>data</cite> class. There is no need to rewrite the latter.<br />
Hence, in the last example, we can execute the following:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; data=f-&gt;get(filename)
IDL&gt; help,data,filename
DATA            INT       = Array[512, 512]
FILENAME        STRING    = 'bbso_halph_fl_20040310_173531.fts'</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>Note also that the <cite>fits</cite> object methods (<cite>read</cite> and<br />
<cite>get</cite>)<br />
retain the same names as their parent <cite>data</cite> method names. The difference<br />
is in their behaviors, which depends upon which data type is being operated<br />
on. This ability to behave differently depending upon class (or data type) is called<br />
<strong>polymorphism</strong>.</p>
<p><a name="s3"></a></p>
<h3>3. APPLYING OBJECTS TO SOLAR IMAGES</h3>
<p>The example classes in this tutorial demonstrate how<br />
objects can be<br />
designed, created, and used.<br />
If interested in experimenting with these<br />
classes, you can download complete definition files via the following links:</p>
<p><strong><a href="./data__define.pro" class="broken_link">data__define.pro</a></strong></p>
<p>and</p>
<p><strong><a href="./fits__define.pro" class="broken_link">fits__define.pro</a></strong>.</p>
<p>Although useful for illustrative purposes,<br />
these classes are too simplistic for<br />
handling more complicated solar datasets.<br />
For example, not all solar datasets conform<br />
to the FITS format standard. Variations<br />
in the use of header keyword names and values<br />
often require the use of special readers.<br />
Moreover, different datasets usually<br />
require the application of instrument-specific processing algorithms<br />
inorder to be useful.<br />
This dependence of operations upon the properties of the dataset<br />
naturally lends itself to the use of objects as a tool for analyzing<br />
solar data.</p>
<p><a name="s3.1"></a></p>
<h3>3.1 Using <cite>MAP</cite> objects</h3>
<p>IDL <cite>maps</cite> are described in<br />
<strong><a href="../maps/maps.html" class="broken_link">maps.html</a></strong>.<br />
An IDL <cite>map</cite> is a structure data type that<br />
stores data and associated identifying information. A <cite>map</cite><br />
structure is not a true object since it does not contain methods.<br />
Nevertheless, it is useful<br />
for displaying and, in particular, overlaying solar images from<br />
different instruments.<br />
The following example illustrates how to<br />
to read, process, and display the quicklook<br />
<cite>SOHO/EIT</cite> file<br />
<a href="./efr20040309.072550" class="broken_link"><br />
<strong>efr20040309.072550</strong></a><br />
using a map and procedures available in the IDL<br />
<strong><br />
<a href="http://www.lmsal.com/solarsoft/index_old.html"><cite>SolarSoft</cite></a></strong> library:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; files='efr20040309.072550'
IDL&gt; read_eit,files,index,data                   ;-- read EIT QL file
IDL&gt; eit_prep,index,data=data,outindex,outdata   ;-- prep data
IDL&gt; index2map,outindex,outdata,emap             ;-- create map
IDL&gt; eit_colors,195                              ;-- load 195 color table
IDL&gt; plot_map,emap,/log,grid=20,/limb            ;-- plot map</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p><img src="./eit.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="350" height="350" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./eit.jpeg" class="broken_link"><strong><cite>SOHO/EIT 195 A</cite></strong></a></p>
<p>This example highlights several points. Even though we<br />
are primarily interested in<br />
reading and plotting an <cite>EIT</cite> image, we have to<br />
know and perform several steps:</p>
<ol>
<li> read the <cite>EIT</cite> FITS file using the special reader<br />
<cite>read_eit</cite>.</li>
<li> process the <cite>EIT</cite> image<br />
using the procedure <cite>eit_prep</cite>, which performs dark current<br />
subtraction and flatfielding.</li>
<li> convert the processed image to a map structure<br />
<cite>emap</cite> via the procedure<br />
<cite>index2map</cite>.</li>
<li> plot the map structure <cite>emap</cite><br />
using the procedure <cite>plot_map</cite>, which is<br />
called with the keywords <cite>/limb, /log</cite>, and <cite>grid=20</cite><br />
inorder to display a log-scaled image with a heliographic grid and limb.</li>
</ol>
<p>In addition, we have to remember to pass the variables: <cite>index, data</cite><br />
as arguments to these procedures, and know that our <cite>EIT</cite> dataset is<br />
a 195 A image that has a custom color table (which we load with the procedure<br />
<cite>eit_colors</cite>). That&#8217;s a lot to remember each time. It would be nice<br />
if we could somehow <strong>encapsulate</strong> the above procedures and data into an<br />
object and only have to remember as little as necessary to get the job done.</p>
<p>What we need is a <cite>map</cite> class that will allow us to define<br />
<cite>map</cite> objects to store data such as <cite>EIT</cite> images and<br />
provide methods to manipulate them. Such a class already exists. It is defined<br />
in the file <strong><a href="javascript:reformat('map__define.pro');"><br />
<cite>map__define.pro</cite></a></strong>. The <cite>map</cite> class is analogous to<br />
our example <cite>data</cite> class except that it uses a <cite>map</cite><br />
structure to store data and its corresponding properties (such as pointing).</p>
<p>Now consider the following OOP approach to the same example:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; file='efr20040309.072550'
IDL&gt; eobj=obj_new('eit')                         ;-- create an EIT object
IDL&gt; eobj-&gt;read,file                             ;-- read EIT file
IDL&gt; eobj-&gt;plot                                  ;-- plot EIT image</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The above example produces exactly the same plot output as the conventional<br />
example, but what is different? Let&#8217;s take it in steps:</p>
<ul>
<li> We have created an object variable <cite>eobj</cite> by<br />
calling the object creation function <cite>obj_new(&#8216;eit&#8217;)</cite><br />
with the class name <cite>eit</cite>. But where did this class<br />
come from? The answer is that we have already created a class<br />
definition file<br />
<strong><a href="javascript:reformat('eit__define.pro');"><br />
<cite>eit__define.pro</cite></a></strong> in which we have<br />
incorporated the <cite>EIT</cite> data as a property.<br />
The <cite>eit</cite> class definition file is slightly more complicated<br />
than the <cite>fits</cite> and <cite>data</cite> classes defined earlier.<br />
The <cite>eit</cite> class inherits from a slightly more complicated<br />
<cite>fits</cite> class that is defined in<br />
<strong><a href="javascript:reformat('fits__define.pro');"><br />
<cite>fits__define.pro</cite></a></strong>,<br />
which in turn inherits from the <cite>map</cite> class.<br />
The <cite>map</cite> class<br />
works as a storage device in much the same way as the simple<br />
<cite>data</cite> class that we defined<br />
in our earlier example.<br />
This inheritance relationship is illustrated in the diagram below.<br />
<img src="./flow.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="355" height="342" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./flow.jpeg" class="broken_link"><strong><cite>MAP-&gt;FITS-&gt;EIT Class Inheritance</cite></strong></a></li>
<li> After creating the <cite>eit</cite> object, we read the<br />
<cite>EIT</cite> file using the <cite>read</cite> method. This method<br />
is nothing other than the <cite>read_eit</cite> procedure, which we have incorporated<br />
into <cite>eit__define.pro</cite>. This is <strong>polymorphism</strong><br />
at work. Because our object is <cite>aware</cite> that it belongs to the<br />
<cite>eit</cite> class, its <cite>read</cite> method correctly calls the corresponding<br />
<cite>eit</cite> reader, followed by <cite>eit_prep</cite> to process the image.<br />
Hence, the <cite>EIT</cite> image is automatically<br />
read, processed, and saved into the <cite>eit</cite> object.</li>
<li> With the <cite>EIT</cite> image in memory, we display it<br />
using the <cite>plot</cite> method. This method is the<br />
<cite>plot_map</cite> procedure that we have already incorporated into<br />
<cite>map__define.pro</cite> and, hence, is inherited<br />
by the <cite>eit</cite> object. We have also modified the <cite>plot</cite> method<br />
slightly to include a call to <cite>eit_colors</cite> in order<br />
to load the corresponding image color table.</li>
</ul>
<p>In summary, the object variable <cite>eobj</cite> object is a <cite>map</cite> object<br />
since the <cite>eit</cite> class is derived from a <cite>map</cite> class.<br />
The details of the relationship between<br />
<cite>eit</cite> and <cite>map</cite> classes are not overly important<br />
to the average user who is interested in performing basic data analysis.<br />
The main point is that, by using an <cite>eit</cite> map object,<br />
the overhead of remembering<br />
several instrument-specific procedure names is significantly reduced.</p>
<p><a name="s3.2"></a></p>
<h3>3.2 Image analysis with objects</h3>
<p>The <cite>eit</cite> class has a <cite>get</cite> method that<br />
provides access to the <cite>EIT</cite> image data and map structure as<br />
follows:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; edata=eobj-&gt;get(/data)
IDL&gt; help,edata
EDATA           INT       = Array[1024, 1024]

IDL&gt; emap=eobj-&gt;get(/map)
IDL&gt; help,/st,emap
** Structure &lt;40e0fb08&gt;, 13 tags, length=2097256, refs=2:
   DATA            INT       Array[1024, 1024]
   XC              FLOAT          -8.15294
   YC              FLOAT           21.0663
   DX              FLOAT           2.63500
   DY              FLOAT           2.63500
   TIME            STRING    ' 9-Mar-2004 07:24:58.402'
   ID              STRING    ' Rocket Science EIT 195'
   ROLL_ANGLE      FLOAT           0.00000
   ROLL_CENTER     FLOAT     Array[2]
   DUR             FLOAT           12.5970
   XUNITS          STRING    'arcsecs'
   YUNITS          STRING    'arcsecs'
   SOHO            BYTE         1</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>The pointing information contained within a map structure allows us to<br />
analyze different images regardless of the image source. By making a<br />
<cite>map</cite> structure a property of a <cite>map</cite> object, we<br />
simplify the steps involved in performing typical image processing operations.<br />
We will conclude this tutorial by demonstrating three such operations:<br />
rotating an image; correcting for differential solar rotation; and overlaying<br />
images.</p>
<ul>
<li> <strong> Rotation:</strong> to rotate (or roll) an image clockwise about its center,<br />
we pass the angle of rotation as an argument to the method <cite>rotate</cite>.</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; robj=eobj-&gt;rotate(45)
IDL&gt; robj-&gt;plot</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>In this example, we rotate the <cite>EIT</cite> image contained in<br />
the <cite>eit</cite> map object <cite>eobj</cite> by 45 degrees to create<br />
a new map object <cite>robj</cite> which produces the image:<br />
<img src="./reit.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="350" height="350" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./reit.jpeg" class="broken_link"><strong>Rolled <cite>EIT 195 A</cite></strong></a></li>
<li><strong> Solar differential rotation: </strong> to differentially rotate an image we pass the<br />
time interval over which to rotate<br />
as an argument to the method <cite>drotate</cite>.</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; dobj=eobj-&gt;drotate(5,/days)
IDL&gt; dobj-&gt;plot</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>In this example, we solar rotate the <cite>EIT</cite> image<br />
forward in time by 5 days to produce<br />
the image:<br />
<img src="./deit.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="350" height="350" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./deit.jpeg" class="broken_link"><strong>Differentially rotated <cite>EIT 195 A</cite></strong></a></li>
<li><strong>Overlaying images:</strong> to overlay two images, we first plot a base image<br />
using the <cite>plot</cite> method and overplot a second image<br />
as a contour using <cite>plot</cite><br />
with the keyword <cite>/over</cite>.<br />
We demonstrate this operation by overlaying<br />
a <cite>SOHO/MDI</cite> image on an <cite>EIT</cite><br />
image. But<br />
first we need to create an <cite>mdi</cite> map object.<br />
We have already defined an <cite>mdi</cite> class by writing a<br />
definition file<br />
<strong><a href="javascript:reformat('mdi__define.pro');"><br />
<cite>mdi__define.pro</cite></a></strong>.<br />
As with the <cite>eit</cite> class, the <cite>mdi</cite> class inherits<br />
from a <cite>fits</cite> class (which inherits from a <cite>map</cite> class).<br />
Because of this common inheritance, an <cite>mdi</cite> object has the same<br />
<cite>plot</cite> method as an <cite>eit</cite> object.<br />
This class allows us to create<br />
an <cite>mdi</cite> object to read and display a high-resolution <cite>MDI</cite> image<br />
in the file<br />
<a href="./mdi_maglc_re_20040310_2102.fts" class="broken_link"><br />
<strong>mdi_maglc_re_20040310_2102.fts</strong></a>:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; file='mdi_maglc_re_20040310_2102.fts'
IDL&gt; mobj=obj_new('mdi')                         ;-- create an MDI object
IDL&gt; mobj-&gt;read,file                             ;-- read MDI file
IDL&gt; mobj-&gt;plot                                  ;-- plot MDI image</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p><img src="./mdi.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="350" height="350" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./mdi.jpeg" class="broken_link"><strong><cite>SOHO/MDI</cite></strong></a><br />
Note how the steps for reading and plotting the <cite>MDI</cite><br />
image are identical to those for <cite>EIT</cite>. The internal details of<br />
how these steps are performed are handled by the<br />
corresponding methods. Having created <cite>eit</cite> and <cite>mdi</cite><br />
objects, the final step of overlaying their corresponding images<br />
is reduced to the following single line:</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; eobj-&gt;plot,/over,/drotate    ;-- overlay EIT image on previous MDI image
                                  ;   (correcting for solar differential rotation)</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p><img src="./overlay.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="350" height="350" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./overlay.jpeg" class="broken_link"><strong><cite>EIT/MDI</cite> overlay</strong></a><br />
In this example, we used the <cite>/drotate</cite> keyword to differentially<br />
rotate the <cite>EIT</cite> image contours to the same time as the<br />
base <cite>MDI</cite> image.</li>
<li><strong>Extracting a sub-field:</strong> the<br />
<cite>extract</cite> method extracts a sub-field graphically<br />
or via keywords.</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td bgcolor="FFFF99"><strong></p>
<pre>IDL&gt; mobj=obj_new('mdi')
IDL&gt; mobj-&gt;read,'mdi_maglc_fd_20040522_0005.fts.gz'
IDL&gt; cobj=mobj-&gt;extract()
IDL&gt; cobj=mobj-&gt;extract(xrange=[-500,500],yrange=[-500,500])</pre>
<p></strong></td>
</tr>
</tbody>
</table>
<p>In this example, we read an <cite>MDI</cite> full-disk image in the file<br />
<a href="./mdi_maglc_fd_20040522_0005.fts.gz" class="broken_link"><br />
<strong>mdi_maglc_fd_20040522_0005.fts.gz</strong></a>, and call <cite>extract</cite><br />
without any keywords. A box-cursor is used to select a sub-field.<br />
Alternatively, the keywords: <cite>xrange</cite> and <cite>yrange</cite><br />
can be used to specify the sub-field.</p>
<table border="0">
<tbody>
<tr>
<td><img src="./mdi2.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="400" height="400" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./mdi2.jpeg" class="broken_link"><strong><br />
<cite>MDI</cite> Full Disk</strong></a></td>
<td><img src="./emdi2.jpeg" alt=" Programming IDL Objects: Why and how to do it" width="400" height="400" align="center" title="Programming IDL Objects: Why and how to do it" /></p>
<p><a href="./emdi2.jpeg" class="broken_link"><strong><br />
<cite>MDI</cite> Partial Disk</strong></a></td>
</tr>
</tbody>
</table>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=117</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solar Image Processing Workshop IV</title>
		<link>http://www.sipwork.org/?p=105</link>
		<comments>http://www.sipwork.org/?p=105#comments</comments>
		<pubDate>Tue, 23 Mar 2010 09:03:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Meetings]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=105</guid>
		<description><![CDATA[The most recent workshop was held in Baltimore MD, 26-30 October 2008. The focus of this meeting was the comparison of computer vision algorithms developed for solar physics applications, and their effective implementation. The meeting attracted around 85 participants (fulfilling pre-meeting expectations), from both the solar physics and image processing communities. Lively workshop groups were [...]]]></description>
			<content:encoded><![CDATA[<p>The most recent workshop was held in Baltimore MD, 26-30 October 2008. The focus of this meeting was the comparison of computer vision algorithms developed for solar physics applications, and their effective implementation. The meeting attracted around 85 participants (fulfilling pre-meeting expectations), from both the solar physics and image processing communities. Lively workshop groups were held in 4 major areas: eruptive events (coronal mass ejections, prominence eruptions), solar disk features (filaments, sunspots, etc), oscillations in the solar corona (waves and wave mode identification), and solar physics from multiple viewpoints (3-d tomography of coronal mass ejections and reconstruction of active region coronal loop structures). </p>
<p><span id="more-105"></span></p>
<p>Two significant developments arose from this meeting. Firstly, the meeting was organized around a new website http://www.sipwork.org, set up not only to handle the organizational aspects of SIPWork IV, but also to act as a central meeting place where the discussion of image processing, computer vision and its application to solar physics can be discussed. At time of writing, the website is undergoing a major revision in order to make it simpler to manage and more directly accessible from social media feeds such as Facebook and Twitter. Secondly, the participants spontaneously agreed to hold an extra splinter session during the meeting, on image/data browsing tools and the availability and accessibility of images and data, with special emphasis on the data volume challenges of SDO. The flexibility of the workshop format we designed can accommodate such spontaneous requests from this solar image processing community. That this request occurred clearly shows that the participants are eager to discuss the data volume challenge of SDO.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=105</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solar Image Processing Workshop II</title>
		<link>http://www.sipwork.org/?p=84</link>
		<comments>http://www.sipwork.org/?p=84#comments</comments>
		<pubDate>Tue, 23 Mar 2010 00:48:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Meetings]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=84</guid>
		<description><![CDATA[Some of the organizers of SIRW formed a collaboration to organize future workshops to follow a similar format. The organizing committee planned the next workshop for November 2004 in Annapolis, MD. The workshop name was changed to Solar Image Processing Workshop (SIPWII). SIPWII again brought together researchers from the field of solar physics, image processing [...]]]></description>
			<content:encoded><![CDATA[<p>Some of the organizers of SIRW formed a collaboration to organize future workshops to follow a similar format. The organizing committee planned the next workshop for November 2004 in Annapolis, MD. The workshop name was changed to Solar Image Processing Workshop (SIPWII). SIPWII again brought together researchers from the field of solar physics, image processing and data mining. The workshop lasted for 3 days and consisted of invited talks, contributed talks and posters. This workshop focused on using current, up-to-date image processing techniques to maximize the scientific return from space- and ground-based solar observatories. SIPWII also introduced break-out sessions or working groups to discuss the topics of (1) the definition of CMEs for the purpose of detection and tracking, (2) techniques for ground-based image reconstruction, and (3) magnetic field image data. Some of the work presented in the workshop as well as related work in the field was published in a twenty-four paper Topical Issue of Solar Physics (Gallagher et al. 2005). Given the success of this workshop and the expressed interest of its participants, the organizing committee decided to continue these workshops roughly every 2 years with the location alternating between Europe and the United States.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=84</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solar Image Processing Workshop III</title>
		<link>http://www.sipwork.org/?p=87</link>
		<comments>http://www.sipwork.org/?p=87#comments</comments>
		<pubDate>Tue, 23 Mar 2010 00:47:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Meetings]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=87</guid>
		<description><![CDATA[The 3rd Solar Image Processing Workshop (SIPWIII), was held at Trinity College Dublin in September 2006. This time the workshop focused on challenges presented by new instrumentation including new ground based instrumentation such as the Advanced Technology Solar Telescope (ATST), Swedish Solar Telescope (SST) and Dutch Open Telescope (DOT), as well as recent and future [...]]]></description>
			<content:encoded><![CDATA[<p>The 3rd Solar Image Processing Workshop (SIPWIII), was held at Trinity College Dublin in September 2006. This time the workshop focused on challenges presented by new instrumentation including new ground based instrumentation such as the Advanced Technology Solar Telescope (ATST), Swedish Solar Telescope (SST) and Dutch Open Telescope (DOT), as well as recent and future space instrumentation on board the STEREO, Hinode and SDO spacecraft. The workshop had ~70 participants featuring invited and contributed talks, posters and breakout/open-ended discussion sessions (working groups). As with previous workshops, we emphasized that we were looking for topics that would be of interest to both the image processing and solar physics communities. The successful working group sessions were held in three groups, discussing (1) 3D tomography and visualization of the corona and heliosphere, (2) real-time data analysis and assimilation , and (3) fundamental image processing and statistics. Some presentations from this conference and related research have been compiled for a Topical Issue of Solar Physics (vol. 248, Young &#038; Ireland 2009).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=87</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TRACE Pointing Correction</title>
		<link>http://www.sipwork.org/?p=75</link>
		<comments>http://www.sipwork.org/?p=75#comments</comments>
		<pubDate>Mon, 26 Oct 2009 22:10:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Image Processing]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=75</guid>
		<description><![CDATA[
TRACE/EIT 19.5 nm Image Alignment using Cross-Correlation
(Peter T. Gallagher, L-3 Com Analytics Corp., NASA/GSFC)


This page describes a simple method to correct the pointing information in TRACE
19.5 nm images by cross-correlating them with EIT 19.5 nm images using IDL
SSW. The data were taken during an X-class flare which occurred on 21-Apr-2002, more details on which can [...]]]></description>
			<content:encoded><![CDATA[<hr />
<h2>TRACE/EIT 19.5 nm Image Alignment using Cross-Correlation</h2>
<p><em>(Peter T. Gallagher, L-3 Com Analytics Corp., NASA/GSFC)</em></p>
<p><span id="more-75"></span></p>
<hr />
<p>This page describes a simple method to correct the pointing information in TRACE<br />
19.5 nm images by cross-correlating them with EIT 19.5 nm images using IDL<br />
<a href="http://www.lmsal.com/ssw">SSW</a>. The data were taken during an X-class flare which occurred on 21-Apr-2002, more details on which can be found <a href="http://hesperia.gsfc.nasa.gov/%7Eptg/hessi/20020421/" class="broken_link">here</a>.</p>
<p>An alternative method for correctng TRACE pointing (using MDI continuum images) is described at Tom Metcalf&#8217;s <a href="http://www.lmsal.com/%7Emetcalf/TRACE/pointing.html" class="broken_link">page</a>.</p>
<h3>Step 1: Read, calibrate and convert data to maps</h3>
<p>It is best to select images which have been taken as<br />
close in time as possible. In this example the images are separated by<br />
11 seconds.</p>
<p><strong><br />
<code><br />
</code> </strong></p>
<p><strong> </strong></p>
<pre>IDL&gt; eit_prep, 'efr20020421.011334', eit_index, eit_data
IDL&gt; index2map, eit_index, eit_data, eit_map
IDL&gt; eit_map = map2earth( eit_map ) ; SOHO @ L1 -&gt; Earth

IDL&gt; mreadfits, 'trf20020421_011323_a2.fits', index, data
IDL&gt; trace_prep, index, data, trace_index, trace_data, /wave2point
IDL&gt; index2map, trace_index, trace_data, trace_map</pre>
<p>Further information on mapping software can be found at Dominic<br />
Zarro&#8217;s<br />
<a href="http://orpheus.nascom.nasa.gov/%7Ezarro/idl/maps.html" class="broken_link">pages</a>.</p>
<hr />
<img src="index_files/trace-eit.gif" alt="trace eit TRACE Pointing Correction"  title="TRACE Pointing Correction" /></p>
<p><strong><em>Figure 1: </em></strong> TRACE and EIT 19.5 nm images with the same<br />
field-of-view.</p>
<hr />
<h3>Step 2: Extract regions with distinct features and plot</h3>
<p>We extract a region where there is a bright loop visible:<br />
800&#8243; &lt; Solar_X &lt; 1000&#8243; and -350&#8243; &lt; Solar_Y &lt; -150&#8243;. This<br />
is plotted<br />
in <strong><em>Figure 1</em></strong> above.<br />
<strong><br />
<code><br />
</code> </strong></p>
<p><strong> </strong></p>
<pre>IDL&gt; xrange = [ 800, 1000 ]
IDL&gt; yrange = [ -350, -150 ]
IDL&gt; sub_map, eit_map, sub_eit, xrange = xrange, yrange = yrange
IDL&gt; sub_map, trace_map, sub_trace, xrange = xrange, yrange = yrange

IDL&gt; eit_colors, 195
IDL&gt; !p.multi = [ 0, 2, 1 ]
IDL&gt; plot_map, sub_eit, /log
IDL&gt; plot_map, sub_trace, /log</pre>
<h3>Step 3: Extract TRACE and EIT images and convert to same size</h3>
<p>In order to compute the cross-correlation between two images the<br />
image with the lesser number of pixels (EIT) is rebinned<br />
to the size of the larger (TRACE).<br />
<strong><br />
<code><br />
</code> </strong></p>
<p><strong> </strong></p>
<pre>IDL&gt; trace_image = sub_trace.data
IDL&gt; sz = size( trace_image, /dim )
IDL&gt; cube = fltarr( sz( 0 ), sz( 1 ), 2 )
IDL&gt; rsub_eit = coreg_map( sub_eit, sub_trace )
IDL&gt; cube( *, *, 0 ) = rsub_eit.data
IDL&gt; cube( *, *, 1 ) = sub_trace.data</pre>
<h3>Step 4: Compute offsets between TRACE and EIT and update TRACE map.</h3>
<p>Use cross-correlation to find the pixel offsets between TRACE and EIT<br />
and create a new TRACE map with corrected pointing.<br />
<strong><br />
<code><br />
</code> </strong></p>
<p><strong> </strong></p>
<pre>IDL&gt; offsets = get_correl_offsets( cube )
IDL&gt; print, offsets
      0.00000      0.00000
      5.19975      8.60905
IDL&gt; correct_trace_map = shift_map( trace_map, offsets( 0, 1 ) * trace_map.dx, $
IDL&gt;                                           offsets( 1, 1 ) * trace_map.dy )</pre>
<hr />
<img src="index_files/trace-eit-contour.gif" alt="trace eit contour TRACE Pointing Correction"  title="TRACE Pointing Correction" /></p>
<p><strong><em>Figure 2: </em></strong>Left: TRACE with EIT contours before pointing<br />
correction. Right: The corresponding data after TRACE pointing correction.</p>
<hr />
<h3>Step 5: Plot the uncorrected and corrected TRACE data with EIT contour<br />
overlay</h3>
<p>The corrected and uncorrected TRACE 19.5 images together with EIT contour<br />
overlays are given in <strong><em>Figure 2</em></strong> above.<br />
<strong><br />
<code><br />
</code> </strong></p>
<p><strong> </strong></p>
<pre>IDL&gt; plot_map, trace_map, xrange = xrange, yrange = yrange, /log
IDL&gt; plot_map, eit_map, /over
IDL&gt; plot_map, correct_trace_map, xrange = xrange, yrange = yrange, /log
IDL&gt; plot_map, eit_map, /over</pre>
<hr />
<img src="index_files/trace-eit-movie.gif" alt="trace eit movie TRACE Pointing Correction"  title="TRACE Pointing Correction" /></p>
<p><strong><em>Figure 3: </em></strong>Movie which blinks between the coaligned TRACE and EIT images (Hit reload/refresh to run).</p>
<hr />
<address> Peter T. Gallagher -<br />
<a href="mailto:ptg@hessi.gsfc.nasa.gov">ptg@hessi.gsfc.nasa.gov</a></p>
<p>(Last updated: 9-May-2002)
</p></address>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=75</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IDL Map Software for Analyzing Solar Images</title>
		<link>http://www.sipwork.org/?p=42</link>
		<comments>http://www.sipwork.org/?p=42#comments</comments>
		<pubDate>Sat, 03 Oct 2009 00:10:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Image Processing]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=42</guid>
		<description><![CDATA[D. M. Zarro (ADNET/GSFC)

CONTENTS
1. INTRODUCTION

1.1 Creating a Map
1.2 Plotting a Map
1.3 Plotting Maps on Different Color Scales
2. OPERATIONS WITH MAPS
2.1 Rotating a Map
2.2 Stretching and Resizing a Map
2.3 Extracting a Sub-region From a Map
2.4 Differencing Maps
3. APPLYING MAPS TO SOLAR IMAGES
3.1 Creating a SOHO/EIT Map
3.2 Creating a SOHO/CDS Map
3.3 Creating a Yohkoh/SXT Map
3.4 Converting a [...]]]></description>
			<content:encoded><![CDATA[<p><strong>D. M. Zarro (ADNET/GSFC)</strong></p>
<hr />
<h3>CONTENTS</h3>
<p><a href="#s1">1. INTRODUCTION</a></p>
<p><span id="more-42"></span></p>
<p><a href="#s1.1">1.1 Creating a Map</a></p>
<p><a href="#s1.2">1.2 Plotting a Map</a></p>
<p><a href="#s1.3">1.3 Plotting Maps on Different Color Scales</a></p>
<p><a href="#s2">2. OPERATIONS WITH MAPS</a></p>
<p><a href="#s2.1">2.1 Rotating a Map</a></p>
<p><a href="#s2.2">2.2 Stretching and Resizing a Map</a></p>
<p><a href="#s2.3">2.3 Extracting a Sub-region From a Map</a></p>
<p><a href="#s2.4">2.4 Differencing Maps</a></p>
<p><a href="#s3">3. APPLYING MAPS TO SOLAR IMAGES</a></p>
<p><a href="#s3.1">3.1 Creating a <cite>SOHO/EIT</cite> Map</a></p>
<p><a href="#s3.2">3.2 Creating a <cite>SOHO/CDS</cite> Map</a></p>
<p><a href="#s3.3">3.3 Creating a <cite>Yohkoh/SXT</cite> Map</a></p>
<p><a href="#s3.5">3.4 Converting a <cite>TRACE</cite> File to a Map</a></p>
<p><a href="#s3.5">3.5 Converting a <cite>FITS</cite> File to a Map</a></p>
<p><a href="#s3.5.1">3.5.1 Converting a <cite>HESSI FITS</cite> File to a Map<br />
</a> <a href="#s3.6">3.6 Correcting for Solar Differential Rotation</a></p>
<p><a href="#s4">4. OVERLAYING MAPS</a></p>
<hr />
<h3><a name="s1"></a></h3>
<p><a name="s1"></a></p>
<p>An IDL map is a structure that contains two-dimensional (2-d) image data with accompanying pixel coordinate and spatial scale information. The latter parameters are defined as <em>properties</em> of the map and are unique for each image source. Defined in this manner, an arbitrary image can be manipulated or transformed in a manner that is independent of the image source.</p>
<p>This software note describes how to create and use maps for processing solar images. We will use sample images obtained from instruments onboard <cite>SOHO</cite> and <cite>Yohkoh</cite> missions. Typical processing tasks include: roll-correction, stretching, translation, solar rotation-compensation, and image coalignment. Although we discuss solar examples, the techniques described below are applicable to any two-dimensional dataset. IDL mapping software is incorporated into the <a href="http://www.lmsal.com/solarsoft">SolarSoft</a> system &#8211; a set of integrated software libraries, databases, and system utilities which provide a &#8220;common&#8221; programming and data analysis environment for Solar Physics.</p>
<h3><a name="s1.1"></a></h3>
<p>The low-level function for creating a map is <a href="javascript:reformat('make_map.pro');"><strong>make_map</strong></a>. In this example, a 256&#215;256 array is created with <strong>findgen</strong> and converted to a map variable:</p>
<pre><strong><span class="c2"><code>
IDL&gt; image=findgen(256,256)
IDL&gt; map=make_map(image)
IDL&gt; help,/st,map

** Structure &lt;4031f908&gt;, 8 tags, length=40056, refs=1:
   DATA            FLOAT     Array[256,256]
   XC              FLOAT           0.00000
   YC              FLOAT           0.00000
   DX              FLOAT           1.00000
   DY              FLOAT           1.00000
   TIME            STRING    '11-Mar-1998 11:40:44.000'
</code></span></strong></pre>
<p>The resulting map is an anonymous structure with the following tag definitions:</p>
<ul>
<li><em>DATA:</em> the 2-d data values.</li>
<li><em>XC, YC:</em> the cartesian coordinates of center of the image. Since coordinate information was not specified, the origin is used as the default value.</li>
<li><em>DX, DY:</em> the spacing between between pixels in the cartesian X and Y directions, respectively. Since spatial scale was not specified, the spacings default to unity.</li>
<li><em>TIME:</em> a reference time for the image. It could be the start or mean time of the image. The default time is the current Universal Time (UT) when the map is created.</li>
</ul>
<p>The above tag definitions are defined also as keywords in <strong>make_map</strong>. For example, a map with a pixel spacing of 2 units in the x-direction and 3 units in the y-direction is created by:</p>
<pre><strong><span class="c2"><code>
IDL&gt; image=findgen(256,256)
IDL&gt; map=make_map(image,dx=2,dy=3)
IDL&gt; help,/st,map
** Structure &lt;403cd0e8&gt;, 9 tags, length=40072, refs=1:
   DATA            FLOAT     Array[100, 100]
   XC              FLOAT           0.00000
   YC              FLOAT           0.00000
   DX              FLOAT           2.00000
   DY              FLOAT           3.00000
   TIME            STRING    '18-Mar-1998 15:23:16.000'
</code></span></strong></pre>
<p>Note that the basic map structure definition is kept intentionally simple, with data and coordinate parameters being the main defining properties. The units of the coordinate system are also arbitrary. Additional properties are added two ways:</p>
<ol>
<li>At the definition stage. For example, to include a property <em>UNITS</em> that specifies coordinate units:
<pre><strong><span class="c2"><code>
IDL&gt; nmap=make_map(map,units='arcsecs')
IDL&gt; help,nmap,/st
** Structure &lt;403cd0e8&gt;, 9 tags, length=40072, refs=1:
   DATA            FLOAT     Array[100, 100]
   XC              FLOAT           0.00000
   YC              FLOAT           0.00000
   DX              FLOAT           2.00000
   DY              FLOAT           3.00000
   TIME            STRING    '18-Mar-1998 15:23:16.000'
   UNITS           STRING    'arcsecs'
</code></span></strong></pre>
</li>
<li>After the definition stage. Following the same example, but using the function <a href="javascript:reformat('add_prop.pro');"><strong>add_prop</strong></a> :
<pre><strong><span class="c2"><code>

IDL&gt; add_prop,map,units='arcsecs'

</code></span></strong></pre>
<p>produces the same result. Multiple properties are added as multiple keywords, with the restriction that each property name is unique.</li>
</ol>
<h3><a name="s1.2"></a></h3>
<p>Maps are plotted using the procedure <a href="javascript:reformat('plot_map.pro');"><strong>plot_map</strong></a> . Thus, using the 2-d image created earlier,</p>
<pre><strong><span class="c2"><code>
IDL&gt; plot_map,map
</code></span></strong></pre>
<div class="c1"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" align="middle" title="IDL Map Software for Analyzing Solar Images" /></a></p>
<p><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1.gif"><strong>Fig. 1 &#8211; Image Map</strong></a></div>
<p>The procedure <strong>plot_map</strong> inherits all the major IDL plot keywords such as <em>xstyle, ystyle, font, charsize, charthick,</em> etc. It supports the following additional keywords:</p>
<ul>
<li><em>drange:</em> 2-element vector of data min and max to display</li>
<li><em>xrange:</em> 2-element vector of xmin and xmax to display</li>
<li><em>yrange:</em> 2-element vector of ymin and ymax to display</li>
<li><em>/log:</em> display using log10 scaling</li>
<li><em>xsize, ysize:</em> device pixel size for the plot window [def=512x512]</li>
<li><em>/noaxes:</em> inhibit plotting axes</li>
<li><em>/nolabels:</em> inhibit printing axis labels</li>
<li><em>/notitle:</em> inhibit printing title</li>
<li><em>/cont:</em> plot image as a contour</li>
<li><em>levels:</em> an array of contour levels</li>
</ul>
<p>The use of more advanced keywords will be demonstrated later in this tutorial.</p>
<h3><a name="s1.3"></a></h3>
<p>The following steps demonstrate how to simultaneously plot maps using different color tables.</p>
<pre><strong><span class="c2"><code>

IDL&gt; image=findgen(256,256)
IDL&gt; map=make_map(image)                ;-- make a simple map
IDL&gt; nc=100                             ;-- # of colors per image
IDL&gt; loadct,3,ncolors=nc                ;-- load red table from  0:nc-1
IDL&gt; plot_map,map,ncolors=nc            ;-- plot map using red table
IDL&gt; loadct,1,bottom=nc,ncolors=nc      ;-- load blue table from nc:2*nc-1
IDL&gt; plot_map,map,bottom=nc,ncolors=nc  ;-- plot using blue table

</code></span></strong></pre>
<p>The key to plotting with separate color tables is to divide evenly the total number of available device colors. The latter is given by the system variable <em>!d.table_size</em>. In the above example, the total available colors is 200. Hence, the color table is split into two equal halves of <em>nc=100</em> colors each. The routine <strong>loadct</strong> loads a red color table (#3) into the first 0 to <em>nc</em>-1 color range, and blue color table (#1) into the second <em>nc</em> to <em>2*nc</em>-1 range. The resulting plots appear as:</p>
<div class="c1">
<table border="0" cellspacing="10" cellpadding="10" align="middle">
<tbody>
<tr>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1b.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1b.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
</tr>
<tr>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1.gif"><strong>Fig. 2a &#8211; Red Table</strong></a></strong></td>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig1b.gif"><strong>Fig. 2b &#8211; Blue Table</strong></a></strong></td>
</tr>
</tbody>
</table>
</div>
<h3><a name="s2"></a></h3>
<p>The following examples demonstrate various image processing that can be applied to maps.<a name="s2.1"></a></p>
<h3><a name="s2"></a></h3>
<p>Maps are rotated using the function <a href="javascript:reformat('rot_map.pro');"><strong>rot_map</strong></a> . An interesting example is provided by rotating (i.e, rolling) a <cite>SOHO EIT</cite> full Sun image. The routines for creating an EIT map will be described in <a href="#s3.1">section 3.1</a> . For now, assume a 512&#215;512 EIT map, <em>eit_map</em> with the following properties:</p>
<pre><strong><span class="c2"><code>

   DATA            INT       Array[512, 512]
   XC              FLOAT           14.2450
   YC              FLOAT          -13.0278
   DX              FLOAT           5.18000
   DY              FLOAT           5.18000
   TIME            STRING    '15-Mar-1998 00:00:49.985'
   DUR             FLOAT           12.1000
   ID              STRING    'EIT: 304'
   SOHO            INT              1
   UNITS           STRING    'arcsecs' 

</code></span></strong></pre>
<p>This map contains an EIT 304 Angstrom image that has been double-binned from it&#8217;s original 1024&#215;1024 size. Note the additional properties <em>ID</em> specifying the image wavelength, <em>DUR</em> specifying the image duration, and <em>SOHO</em> specifying image source. To rotate this map through, say, 60 degrees clockwise about its center, and display the results:</p>
<pre><strong><span class="c2"><code>

IDL&gt; rmap=rot_map(eit_map,60.)
IDL&gt; plot_map,eit_map,/log
IDL&gt; plot_map,rmap,/log,/new

IDL&gt; help,/st,rmap

   DATA            INT       Array[512, 512]
   XC              FLOAT           14.2450
   YC              FLOAT          -13.0278
   DX              FLOAT           5.18000
   DY              FLOAT           5.18000
   TIME            STRING    '15-Mar-1998 00:00:49.985'
   DUR             FLOAT           12.1000
   ROLL            FLOAT           60.0000
   ROLL_CENTER     FLOAT     Array[2]
   ID              STRING    'EIT: 304'
   SOHO            INT              1
   UNITS           STRING    'arcsecs' 

</code></span></strong></pre>
<div class="c1">
<table border="0" cellspacing="10" cellpadding="10" align="middle">
<tbody>
<tr>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig2a.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig2a.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig2b.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig2b.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
</tr>
<tr>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig2a.gif"><strong>Fig. 3a &#8211; Before roll</strong></a></strong></td>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig2b.gif"><strong>Fig. 3b &#8211; After roll</strong></a></strong></td>
</tr>
</tbody>
</table>
</div>
<p>The keyword <em>/new</em> forces the creation of a new plot window in which to plot the rotated image. The rotation is performed by rotating the coordinates of each image pixel, computing a new grid of rotated coordinates, and interpolating the new grid back to the original image. Generally, the dimensions of the rotated grid will be larger than the original image. By default, <strong>rot_map</strong> will preserve the original image dimensions by clipping image pixels that fall outside the original dimensions. The keyword <em>/full_size</em> inhibits clipping.</p>
<p>The roll angle and roll center are added as property fields name ROLL and ROLL_CENTER to the rotated map. The roll angle in units of degrees measured clockwise from North and the roll center coordinates are in data units (i.e., arcsecs). Note that if the input map is already rolled, then the new roll angle will be added to the existing roll value. By default, the map is rotated about it&#8217;s center. The keyword <em>center</em> can be used to rotate about an arbitrary center, e.g., <em>center=[20,30]</em> .</p>
<p>The keyword <em>roll</em> has the same functionality and can be used to roll a map to any given roll angle, regardless of it&#8217;s current roll angle. For example, to rotate a map to a 100 degree roll:</p>
<pre><strong><span class="c2"><code>

IDL&gt; rmap=rot_map(eit_map,roll=100.)

</code></span></strong></pre>
<h3><a name="s2.2"></a></h3>
<p>The function <a href="javascript:reformat('grid_map.pro');"><strong>grid_map</strong></a> changes the dimensions and pixel spacing of a map. For example, the following command will rebin the 512&#215;512 EIT map displayed in figure 3a, to a 128&#215;128 size map:</p>
<pre><strong><span class="c2"><code>

IDL&gt; gmap=grid_map(map,128,128)

</code></span></strong></pre>
<p>The (x,y) pixel spacings of the output map are computed automatically. To change the spacing between pixels, use the keywords <em>dx, dy</em> . For example, to rebin to a pixel spacing of 2 units in x- and 5 in y-directions:</p>
<pre><strong><span class="c2"><code>

IDL&gt; gmap=grid_map(map,dx=2,dy=5)

</code></span></strong></pre>
<p>The (x,y) dimensions of the output map are computed automatically. Spacing and output dimension parameters can be combined to produce different stretching and resizing effects. For large images, regridding can be a slow process since each pixel has to be interpolated onto a new spatial scale.</p>
<h3><a name="s2.3"></a></h3>
<p>The procedure <a href="javascript:reformat('sub_map.pro');"><strong>sub_map</strong></a> extracts a sub-region from a map. It can be used in two ways, graphically or manually.</p>
<pre><strong><span class="c2"><code>

IDL&gt; sub_map,map,smap,/plot,[xrange=xrange,yrange=yrange,ref_map=ref_map]

</code></span></strong></pre>
<p>A sub-region of <em>map</em> is selected graphically by using the keyword <em>/plot</em>, in which case <strong>plot_map</strong> is called and a &#8220;rubber-band&#8221; cursor is used to select a sub-region. The sub-region map is returned in <em>smap</em>. The data coordinate limits of the sub-region are returned as two-element vectors in the keywords <em>xrange</em> and <em>yrange</em>. Alternatively, the data coordinate limits can be input via the keywords <em>xrange=[xmin,xmax], yrange=[ymin,ymax]</em>, or via the keyword <em>ref_map</em>. In the latter case, the extracted sub-region will be extracted according to the <em>xrange/yrange</em> values of <em>ref_map</em>.</p>
<h3><a name="s2.4"></a></h3>
<p>The procedure <a href="javascript:reformat('diff_map.pro');"><strong>diff_map</strong></a> subtracts two maps to produce a difference map.</p>
<pre><strong><span class="c2"><code>

IDL&gt; dmap=diff_map(map1,map2,[/rotate])

</code></span></strong></pre>
<p>The output map <em>dmap</em> contains a difference image of the two images contained in the <em>map1</em> and <em>map2</em> input maps &#8212; the second image is subtracted from the first. The optional keyword <em>/rotate</em> solar rotates the second image to the time of the first image prior to subtraction. Solar rotation is described in <a href="#s3.6">section 3.6</a> .</p>
<h3><a name="s3"></a></h3>
<p>This section describes the steps involved in creating maps for various solar datasets. The routine <a href="javascript:reformat('index2map.pro');"><strong>index2map</strong></a> is a generally useful program for creating maps from any dataset that is in a <cite>Yohkoh</cite> index/data format.</p>
<h3><a name="s3.1"></a></h3>
<p>The following lines read and process <cite>EIT</cite> images into maps:</p>
<pre><strong><span class="c2"><code>

IDL&gt; files=eit_files('19-mar-98','20-mar-98',wave=304,/full)
IDL&gt; read_eit,files,index,data,[outsize=outsize]
IDL&gt; eit_prep,index,data=data,outindex,outdata
IDL&gt; index2map,outindex,outdata,emap

</code></span></strong></pre>
<p>Each step is summarized as follows:</p>
<ol>
<li><a href="javascript:reformat('eit_files.pro');"><strong>eit_files</strong></a> returns EIT filenames for a range of times/dates and wavelength filter. This example returns filenames (string array) for 304 Angstom full-disk images.</li>
<li><a href="javascript:reformat('read_eit.pro');"><strong>read_eit</strong></a> reads the filenames array and returns an <em>index</em> structure representation of the <cite>FITS</cite> file header and a 2-d <em>data</em> array of image values. The latter is a 3-d array when more than one image is read. The optional keyword <em>outsize</em> specifies the dimensions of the output image. For example, setting <em>outsize=512</em> produces a 512&#215;512 image.</li>
<li><a href="javascript:reformat('eit_prep.pro');"><strong>eit_prep</strong></a> applies degridding, dark current, and flatfield corrections to the image data.</li>
<li><strong>index2map</strong> converts the corrected <em>outindex</em> and <em>outdata</em> variables into a map. The latter is an array when multiple images are copied.</li>
</ol>
<p>In the case of full-disk images, the 1024&#215;1024 array size can lead to IDL out-of-memory problems on some systems. To avoid this problem, there is an optional <em>outsize</em> keyword to rebin images to a smaller dimension (with accompanying loss of spatial resolution). The following example creates a 512&#215;512 map.</p>
<pre><strong><span class="c2"><code>

IDL&gt;index2map,outindex,outdata,emap,outsize=512

</code></span></strong></pre>
<p>The <em>outsize</em> keyword can also be used when reading the image with <strong>read_eit</strong>. More detailed documentation on manipulating <em>EIT</em> data is located in the <a href="http://umbra.nascom.nasa.gov/eit/eit_guide/chap4.html" class="broken_link"><em>EIT</em> <strong>Users Guide</strong></a> .</p>
<h3><a name="s3.2"></a></h3>
<p>The function <a href="javascript:reformat('mk_cds_map.pro');"><strong>mk_cds_map</strong></a> creates CDS maps. The CDS instrument produces images by rastering in pre-determined spectral lines. Images can be derived by using the peak count rate intensity of these lines, or by integrating the count rates over the observed spectral wavelength band. The following steps illustrate reading and processing CDS images into maps:</p>
<pre><strong><span class="c2"><code>

IDL&gt; files=cds_files('19-mar-98','20-mar-98',study=study,info=info)
IDL&gt; read_cds,files,ql
IDL&gt; cds_map=mk_cds_map(ql,window,/calib,/clean)

</code></span></strong></pre>
<p>Each step is summarized as follows:</p>
<ol>
<li><a href="javascript:reformat('cds_files.pro');"><strong>cds_files</strong></a> returns CDS filenames for a range of times/dates. This procedure requires that the environment variable <strong>CDS_FITS_DATA</strong> point to the directory containing the CDS FITS files. An optional input keyword <em>study</em> can be used to search for specific files. This keyword is an acronym for the CDS study, e.g. <em>study=&#8217;SYNOP&#8217;</em> . An optional output keyword <em>info</em> returns a string array of observation start times and study names for the files. Currently, the mapping software requires that only maps with similar dimensions can be combined. Since CDS studies can have arbitrary raster sizes, one must be careful not to mix different studies into an array of maps.</li>
<li><a href="javascript:reformat('read_cds.pro');"><strong>read_cds</strong></a> reads each file name and returns an array of &#8220;quicklook&#8221; data structures <em>QL</em>. Each <em>QL</em> structure contains a single raster experiment in several simultaneous wavelengths.</li>
<li><strong>mk_cds_map</strong> creates maps for selected selected spectral windows. The <em>window</em> argument is a scalar or vector of window numbers. Each window corresponds to a particular wavelength range. If this argument is not included, then the function will prompt for window numbers. The following keywords are also supported:
<ul>
<li><em>/calib:</em> applies instrumental corrections for background, flatfield, and spectral tilt.</li>
<li><em>/clean:</em> removes data pixels corrupted by cosmic ray hits.</li>
<li><em>/peak:</em> produces an image based on the peak intensity within the window spectral band &#8212; default behavior is to sum over wavelength.</li>
</ul>
</li>
</ol>
<h3><a name="s3.3"></a></h3>
<p>The following example, reads and creates an SXT map from an SXT full-frame data file:</p>
<pre><strong><span class="c2"><code>IDL&gt; rd_xda,'sfr970407.1229',-1,index,data
IDL&gt; sxt_prep,index,data,outindex,outdata,/register,/norm,/roll
IDL&gt; index2map,outindex,outdata,sxt_map
</code></span></strong></pre>
<p>Details on the use of <a href="javascript:reformat('rd_xda.pro');"><strong>rd_xda</strong></a> for reading SXT files can be found in the <a href="http://www.lmsal.com/SXT/html2/yag/ydac-yag.html">Yohkoh Analysis Guide</a>. The procedure <a href="javascript:reformat('sxt_prep.pro');"><strong>sxt_prep</strong></a> applies instrumental corrections to the SXT raw image that include (among other things) adjustment for spacecraft jitter, roll, dark current subtraction, and exposure normalization. Multiple images can be combined with the restriction that they have the same dimensions. Figure 4 shows a map created from an SXT full-frame AlMg filter image with the following properties:</p>
<pre><strong><span class="c2"><code>

IDL&gt; help,/st,sxt_map
** Structure &lt;40a74fe8&gt;, 9 tags, length=1048648, refs=2:
   DATA            FLOAT     Array[512, 512]
   XC              FLOAT          -73.8006
   YC              FLOAT          -154.193
   DX              FLOAT           4.91000
   DY              FLOAT           4.91000
   TIME            STRING    ' 6-Jun-1996 19:30:37.000'
   DUR             FLOAT           1.00000
   ID              STRING    'AlMg '
   UNITS           STRING    'arcsecs' 

IDL&gt; plot_map,sxt_map,/log,grid=20

</code></span></strong></pre>
<div class="c1"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig3.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig3.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" align="middle" title="IDL Map Software for Analyzing Solar Images" /></a></p>
<p><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig3.gif"><strong>Fig. 4 &#8211; <cite>SXT</cite> map</strong></a></div>
<p>The above image is plotted using the keyword <em>grid=20</em>. This keyword enables overlaying of a latitude and longitude grid with a grid spacing equal to the keyword value in units of degrees. Setting <em>grid</em> to a negative value will disable gridding, but will enable plotting of the optical solar limb. The same effect is achieved using the keyword <em>/limb</em>. <a name="s3.4"></a></p>
<h3><a name="s3.4"></a></h3>
<p><cite>TRACE</cite> files are read and converted to maps as follows.</p>
<pre><strong><span class="c2"><code>

IDL&gt; read_trace,file_name,dset,index,data
IDL&gt; index2map,index,data,trace_map
IDL&gt; plot_map,trace_map

</code></span></strong></pre>
<p>where the procedure <a href="javascript:reformat('read_trace.pro');"><strong>read_trace</strong></a> is a special purpose reader for <cite>TRACE</cite> files.</p>
<h3><a name="s3.5"></a></h3>
<p><cite>FITS</cite> files can be converted to maps by using the procedure <a href="javascript:reformat('fits2map.pro');"><strong>fits2map</strong></a> . The following example reads and converts a <cite>SOHO/MDI</cite> full-disk magnetogram <cite>FITS</cite> file into a map, and plots the result:</p>
<pre><strong><span class="c2"><code>

IDL&gt; fits2map,'smdi_maglc_fd_19980331_1117.fts',map,header=header
IDL&gt; loadct,0
IDL&gt; plot_map,map

</code></span></strong></pre>
<p>The keyword <em>header</em> optionally returns the string header of the <cite>FITS</cite> file.</p>
<div class="c1"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig5.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig5.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" align="middle" title="IDL Map Software for Analyzing Solar Images" /></a></p>
<p><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig5.gif"><strong>Fig. 5 &#8211; <cite>MDI</cite> map</strong></a></div>
<h3><a name="s3.5.1"></a></h3>
<p><cite>HESSI FITS</cite> files are converted to maps by using <strong>fits2map</strong>. HESSI images can be created using the <cite>HESSI</cite> GUI and saved as FITS files <a name="s3.6"></a></p>
<h3><a name="s3.5.1"></a></h3>
<p>The function <a href="javascript:reformat('drot_map.pro');"><strong>drot_map</strong></a> rotates a map using the solar differential rotation formula of Howard, Harvey, and Forgach, <cite>Solar Physics</cite>, 130, 295, 1990. Since the formula is derived from statistical studies of small-scale magnetic features, it is most accurately applied to photospheric images and is less accurate when applied to transition region and coronal images observed by <cite>EIT</cite> and <cite>SXT</cite>, respectively. The following example demonstrates the differential rotation of the above full-disk SXT image over 4 days.</p>
<pre><strong><span class="c2"><code>

IDL&gt; gmap=grid_map(sxt_map,256,256)
IDL&gt; dmap=drot_map(gmap,4,/days)
IDL&gt; plot_map,sxt_map,/log
IDL&gt; plot_map,dmap,/log,/new,/limb

</code></span></strong></pre>
<div class="c1"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig5b.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig5b.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" align="middle" title="IDL Map Software for Analyzing Solar Images" /></a></p>
<p><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig5b.gif"><strong>Fig. 6 &#8211; Rotated <cite>SXT</cite> map</strong></a></div>
<p>Because solar rotation involves interpolating each pixel to a new location, processing large 512&#215;512 or 1024&#215;1024 images can be very time-consuming and memory-intensive on some systems. In the above example, the SXT map is rebinned to a more manageable 256&#215;256 size prior to rotation. The function <strong>drot_map</strong> accepts map and duration (in hours) as input arguments. It also supports the following keywords:</p>
<ul>
<li><em>/days:</em> specifies that input duration is in units of days.</li>
<li><em>/secs:</em> specifies that input duration is in units of seconds.</li>
<li><em>time=new_time:</em> specifies the new time to which the image is to be rotated. In this case, the duration argument should <em>not</em> be used (since it always takes precedence).</li>
<li><em>missing=value:</em> specifies the value assigned to pixels that have rotated out of the field or over the limb &#8212; the default is 0.</li>
</ul>
<p>The function <strong>drot_map</strong> combines regridding, roll-correction, and translation through the following additional keywords:</p>
<ul>
<li><em>space=[dx,dy]:</em> specifies new pixel spacings.</li>
<li><em>roll=new_roll:</em> specifies new roll angle (in degrees).</li>
<li><em>center = [rx,ry]:</em> specifies new roll center.</li>
<li><em>trans = [xs,ys]:</em> specifies translation shifts in the x- and y- directions.</li>
<li><em>ncenter = [nx,ny]:</em> specifies a new center coordinate for the solar-rotated image.</li>
<li><em>ref_map=ref_map:</em> specifies a reference map to which the input map is to be mapped (i.e, use reference map time, spacing, roll, center, ncenter, etc).</li>
</ul>
<h3><a name="s4"></a></h3>
<p>Maps are graphically overlayed using the keyword <em>/over</em> in <strong>plot_map</strong> . In the following example, an <cite>SXT</cite> map is contoured over an <cite>EIT</cite> map.</p>
<pre><strong><span class="c2"><code>

IDL&gt;plot_map,eit_map,fov=sxt_map,/log  ;-- first plot <cite>EIT</cite>
IDL&gt;plot_map,sxt_map,/log,/over,/rotate  ;-- then contour over <cite>SXT</cite>

</code></span></strong></pre>
<p>The <em>fov</em> keyword is a map structure from which <strong>plot_map</strong> infers <em>xrange</em> and <em>yrange</em> values. In the above example, only the sub-region of <em>eit_map</em> that overlaps with that of <em>sxt_map</em> field-of-view is displayed. This keyword is optional. Different sub-regions can be displayed also via the <em>xrange</em> and <em>yrange</em> keywords.</p>
<p>The <em>/rotate</em> keyword corrects for solar rotation of the overlayed image relative to the first. This correction is important if the time difference between images is more than several hours. The overlayed image can be rotated to a specified time via the keyword <em>time</em>.</p>
<div class="c1">
<table border="0" cellspacing="10" cellpadding="10" align="middle">
<tbody>
<tr>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6a.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6a.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6b.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6b.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
</tr>
<tr>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6a.gif">Fig. 7a &#8211; <cite>EIT</cite></a></strong></td>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6b.gif">Fig. 7b &#8211; <cite>SXT</cite></a></strong></td>
</tr>
</tbody>
</table>
</div>
<div class="c1"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6c.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6c.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></p>
<p><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig6c.gif">Fig. 7c &#8211; <cite>SXT/EIT Overlay</cite></a></strong></div>
<hr />
<p>The following example shows an overlay of <cite>MDI</cite> magnetogram contours on an <cite>SXT</cite> observation of flare loops. The example illustrates the use of additional keyword options in <strong>plot_map</strong>.</p>
<div class="c1"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig7.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig7.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" align="middle" title="IDL Map Software for Analyzing Solar Images" /></a></p>
<p><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig7.gif"><strong>Fig. 8 &#8211; <cite>MDI/SXT</cite> Overlay</strong></a></div>
<pre><strong><span class="c2"><code>

IDL&gt;set_line_color
IDL&gt;levels=100+findgen(11)*100.
IDL&gt;plot_map,sxt_map,/log,bottom=11
IDL&gt;plot_map,mdi_map,/over,/rotate,/positive,lcolor=5,levels=levels
IDL&gt;plot_map,mdi_map,/over,/rotate,/negative,lcolor=2,levels=-levels  

</code></span></strong></pre>
<p>Each step is explained below:</p>
<ol>
<li><a href="javascript:reformat('set_line_color')"><strong>set_line_color</strong></a> allocates a simple color table between 0 and 10, in which color=2 corresponds to yellow, and color=5 corresponds to blue. When using <strong>set_line_color</strong>, it is necessary that <strong>plot_map</strong> be called with the keyword: <cite>bottom=11</cite> to ensure that the image data are scaled to the correct number of available colors above the 11 colors reserved by <strong>set_line_color</strong>.</li>
<li><strong>findgen</strong> is used to define an array of contour levels: 100,200&#8230;1000.</li>
<li>the <cite>SXT</cite> map specified in <em>sxt_map</em> is plotted.</li>
<li>positive <cite>MDI</cite> magnetogram values in the map <em>mdi_map</em> are overplotted as blue contours.</li>
<li>negative <cite>MDI</cite> magnetogram values are overplotted as yellow contours.</li>
</ol>
<hr />
<p>The final example shows an overlay of a <cite>CDS</cite> Ne VI map on an <cite>EIT</cite> 171 map, for a limb active region.</p>
<pre><strong><span class="c2"><code>

IDL&gt;plot_map,eit_map,/log
IDL&gt;plot_map,cds_map,/over,cthick=2

</code></span></strong></pre>
<p>The keyword <em>cthick=2</em> specifies a double thickness contour for the overlay image.</p>
<div class="c1">
<table border="0" cellspacing="10" cellpadding="10" align="middle">
<tbody>
<tr>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8a.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8a.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
<td align="middle"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8b.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8b.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></td>
</tr>
<tr>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8a.gif">Fig. 9a &#8211; <cite>EIT</cite> 171</a></strong></td>
<td align="middle"><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8b.gif">Fig. 9b &#8211; <cite>CDS</cite> Ne VI</a></strong></td>
</tr>
</tbody>
</table>
</div>
<div class="c1"><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8c.gif"><img src="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8c.gif" alt="** PLEASE DESCRIBE THIS IMAGE **" width="256" height="256" title="IDL Map Software for Analyzing Solar Images" /></a></p>
<p><strong><a href="http://www.sipwork.org/v1/Tutorials/MapsObjects/figures/fig8c.gif">Fig. 9c &#8211; <cite>CDS/EIT Overlay</cite></a></strong></div>
<hr />
<strong>Last Revised:</strong> <em><script type="text/javascript">// <![CDATA[
document.write(document.lastModified);
// ]]&gt;</script></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=42</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Past Conferences</title>
		<link>http://www.sipwork.org/?p=39</link>
		<comments>http://www.sipwork.org/?p=39#comments</comments>
		<pubDate>Fri, 02 Oct 2009 21:50:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Meetings]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=39</guid>
		<description><![CDATA[This will be a listing with links to past conferences on image processing. 
]]></description>
			<content:encoded><![CDATA[<p>This will be a listing with links to past conferences on image processing. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=39</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solar Image Processing Workshop V &#8211; First Announcement</title>
		<link>http://www.sipwork.org/?p=37</link>
		<comments>http://www.sipwork.org/?p=37#comments</comments>
		<pubDate>Fri, 02 Oct 2009 21:50:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Latest News]]></category>
		<category><![CDATA[Meetings]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/?p=37</guid>
		<description><![CDATA[First Announcement
Fifth Solar Image Processing Workshop
 12 – 16 September 2010.
Eurotel Victoria Les Diablerets, Les Diablerets, Switzerland,
This series of workshops brings together members of the solar physics and image processing communities to present and discuss advances in solar image processing techniques. The design and implementation of existing algorithms as reliable and robust tools are discussed, as well as automated [...]]]></description>
			<content:encoded><![CDATA[<h2>First Announcement</h2>
<h1>Fifth Solar Image Processing Workshop</h1>
<address> 12 – 16 September 2010.<br />
Eurotel Victoria Les Diablerets, Les Diablerets, Switzerland,</address>
<p>This series of workshops brings together members of the solar physics and image processing communities to present and discuss advances in solar image processing techniques. The design and implementation of existing algorithms as reliable and robust tools are discussed, as well as automated techniques for processing very large amounts of data.</p>
<p><span id="more-37"></span></p>
<p>The fifth Solar Image Processing Workshop (<a href="http://sipworkv.sipwork.org/">http://sipworkv.sipwork.org/</a>) will concentrate on the role played by solar image processing as we enter the petabyte era of solar physics. For example, the Solar Dynamics Observatory vastly increases the amount of data we have about our Sun, and solar image processing is taking a central role in reducing SDO and other data into useful information about the underlying physics.</p>
<p>Contribution to oral and poster sessions will be solicited in the second announcement, including presentations of image processing methods, software and visualization tools. Contributions involving SDO, PROBA2, STEREO, Hinode, SOHO are particularly solicited.</p>
<p>The workshop will consist of a 3.5 day meeting. In common with previous workshops in this series, mornings will be given over to talks, whilst in the afternoon the workshop will split up into working groups, each of which will cover a given topic in greater depth. Special attention will be given to the results from the Solar Dynamics Observatory mission. The meeting will address topics in the application of computer vision techniques to the challenges of solar physics, such as solar tomography, 3-d reconstruction of solar features, automated feature detection, multiwavelength and motion analysis, blind source separation, and distributed data analysis infrastructure.</p>
<p>For the latest updates please consult the meeting website <a href="http://sipworkv.sipwork.org/">http://sipworkv.sipwork.org/</a>.</p>
<p>LOC Chair: Andre Csillaghy, University of Applied Sciences Northwestern Switzerland<br />
SOC Chair: Jack Ireland, ADNET Systems Inc./NASA GSFC</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=37</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solar Visualization Tools Overview</title>
		<link>http://www.sipwork.org/?p=25</link>
		<comments>http://www.sipwork.org/?p=25#comments</comments>
		<pubDate>Fri, 02 Oct 2009 21:08:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Visualization]]></category>

		<guid isPermaLink="false">http://www.sipwork.org/v1/?p=25</guid>
		<description><![CDATA[Helioviewer.org
JHelioviewer
Festival
Solar Weather Browser
]]></description>
			<content:encoded><![CDATA[<p>Helioviewer.org</p>
<p>JHelioviewer</p>
<p>Festival</p>
<p>Solar Weather Browser</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sipwork.org/?feed=rss2&amp;p=25</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
