source: trunk/Mars/fact/processing/ontime.C@ 18105

Last change on this file since 18105 was 17386, checked in by tbretz, 11 years ago
Removed svn:executable property, these are no executables.
File size: 5.0 KB
Line 
1void ontime(const char *fname, double beg=0, double end=100000)
2{
3 //open the file
4 fits file(fname);
5
6 //file.PrintColumns();
7 //file.PrintKeys();
8
9 //allocate variables to read data into
10 Double_t time;
11 Float_t OnTime, ElTime, TriggerRate;
12 file.SetPtrAddress("Time", &time);
13 file.SetPtrAddress("OnTime", &OnTime);
14 file.SetPtrAddress("ElapsedTime", &ElTime);
15 file.SetPtrAddress("TriggerRate", &TriggerRate);
16
17 //some file MJDREF offset fun. Before a given day, the MJDREF was not subtracted correctly.
18 //Also, see the logbook for more details (there are also some broken files)
19 UInt_t offset = file.GetUInt("MJDREF");
20 if (beg < 30000)
21 beg+=offset;
22 if (end < 30000)
23 end+=offset;
24
25 //variables to calculate stuff with
26 double SumOnTime = 0.; //Sum up the OnTime_i for later effective on calculation
27 double SumElTime = 0.; //sum up ElTime_i for later effective on calculation
28
29 double SumOnEl = 0.; //Sum of the OnTime_i / ElapsedTime_i
30 double SumOnEl2 = 0.; //Sum of the (OnTime_i / ElapsedTime_i)^2,
31 //both values needed for variance of the effective on timeseries
32
33 double EffectiveOn = 0.; //this will be the one effective on value
34 double EffectiveOnRMS = 0.; //this will be variance(effective on)
35 int counter = 0; //cnt the number of non zero ElTime datapoints
36
37 double TriggerTimeOver100 = 0.; //this will be the time in sec the Trigger
38 double TriggerTimeOver125 = 0.; //is above 100Hz,125Hz,...
39 double TriggerTimeOver150 = 0.;
40 double TriggerTimeOver175 = 0.;
41
42 double SumRate = 0.; //for calculating the sqrt(var) of the trigger rate
43 double SumRate2 = 0.; //same
44 double TriggerRateRms = 0.;
45 int ratecounter = 0;
46
47 //loop over all rows in slow-file
48 while (file.GetNextRow())
49 {
50 //add the offset, as the data is saved with the offset subtracted
51 time += offset;
52
53 //if the end of the run is reached, break
54 if (time>end)
55 break;
56
57 //if the data is before the beginning of the run, continue
58 if (time<beg)
59 {
60 continue;
61 }
62
63 //sum the data for the mean effective on
64 SumOnTime += OnTime;
65 SumElTime += ElTime;
66
67 //sum the data for the variance of the effective on timeseries, check for zero elapsed time
68 if (ElTime>0){
69 SumOnEl += OnTime/ElTime;
70 SumOnEl2 += OnTime/ElTime*OnTime/ElTime;
71 counter++;
72 //cout << "OnTime:" << OnTime << " # ElTime:" << ElTime << " # OnTime/ElTime:" << OnTime/ElTime << " # (OnTime/ElTime)^2:" << OnTime/ElTime*OnTime/ElTime << " # Counter:" << counter << endl;
73 }
74
75 //to calculate the sqrt(var) of the rate
76 SumRate +=TriggerRate;
77 SumRate2 +=TriggerRate*TriggerRate;
78 ratecounter +=1;
79
80 //sum the time the triggerate is over 100Hz, 125Hz,...
81 if (TriggerRate>100.){
82 TriggerTimeOver100 += ElTime;
83
84 if (TriggerRate>125.){
85 TriggerTimeOver125 += ElTime;
86
87 if (TriggerRate>1500.){
88 TriggerTimeOver150 += ElTime;
89
90 if (TriggerRate>175.){
91 TriggerTimeOver175 += ElTime;
92
93 }
94 }
95 }
96 }
97
98 }
99
100 //cout << "SumOnEl2:" << SumOnEl2 << " # SumOnEl:" << SumOnEl << " # (SumOnEl2/counter-(SumOnEl/counter*SumOnEl/counter)): " << (SumOnEl2/counter-(SumOnEl/counter*SumOnEl/counter)) << endl;
101
102 //calculate the return values, watch out for traps when doing math operations!
103 EffectiveOn = SumElTime>0 ? SumOnTime/SumElTime : 0.;
104 EffectiveOnRMS = counter>0 ? (SumOnEl2/counter-
105 (SumOnEl/counter*SumOnEl/counter)) : 0.;
106 EffectiveOnRMS = EffectiveOnRMS>0 ? sqrt(EffectiveOnRMS) : 0;
107 TriggerRateRms = ratecounter>0? (SumRate2/ratecounter-
108 (SumRate/ratecounter*SumRate/ratecounter)) : 0.;
109 TriggerRateRms = TriggerRateRms>0 ? sqrt(TriggerRateRms) : 0;
110
111 //check for crap data, which happenes sometimes...
112 if (EffectiveOn>1.) EffectiveOn = 1.;
113 if (EffectiveOnRMS>0.5) EffectiveOnRMS = 0.5;
114 if (TriggerRateRms>1000) TriggerRateRms = 0.;
115
116 //return fun. The style from daniela (grep the output) requires an non scientific notation,
117 //i.e. withour exponential+ therefore set the precision to ~double with fixed width after decimal point
118 cout << setiosflags(ios::fixed) << setprecision(12)
119 << "result "
120 << EffectiveOn << " "
121 << EffectiveOnRMS << " "
122 << SumOnTime << " "
123 << TriggerTimeOver100 << " "
124 << TriggerTimeOver125 << " "
125 << TriggerTimeOver150 << " "
126 << TriggerTimeOver175 << " "
127 << TriggerRateRms << " "
128 << endl;
129}
Note: See TracBrowser for help on using the repository browser.