aboutsummaryrefslogtreecommitdiff
path: root/quantum_efficiency.c
diff options
context:
space:
mode:
authortlatorre <tlatorre@uchicago.edu>2018-07-04 16:56:29 -0400
committertlatorre <tlatorre@uchicago.edu>2018-07-04 16:56:29 -0400
commita81ca4e4bf3c84b9c4fcefe80f23ed59db2d5689 (patch)
tree053b556a50fbec3d87cc4d33de96097be3a4db39 /quantum_efficiency.c
parent8dd7e5e7b47e38c61447b0ef2b7cfaed8584cd92 (diff)
downloadsddm-a81ca4e4bf3c84b9c4fcefe80f23ed59db2d5689.tar.gz
sddm-a81ca4e4bf3c84b9c4fcefe80f23ed59db2d5689.tar.bz2
sddm-a81ca4e4bf3c84b9c4fcefe80f23ed59db2d5689.zip
initial commit of a file to calculate the quantum efficiency
Diffstat (limited to 'quantum_efficiency.c')
-rw-r--r--quantum_efficiency.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/quantum_efficiency.c b/quantum_efficiency.c
new file mode 100644
index 0000000..02aea06
--- /dev/null
+++ b/quantum_efficiency.c
@@ -0,0 +1,114 @@
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+static int initialized = 0;
+
+static double *x, *y;
+static size_t size;
+
+static int init()
+{
+ int i;
+ char line[256];
+ char *str;
+ double value;
+ int n;
+
+ FILE *f = fopen("pmt_pcath_response.dat", "r");
+
+ if (!f) {
+ fprintf(stderr, "failed to open pmt_pcath_response.dat: %s", strerror(errno));
+ return -1;
+ }
+
+ i = 0;
+ n = 0;
+ /* For the first pass, we just count how many values there are. */
+ while (fgets(line, sizeof(line), f)) {
+ size_t len = strlen(line);
+ if (len && (line[len-1] != '\n')) {
+ fprintf(stderr, "got incomplete line on line %i: '%s'\n", i, line);
+ goto err;
+ }
+
+ i += 1;
+
+ /* Skip the first 32 lines since it's just a header. */
+ if (i < 32) continue;
+
+ if (!len) continue;
+ else if (line[0] == '#') continue;
+
+ str = strtok(line," \n");
+
+ while (str) {
+ value = strtod(str, NULL);
+ n += 1;
+ str = strtok(NULL," \n");
+ }
+ }
+
+ x = malloc(sizeof(double)*(n+2));
+ y = malloc(sizeof(double)*(n+2));
+ size = n + 2;
+
+ /* Make sure we extrapolate to 0. */
+ x[0] = 0;
+ y[0] = 0;
+ x[n+1] = 1000;
+ y[n+1] = 0;
+
+ i = 0;
+ n = 0;
+ /* Now, we actually store the values. */
+ rewind(f);
+ while (fgets(line, sizeof(line), f)) {
+ size_t len = strlen(line);
+ if (len && (line[len-1] != '\n')) {
+ fprintf(stderr, "got incomplete line on line %i: '%s'\n", i, line);
+ goto err;
+ }
+
+ i += 1;
+
+ /* Skip the first 32 lines since it's just a header. */
+ if (i < 32) continue;
+
+ if (!len) continue;
+ else if (line[0] == '#') continue;
+
+ str = strtok(line," \n");
+
+ while (str) {
+ value = strtod(str, NULL);
+ /* According to the file, the values are stored for wavelengths
+ * between 230 and 700 in 1 nm increments. */
+ x[n+1] = 230 + n*1.0;
+ y[n+1] = value;
+ n += 1;
+ str = strtok(NULL," \n");
+ }
+ }
+
+ fclose(f);
+
+ initialized = 1;
+
+ return 0;
+
+err:
+ fclose(f);
+
+ return -1;
+}
+
+double get_quantum_efficiency(double wavelength)
+{
+ if (!initialized) {
+ if (init()) {
+ exit(1);
+ }
+ }
+}