22 return (locTOFSpacetimeHitMatch1.
delta_r < locTOFSpacetimeHitMatch2.
delta_r);
26 return locTOFPoint1->
t < locTOFPoint2->
t;
35 map<string, double> tofparms;
36 if( !loop->GetCalib(
"TOF/tof_parms", tofparms))
40 E_THRESHOLD = tofparms[
"TOF_E_THRESHOLD"];
41 ATTEN_LENGTH = tofparms[
"TOF_ATTEN_LENGTH"];
45 cout <<
"DTOFPoint_factory: Error loading values from TOF data base" <<endl;
51 if(eventLoop->GetCalib(
"TOF/propagation_speed", propagation_speed))
52 jout <<
"Error loading /TOF/propagation_speed !" << endl;
53 if(eventLoop->GetCalib(
"TOF/paddle_resolutions", paddle_resolutions))
54 jout <<
"Error loading /TOF/paddle_resolutions !" << endl;
56 loop->GetSingle(dTOFGeometry);
58 HALFPADDLE = dTOFGeometry->Get_HalfLongBarLength();
59 HALFPADDLE_ONESIDED = dTOFGeometry->Get_HalfShortBarLength();
60 double locBeamHoleWidth = dTOFGeometry->Get_LongBarLength() - 2.0*dTOFGeometry->Get_ShortBarLength();
61 ONESIDED_PADDLE_MIDPOINT_MAG = HALFPADDLE_ONESIDED + locBeamHoleWidth/2.0;
63 NUM_BARS = dTOFGeometry->Get_NBars();
65 dPositionMatchCut_DoubleEnded = 9.0;
67 dTimeMatchCut_PositionWellDefined = 10.0;
68 dTimeMatchCut_PositionNotWellDefined = 10.0;
76 if(dTOFSpacetimeHitPool_Available.empty())
79 dTOFSpacetimeHitPool_All.push_back(locTOFSpacetimeHit);
83 locTOFSpacetimeHit = dTOFSpacetimeHitPool_Available.back();
84 dTOFSpacetimeHitPool_Available.pop_back();
86 return locTOFSpacetimeHit;
95 if(dTOFSpacetimeHitPool_All.size() > MAX_TOFSpacetimeHitPoolSize)
97 for(
size_t loc_i = MAX_TOFSpacetimeHitPoolSize; loc_i < dTOFSpacetimeHitPool_All.size(); ++loc_i)
98 delete dTOFSpacetimeHitPool_All[loc_i];
99 dTOFSpacetimeHitPool_All.resize(MAX_TOFSpacetimeHitPoolSize);
101 dTOFSpacetimeHitPool_Available = dTOFSpacetimeHitPool_All;
103 vector<const DTOFPaddleHit*> locTOFHitVector;
104 loop->Get(locTOFHitVector);
107 deque<tof_spacetimehit_t*> locTOFSpacetimeHits_Horizontal, locTOFSpacetimeHits_Vertical;
108 set<tof_spacetimehit_t*> locUnusedTOFSpacetimeHits;
109 for(
size_t loc_i = 0; loc_i < locTOFHitVector.size(); ++loc_i)
112 if(!((locTOFHit->
E_north > E_THRESHOLD) || (locTOFHit->
E_south > E_THRESHOLD)))
118 locTOFSpacetimeHits_Horizontal.push_back(locSpacetimeHit);
119 locUnusedTOFSpacetimeHits.insert(locSpacetimeHit);
124 locTOFSpacetimeHits_Vertical.push_back(locSpacetimeHit);
125 locUnusedTOFSpacetimeHits.insert(locSpacetimeHit);
131 deque<tof_spacetimehitmatch_t> locTOFSpacetimeHitMatches;
132 for(
size_t loc_i = 0; loc_i < locTOFSpacetimeHits_Horizontal.size(); ++loc_i)
134 tof_spacetimehit_t* locTOFSpacetimeHit_Horizontal = locTOFSpacetimeHits_Horizontal[loc_i];
135 for(
size_t loc_j = 0; loc_j < locTOFSpacetimeHits_Vertical.size(); ++loc_j)
137 tof_spacetimehit_t* locTOFSpacetimeHit_Vertical = locTOFSpacetimeHits_Vertical[loc_j];
140 if(!Match_Hits(locTOFSpacetimeHit_Horizontal, locTOFSpacetimeHit_Vertical, locTOFSpacetimeHitMatch))
143 locTOFSpacetimeHitMatches.push_back(locTOFSpacetimeHitMatch);
150 for(
size_t loc_i = 0; loc_i < locTOFSpacetimeHitMatches.size(); ++loc_i)
152 tof_spacetimehit_t* locTOFSpacetimeHit_Horizontal = locTOFSpacetimeHitMatches[loc_i].dTOFSpacetimeHit_Horizontal;
153 if(locUnusedTOFSpacetimeHits.find(locTOFSpacetimeHit_Horizontal) == locUnusedTOFSpacetimeHits.end())
156 tof_spacetimehit_t* locTOFSpacetimeHit_Vertical = locTOFSpacetimeHitMatches[loc_i].dTOFSpacetimeHit_Vertical;
157 if(locUnusedTOFSpacetimeHits.find(locTOFSpacetimeHit_Vertical) == locUnusedTOFSpacetimeHits.end())
160 Create_MatchedTOFPoint(locTOFSpacetimeHit_Horizontal, locTOFSpacetimeHit_Vertical);
163 locUnusedTOFSpacetimeHits.erase(locTOFSpacetimeHit_Horizontal);
164 locUnusedTOFSpacetimeHits.erase(locTOFSpacetimeHit_Vertical);
168 set<tof_spacetimehit_t*>::iterator locSetIterator = locUnusedTOFSpacetimeHits.begin();
169 for(; locSetIterator != locUnusedTOFSpacetimeHits.end(); ++locSetIterator)
170 Create_UnMatchedTOFPoint(*locSetIterator);
183 locTOFSpacetimeHit->
TOFHit = locTOFHit;
185 int bar = locTOFHit->
bar;
186 int id = NUM_BARS + locTOFHit->
bar - 1;
187 double v = propagation_speed[id];
189 if((locTOFHit->
bar < dTOFGeometry->Get_FirstShortBar()) || (locTOFHit->
bar > dTOFGeometry->Get_LastShortBar()))
193 locTOFSpacetimeHit->
y = dTOFGeometry->bar2y(bar);
198 locTOFSpacetimeHit->
x = 0.0;
199 if(locTOFHit->
E_north > E_THRESHOLD)
200 locTOFSpacetimeHit->
t = locTOFHit->
t_north - HALFPADDLE/v;
202 locTOFSpacetimeHit->
t = locTOFHit->
t_south - HALFPADDLE/v;
204 locTOFSpacetimeHit->
pos_cut = 1000.0;
205 locTOFSpacetimeHit->
t_cut = dTimeMatchCut_PositionNotWellDefined;
210 locTOFSpacetimeHit->
x = locTOFHit->
pos;
211 locTOFSpacetimeHit->
t = locTOFHit->
meantime;
212 locTOFSpacetimeHit->
pos_cut = dPositionMatchCut_DoubleEnded;
213 locTOFSpacetimeHit->
t_cut = dTimeMatchCut_PositionWellDefined;
217 return locTOFSpacetimeHit;
223 locTOFSpacetimeHit->
pos_cut = 1000.0;
224 locTOFSpacetimeHit->
t_cut = dTimeMatchCut_PositionNotWellDefined;
229 locTOFSpacetimeHit->
y = dTOFGeometry->bar2y(bar,1);
230 locTOFSpacetimeHit->
x = -1.0*ONESIDED_PADDLE_MIDPOINT_MAG;
231 locTOFSpacetimeHit->
t = locTOFHit->
t_south - HALFPADDLE_ONESIDED/v;
236 locTOFSpacetimeHit->
y = dTOFGeometry->bar2y(bar,0);
237 locTOFSpacetimeHit->
x = ONESIDED_PADDLE_MIDPOINT_MAG;
238 locTOFSpacetimeHit->
t = locTOFHit->
t_north - HALFPADDLE_ONESIDED/v;
242 return locTOFSpacetimeHit;
248 locTOFSpacetimeHit->
TOFHit = locTOFHit;
250 int bar = locTOFHit->
bar;
251 int id = locTOFHit->
bar - 1;
252 double v = propagation_speed[id];
254 if((locTOFHit->
bar < dTOFGeometry->Get_FirstShortBar()) || (locTOFHit->
bar > dTOFGeometry->Get_LastShortBar()))
259 locTOFSpacetimeHit->
x = dTOFGeometry->bar2y(bar);
264 locTOFSpacetimeHit->
y = 0.0;
265 if(locTOFHit->
E_north > E_THRESHOLD)
266 locTOFSpacetimeHit->
t = locTOFHit->
t_north - HALFPADDLE/v;
268 locTOFSpacetimeHit->
t = locTOFHit->
t_south - HALFPADDLE/v;
269 locTOFSpacetimeHit->
pos_cut = 1000.0;
270 locTOFSpacetimeHit->
t_cut = dTimeMatchCut_PositionNotWellDefined;
275 locTOFSpacetimeHit->
y = locTOFHit->
pos;
276 locTOFSpacetimeHit->
t = locTOFHit->
meantime;
277 locTOFSpacetimeHit->
pos_cut = dPositionMatchCut_DoubleEnded;
278 locTOFSpacetimeHit->
t_cut = dTimeMatchCut_PositionWellDefined;
282 return locTOFSpacetimeHit;
288 locTOFSpacetimeHit->
pos_cut = 1000.0;
289 locTOFSpacetimeHit->
t_cut = dTimeMatchCut_PositionNotWellDefined;
293 locTOFSpacetimeHit->
x = dTOFGeometry->bar2y(bar,0);
294 locTOFSpacetimeHit->
y = -1.0*ONESIDED_PADDLE_MIDPOINT_MAG;
295 locTOFSpacetimeHit->
t = locTOFHit->
t_south - HALFPADDLE_ONESIDED/v;
300 locTOFSpacetimeHit->
x = dTOFGeometry->bar2y(bar,1);
301 locTOFSpacetimeHit->
y = ONESIDED_PADDLE_MIDPOINT_MAG;
302 locTOFSpacetimeHit->
t = locTOFHit->
t_north - HALFPADDLE_ONESIDED/v;
306 return locTOFSpacetimeHit;
322 if(locTOFSpacetimeHit_Vertical->
TOFHit->
bar < dTOFGeometry->Get_FirstShortBar())
328 if(locTOFSpacetimeHit_Vertical->
TOFHit->
bar > dTOFGeometry->Get_LastShortBar())
338 if(locTOFSpacetimeHit_Horizontal->
TOFHit->
bar < dTOFGeometry->Get_FirstShortBar())
344 if(locTOFSpacetimeHit_Horizontal->
TOFHit->
bar > dTOFGeometry->Get_LastShortBar())
356 float locDeltaX = locTOFSpacetimeHit_Horizontal->
x - locTOFSpacetimeHit_Vertical->
x;
357 if(fabs(locDeltaX) > locTOFSpacetimeHit_Horizontal->
pos_cut)
360 float locDeltaY = locTOFSpacetimeHit_Horizontal->
y - locTOFSpacetimeHit_Vertical->
y;
361 if(fabs(locDeltaY) > locTOFSpacetimeHit_Vertical->
pos_cut)
364 float locDeltaT = locTOFSpacetimeHit_Horizontal->
t - locTOFSpacetimeHit_Vertical->
t;
365 float locTimeCut = (locTOFSpacetimeHit_Horizontal->
t_cut > locTOFSpacetimeHit_Vertical->
t_cut) ? locTOFSpacetimeHit_Horizontal->
t_cut : locTOFSpacetimeHit_Vertical->
t_cut;
366 if(fabs(locDeltaT) > locTimeCut)
369 locTOFSpacetimeHitMatch.
delta_t = locDeltaT;
370 locTOFSpacetimeHitMatch.
delta_r =
sqrt(locDeltaX*locDeltaX + locDeltaY*locDeltaY);
383 int id_vert = locTOFHit_Vertical->
bar - 1;
384 int id_horiz = NUM_BARS + locTOFHit_Horizontal->
bar - 1;
385 double locVMatchTErr = paddle_resolutions[id_vert];
386 double locHMatchTErr = paddle_resolutions[id_horiz];
387 double locMatchTErr = 0.;
390 float locMatchX, locMatchY, locMatchZ, locMatchdE, locMatchT;
395 locMatchX = locTOFSpacetimeHit_Horizontal->
x;
396 locMatchY = locTOFSpacetimeHit_Vertical->
y;
397 locMatchZ = dTOFGeometry->Get_CenterMidPlane();
398 locMatchT = 0.5*(locTOFSpacetimeHit_Horizontal->
t + locTOFSpacetimeHit_Vertical->
t);
399 locMatchdE = 0.5*(locTOFHit_Horizontal->
dE + locTOFHit_Vertical->
dE);
400 locMatchTErr = 0.5 *
sqrt(locVMatchTErr*locVMatchTErr + locHMatchTErr*locHMatchTErr);
405 locMatchX = locTOFSpacetimeHit_Horizontal->
x;
406 locMatchY = locTOFSpacetimeHit_Horizontal->
y;
407 locMatchT = locTOFSpacetimeHit_Horizontal->
t;
408 locMatchZ = dTOFGeometry->Get_CenterHorizPlane();
409 locMatchdE = locTOFHit_Horizontal->
dE;
410 locMatchTErr = locHMatchTErr;
415 locMatchX = locTOFSpacetimeHit_Vertical->
x;
416 locMatchY = locTOFSpacetimeHit_Vertical->
y;
417 locMatchT = locTOFSpacetimeHit_Vertical->
t;
418 locMatchZ = dTOFGeometry->Get_CenterVertPlane();
419 locMatchdE = locTOFHit_Vertical->
dE;
420 locMatchTErr = locVMatchTErr;
424 locTOFPoint->AddAssociatedObject(locTOFHit_Horizontal);
425 locTOFPoint->AddAssociatedObject(locTOFHit_Vertical);
426 locTOFPoint->
pos.SetXYZ(locMatchX, locMatchY, locMatchZ);
427 locTOFPoint->
t = locMatchT;
428 locTOFPoint->
tErr = locMatchTErr;
429 locTOFPoint->
dE = locMatchdE;
438 _data.push_back(locTOFPoint);
444 bool locIsHorizontalBarFlag = (locPaddleHit->
orientation == 1);
445 float locPointZ = locIsHorizontalBarFlag ? dTOFGeometry->Get_CenterHorizPlane() : dTOFGeometry->Get_CenterVertPlane();
447 int id_vert = locPaddleHit->
bar - 1;
448 int id_horiz = NUM_BARS + locPaddleHit->
bar - 1;
449 double locVTErr = paddle_resolutions[id_vert];
450 double locHTErr = paddle_resolutions[id_horiz];
452 double locTErr = locIsHorizontalBarFlag ? locHTErr : locVTErr;
458 locTOFPoint->AddAssociatedObject(locPaddleHit);
460 locTOFPoint->
pos.SetXYZ(locTOFSpacetimeHit->
x, locTOFSpacetimeHit->
y, locPointZ);
461 locTOFPoint->
t = locTOFSpacetimeHit->
t;
462 locTOFPoint->
tErr = locTErr;
463 locTOFPoint->
dE = locPaddleHit->
dE;
466 locTOFPoint->
dVerticalBar = locIsHorizontalBarFlag ? 0 : locPaddleHit->
bar;
472 _data.push_back(locTOFPoint);
481 locTOFPoint->AddAssociatedObject(locPaddleHit);
483 float locPointX = locTOFSpacetimeHit->
x;
484 float locPointY = locTOFSpacetimeHit->
y;
485 locTOFPoint->
pos.SetXYZ(locPointX, locPointY, locPointZ);
486 locTOFPoint->
t = locTOFSpacetimeHit->
t;
487 locTOFPoint->
tErr = locTErr;
489 bool locNorthAboveThresholdFlag = (locPaddleHit->
E_north > E_THRESHOLD);
492 locTOFPoint->
dVerticalBar = locIsHorizontalBarFlag ? 0 : locPaddleHit->
bar;
494 int locBarStatus = locNorthAboveThresholdFlag ? 1 : 2;
499 double locDeltaXToMidPoint = locTOFSpacetimeHit->
dIsDoubleEndedBar ? HALFPADDLE : HALFPADDLE_ONESIDED;
500 float locEnergy = locNorthAboveThresholdFlag ? locPaddleHit->
E_north : locPaddleHit->
E_south;
501 locEnergy *= exp(locDeltaXToMidPoint/ATTEN_LENGTH);
502 locTOFPoint->
dE = locEnergy;
504 _data.push_back(locTOFPoint);
510 for(
size_t loc_i = 0; loc_i < dTOFSpacetimeHitPool_All.size(); ++loc_i)
511 delete dTOFSpacetimeHitPool_All[loc_i];
void Create_MatchedTOFPoint(const tof_spacetimehit_t *locTOFSpacetimeHit_Horizontal, const tof_spacetimehit_t *locTOFSpacetimeHit_Vertical)
tof_spacetimehit_t * dTOFSpacetimeHit_Horizontal
bool dPositionWellDefinedFlag
bool dBothPositionsWellDefinedFlag
tof_spacetimehit_t * dTOFSpacetimeHit_Vertical
bool Match_Hits(tof_spacetimehit_t *locTOFSpacetimeHit_Horizontal, tof_spacetimehit_t *locTOFSpacetimeHit_Vertical, tof_spacetimehitmatch_t &locTOFSpacetimeHitMatch)
jerror_t evnt(JEventLoop *loop, uint64_t eventnumber)
tof_spacetimehit_t * Build_TOFSpacetimeHit_Horizontal(const DTOFPaddleHit *locTOFHit)
tof_spacetimehit_t * Get_TOFSpacetimeHitResource(void)
const DTOFPaddleHit * TOFHit
bool dIsSingleEndedNorthPaddle
tof_spacetimehit_t * Build_TOFSpacetimeHit_Vertical(const DTOFPaddleHit *locTOFHit)
bool Compare_TOFSpacetimeHitMatches_Distance(const DTOFPoint_factory::tof_spacetimehitmatch_t &locTOFSpacetimeHitMatch1, const DTOFPoint_factory::tof_spacetimehitmatch_t &locTOFSpacetimeHitMatch2)
jerror_t brun(JEventLoop *loop, int32_t runnumber)
void Create_UnMatchedTOFPoint(const tof_spacetimehit_t *locTOFSpacetimeHit)
bool Compare_TOFPoint_Time(const DTOFPoint *locTOFPoint1, const DTOFPoint *locTOFPoint2)