-
Notifications
You must be signed in to change notification settings - Fork 0
/
ExtinctionPlotterMultiple
executable file
·154 lines (152 loc) · 8.49 KB
/
ExtinctionPlotterMultiple
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
#! /usr/bin/env python
#This code will plot extinction spectra from multiple calculations and data from literature on one plot.
import matplotlib.pyplot as plt
import numpy as np
import os
import readline
import time
import math
#turn on tab completion, and remove '-' from the list of delimiters as cp2k uses tabs in file names
readline.parse_and_bind("tab: complete")
readline.set_completer_delims(readline.get_completer_delims().replace('-',''))
fix,ax = plt.subplots()
#find all instances of qtable in the directory
os.system('find -name "qtable" -printf "%h\n" > locations.dat')
os.system('find -name "qtable" > qtableLocations.dat')
#get the locations into the code
locationsFile = open('locations.dat','r')
Lines = locationsFile.readlines()
locationsFile.close()
#os.system('rm locations.dat')
#get the full file paths into the code
qtablePathsFile = open('qtableLocations.dat','r')
qtableLines = qtablePathsFile.readlines()
qtablePathsFile.close()
os.system('rm qtableLocations.dat')
#show the user which directories - aka calculations - are available to plot
print('The following calculations are available:\n')
time.sleep(1)
for j, line in enumerate(Lines):
print('{0}: {1}'.format(j,line))
time.sleep(1)
#determine which calculations the user would like to plot
print('\nEnter the numbers corresponding to the calculations you would like to plot, separated by spaces.\n')
numbers = raw_input('For example: 0 3 4\n')
numberList = np.unique(np.array([int(s) for s in numbers.split() if s.isdigit()]))
#now determine if data in the literatureData directory needs to be plotted, and get an input which corresponds to the data files.
controller = 0
while (controller != 1):
inputRequiredController = raw_input('\n\nDo data sets from the literature need to be plotted? (y/n)\n')
if (inputRequiredController == 'n'):
controller = 1
totalDataSets = len(numberList)
litNumList = np.array([])
elif (inputRequiredController == 'y'):
controller = 1
#now the data file names in the literatureData directory must be output to the screen
os.system('cd ~/extinctionCalculations/literatureData/ && find . -type f > ~/extinctionCalculations/literatureDataFiles.dat')
litDatFile = open('literatureDataFiles.dat','r')
litDatLines = litDatFile.readlines()
litDatFile.close()
os.system('rm literatureDataFiles.dat')
print('\nData for the following calculations are available:\n')
time.sleep(1)
for i, line in enumerate(litDatLines):
print('{0}: {1}'.format(i,line))
time.sleep(1)
#now, determine which of these calculations the user would like to add to the plot
print('\nEnter the numbers corresponding to the calculations you would like to plot, separated by spaces.\n')
litNumbers = raw_input('For example: 0 1\n')
litNumList = np.unique(np.array([int(s) for s in litNumbers.split() if s.isdigit()]))
#what is the total number of data sets?
totalDataSets = len(numberList) + len(litNumList)
else:
time.sleep(2)
print('\n\n\nInvalid entry, please try again.\n')
time.sleep(1)
#set the size of the tick marks
plt.rc('xtick', labelsize=18)
plt.rc('ytick', labelsize=18)
#create variable to hold the effective radius of geometry used in the calculation, and a second variable to hold the labels for the data sets
effectiveRadiusList = np.array([])
dataSetLabels = np.array([])
#now that the literature and calculated data locations have been selected by the user, the next step is to get the data corresponding to the locations the user indicated with his/her numerical input. First, do the data resulting from calculations. This will be easier than literature data, which may require the file format to be changed.
#for each number corresponding to a calculation data file the user entered, identify the data file, open it, and save the data in a list in the empty list. Also save the name of the parent directory of the data to be used as a plot label. Further, save the effective radius of the data
#initialize count so there will not be a crash if no calculation data is selected
count = -1
#create an array to hold the colors of the lines so they can be plotted automatically with matching colors
colorArray = np.array([])
kolor = np.array(['g','r','k'])
#plot the calculated data
for count, p in enumerate(numberList):
#make temp arrays to hold data
tempArrayWave = np.array([])
tempArrayExt = np.array([])
dataSetLabels = np.append(dataSetLabels, Lines[int(p)])#.rsplit('/',1)[1][:-1])
tempFile = open(qtableLines[int(p)].replace("\n",''),'r')
tempLines = tempFile.readlines()
tempFile.close()
for kount, line in enumerate(tempLines):
if kount > 13:
if kount == 14:
effectiveRadiusList = np.append(effectiveRadiusList,float(line.split()[0]))
tempArrayWave = np.append(tempArrayWave,float(line.split()[1]))
tempArrayExt = np.append(tempArrayExt,float(line.split()[2]))
colorHolder, = plt.plot(tempArrayWave*1000,tempArrayExt*3*math.pow(10,6)/4/effectiveRadiusList[count],label=dataSetLabels[count].replace('_',' ').replace(' 2.41 nm','').replace(' 2.4 nm','')+', Calculated', linewidth=2.0, color=kolor[count])
#save the color of the plot
colorArray = np.append(colorArray, colorHolder.get_color())
#now it is time to add the literature data to the plot
for dCount, P in enumerate(litNumList):
tempWaveArray = np.array([])
tempExtArray = np.array([])
dataSetLabels = np.append(dataSetLabels, litDatLines[int(P)][:-1].replace('.xls',''))
fileName = 'literatureData/' + litDatLines[int(P)][:-1]
#get the effective radius of the calculation
#future capability: add the ability to handle several units! Add them as needed
#if litDatLines[int(P)].rsplit
effectiveRadiusList = np.append(effectiveRadiusList,float(litDatLines[int(P)].rsplit('_')[1]))
tempFile = open(fileName,'r')
tempLines = tempFile.readlines()
tempFile.close()
#now determine if the file is in raw format from ImageJ, or if it has been processed already
if (tempLines[0].split()[1] == 'Mean'):
#The file is in raw format. It needs to be processed!
for jCount, line in enumerate(tempLines):
if (jCount > 0):
tempWaveArray = np.append(tempWaveArray, float(line.split()[5]))
tempExtArray = np.append(tempExtArray, float(line.split()[6]))
#now write the data to a new file of the same name,
newFile = open(fileName.rsplit('.',1)[0],'w')
#write an identifying line
newFile.write('converted file format\n')
for kCount, line in enumerate(tempWaveArray):
newFile.write('{0} {1}\n'.format(tempWaveArray[kCount],tempExtArray[kCount]))
newFile.close()
#now that the file has been rewritten into a new file, remove the original file
os.system('rm {0}'.format(fileName))
elif (tempLines[0][:-1] == 'converted file format'):
#the file is in converted format
for jCount, line in enumerate(tempLines):
if (jCount > 0):
tempWaveArray = np.append(tempWaveArray, line.split()[0])
tempExtArray = np.append(tempExtArray, line.split()[1])
colorSuccess = 0
#determine if this data set is being plotted with a calculated data set of the same name. If so, match the colors
# :-1 returns all except the last element
for kCounter, nameString in enumerate(dataSetLabels[:-1]):
if (dataSetLabels[dCount+count+1].rsplit('_',1)[0].rsplit('/',1)[1] == nameString):
print('{0}'.format(dataSetLabels[dCount+count+1]))
plt.plot(tempWaveArray, tempExtArray, label=dataSetLabels[dCount+count+1].rsplit('/',1)[1].rsplit('_',1)[0].replace('_',' ').replace(' 2.41 nm','').replace(' 2.4 nm','')+", Literature", marker='o', linestyle='none', markersize=10, color=colorArray[kCounter])
colorSuccess = 1
if (colorSuccess == 0):
plt.plot(tempWaveArray, tempExtArray, label=dataSetLabels[dCount+count+1].rsplit('/',1)[1]+", Literature", marker='o', markersize=10, linestyle='none')
#finalize the plot!
plotTitle = raw_input('\nEnter the desired figure file name. Extension added automatically.\n')
plt.xlabel('Wavelength (nm)', fontsize=20)
plt.ylabel('Extinction Normalized to Volume (1/m)', fontsize=20)
plt.xlim(300,600)
handles,labels = ax.get_legend_handles_labels()
labels, handles = zip(*sorted(zip(labels, handles), key=lambda t: t[0]))
plt.legend(handles, labels, prop={'size':18},frameon=False)
plt.savefig(plotTitle)
plt.show()