source: fact/tools/rootmacros/GetDrsOffset.C@ 17963

Last change on this file since 17963 was 12581, checked in by neise, 13 years ago
GetDrsOffset.C initial commit
  • Property svn:executable set to *
File size: 5.3 KB
Line 
1/*
2GetDrsOffset.C - a ROOT macro calculating the DRS Offset calibration constants
3
4 -- TESTING --
5
6 In case you have taken a file, which is good for calibrating the DRS Offset,
7 then you can calculate the offset using this macro.
8 It just calculates the mean value and the RMS for all DRS bins of all pixels
9 in the file, for the number of events you like.
10
11 The output is two TH2Fs, which contain all requested data on the one hand and
12 on the other hand are good for having an overview.
13
14 call it like this:
15 GetDrsOffset("path/20111111_001.fits.gz")
16
17 GetDrsOffset("path/20111111_001.fits.gz", "foo/output.root")
18 saves the output to a root file
19
20 GetDrsOffset("path/20111111_001.fits.gz", "", "bar/test.bin")
21 saves the output to a binary file.
22
23 GetDrsOffset("path/20111111_001.fits.gz", "foo/out.root", "bar/test.bin", false, -1)
24 produces all output, but does not open a ROOT Canvas.
25 -1 : means process all events in the given file.
26
27*/
28
29
30#include <TROOT.h>
31#include <TCanvas.h>
32#include <TH2F.h>
33#include <Getline.h>
34#include <TFile.h>
35#include <TStyle.h>
36
37#include <stdio.h>
38#include <stdint.h>
39#include <cstdio>
40#include <fstream>
41#include <string.h>
42
43#define HAVE_ZLIB
44#include "fits.h"
45
46#include "openFits.h"
47#include "openFits.c"
48
49
50int NEvents;
51vector<int16_t> AllPixelDataVector;
52vector<int16_t> StartCellVector;
53unsigned int CurrentEventID;
54size_t PXLxROI;
55UInt_t RegionOfInterest;
56UInt_t NumberOfPixels;
57
58TH2F * hOffset;
59TH2F * hOffsetRMS;
60double mean[1440][1024]={{0}};
61int n[1440][1024]={{0}};
62double rms[1440][1024]={{0}};
63TObjArray hList;
64
65
66int GetDrsOffset(
67 char *datafilename = "data/20111016_013.fits.gz",
68 const char *RootFileName = "",
69 const char *OutFileName = "",
70 bool graphic = true,
71 int nevents = -1,
72 int verbosityLevel = 1
73 )
74{
75gStyle->SetPalette(1,0);
76
77
78 fits * datafile;
79 NEvents = openDataFits( datafilename, &datafile,
80 AllPixelDataVector, StartCellVector, CurrentEventID,
81 RegionOfInterest, NumberOfPixels, PXLxROI, verbosityLevel);
82 if (NEvents == 0){
83 cout << "return code of OpenDataFile:" << datafilename<< endl;
84 cout << "is zero -> aborting." << endl;
85 return 1;
86 }
87
88 if (verbosityLevel > 0)
89 cout <<"number of events in file: "<< NEvents << "\t";
90 if ( nevents == -1 || nevents > NEvents ) nevents = NEvents; // -1 means all!
91 if (verbosityLevel > 0)
92 cout <<"of, which "<< nevents << " will be processed"<< endl;
93
94 int npixel = -1;
95 if (verbosityLevel > 0)
96 cout <<"Total # of Pixel: "<< NumberOfPixels << "\t";
97 if ( npixel == -1 || npixel > (int)NumberOfPixels ) npixel = (int)NumberOfPixels; // -1 means all!
98 if (verbosityLevel > 0)
99 cout <<"of, which "<< npixel << " will be processed"<< endl;
100
101
102 if (verbosityLevel > 0)
103 cout <<" The ROI of this datafile is:" << RegionOfInterest << endl;
104
105 double cur;
106 // -------------------- OFFSET --------------------------------------------
107 for ( int ev = 0; ev < nevents; ev++) {
108 printf("%5d / %5d\b\b\b\b\b\b\b\b\b\b\b\b\b",ev,nevents);
109 datafile->GetRow( ev );
110 for ( int pix = 0 ; pix < npixel; pix++ ){
111 for (unsigned int sl=0; sl< RegionOfInterest; sl++){
112 cur = AllPixelDataVector[pix * RegionOfInterest + sl];
113 mean[pix][(sl+StartCellVector[pix])%1024] += cur;
114 ++n[pix][(sl+StartCellVector[pix])%1024];
115 rms[pix][(sl+StartCellVector[pix])%1024] += cur * cur;
116 }
117 }
118 }
119 for (int p=0; p<1440; p++)
120 for (int s=0; s<1024; s++){
121 if (n[p][s]==0){
122 cout << "Error: no data for pixel:" << p <<" slice:" << s << endl;
123 return 1;
124 }
125 mean[p][s]/=n[p][s];
126 rms[p][s]/=n[p][s];
127 rms[p][s]-=mean[p][s]*mean[p][s];
128 rms[p][s]=sqrt(rms[p][s]);
129 }
130
131
132 // ----------------- For plotting only -------------------
133 if (graphic){
134
135 TCanvas *cOffset = NULL;
136 cOffset = new TCanvas("cOffset","Offset",10,10,800,400);
137 cOffset->Divide(1, 2);
138
139 hOffset = new TH2F("hOffset","Offset",1440,-0.5,1439.5, 1024, -0.5, 1023.5);
140 hOffset->GetXaxis()->SetTitle( "pixel" );
141 hOffset->GetYaxis()->SetTitle( "slice" );
142 hList.Add( hOffset );
143
144 hOffsetRMS = new TH2F("hOffsetRMS","Offset RMS",1440,-0.5,1439.5, 1024, -0.5, 1023.5);
145 hOffsetRMS->GetXaxis()->SetTitle( "pixel" );
146 hOffsetRMS->GetYaxis()->SetTitle( "slice" );
147 hList.Add( hOffsetRMS );
148
149 for ( int pix = 0 ; pix < 1440; pix++ ){
150 for (unsigned int sl=0; sl< 1024; sl++){
151 hOffset->Fill(pix,sl,mean[pix][sl]);
152 hOffsetRMS->Fill(pix,sl,rms[pix][sl]);
153 }
154 }
155 cOffset->cd(1);
156 hOffset->Draw("COLZ");
157 cOffset->cd(2);
158 hOffsetRMS->Draw("COLZ");
159 cOffset->Modified();
160 cOffset->Update();
161 }
162
163 if ( strlen(OutFileName) > 0 ) {
164 ofstream out(OutFileName, ios::out | ios::binary);
165 if(!out) {
166 cout << "Cannot open file." << OutFileName << endl;
167 return 1;
168 }
169 out.write((char *) &mean, sizeof mean);
170 out.write((char *) &rms, sizeof rms);
171 out.close();
172 cout << "binary output written to \"" << OutFileName << "\"" << endl;
173 }else
174 cout << "no output generated" << endl;
175
176/*
177 double offset[1440][1024];
178 ifstream in(OutFileName, ios::in | ios::binary);
179 in.read((char*) &offset, sizeof offset);
180 in.close();
181
182
183 for ( int pix = 0 ; pix < 1440; pix++ ){
184 for (unsigned int sl=0; sl< 1024; sl++){
185 cout << offset[pix][sl] << endl;
186 }
187 }
188*/
189
190 TFile tf( RootFileName, "RECREATE");
191 hList.Write(); // write the major histograms into the top level directory
192 tf.Close(); // close the file
193 return( 0 );
194}
195
Note: See TracBrowser for help on using the repository browser.