source: fact/tools/pyscripts/sandbox/kraehenb/calfits.h@ 13451

Last change on this file since 13451 was 13451, checked in by kraehenb, 12 years ago
New comments [all], cleaned up unused code parts [CalFitsPerformanceWeave].
File size: 5.6 KB
Line 
1//********************************
2//
3// Class Calfits
4// Wrapper class for fits.h or pyfits.h
5// Provides fast access to calibrated events of FACT raw files
6//
7// written by Thomas Kraehenbuehl, ETH Zurich
8// tpk@phys.ethz.ch, +41 44 633 3973
9// April 2012
10//
11//********************************
12//
13// Compilation (root in pyfact directory)
14// root [0] gSystem->Load("/usr/lib64/libz.so");
15// root [1] .L pyfits.h++
16// root [2] .L ../sandbox/kraehenb/calfits.h++
17//
18// Usage in Python:
19// See CalFitsTest.py
20//
21//********************************
22
23//ToDo: shared library creation debuggen
24
25#ifndef CALFITS_H
26#define CALFITS_H
27
28#include <cstdio>
29#include <string>
30
31#ifndef __MARS__
32#include <vector>
33#include <iomanip>
34#include <iostream>
35#define gLog cerr
36#define ___err___ ""
37#define ___all___ ""
38#else
39#include "MLog.h"
40#include "MLogManip.h"
41#define ___err___ err
42#define ___all___ all
43#endif
44
45#ifdef __EXCEPTIONS
46#include <stdexcept>
47#endif
48
49#include "../../pyfact/pyfits.h"
50
51class CalFits
52{
53public:
54 //No standard constructor CalFits()!
55
56 //Direct handlers of the files
57 fits datafile, calibfile; //Class name should be PyFits or better FactPyFits...
58
59 //Basic file parameters
60 UInt_t calib_nroi, calib_npix;
61 UInt_t calib_blm_size, calib_gm_size, calib_tom_size;
62 UInt_t data_nroi, data_npix, data_ndata;
63
64 //Common variables
65 UInt_t nroi, npix, nevents;
66
67 //Calibration variables
68 float* calib_baselinemean;
69 float* calib_gainmean;
70 float* calib_triggeroffsetmean;
71 //Using <vector> instead of arrays makes no visible difference
72 //ToDo: use arrays of size 1440x1024 (x2 for wrap-arounds) and read all variables into those
73
74 //Event variables
75 UInt_t event_id;
76 UShort_t event_triggertype;
77 int16_t* event_data;
78 int16_t* event_offset;
79 int32_t* event_boardtimes;
80 double* npcaldata;
81
82 CalFits(const string &datafilename, const string &calibfilename) //Constructor with two filenames
83 : datafile(datafilename),
84 calibfile(calibfilename),
85 npcaldata(NULL)
86 {
87 //Read basic parameters of the two files
88// std::cout << "...Reading basic file parameters..." << std::endl;
89 calib_nroi = calibfile.GetUInt("NROI");
90 calib_npix = calibfile.GetUInt("NPIX");
91 data_nroi = datafile.GetUInt("NROI");
92 data_npix = datafile.GetUInt("NPIX");
93 data_ndata = datafile.GetN("Data");
94
95 calib_blm_size = calibfile.GetN("BaselineMean")/calib_npix;
96 calib_gm_size = calibfile.GetN("GainMean")/calib_npix;
97 calib_tom_size = calibfile.GetN("TriggerOffsetMean")/calib_npix;
98
99// std::cout << "Column sizes: " << calib_blm_size << " " << calib_gm_size << " " << calib_tom_size << std::endl;
100
101 //Define the common variables
102 if((calib_nroi==data_nroi)&&(calib_npix==data_npix)&&(data_nroi*data_npix==data_ndata)&&(calib_blm_size==calib_gm_size)&&(calib_tom_size==calib_nroi)) {
103 nroi = data_nroi;
104 npix = data_npix;
105 }
106 else {
107 ostringstream str;
108 str << "Data/calib file error: NROI mismatch, NPIX mismatch, data column size wrong or calib columns mismatch.";
109#ifdef __EXCEPTIONS
110 throw runtime_error(str.str());
111#else
112 gLog << ___err___ << "ERROR - " << str.str() << endl;
113 return;
114#endif
115 }
116 nevents = datafile.GetNumRows();
117
118 //Read the calibration data
119// std::cout << "...Reading calibration data..." << std::endl;
120 calib_baselinemean = new float[calibfile.GetN("BaselineMean")];
121 calibfile.SetPtrAddress("BaselineMean", calib_baselinemean, calibfile.GetN("BaselineMean"));
122 calib_gainmean = new float[calibfile.GetN("GainMean")];
123 calibfile.SetPtrAddress("GainMean", calib_gainmean, calibfile.GetN("GainMean"));
124 calib_triggeroffsetmean = new float[calibfile.GetN("TriggerOffsetMean")];
125 calibfile.SetPtrAddress("TriggerOffsetMean", calib_triggeroffsetmean, calibfile.GetN("TriggerOffsetMean"));
126 calibfile.GetRow(0);
127
128 //Set the event pointers
129// std::cout << "...Setting event pointers..." << std::endl;
130 datafile.SetRefAddress("EventNum", event_id);
131 datafile.SetRefAddress("TriggerType", event_triggertype);
132
133 event_data = new int16_t[data_ndata];
134 datafile.SetPtrAddress("Data", event_data, data_ndata);
135
136 event_offset = new int16_t[datafile.GetN("StartCellData")];
137 datafile.SetPtrAddress("StartCellData", event_offset, datafile.GetN("StartCellData"));
138
139 event_boardtimes = new int32_t[datafile.GetN("BoardTime")];
140 datafile.SetPtrAddress("BoardTime", event_boardtimes, datafile.GetN("BoardTime"));
141 }
142
143 ~CalFits() //Standard destructor
144 {
145 delete[] calib_baselinemean;
146 delete[] calib_gainmean;
147 delete[] calib_triggeroffsetmean;
148 delete[] event_data;
149 delete[] event_offset;
150 delete[] event_boardtimes;
151 }
152
153 bool GetCalEvent() //Read calibrated event into the event variables
154 {
155 if(!npcaldata) {
156 ostringstream str;
157 str << "Pointer to the calibrated data not initialized!";
158#ifdef __EXCEPTIONS
159 throw runtime_error(str.str());
160#else
161 gLog << ___err___ << "ERROR - " << str.str() << endl;
162 return false;
163#endif
164 }
165 if(datafile.GetNextRow() == false) {
166// std::cout << "Last event reached..." << std::endl;
167 return false;
168 }
169 else {
170 UInt_t drs_calib_offset;
171 for(UInt_t pixel=0;pixel<data_npix;pixel++) {
172 for(UInt_t slice=0;slice<data_nroi;slice++) {
173 drs_calib_offset = (slice+event_offset[pixel])%calib_blm_size;
174 npcaldata[pixel*data_nroi+slice] = double((event_data[pixel*data_nroi+slice]*2000./4096.-calib_baselinemean[pixel*calib_blm_size+drs_calib_offset]-calib_triggeroffsetmean[pixel*data_nroi+slice])/calib_gainmean[pixel*calib_blm_size+drs_calib_offset]*1907.35);
175 //Note: data_nroi=calib_nroi, calib_blm_size=calib_gm_size
176 }
177 }
178 }
179 return true;
180 }
181
182 void SetNpcaldataPtr(double *numpyptr) //Set the pointer for the calibrated data to the numpy array
183 {
184 npcaldata = numpyptr;
185 return;
186 }
187};
188#endif
Note: See TracBrowser for help on using the repository browser.