Introduction to IDL®
Revised for Print March, 2016
©2016 Exelis Visual Information Solutions, Inc., a subsidiary of Harris Corporation. All rights reserved. ENVI and IDL are registered trademarks of Harris Corporation. All other marks are the property of their respective owners.
This document is not subject to the controls of the International Traffic in Arms Regulations
(ITAR) or the Export Administration Regulations (EAR).
Contents
- 1
- Introduction To IDL
- 5
55666677777
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1 What is ENVI? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 ENVI + IDL, ENVI, and IDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.3 ENVI Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.4 Contacting Harris Geospatial Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.5 Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.6 Training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.7 ENVI Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.8 Contacting Technical Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.9 Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.10 IDL Newsgroup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
- About This Course
- 9
99
2.1 Manual Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Programming Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 The Course Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Installing the Course Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Starting IDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.2 Max OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.3 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
- A Tour of IDL
- 13
3.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.2 Scalars and Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.3 Reading Data from Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.4 Line Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.5 Surface Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.6 Contour Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.7 Displaying Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.9 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
- 4
- IDL Basics
- 23
4.1 IDL Directory Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.2 The IDL Workbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.3 Exploring the IDL Workbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.4 Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5 Working Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.6 Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.7 Search Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
34
4.8 The IDL Help System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.9 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
- 5
- Line, Bar, and Scatter Plots
- 35
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.2 Graphics Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.3 Reflectance Spectra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.3.1 Plotting Multiple Datasets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 5.3.2 Adding Annotations to Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.3.3 Saving Graphics Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.4 Boulder Temperature Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.5 Scatterplots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 5.6 Bar Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.7 Error Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.8 The Sunspot Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 5.9 Histogram Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.10 Positioning Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 5.12 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
- 6
- Data Structures
- 49
6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.2.1 Variable Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2.2 System Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.3 Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.3.1 Type Behaviors in IDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6.3.2 Exception to Type Promotion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 6.3.3 Null Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.4 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.4.1 Array Subscripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6.4.2 Multidimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 6.4.3 Single-Index Subscripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 6.4.4 The Where Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.5 Lists and Hashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.6 Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.7 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 6.8 Pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.9 Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.11 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
- 7
- Programming
- 67
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 7.2 Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
7.2.1 Executive Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 7.2.2 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 7.2.3 Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 7.2.4 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 7.2.5 The COMPILE_OPT statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.3 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.3.1 Parameter Passing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.4 Calling Mechanism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 7.5 Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
45
7.5.1 Compound Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 7.5.2 Array Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 7.5.3 Matrix Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.6 Control Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.6.1 Compound Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.7 Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.7.1 If Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 7.7.2 Case Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 7.7.3 Switch Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 7.7.4 The Definition of True and False . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.8 Loop Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.8.1 For Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 7.8.2 While Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 7.8.3 Repeat Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 7.8.4 Foreach loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.9 Jump Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.9.1 The Break Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 7.9.2 The Continue Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.10 IDL Batch Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7.11 Timing with TIC and TOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7.12 Programming tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 7.13 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 7.14 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
89
- Images
- 91
8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 8.2 What is an Image? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 8.3 HST Imagery of the Carina Nebula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 8.4 Truecolor JPEG Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 8.5 Landsat 7 ETM+ Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 8.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 8.7 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
- File Access
- 103
9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 9.2 File Types: Text and Binary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 9.3 File Manipulation Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 9.4 IDL SAVE files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 9.5 Standard File Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
9.5.1 Wrappers for Standard Format Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 9.5.2 User-contributed Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
9.6 Reading Text and Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 9.7 Low-level File Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
9.7.1 Opening and Closing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 9.7.2 Logical Unit Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 9.7.3 Compressed and XDR-format files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 9.7.4 Byte Ordering in Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 9.7.5 Reading and Writing Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 9.7.6 Reading Free Format ASCII Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 9.7.7 Reading Explicitly Formatted ASCII Files . . . . . . . . . . . . . . . . . . . . . . . . . 115
9.8 Writing Free and Explicitly Formatted ASCII Files . . . . . . . . . . . . . . . . . . . . . . . . 116
9.8.1 Reading and Writing Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
9.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 9.10 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5
- 10 Surface and Contour Poots
- 119
10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
10.1.1 Graphics Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
10.2 Spatial Rainfall Distribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
10.2.1 Data Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 10.2.2 Shaded Surface Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 10.2.3 Filled Contour Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 10.2.4 Combined Surface and Contour Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
10.3 Digital Elevation Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
10.3.1 Wire Mesh Surface Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 10.3.2 Three-dimensional Contour Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 10.3.3 Texture-mapped Surface Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 10.3.4 A Remark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
10.4 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 10.5 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
- 11 Analysis
- 133
11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 11.2 Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
11.2.1 Interpolation with Cubic Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 11.2.2 Gridding Irregularly Spaced Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
11.3 Curve Fitting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.3.1 Least-squares Linear Fit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 11.3.2 Least-square User-defined Fit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
11.4 Signal Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 11.5 Image Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
11.5.1 Histogram Equalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 11.5.2 Image Sharpening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 11.5.3 Edge Enhancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 11.5.4 Fourier Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
11.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 11.7 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
- 12 Map Projections
- 151
12.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
12.1.1 Map Projections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 12.1.2 Graphics Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
12.2 A Simple Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 12.3 Landsat 7 ETM Image, Georeferenced . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 12.4 General Map Projection Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 12.5 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 12.6 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Chapter 1
Introduction To IDL
Contents
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1 What is ENVI? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 ENVI + IDL, ENVI, and IDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.3 ENVI Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.4 Contacting Harris Geospatial Solutions . . . . . . . . . . . . . . . . . . . . . . . . 1.1.5 Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.6 Training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.7 ENVI Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.8 Contacting Technical Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.9 Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.10 IDL Newsgroup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .