aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--quantum_efficiency.c114
-rw-r--r--quantum_efficiency.h6
2 files changed, 120 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);
+ }
+ }
+}
diff --git a/quantum_efficiency.h b/quantum_efficiency.h
new file mode 100644
index 0000000..bd05950
--- /dev/null
+++ b/quantum_efficiency.h
@@ -0,0 +1,6 @@
+#ifndef QUANTUM_EFFICIENCY_H
+#define QUANTUM_EFFICIENCY_H
+
+double get_quantum_efficiency(double wavelength);
+
+#endif