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

Last change on this file since 13408 was 13400, checked in by kraehenb, 13 years ago
Completed the fast implementation to read calibrated data: calfits.h, CalFitsTest.py.
File size: 4.9 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: alle Event-Parameter zugänglich, 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 vector<float> calib_baselinemean;
69 vector<float> calib_gainmean;
70 vector<float> calib_triggeroffsetmean;
71 //ToDo: use arrays of size 1440x1024 (x2 for wrap-arounds) and read all variables into those
72
73 //Event variables
74 UInt_t event_id;
75 UShort_t event_triggertype;
76 vector<int16_t> event_data;
77 vector<int16_t> event_offset;
78 vector<int32_t> event_boardtimes;
79 vector<float> event_caldata; //Vector for calibrated event
80
81 CalFits(const string &datafilename, const string &calibfilename) //Constructor with two filenames
82 : datafile(datafilename),
83 calibfile(calibfilename)
84 {
85 //Read basic parameters of the two files
86// std::cout << "...Reading basic file parameters..." << std::endl;
87 calib_nroi = calibfile.GetUInt("NROI");
88 calib_npix = calibfile.GetUInt("NPIX");
89 data_nroi = datafile.GetUInt("NROI");
90 data_npix = datafile.GetUInt("NPIX");
91 data_ndata = datafile.GetN("Data");
92
93 calib_blm_size = calibfile.GetN("BaselineMean")/calib_npix;
94 calib_gm_size = calibfile.GetN("GainMean")/calib_npix;
95 calib_tom_size = calibfile.GetN("TriggerOffsetMean")/calib_npix;
96
97// std::cout << "Column sizes: " << calib_blm_size << " " << calib_gm_size << " " << calib_tom_size << std::endl;
98
99 //Define the common variables
100 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)) {
101 nroi = data_nroi;
102 npix = data_npix;
103 }
104 else {
105 ostringstream str;
106 str << "Data/calib file error: NROI mismatch, NPIX mismatch, data column size wrong or calib columns mismatch.";
107#ifdef __EXCEPTIONS
108 throw runtime_error(str.str());
109#else
110 gLog << ___err___ << "ERROR - " << str.str() << endl;
111 return;
112#endif
113 }
114 nevents = datafile.GetNumRows();
115
116 //Read the calibration data
117// std::cout << "...Reading calibration data..." << std::endl;
118 calib_baselinemean.resize(calibfile.GetN("BaselineMean"),0);
119 calibfile.SetVecAddress("BaselineMean", calib_baselinemean);
120 calib_gainmean.resize(calibfile.GetN("GainMean"),0);
121 calibfile.SetVecAddress("GainMean", calib_gainmean);
122 calib_triggeroffsetmean.resize(calibfile.GetN("TriggerOffsetMean"),0);
123 calibfile.SetVecAddress("TriggerOffsetMean", calib_triggeroffsetmean);
124 calibfile.GetRow(0);
125
126 //Get the column sizes per pixel
127 //...
128
129 //Set the event pointers
130// std::cout << "...Setting event pointers..." << std::endl;
131 datafile.SetRefAddress("EventNum", event_id);
132 datafile.SetRefAddress("TriggerType", event_triggertype);
133
134 event_data.resize(data_ndata,0);
135 event_caldata.resize(data_ndata,0);
136 datafile.SetVecAddress("Data", event_data);
137
138 event_offset.resize(datafile.GetN("StartCellData"),0);
139 datafile.SetVecAddress("StartCellData", event_offset);
140
141 event_boardtimes.resize(datafile.GetN("BoardTime"),0);
142 datafile.SetVecAddress("BoardTime", event_boardtimes);
143 }
144
145 bool GetCalEvent()
146 {
147 if(datafile.GetNextRow() == false) {
148// std::cout << "Last event reached..." << std::endl;
149 return false;
150 }
151 else {
152 UInt_t drs_calib_offset;
153 for(UInt_t pixel=0;pixel<data_npix;pixel++) {
154 for(UInt_t slice=0;slice<data_nroi;slice++) {
155 drs_calib_offset = (slice+event_offset[pixel])%calib_blm_size;
156 event_caldata[pixel*data_nroi+slice] = float((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);
157 //Note: data_nroi=calib_nroi, calib_blm_size=calib_gm_size
158 }
159 }
160 }
161 return true;
162 }
163};
164#endif
Note: See TracBrowser for help on using the repository browser.