-
Notifications
You must be signed in to change notification settings - Fork 0
/
sim.py
291 lines (233 loc) · 8.95 KB
/
sim.py
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 18 18:59:00 2021
@author: minty
"""
import numpy as np
import random
import matplotlib.pyplot as plt
import fiberloc as fl
def newstate(): #generate a new state
i = random.randint(0, Nfiber-1)
ifassignnew = ifassign
whereassignnew = whereassign
if ifassign[i] == 0: #fiber is not already assigned
#check area for targets
ptloc, ptprior = checkarea(i)
#assign highest priority target
whichtar = besttarget_prior(ptloc, ptprior)
if int(whichtar) == Ntarget: #there are no good targets in the patrol area
ifassignnew[i] = 0
else:
ifassignnew[i] = 1
tiltarray[i] = tilt(r, tx[whichtar], ty[whichtar], fx[i], fy[i])
whereassignnew[i] = whichtar
return ifassignnew, whereassignnew, tiltarray
if ifassign[i] == 1: #Fiber is already assigned
P = np.exp(-1/T)*prior[int(whereassign[i])] #you can change this probability distribution
PROBABLY.append(P)
if P < .95: #play around with the probabilities, this will deassign the fiber
ifassignnew[i] = 0
whereassignnew[i] = Ntarget
whichtar = i
return ifassignnew, whereassignnew, tiltarray
else: #we leave the fiber alone
return ifassign, whereassign, tiltarray
def checkarea(i): #checks patrol area for open targets
ptloc = [] #potential targets number
ptprior = [] #their priorities
for j in range(Ntarget-1):
if circle(fx[i], fy[i], r, tx[j], ty[j], tr) == 1 :
#check if that target is already assigned
if float(j) not in whereassign:
#check if there is an intersection
ptloc.append(j)
ptprior.append(prior[j])
return ptloc, ptprior
def besttarget_prior(ptloc, ptprior): #finds the best target from potential target list
if ptloc == []:
return Ntarget
max_value = max(ptprior)
max_index = [i for i, x in enumerate(ptprior) if x == max_value]
if len(max_index) == 1:
return ptloc[max_index[0]] #only 1 good target
else:
b = random.choice(max_index) #pick randomly between highest targets if there is a tie
return ptloc[b]
def circle(cfx, cfy, rf, ctx, cty, rt): #check if target and fiber intersect
c1c2 = np.sqrt((cfx-ctx)**2 + (cfy-cty)**2)
if c1c2 <= r:
return 1
else:
return 0
def energy(ifassign, whereassign, prior, tiltarray): #calculates energy function
energy = 0
for m in range (Nfiber):
if int(whereassign[m]) != Ntarget:
energy += (ifassign[m] * prior[int(whereassign[m])] * (1-tiltarray[m]**2))
return energy
def fiber2sky(mini, loc): #changes the fiber locations to match the sky tile locations
loc2 = np.ones(len(loc))
for i in range (len(loc)):
loc2[i] = mini + loc[i]
return loc2
def tilt(r, txloc, tyloc, fxloc, fyloc): #calculates the tilt as a fraction of r
t = np.sqrt((fxloc-txloc)**2 + (fyloc-tyloc)**2)
return t/r
#Set up Inital State and Parameters
platescale = 106.7 * 3600 * 0.001
r = 7.7/platescale #patrol radius (mm)/platescale
p = 7.7/platescale #pitch
e = 1/platescale #exclusion radius
tr = 1/platescale #target radius
T_initial = 100
tstep = 0.1
T_final = 0.1
T = T_initial
tx = np.loadtxt('OV_test_x.txt')
ty = np.loadtxt('OV_test_y.txt')
ra_min = min(tx)
dec_min = min(ty)
fx, fy , Nfiber, tr = fl.arrangefibers(r, p, e, tr) #arranges fiber on focal plane
fx = fiber2sky(ra_min, fx)
fy = fiber2sky(dec_min, fy)
prior = np.loadtxt('OV_targetgalaxytestprior.txt')
info = np.loadtxt('OV_targetinfo.txt')
PROBABLY = [] #this is used to chack the probability distributions for deassigning
Ntarget = len(tx) #number of targets
#assignment array, 1 is assigned, 0 if unassigned
ifassign = np.zeros(Nfiber) #0 if unassigned, 1 if assigned
whereassign = (Ntarget)*np.ones(Nfiber) #which target is each fiber pointing to? if none then value is 500
tiltarray = np.ones(Nfiber) #if the target is assigned to a fiber, how much is the tilt
E_current = 0 #current energy
E_time = [] #store energies for energy vs time graph
step = []
count = 0
elggraph = [] #store number of each type of target vs time/step
lbggraph = []
qsograph = []
clustergraph = []
while T > T_final:
#Generate new state
E_time.append(E_current)
#create new arrays to compare energies
ifassignnew, whereassignnew, tiltarray = newstate()
E_new = energy(ifassignnew, whereassignnew, prior, tiltarray)
if E_new >= E_current: #check if new energy is greater
ifassign = ifassignnew
whereassign = whereassignnew
E_current = E_new
else:
#generate probability
P = np.exp((E_new-E_current)/T)
#PROBABLY.append(P) #this is to check the probabilities
if P < np.random.rand(1): #you can also mess around with this
ifassign = ifassignnew
whereassign = whereassignnew
E_current = E_new
count += 1
T -= tstep
step.append(count)
#analyze results as we go
#this is NOT efficient at all, I just coded this in last minute.
#please change this for future
elg = 0
lbg = 0
qso = 0
cluster = 0
for m in range (len(ifassign)):
if ifassign[m] == 1:
if info[int(whereassign[m])] == 1:
elg += 1
if info[int(whereassign[m])] == 2:
lbg += 1
if info[int(whereassign[m])] == 3:
qso += 1
if info[int(whereassign[m])] == 4:
cluster += 1
#print(whichtar)
elggraph.append(elg)
lbggraph.append(lbg)
qsograph.append(qso)
clustergraph.append(cluster)
plt.plot(step, elggraph, label='Emission Line Galaxies')
plt.plot(step, lbggraph, label='Lyman Break Galaxies')
plt.plot(step, qsograph, label='Lyman Alpha QSOs')
plt.plot(step, clustergraph, label='Cluster Galaxy')
plt.title('Target type per step')
plt.xlabel('Step')
plt.ylabel('Count')
plt.legend(bbox_to_anchor=(0.5, 0.75), loc='upper left')
plt.show()
print('Current Energy: ' + str(E_current))
tassign = np.zeros(Nfiber)#Ntarget) #what is this?
for n in range (len(whereassign)):
if whereassign[n] == 1:
tassign[n] = 1
fa = sum(ifassign)
print('Total targets: ' + str(Ntarget))
print('Fibers assigned: ' + str(fa))
print('Total fibers: ' + str(Nfiber))
finaltargetsx = []
finaltargetsy = []
finalprior = []
finaltilts = []
unassignedfx = []
unassignedfy = []
unassignedprior = []
elg = 0
lbg = 0
qso = 0
cluster = 0
for n in range (Nfiber):
if ifassign[n] == 1:
# print(n)
# print(whereassign[n])
finaltargetsx.append(tx[int(whereassign[n])])
finaltargetsy.append(ty[int(whereassign[n])])
finalprior.append(prior[int(whereassign[n])])
'''
if info[int(whereassign[n])] == 1:
elg += 1
if info[int(whereassign[n])] == 2:
lbg += 1
if info[int(whereassign[n])] == 3:
qso += 1
if info[int(whereassign[n])] == 4:
cluster += 1
'''
finaltilts.append(tiltarray[n])#*r*platescale)
if ifassign[n] == 0:
unassignedfx.append(fx[n])
unassignedfy.append(fy[n])
for n in range (Ntarget):
if n not in whereassign:
unassignedprior.append(prior[n])
print(np.max(finaltilts))
print(r*platescale)
plt.plot(unassignedfx, unassignedfy, 'x', label='Unassigned fiber')
plt.scatter(tx,ty, c=prior, s = 50, marker='*', label='Targets', cmap='cool')
plt.colorbar(label='Priority')
plt.plot(finaltargetsx,finaltargetsy, "o", markersize='5', markerfacecolor='none', color='red', label='Observed Target')
plt.xlabel('Target X location (DEC)')
plt.ylabel('Target Y location (RA)')
plt.title('Assigned Targets: ' + str(fa) + '/' + str(Ntarget) + ', Total Fibers: ' + str(Nfiber))
plt.legend(bbox_to_anchor=(0.5, -0.2), loc='center', ncol=3)
plt.show()
plt.plot(step, E_time)
plt.xlabel('T step')
plt.ylabel('Energy of current configuration')
plt.title('Energy vs Time, Final energy: ' + str(E_current))
plt.show()
plt.hist(finaltilts)
plt.xlabel('Tilt (percentage of radius(7.7mm))')
plt.ylabel('Number of fibers')
plt.title('Tilt with Median: ' + str(np.median(finaltilts)))
plt.show()
plt.hist([finalprior, unassignedprior], bins=5, stacked=True, label=['Observed','Unobserved'])
plt.xlabel('Priority')
plt.ylabel('Count')
plt.title('Number of Observed Targets vs. Priority')
plt.legend()
plt.show()
#plt.hist(PROBABLY)