Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

from builtins import object 

import os 

import sqlite3 

import numpy as np 

from astropy.time import Time 

from lsst.utils import getPackageDir 

 

__all__ = ["CloudData"] 

 

 

class CloudData(object): 

"""Handle the cloud information. 

 

This class deals with the cloud information that was previously produced for 

OpSim version 3. 

 

Parameters 

---------- 

start_time : astropy.time.Time 

The time of the start of the simulation. 

The cloud database will be assumed to start on Jan 01 of the same year. 

cloud_db : str, opt 

The full path name for the cloud database. Default None, 

which will use the database stored in the module ($SIMS_CLOUDMODEL_DIR/data/cloud.db). 

offset_year : float, opt 

Offset into the cloud database by 'offset_year' years. Default 0. 

""" 

def __init__(self, start_time, cloud_db=None, offset_year=0): 

self.cloud_db = cloud_db 

if self.cloud_db is None: 

self.cloud_db = os.path.join(getPackageDir('sims_cloudModel'), 'data', 'cloud.db') 

 

# Cloud database starts in Jan 01 of the year of the start of the simulation. 

year_start = start_time.datetime.year + offset_year 

self.start_time = Time('%d-01-01' % year_start, format='isot', scale='tai') 

 

self.cloud_dates = None 

self.cloud_values = None 

self.read_data() 

 

def __call__(self, time): 

"""Get the cloud for the specified time. 

 

Parameters 

---------- 

time : astropy.time.Time 

Time in the simulation for which to find the current cloud coverage. 

The difference between this time and the start_time, plus the offset, 

will be used to query the cloud database for the 'current' conditions. 

 

Returns 

------- 

float 

The fraction of the sky that is cloudy (measured in steps of 8ths) closest to the specified time. 

""" 

delta_time = (time - self.start_time).sec 

dbdate = delta_time % self.time_range + self.min_time 

idx = np.searchsorted(self.cloud_dates, dbdate) 

# searchsorted ensures that left < date < right 

# but we need to know if date is closer to left or to right 

left = self.cloud_dates[idx - 1] 

right = self.cloud_dates[idx] 

if dbdate - left < right - dbdate: 

idx -= 1 

return self.cloud_values[idx] 

 

def read_data(self): 

"""Read the cloud data from disk. 

 

The default behavior is to use the module stored database. However, an 

alternate database file can be provided. The alternate database file needs to have a 

table called *Cloud* with the following columns: 

 

cloudId 

int : A unique index for each cloud entry. 

c_date 

int : The time (units=seconds) since the start of the simulation for the cloud observation. 

cloud 

float : The cloud coverage (in steps of 8ths) of the sky. 

""" 

with sqlite3.connect(self.cloud_db) as conn: 

cur = conn.cursor() 

query = "select c_date, cloud from Cloud order by c_date;" 

cur.execute(query) 

results = np.array(cur.fetchall()) 

self.cloud_dates = np.hsplit(results, 2)[0].flatten() 

self.cloud_values = np.hsplit(results, 2)[1].flatten() 

cur.close() 

# Make sure seeing dates are ordered appropriately (monotonically increasing). 

ordidx = self.cloud_dates.argsort() 

self.cloud_dates = self.cloud_dates[ordidx] 

self.cloud_values = self.cloud_values[ordidx] 

# Record this information, in case the cloud database does not start at t=0. 

self.min_time = self.cloud_dates[0] 

self.max_time = self.cloud_dates[-1] 

self.time_range = self.max_time - self.min_time 

 

def config_info(self): 

"""Report information about configuration of this data. 

 

Returns 

------- 

Dict 

""" 

config_info = {} 

config_info['Start time for db'] = self.start_time 

config_info['Cloud database'] = self.cloud_db 

return config_info