| 1 | /*
|
|---|
| 2 | GetDrsOffset.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 |
|
|---|
| 50 | int NEvents;
|
|---|
| 51 | vector<int16_t> AllPixelDataVector;
|
|---|
| 52 | vector<int16_t> StartCellVector;
|
|---|
| 53 | unsigned int CurrentEventID;
|
|---|
| 54 | size_t PXLxROI;
|
|---|
| 55 | UInt_t RegionOfInterest;
|
|---|
| 56 | UInt_t NumberOfPixels;
|
|---|
| 57 |
|
|---|
| 58 | TH2F * hOffset;
|
|---|
| 59 | TH2F * hOffsetRMS;
|
|---|
| 60 | double mean[1440][1024]={{0}};
|
|---|
| 61 | int n[1440][1024]={{0}};
|
|---|
| 62 | double rms[1440][1024]={{0}};
|
|---|
| 63 | TObjArray hList;
|
|---|
| 64 |
|
|---|
| 65 |
|
|---|
| 66 | int 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 | {
|
|---|
| 75 | gStyle->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 |
|
|---|