#include <MuonDriftCalScheme.h>
Inheritance diagram for MuonDriftCalScheme:

Public Member Functions | |
| MuonDriftCalScheme () | |
| virtual void | DoReset (const VldContext &context) |
| virtual void | ConfigModified () |
| virtual void | PrintConfig (std::ostream &os) const |
| virtual FloatErr | GetDriftCorrected (FloatErr rawcharge, const PlexStripEndId &seid) const |
| virtual FloatErr | DecalDrift (FloatErr undrifted, const PlexStripEndId &seid) const |
Private Member Functions | |
| ClassDef (MuonDriftCalScheme, 0) | |
Private Attributes | |
| VldTimeStamp | fReferenceTime |
| Int_t | fTask |
| DbiResultPtr< CalDrift > | fRefTable |
| DbiResultPtr< CalDrift > | fCurTable |
| FloatErr | fCurDrift |
| Int_t | fCurError |
|
|
Definition at line 77 of file MuonDriftCalScheme.cxx. References MSG, and Registry::Set(). 00078 {
00079 MSG("Calib",Msg::kVerbose)
00080 << "MuonDriftCalScheme::MuonDriftCalScheme"
00081 << endl;
00082
00083 Registry r;
00084 //task default is still 0, meaning pre Dogwood database
00085 //from Dogwood1 on the task number needs to be set to 1
00086 r.Set("Task",0);
00087 r.Set("ReferenceDate",20051201);
00088 r.Set("ReferenceTime",000010);
00089
00090 InitializeConfig(r);
00091 }
|
|
||||||||||||
|
|
|
|
Reimplemented from CalScheme. Definition at line 94 of file MuonDriftCalScheme.cxx. References fReferenceTime, fTask, Registry::Get(), CfgPromptConfigurable::GetConfig(), CalScheme::GetContext(), MSG, and CalScheme::Reset(). 00095 {
00096 int refdate;
00097 int reftime;
00098
00099 bool ok = true;
00100 ok = ok && GetConfig().Get("ReferenceDate",refdate);
00101 ok = ok && GetConfig().Get("ReferenceTime",reftime);
00102 ok = ok && GetConfig().Get("Task",fTask);
00103 if(!ok) MSG("Calib",Msg::kWarning) << "MuonDriftCalibrator "
00104 << " Problem when configuring. " <<endl;
00105
00106 // Interpret date.
00107 fReferenceTime = VldTimeStamp(refdate,reftime,0);
00108
00109 // Ensure the DB has been fixed up.
00110 Reset(GetContext(),true);
00111 }
|
|
||||||||||||
|
Purpose: Apply drift In: drift-corrected ADCs strip end Out: drifted adcs Reimplemented from CalScheme. Definition at line 317 of file MuonDriftCalScheme.cxx. References FloatErr, and CalScheme::IncrementErrors(). 00319 {
00328
00329 if(fCurError) {
00330 IncrementErrors(kDriftCalibrator,kMissingRow);
00331 }
00332 return undrifted*fCurDrift;
00333 }
|
|
|
New context. For this module, this function actually does all the work. That's because we have only 1 calibration constant for the whole detector at one time, so we can pre-compute everything now. Reimplemented from CalScheme. Definition at line 113 of file MuonDriftCalScheme.cxx. References ValueErr< T >::AsString(), VldTimeStamp::AsString(), VldContext::AsString(), fCurDrift, fCurError, fCurTable, FloatErr, Form(), fRefTable, fTask, VldContext::GetDetector(), CalDrift::GetMedianAsR1_18_2(), CalDrift::GetMedianErrAsR1_18_2(), DbiResultPtr< T >::GetNumRows(), CalDrift::GetRecoVersion(), DbiResultPtr< T >::GetRow(), VldContext::GetSimFlag(), VldRange::GetTimeEnd(), VldContext::GetTimeStamp(), VldRange::GetTimeStart(), DbiResultPtr< T >::GetValidityRec(), DbiValidityRec::GetVldRange(), CalScheme::IncrementErrors(), MAXMSG, MSG, DbiResultPtr< T >::NewQuery(), ValueErr< T >::Set(), and ValueErr< T >::SetError(). 00114 {
00115
00122
00123 fCurError = 0;
00124 fCurDrift.Set(1.0 ,0.5); // Default: No drift, 50% error.
00125 string refRecoVersion = "";
00126 string recoVersion = "";
00127
00129 // Build context for reference point.
00130 VldContext refContext(vc.GetDetector(),
00131 vc.GetSimFlag(),
00132 fReferenceTime);
00133
00135 // Get the reference point data.
00136 fRefTable.NewQuery(refContext,fTask);
00137
00138 // The reference value:
00139 FloatErr reference(1,0);
00140
00141 // Maybe we don't have any data there....
00142 if(fRefTable.GetNumRows() == 0) {
00143 IncrementErrors(kDriftCalibrator,kMissingTable);
00144 MAXMSG("Calib",Msg::kError,10)
00145 << "No rows in CALDRIFT reference table task=" << fTask
00146 << " cx=" << refContext.AsString() << std::endl;
00147 MAXMSG("Calib",Msg::kError,10)
00148 << "Your database is bad or MuonDriftCalScheme is misconfigured!" << endl;
00149 // Flag it.
00150 fCurError=1;
00151 refRecoVersion = "Null";
00152 assert(fRefTable.GetNumRows() && "No Table row for reference date");
00153 } else {
00154 const CalDrift* refRow = fRefTable.GetRow(0); // We know at least one row exists.
00155 reference = refRow->GetMedianAsR1_18_2(vc.GetDetector());
00156 reference.SetError(0); // The error on the reference point is not relevant.
00157 refRecoVersion = refRow->GetRecoVersion();
00158 }
00159
00160 // The current value:
00161 FloatErr current(1,0);
00162
00163 fCurTable.NewQuery(vc,fTask);
00164
00165 if(fCurTable.GetNumRows() == 0) {
00166 IncrementErrors(kDriftCalibrator,kMissingTable);
00167
00168 MAXMSG("Calib",Msg::kError,10)
00169 << "No rows in CALDRIFT table task=" << fTask
00170 << " cx=" << vc.AsString()
00171 // << " cx=" << refContext.AsString()
00172 << ". Trying extrapolation." << std::endl;
00173 // Ok, now we have work to do.
00174
00175 VldTimeStamp prevTime;
00176 const CalDrift* prevRow =0;
00177 VldTimeStamp nextTime;
00178 const CalDrift* nextRow =0;
00179
00180 // Attempt to find the previous valid data.
00181 const char* sqlprev = Form("(TIMEEND<='%s') "
00182 "and (TASK=%d) "
00183 "and (DETECTORMASK & %d) "
00184 "and (SIMMASK & %d) "
00185 "order by TIMEEND desc limit 1",
00186 vc.GetTimeStamp().AsString("s"),
00187 fTask,
00188 vc.GetDetector(),
00189 vc.GetSimFlag() );
00190 //MSG("Calib",Msg::kDebug) << "PrevRequest: " << sqlprev << endl;
00191 DbiSqlContext prevContext(sqlprev);
00192 DbiResultPtr<CalDrift> prevTable("CALDRIFT",prevContext);
00193 if(prevTable.GetNumRows()>0) {
00194 prevRow = prevTable.GetRow(0);
00195 VldRange r = prevTable.GetValidityRec(prevRow)->GetVldRange();
00196 prevTime = r.GetTimeStart() + 0.5*(r.GetTimeEnd() - r.GetTimeStart());
00197 }
00198
00199 // Attempt to find the next valid data.
00200 const char* sqlnext = Form("(TIMESTART>='%s') "
00201 "and (TASK=%d) "
00202 "and (DETECTORMASK & %d) "
00203 "and (SIMMASK & %d) "
00204 "order by TIMESTART asc limit 1",
00205 vc.GetTimeStamp().AsString("s"),
00206 fTask,
00207 vc.GetDetector(),
00208 vc.GetSimFlag() );
00209 //MSG("Calib",Msg::kDebug) << "NextRequest: " << sqlnext << endl;
00210 DbiSqlContext nextContext(sqlnext);
00211 DbiResultPtr<CalDrift> nextTable("CALDRIFT",nextContext);
00212 if(nextTable.GetNumRows()>0) {
00213 nextRow = nextTable.GetRow(0);
00214 VldRange r = nextTable.GetValidityRec(nextRow)->GetVldRange();
00215 nextTime = r.GetTimeStart() + 0.5*(r.GetTimeEnd() - r.GetTimeStart());
00216 }
00217
00218 if((nextRow)&&(prevRow)) {
00219
00220 // Interpolate between these two straddling points.
00221 //MSG("Calib",Msg::kDebug) << "Interpolating. ";
00222 double dt = (nextTime-prevTime);
00223 Float_t y1a=prevRow->GetMedianAsR1_18_2(vc.GetDetector());
00224 Float_t y1b=prevRow->GetMedianErrAsR1_18_2(vc.GetDetector());
00225
00226 FloatErr y1(y1a, y1b);
00227 Float_t y2a=nextRow->GetMedianAsR1_18_2(vc.GetDetector());
00228 Float_t y2b=nextRow->GetMedianErrAsR1_18_2(vc.GetDetector());
00229
00230 FloatErr y2(y2a,y2b);
00231 FloatErr y = (y2-y1)*(vc.GetTimeStamp()-prevTime)/dt + y1;
00232 if(fCurError==0)
00233 fCurDrift = y/reference;
00234
00235 } else if (nextRow) {
00236
00237 // Extrapolate from the next point.
00238 //MSG("Calib",Msg::kDebug) << "Extrapolating next. ";
00239 Float_t ya=nextRow->GetMedianAsR1_18_2(vc.GetDetector());
00240 Float_t yb= nextRow->GetMedianErrAsR1_18_2(vc.GetDetector());
00241 FloatErr y(ya,yb);
00242
00243 // Degrade the error by 2% per month it's out of date.
00244 y *= FloatErr(1.0, 0.02 * fabs(nextTime-vc.GetTimeStamp())/
00245 (30*Munits::day));
00246 if(fCurError==0)
00247 fCurDrift = y/reference;
00248
00249 } else if (prevRow) {
00250
00251 // Extrapolate from the previous point.
00252 MSG("Calib",Msg::kDebug) << "Extrapolating prev. ";
00253 Float_t ya=prevRow->GetMedianAsR1_18_2(vc.GetDetector());
00254 Float_t yb=prevRow->GetMedianErrAsR1_18_2(vc.GetDetector());
00255
00256 FloatErr y(ya,yb);
00257 // Degrade the error by 2% per day it's out of date.
00258 y *= FloatErr(1.0, 0.02 * fabs(prevTime-vc.GetTimeStamp())/
00259 (30*Munits::day));
00260 if(fCurError==0)
00261 fCurDrift = y/reference;
00262
00263 } else {
00264 // No data at all!
00265 fCurError = 1;
00266 MAXMSG("Calib",Msg::kError,10)
00267 << "No rows in CALDRIFT task=" << fTask
00268 << "for ANY time! Badness." << std::endl;
00269 }
00270 } else {
00271 // We have current data, so all the above is unneccessary.
00272 MSG("Calib",Msg::kDebug) << "Have data. ";
00273 const CalDrift* nowRow = fCurTable.GetRow(0);
00274 Float_t ya=nowRow->GetMedianAsR1_18_2(vc.GetDetector());
00275 Float_t yb=nowRow->GetMedianErrAsR1_18_2(vc.GetDetector());
00276 current.Set(ya,yb);
00277
00278 if(fCurError == 0)
00279 fCurDrift = current/reference;
00280 }
00281 MSG("Calib",Msg::kDebug) << "Drift constant = " << fCurDrift.AsString()
00282 << " for time " << vc.AsString() << std::endl;
00283
00284
00285 }
|
|
||||||||||||
|
Purpose: Apply drift correction In: linearised adc strip end Out: drift-corrected adcs Reimplemented from CalScheme. Definition at line 298 of file MuonDriftCalScheme.cxx. References FloatErr, and CalScheme::IncrementErrors(). 00300 {
00309
00310 if(fCurError) {
00311 IncrementErrors(kDriftCalibrator,kMissingRow);
00312 }
00313 return rawcharge/fCurDrift;
00314 }
|
|
|
Prints out the current configuration status Should be overridden by implimentation. Reimplemented from CalScheme. Definition at line 289 of file MuonDriftCalScheme.cxx. References VldTimeStamp::AsString(), fReferenceTime, and fTask. 00290 {
00291 os << " Muon Drift Scheme: " << endl;
00292 os << " ReferenceTime: " << fReferenceTime.AsString() << endl;
00293 os << " Task: " << fTask << endl;
00294 }
|
|
|
Definition at line 53 of file MuonDriftCalScheme.h. Referenced by DoReset(). |
|
|
Definition at line 54 of file MuonDriftCalScheme.h. Referenced by DoReset(). |
|
|
Definition at line 52 of file MuonDriftCalScheme.h. Referenced by DoReset(). |
|
|
Definition at line 47 of file MuonDriftCalScheme.h. Referenced by ConfigModified(), and PrintConfig(). |
|
|
Definition at line 51 of file MuonDriftCalScheme.h. Referenced by DoReset(). |
|
|
Definition at line 48 of file MuonDriftCalScheme.h. Referenced by ConfigModified(), DoReset(), and PrintConfig(). |
1.3.9.1