1 | // The FACT collaboration
|
---|
2 | // Dominik Neise and Sebastian Mueller October 2014
|
---|
3 | // A callisto like CERN-Root script to process the FACT DRS
|
---|
4 | // (Domino-Ring-Sampler) time calibration files.
|
---|
5 | //
|
---|
6 | // The basic script is taken from the October 2014 analysis framework running on
|
---|
7 | // La Palma, maintained by Daniela Dorner and Thomas Bretz. There it was called
|
---|
8 | // "callisto_drs_time.C"
|
---|
9 |
|
---|
10 | // Dominik and Sebastian:
|
---|
11 | // Our first approach was to use the MWriteFitsFile class but we have not been
|
---|
12 | // able to use it.
|
---|
13 |
|
---|
14 | // MWriteFitsFile fitsfile(outfile,
|
---|
15 | // MWriteFitsFile::kSingleFile,
|
---|
16 | // "RECREATE",
|
---|
17 | // "fitsfile",
|
---|
18 | // "atitle");
|
---|
19 | // fitsfile.SetBytesPerSample("Data", 2);
|
---|
20 | // fitsfile.AddContainer("MDrsCalibrationTime","DANDELION");
|
---|
21 |
|
---|
22 | #include "MLogManip.h"
|
---|
23 |
|
---|
24 | int produce_drs_time_fits_file(
|
---|
25 | const char *drs_time_file, //* path to raw drs-time-calib-file
|
---|
26 | const char *drs_file, //* path to drs.fits(.gz) file
|
---|
27 | const char *outfile //* output path like yyyymmdd_rrr.drs.time.fits
|
---|
28 | ){
|
---|
29 | gLog.Separator("produce_drs_time_fits_file");
|
---|
30 | gLog << all;
|
---|
31 | gLog << "DRS Timing " << drs_time_file << '\n';
|
---|
32 | gLog << "DRS 1024 " << drs_file << '\n';
|
---|
33 | gLog << endl;
|
---|
34 |
|
---|
35 | MParList plist0;
|
---|
36 |
|
---|
37 | MTaskList tlist0;
|
---|
38 | plist0.AddToList(&tlist0);
|
---|
39 |
|
---|
40 | MDrsCalibration drscalib1024;
|
---|
41 | if (!drscalib1024.ReadFits(drs_file)){
|
---|
42 | gLog << "Error while opening drs amplitude calibration file:"
|
---|
43 | << drs_file << "Aborting" << endl;
|
---|
44 | return 52; // DN: Why 52 I don't know.
|
---|
45 | }
|
---|
46 | plist0.AddToList(&drscalib1024);
|
---|
47 |
|
---|
48 | MDrsCalibrationTime timecam;
|
---|
49 | plist0.AddToList(&timecam);
|
---|
50 |
|
---|
51 | MEvtLoop loop0("DetermineTimeCal");
|
---|
52 | loop0.SetParList(&plist0);
|
---|
53 |
|
---|
54 | factfits drstimeRawFile(drs_time_file);
|
---|
55 | const int NumberOfChips = drstimeRawFile.GetInt("NPIX")/9; // --> 160
|
---|
56 | const int NumberOfCells = drstimeRawFile.GetInt("NROI"); // --> 1024
|
---|
57 | drstimeRawFile.close();
|
---|
58 |
|
---|
59 | MRawFitsRead read0(drs_time_file);
|
---|
60 | tlist0.AddToList(&read0);
|
---|
61 | MGeomApply apply0;
|
---|
62 | tlist0.AddToList(&apply0);
|
---|
63 | MDrsCalibApply drsapply0;
|
---|
64 | tlist0.AddToList(&drsapply0);
|
---|
65 | MContinue cont0("MRawEvtHeader.GetTriggerID!=33792", "SelectTim");
|
---|
66 | tlist0.AddToList(&cont0);
|
---|
67 | MFillH fill0("MHDrsCalibrationTime");
|
---|
68 | fill0.SetNameTab("DeltaT");
|
---|
69 | tlist0.AddToList(&fill0);
|
---|
70 |
|
---|
71 | if (!loop0.Eventloop(0)){
|
---|
72 | gLog << "Error performing the loop over the drs-time-run:"
|
---|
73 | << drs_time_file << "Aborting" << endl;
|
---|
74 | return 8; // DN: why 8 I don't know.
|
---|
75 | }
|
---|
76 |
|
---|
77 | ofits drstimeFile(outfile);
|
---|
78 | drstimeFile.SetDefaultKeys();
|
---|
79 | drstimeFile.AddColumnDouble(
|
---|
80 | NumberOfChips*NumberOfCells,
|
---|
81 | "SamplingTimeDeviation", "nominal slices",
|
---|
82 | "see following COMMENT."
|
---|
83 | );
|
---|
84 | drstimeFile.SetInt("NCHIPS", NumberOfChips, "number of drs chips");
|
---|
85 | drstimeFile.SetInt("NCELLS", NumberOfCells, "number of cells of each chip");
|
---|
86 | drstimeFile.AddComment(
|
---|
87 | "The SamplingTimeDeviation specifies the deviation of the actual ");
|
---|
88 | drstimeFile.AddComment(
|
---|
89 | "sampling time of a certain cell, from its nominal sampling time.");
|
---|
90 | drstimeFile.AddComment(
|
---|
91 | "It is measured in nominal slices.");
|
---|
92 | drstimeFile.AddComment(
|
---|
93 | "In order to convert the sample index into the actual sampling time");
|
---|
94 | drstimeFile.AddComment(
|
---|
95 | "just do: ");
|
---|
96 | drstimeFile.AddComment(
|
---|
97 | " cell_index + td(cell_index) - td(stop_cell_index)");
|
---|
98 | drstimeFile.AddComment(
|
---|
99 | "where td(i) refers to the SamplingTimeDeviation of cell i of the ");
|
---|
100 | drstimeFile.AddComment(
|
---|
101 | "current DRS4 chip.");
|
---|
102 | drstimeFile.AddComment(
|
---|
103 | "This gives you the actual sampling time of the cell measured in ");
|
---|
104 | drstimeFile.AddComment(
|
---|
105 | "nominal slices [nsl] with respect to the stop cells sampling time.");
|
---|
106 | drstimeFile.AddComment(
|
---|
107 | "Convert it to ns, simply by multiplication ");
|
---|
108 | drstimeFile.AddComment(
|
---|
109 | "with 0.5 ns/nsl.");
|
---|
110 | drstimeFile.AddComment(
|
---|
111 | "");
|
---|
112 |
|
---|
113 | drstimeFile.AddComment(
|
---|
114 | "In FACT it became common practice to measure un-time-calibrated ");
|
---|
115 | drstimeFile.AddComment(
|
---|
116 | " DRS4 data in 'time slices' or simply 'samples', while ");
|
---|
117 | drstimeFile.AddComment(
|
---|
118 | " time-calibrated DRS4 data usually measured in ns. Since the method,");
|
---|
119 | drstimeFile.AddComment(
|
---|
120 | " that is emplyed to measure the DRS4 time calibration constants has ");
|
---|
121 | drstimeFile.AddComment(
|
---|
122 | " no possibility to assert the actual length of a slice is really half");
|
---|
123 | drstimeFile.AddComment(
|
---|
124 | " a nanosecond, this practice is not advisable.");
|
---|
125 | drstimeFile.AddComment(
|
---|
126 | " I propose instead to call un-time-calibrated data 'samples',");
|
---|
127 | drstimeFile.AddComment(
|
---|
128 | " since this is what they are. If one wants to stress the fact,");
|
---|
129 | drstimeFile.AddComment(
|
---|
130 | " that no drs time calibration has been applied one should refer to ");
|
---|
131 | drstimeFile.AddComment(
|
---|
132 | "'uncalibrated slices'. Since it *should* be common practice to apply");
|
---|
133 | drstimeFile.AddComment(
|
---|
134 | " the drs4 time calibration in all cases, I also propose to use the");
|
---|
135 | drstimeFile.AddComment(
|
---|
136 | " short term of 'slices' or 'sl'. If one wants to stress, that the");
|
---|
137 | drstimeFile.AddComment(
|
---|
138 | " drs4 time calibration has actually been applied to the data,");
|
---|
139 | drstimeFile.AddComment(
|
---|
140 | " the term 'calibrated slices' or 'nominal slices' or short 'nsl'.");
|
---|
141 |
|
---|
142 | drstimeFile.WriteTableHeader("DRS_CELL_TIMES");
|
---|
143 |
|
---|
144 | // By drs_sampling_time_deviations we refer to the deviations (measured in nominal slices) of
|
---|
145 | // the actual sampling time compared to the nominal sampling time of every cell of every chip.
|
---|
146 | double *drs_sampling_time_deviations = new double[ NumberOfChips * NumberOfCells ];
|
---|
147 | for (int chip = 0; chip < NumberOfChips; chip++){
|
---|
148 | for (int cell = 0; cell < NumberOfCells; cell++){
|
---|
149 | // Dominik and Sebastian:
|
---|
150 | // We ended with using DrsCalibrateTime.Sum() in order to retrieve
|
---|
151 | // the contents DrsCalibrateTime.fStat.
|
---|
152 | // First we wanted to access the member fStat of class DrsCalibrateTime
|
---|
153 | // which is declared public but it did not work out of the box.
|
---|
154 | // drs_sampling_time_deviations[chip*NumberOfCells+cell] =
|
---|
155 | // timecam.fStat[chip*NumberOfCells+cell].first;
|
---|
156 | drs_sampling_time_deviations[ chip * NumberOfCells + cell ] =
|
---|
157 | timecam.Sum( chip * NumberOfCells + cell );
|
---|
158 | }
|
---|
159 | }
|
---|
160 |
|
---|
161 | drstimeFile.WriteRow(drs_sampling_time_deviations, sizeof(double) * NumberOfChips * NumberOfCells);
|
---|
162 | drstimeFile.close();
|
---|
163 |
|
---|
164 | return 0;
|
---|
165 | }
|
---|