Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DRFTime_factory_TOF.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DRFTime_factory_TOF.cc
4 // Created: Mon Mar 30 10:51:29 EDT 2015
5 // Creator: pmatt (on Linux pmattdesktop.jlab.org 2.6.32-504.12.2.el6.x86_64 x86_64)
6 //
7 
8 #include "DRFTime_factory_TOF.h"
9 
10 //------------------
11 // init
12 //------------------
14 {
16  dTimeOffset = 0.0;
17  dTimeOffsetVariance = 0.0;
18  dTimeResolutionSq = 0.0;
19  return NOERROR;
20 }
21 
22 //------------------
23 // brun
24 //------------------
25 jerror_t DRFTime_factory_TOF::brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
26 {
27  //RF Period
28  vector<double> locBeamPeriodVector;
29  locEventLoop->GetCalib("PHOTON_BEAM/RF/beam_period", locBeamPeriodVector);
30  dBeamBunchPeriod = locBeamPeriodVector[0];
31 
32  //Time Offsets
33  map<string, double> locCCDBMap;
34  map<string, double>::iterator locIterator;
35  if(locEventLoop->GetCalib("/PHOTON_BEAM/RF/time_offset", locCCDBMap))
36  jout << "Error loading /PHOTON_BEAM/RF/time_offset !" << endl;
37  for(locIterator = locCCDBMap.begin(); locIterator != locCCDBMap.end(); ++locIterator)
38  {
39  DetectorSystem_t locSystem = NameToSystem(locIterator->first.c_str());
40  if(locSystem != dSourceSystem)
41  continue;
42  dTimeOffset = locIterator->second;
43  break;
44  }
45 
46  //Time Offset Variances
47  if(locEventLoop->GetCalib("/PHOTON_BEAM/RF/time_offset_var", locCCDBMap))
48  jout << "Error loading /PHOTON_BEAM/RF/time_offset_var !" << endl;
49  for(locIterator = locCCDBMap.begin(); locIterator != locCCDBMap.end(); ++locIterator)
50  {
51  DetectorSystem_t locSystem = NameToSystem(locIterator->first.c_str());
52  if(locSystem != dSourceSystem)
53  continue;
54  dTimeOffsetVariance = locIterator->second;
55  break;
56  }
57 
58  //Time Resolution Squared
59  if(locEventLoop->GetCalib("/PHOTON_BEAM/RF/time_resolution_sq", locCCDBMap))
60  jout << "Error loading /PHOTON_BEAM/RF/time_resolution_sq !" << endl;
61  for(locIterator = locCCDBMap.begin(); locIterator != locCCDBMap.end(); ++locIterator)
62  {
63  DetectorSystem_t locSystem = NameToSystem(locIterator->first.c_str());
64  if(locSystem != dSourceSystem)
65  continue;
66  dTimeResolutionSq = locIterator->second;
67  break;
68  }
69 
70  return NOERROR;
71 }
72 
73 //------------------
74 // evnt
75 //------------------
76 jerror_t DRFTime_factory_TOF::evnt(JEventLoop *locEventLoop, uint64_t eventnumber)
77 {
78  //The RF Time is defined at the center of the target
79  //The time offset needed to line it up to the center of the target is absorbed into the calibration constants.
80 
81  vector<const DRFTDCDigiTime*> locRFTDCDigiTimes;
82  locEventLoop->Get(locRFTDCDigiTimes);
83 
84  const DTTabUtilities* locTTabUtilities = NULL;
85  locEventLoop->GetSingle(locTTabUtilities);
86 
87  //Get RF Times
88  vector<double> locRFTimes;
89 
90  //F1TDC's
91  for(size_t loc_i = 0; loc_i < locRFTDCDigiTimes.size(); ++loc_i)
92  {
93  const DRFTDCDigiTime* locRFTDCDigiTime = locRFTDCDigiTimes[loc_i];
94  DetectorSystem_t locSystem = locRFTDCDigiTime->dSystem;
95  if(locSystem != dSourceSystem)
96  continue;
97  double locRFTime = Convert_TDCToTime(locRFTDCDigiTime, locTTabUtilities);
98  locRFTimes.push_back(locRFTime);
99  }
100 
101  if(locRFTimes.empty())
102  return NOERROR;
103 
104  //Calculate the average RF time
105  double locRFTimeVariance = 0.0;
106  double locAverageRFTime = Calc_WeightedAverageRFTime(locRFTimes, locRFTimeVariance);
107 
108  DRFTime* locRFTime = new DRFTime();
109  locRFTime->dTime = locAverageRFTime; //This time is defined at the center of the target (offsets with other detectors center it)
110  locRFTime->dTimeVariance = locRFTimeVariance;
111  _data.push_back(locRFTime);
112 
113  return NOERROR;
114 }
115 
116 double DRFTime_factory_TOF::Step_TimeToNearInputTime(double locTimeToStep, double locTimeToStepTo) const
117 {
118  return Step_TimeToNearInputTime(locTimeToStep, locTimeToStepTo, dBeamBunchPeriod);
119 }
120 
121 double DRFTime_factory_TOF::Step_TimeToNearInputTime(double locTimeToStep, double locTimeToStepTo, double locPeriod) const
122 {
123  double locDeltaT = locTimeToStepTo - locTimeToStep;
124  int locNumBucketsToShift = (locDeltaT > 0.0) ? int(locDeltaT/locPeriod + 0.5) : int(locDeltaT/locPeriod - 0.5);
125  return (locTimeToStep + locPeriod*double(locNumBucketsToShift));
126 }
127 
128 double DRFTime_factory_TOF::Convert_TDCToTime(const DRFTDCDigiTime* locRFTDCDigiTime, const DTTabUtilities* locTTabUtilities) const
129 {
130  double locRFTime = 0.0;
131  if(locRFTDCDigiTime->dIsCAENTDCFlag)
132  locRFTime = locTTabUtilities->Convert_DigiTimeToNs_CAEN1290TDC(locRFTDCDigiTime);
133  else
134  locRFTime = locTTabUtilities->Convert_DigiTimeToNs_F1TDC(locRFTDCDigiTime);
135 
136  locRFTime -= dTimeOffset;
137  return locRFTime;
138 }
139 
140 double DRFTime_factory_TOF::Calc_WeightedAverageRFTime(vector<double>& locRFTimes, double& locRFTimeVariance) const
141 {
142  //returns the average (and the variance by reference)
143 
144  //will line up the first time near zero, then line up subsequent times to the first time
145  //cannot line up all times to zero: if first time is near +/- beam_period/2 (e.g. +/- 2.004 ns),
146  //may end up with some times near 2.004 and some near -2.004!
147 
148  double locFirstTime = locRFTimes[0];
149  locFirstTime = Step_TimeToNearInputTime(locFirstTime, 0.0);
150 
151  //take weighted average of times
152  //avg = Sum(w_i * x_i) / Sum (w_i)
153  //w_i = 1/varx_i
154  //avg = Sum(x_i / varx_i) / Sum (1 / varx_i)
155  //var_avg = 1 / Sum (1 / varx_i)
156  //avg = Sum(x_i / varx_i) * var_avg
157 
158  double locSumOneOverTimeVariance = 0.0;
159  double locSumTimeOverTimeVariance = 0.0;
160 
161  double locSingleTimeVariance = dTimeResolutionSq + dTimeOffsetVariance;
162  if(!(locSingleTimeVariance > 0.0))
163  {
164  locRFTimeVariance = numeric_limits<double>::quiet_NaN();
165  return locFirstTime;
166  }
167  locSumOneOverTimeVariance += double(locRFTimes.size()) / locSingleTimeVariance;
168 
169  for(size_t loc_i = 0; loc_i < locRFTimes.size(); ++loc_i)
170  {
171  double locShiftedRFTime = Step_TimeToNearInputTime(locRFTimes[loc_i], locFirstTime);
172  locSumTimeOverTimeVariance += locShiftedRFTime / locSingleTimeVariance;
173  }
174 
175  if(!(locSumOneOverTimeVariance > 0.0))
176  {
177  locRFTimeVariance = numeric_limits<double>::quiet_NaN();
178  return locFirstTime;
179  }
180 
181  locRFTimeVariance = 1.0 / locSumOneOverTimeVariance;
182  double locAverageRFTime = locSumTimeOverTimeVariance * locRFTimeVariance;
183  return locAverageRFTime;
184 }
185 
186 //------------------
187 // erun
188 //------------------
190 {
191  return NOERROR;
192 }
193 
194 //------------------
195 // fini
196 //------------------
198 {
199  return NOERROR;
200 }
double Convert_DigiTimeToNs_F1TDC(const JObject *locTDCDigiHit) const
jerror_t fini(void)
Called after last event of last event source has been processed.
DetectorSystem_t dSourceSystem
double Convert_TDCToTime(const DRFTDCDigiTime *locRFTDCDigiTime, const DTTabUtilities *locTTabUtilities) const
double Step_TimeToNearInputTime(double locTimeToStep, double locTimeToStepTo) const
double dTimeVariance
Definition: DRFTime.h:25
double dTime
Definition: DRFTime.h:24
double Convert_DigiTimeToNs_CAEN1290TDC(const JObject *locTDCDigiHit) const
DetectorSystem_t
Definition: GlueX.h:15
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
double Calc_WeightedAverageRFTime(vector< double > &locRFTimes, double &locRFTimeVariance) const
Definition: GlueX.h:20
DetectorSystem_t NameToSystem(const char *locSystemName)
Definition: GlueX.h:105
DetectorSystem_t dSystem
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
jerror_t init(void)
Called once at program start.
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.