14 #define TRG_SHORT_NAMES
15 #define TRGCDC_SHORT_NAMES
18 #include "trg/trg/Utilities.h"
19 #include "trg/trg/Debug.h"
20 #include "trg/cdc/Wire.h"
21 #include "trg/cdc/WireHit.h"
22 #include "trg/cdc/Segment.h"
23 #include "trg/cdc/SegmentHit.h"
24 #include "trg/cdc/LUT.h"
26 #include <framework/datastore/StoreArray.h>
27 #include <cdc/dataobjects/CDCHit.h>
28 #include <trg/cdc/dataobjects/CDCTriggerSegmentHit.h>
29 #include <mdst/dataobjects/MCParticle.h>
33 #define P3D HepGeom::Point3D<double>
41 TRGCDCSegment::TRGCDCSegment(
unsigned id,
45 const std::string& TSLUTFile,
46 const std::vector<const TCWire*>& cells)
51 w.backwardPosition()),
54 _signal(std::string(
"TS_") + TRGUtil::itostring(id), clock),
56 m_TSLUTFileName(TSLUTFile)
73 const string& pre)
const
76 if ((msg.find(
"geometry") != string::npos) ||
77 (msg.find(
"detail") != string::npos)) {
78 cout << pre <<
"id " <<
id();
85 if ((msg.find(
"hit") != string::npos) ||
86 (msg.find(
"detail") != string::npos)) {
87 cout << pre <<
"Wires ";
88 for (
unsigned i = 0; i <
_wires.size(); i++) {
95 if (
_hits.size() == 0) {
96 cout << pre <<
"no wire hit" << endl;
98 cout << pre <<
"WHit dump : ";
99 for (
unsigned i = 0; i <
_hits.size(); i++) {
100 cout <<
_hits[i]->cell().name();
101 if (i <
_hits.size() - 1)
106 for (
unsigned i = 0; i <
_hits.size(); i++) {
107 _hits[i]->dump(msg, pre +
" ");
111 cout << pre <<
"SHit dump" << endl;
114 cout << pre <<
"no TSHit" << endl;
123 if ((msg.find(
"trigger") != string::npos) ||
124 (msg.find(
"detail") != string::npos)) {
128 cout << pre <<
"no trigger signal" << endl;
149 string n0 = string(
"TS") + TRGUtil::itostring(
layerId());
150 string n1 = TRGUtil::itostring(
localId());
155 TCSegment::simulate(
bool clockSimulation,
bool logicLUTFlag,
156 string cdcCollectionName,
string tsCollectionName)
160 for (
unsigned i = 0, n = _wires.size(); i < n; i++) {
161 if (_wires[i]->signal().active())
169 if (clockSimulation) {
170 simulateWithClock(cdcCollectionName, tsCollectionName);
172 simulateWithoutClock(logicLUTFlag);
177 TCSegment::simulateWithoutClock(
bool logicLUTFlag)
182 const unsigned n = _wires.size();
184 vector<TRGSignal> signals;
185 for (
unsigned i = 0; i < n; i++) {
188 const TCWHit* h = _wires[i]->hit();
193 const TRGSignal& s = _wires[i]->signal();
194 signals.push_back(s);
197 const unsigned width = signals.back().clock().unit(1000);
198 signals.back().widen(width);
204 if (logicLUTFlag == 0) {
214 TRGSignal l0, l1, l2, l3, l4;
215 TRGSignal wo1, wo2, wo3, wo4;
220 l0 = signals[0] | signals[1] | signals[2];
221 l1 = signals[3] | signals[4];
223 l3 = signals[6] | signals[7];
224 l4 = signals[8] | signals[9] | signals[10];
234 all = l2 & (wo1 | wo2 | wo3 | wo4);
236 }
else if (n == 15) {
240 l1 = signals[1] | signals[2];
241 l2 = signals[3] | signals[4] | signals[5];
242 l3 = signals[6] | signals[7] | signals[8] | signals[9];
243 l4 = signals[10] | signals[11] | signals[12] | signals[13] | signals[14];
248 all = l0 & (wo1 | wo2 | wo3 | wo4);
264 if (logicLUTFlag == 1) {
267 vector<TRGSignal> hitSignals;
268 for (
unsigned iWire = 0; iWire < signals.size(); iWire++) {
269 if (signals[iWire].active()) hitSignals.push_back(signals[iWire]);
272 TRGSignal allSignals;
273 if (hitSignals.size() != 0) {
274 allSignals = hitSignals[0];
275 for (
unsigned iHitWire = 1; iHitWire < hitSignals.size(); iHitWire++) {
276 allSignals = allSignals & hitSignals[iHitWire];
280 int lutValue = LUT()->getValue(lutPattern());
281 if ((lutValue != 0) && (priority().signal().active() != 0)) {
282 allSignals.name(name());
283 _signal = allSignals;
292 TCSegment::simulateWithClock(
string cdcCollectionName,
string tsCollectionName)
295 if (m_TSLUT->getValue(lutPattern()) == 0)
return;
299 StoreArray<CDCHit> cdcHits(cdcCollectionName);
300 StoreArray<CDCTriggerSegmentHit> segmentHits(tsCollectionName);
303 const TRGClock& wireClock = _wires[0]->signal().clock();
306 for (
unsigned i = 0, n = _wires.size(); i < n; ++i) {
307 const TRGSignal& s = _wires[i]->signal();
309 int clk0 = s[0]->time();
310 int clk1 = s[s.nEdges() - 2]->time();
311 if (clk0 < clkMin) clkMin = clk0;
312 if (clk1 > clkMax) clkMax = clk1;
317 const int step = wireClock.frequency() / signal().clock().frequency();
318 const int width = 16 * step;
319 clkMin -= clkMin % step;
320 clkMax -= clkMax % step;
321 int lastLutValue = 0;
322 int lastPriority = 0;
324 for (
int iclk = clkMin; iclk <= clkMax; iclk += step) {
326 unsigned pattern = lutPattern(iclk - width, iclk + step);
327 int lutValue = m_TSLUT->getValue(pattern);
329 int priorityPos = priorityPosition(iclk - width, iclk + step);
330 int fastest = fastestTime(iclk - width);
333 if ((lastLutValue == 3 && lutValue != 3) ||
334 (lastPriority != 3 && priorityPos == 3) ||
335 fastest != lastFastest) {
337 TRGTime rise = TRGTime(wireClock.absoluteTime(iclk),
true, _signal.clock());
339 fall.shift(1).reverse();
340 _signal |= TRGSignal(rise & fall);
342 int ipr = (priorityPos == 3) ? 0 : priorityPos;
343 const TRGCDCWire* priorityWire = (_wires.size() == 15) ? _wires[ipr] : _wires[ipr + 5];
345 int tdc = priorityWire->signal()[0]->time();
346 if (tdc < iclk - width) {
347 for (
unsigned itdc = 2, edges = priorityWire->signal().nEdges(); itdc < edges; itdc += 2) {
348 tdc = priorityWire->signal()[itdc]->time();
349 if (tdc >= iclk - width)
break;
353 const CDCHit* priorityHit = cdcHits[priorityWire->hit()->iCDCHit()];
354 const CDCTriggerSegmentHit* storeHit =
355 segmentHits.appendNew(*priorityHit,
362 addStoreHit(storeHit);
364 for (
unsigned iw = 0; iw < _wires.size(); ++iw) {
365 if (_wires[iw]->signal().active(iclk - width, iclk + step)) {
367 double weight = (_wires[iw] == priorityWire) ? 2. : 1.;
368 storeHit->addRelationTo(cdcHits[_wires[iw]->hit()->iCDCHit()], weight);
372 RelationVector<MCParticle> mcrel = priorityHit->getRelationsFrom<MCParticle>();
373 for (
unsigned imc = 0; imc < mcrel.size(); ++imc) {
377 lastLutValue = lutValue;
378 lastPriority = priorityPos;
379 lastFastest = fastest;
388 TCSegment::fastestTime()
const
390 if ((LUT()->getValue(lutPattern()))) {
391 float tmpFastTime = 9999;
392 for (
unsigned i = 0; i < _wires.size(); i++) {
393 if (_wires[i]->signal().active()) {
394 float dt = _wires[i]->signal()[0]->time();
395 if (dt < tmpFastTime) {
406 TCSegment::fastestTime(
int clk0)
const
409 for (
unsigned iw = 0; iw < _wires.size(); ++iw) {
410 if (_wires[iw]->signal().active()) {
411 for (
unsigned itdc = 0, edges = _wires[iw]->signal().nEdges(); itdc < edges; itdc += 2) {
412 float dt = _wires[iw]->signal()[itdc]->time();
414 if (dt < fastest) fastest = dt;
424 TCSegment::foundTime()
const
426 if ((LUT()->getValue(lutPattern()))) {
427 float tmpFoundTime[5] = {9999, 9999, 9999, 9999, 9999};
428 for (
unsigned i = 0; i < _wires.size(); i++) {
429 if (!_wires[i]->signal().active())
continue;
430 float dt = _wires[i]->signal()[0]->time();
431 if (_wires.size() == 11) {
433 if (tmpFoundTime[0] > dt) tmpFoundTime[0] = dt;
435 if (tmpFoundTime[1] > dt) tmpFoundTime[1] = dt;
437 if (tmpFoundTime[2] > dt) tmpFoundTime[2] = dt;
439 if (tmpFoundTime[3] > dt) tmpFoundTime[3] = dt;
441 if (tmpFoundTime[4] > dt) tmpFoundTime[4] = dt;
445 if (tmpFoundTime[0] > dt) tmpFoundTime[0] = dt;
447 if (tmpFoundTime[1] > dt) tmpFoundTime[1] = dt;
449 if (tmpFoundTime[2] > dt) tmpFoundTime[2] = dt;
451 if (tmpFoundTime[3] > dt) tmpFoundTime[3] = dt;
453 if (tmpFoundTime[4] > dt) tmpFoundTime[4] = dt;
457 sort(tmpFoundTime, tmpFoundTime + 5);
458 return tmpFoundTime[3];
464 TCSegment::priorityTime()
const
466 const TRGSignal& prioritySignal = priority().signal();
467 if (prioritySignal.active()) {
468 return prioritySignal[0]->time();
474 TCSegment::priorityPosition()
const
476 if (center().signal().active()) {
479 const TRGCDCWire* priorityL;
480 const TRGCDCWire* priorityR;
481 if (_wires.size() == 15) {
482 priorityL = _wires[2];
483 priorityR = _wires[1];
485 priorityL = _wires[7];
486 priorityR = _wires[6];
488 if (priorityL->signal().active()) {
489 if (priorityR->signal().active()) {
490 if ((priorityL->signal()[0]->time()) >= (priorityR->signal()[0]->time()))
return 1;
493 }
else if (priorityR->signal().active()) {
500 TCSegment::priorityPosition(
int clk0,
int clk1)
const
502 if (center().signal().active(clk0, clk1)) {
505 const TRGCDCWire* priorityL;
506 const TRGCDCWire* priorityR;
507 if (_wires.size() == 15) {
508 priorityL = _wires[2];
509 priorityR = _wires[1];
511 priorityL = _wires[7];
512 priorityR = _wires[6];
514 if (priorityL->signal().active(clk0, clk1)) {
515 if (priorityR->signal().active(clk0, clk1)) {
516 if ((priorityL->signal()[0]->time()) >= (priorityR->signal()[0]->time()))
return 1;
519 }
else if (priorityR->signal().active(clk0, clk1)) {
526 TCSegment::priority()
const
528 int priority = priorityPosition();
529 int offset = (_wires.size() == 15) ? 0 : 5;
530 if (priority == 1 || priority == 2)
531 return *_wires[offset + priority];
532 return *_wires[offset];
539 for (
unsigned i = 0; i <
_wires.size(); i++) {
551 for (
unsigned i = 0; i <
_wires.size(); i++) {
553 if (s.active(clk0, clk1))
572 unsigned outValue = (
hitPattern(clk0, clk1)) * 2;
582 const unsigned n =
_wires.size();
583 for (
unsigned i = 0; i < n; i++) {