13 #define TRG_SHORT_NAMES
14 #define TRGCDC_SHORT_NAMES
18 #include "trg/trg/Debug.h"
19 #include "trg/trg/State.h"
20 #include "trg/trg/Channel.h"
21 #include "trg/trg/Utilities.h"
22 #include "trg/cdc/TRGCDC.h"
23 #include "trg/cdc/Cell.h"
24 #include "trg/cdc/Wire.h"
25 #include "trg/cdc/WireHit.h"
26 #include "trg/cdc/Segment.h"
27 #include "trg/cdc/SegmentHit.h"
28 #include "trg/cdc/TrackSegmentFinder.h"
29 #include "framework/datastore/StoreArray.h"
30 #include "framework/datastore/RelationArray.h"
31 #include "cdc/dataobjects/CDCSimHit.h"
32 #include "mdst/dataobjects/MCParticle.h"
33 #include "trg/cdc/FrontEnd.h"
34 #include "trg/cdc/Merger.h"
48 TRGCDCTrackSegmentFinder::TRGCDCTrackSegmentFinder(
const TRGCDC&
TRGCDC,
52 TRGBoard(
"",
TRGClock(
"", 0, 0),
TRGClock(
"", 0, 0),
TRGClock(
"", 0, 0),
55 m_logicLUTFlag(logicLUTFlag),
56 m_makeRootFile(makeRootFile),
57 _type(), _tosbE(), _tosbT()
68 TDirectory* currentDir = gDirectory;
70 m_fileTSF =
new TFile(
"TSF.root",
"RECREATE");
89 const std::string& name,
95 const std::vector<TCSegment*>& tsSL)
96 :
TRGBoard(name, systemClock, dataClock, userClockInput, userClockOutput),
136 const bool trackSegmentClockSimulation,
137 std::vector<TRGCDCSegmentHit*>& segmentHits,
138 std::vector<TRGCDCSegmentHit*>* segmentHitsSL)
146 const unsigned n = tss.size();
147 for (
unsigned i = 0; i < n; i++) {
148 TCSegment& s = * tss[i];
151 if (s.signal().active()) {
152 TCSHit* th =
new TCSHit(s);
154 segmentHits.push_back(th);
155 segmentHitsSL[s.layerId()].push_back(th);
167 string dumpOption =
"trigger";
169 dumpOption =
"detail";
172 if (s.signal().active())
178 dumpOption =
"detail";
179 for (
unsigned i = 0; i < segmentHits.size(); i++) {
180 const TCSHit& s = * segmentHits[i];
186 dumpOption =
"detail";
188 for (
unsigned i = 0; i < segmentHitsSL[j].size(); i++) {
189 const vector<TCSHit*>& s = segmentHitsSL[j];
190 for (
unsigned k = 0; k < s.size(); k++)
200 vector <TRGSignalVector*>
206 tsid) +
" in " + name();
207 TCSegment* tsi = _tsSL[tsid];
208 vector <TRGSignalVector*> result;
211 vector<bool> fTimeVect;
215 vector <bool> tmpOutBool;
220 eachInput->
clock(), 0);
223 for (
unsigned i = 0; i < 12; i++) {
224 Hitmap->push_back((*eachInput)[i]);
225 (*Hitmap)[i].widen(16);
227 for (
unsigned i = 0; i < 4; i++) {
228 pTime.push_back((*eachInput)[i + 12]);
229 fTime.push_back((*eachInput)[i + 16]);
231 for (
unsigned i = 0; i < 5; i++) {
232 pTime.push_back((*eachInput)[i + 20]);
233 fTime.push_back((*eachInput)[i + 20]);
238 int* LUTValue =
new int[changeTime.size()];
239 if (changeTime.size()) {
245 fTime.state(changeTime[0]).copy2bool(fTimeBool);
247 fTimeVect.insert(fTimeVect.begin(), fTimeBool, fTimeBool + 10);
250 for (
unsigned i = 0; i < changeTime.size(); i++) {
251 LUTValue[i] = tsi->LUT()->getValue(mkint(Hitmap->
state(changeTime[i])));
254 if ((LUTValue[i]) && (eOUT)) {
255 resultE->
set(fTimeVect, changeTime[i]);
259 bool priority1rise = (*Hitmap)[6].riseEdge(changeTime[i]);
260 bool priority2rise = ((*Hitmap)[7].riseEdge(changeTime[i]) |
261 (*Hitmap)[8].riseEdge(changeTime[i]));
267 tmpPTime = mkint(pTime.state(changeTime[i]));
268 tmpCTime = changeTime[i];
269 }
else if (priority2rise) {
271 tmpPTime = mkint(pTime.state(changeTime[i]));
272 tmpCTime = changeTime[i];
273 if ((*Hitmap)[0].state(changeTime[i])) hitPosition = 2;
274 else hitPosition = 1;
279 if ((hitPosition) && (LUTValue[i]) && ((changeTime[i] - tmpCTime) < 16)) {
280 tmpOutInt = tsid * pow(2, 13) + tmpPTime * pow(2, 4) + LUTValue[i] * pow(2,
282 tmpOutBool = mkbool(tmpOutInt, 22);
283 if (hitPosition == 3) {
284 if (priority1rise) resultT->
set(tmpOutBool, changeTime[i]);
286 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
287 if (!((LUTValue[i - 1] == 1) |
288 (LUTValue[i - 1] == 2)))
289 resultT->
set(tmpOutBool, changeTime[i]);
291 if (!(LUTValue[i - 1])) resultT->
set(tmpOutBool, changeTime[i]);
295 if (priority2rise) resultT->
set(tmpOutBool, changeTime[i]);
297 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
298 if (!((LUTValue[i - 1] == 1) |
299 (LUTValue[i - 1] == 2)))
300 resultT->
set(tmpOutBool, changeTime[i]);
302 if (!(LUTValue[i])) resultT->
set(tmpOutBool, changeTime[i]);
311 result.push_back(resultT);
312 result.push_back(resultE);
321 TSFinder::packerOuterTracker(vector<TRGSignalVector*>& hitList,
323 const unsigned maxHit)
325 TRGSignalVector* result =
326 new TRGSignalVector(
"", (* hitList[0]).clock() , 21 * maxHit);
328 for (
unsigned ci = 0; ci < cList.size(); ci++) {
330 for (
unsigned hi = 0; hi < hitList.size(); hi++) {
331 TRGState s = (* hitList[hi]).state(cList[ci]);
333 if (cntHit >= maxHit)
continue;
334 for (
unsigned j = 0; j < 21; j++) {
335 if ((* hitList[hi])[j].state(cList[ci])) {
336 (* result)[21 * (maxHit - 1) - (cntHit * 21) + j]
337 .set(cList[ci], cList[ci] + 1);
341 TRGState t = hitList[hi]->state(cList[ci]).subset(13, 9);
343 << unsigned(t) <<
"(" << t <<
")" << endl;
356 TSFinder::packerOuterEvt(vector<TRGSignalVector*> hitList, vector<int> cList,
361 TRGSignalVector* result =
new TRGSignalVector(
"", (*hitList[0]).clock() ,
362 hitList.size() + 9 * maxHit);
364 for (
unsigned ci = 0; ci < cList.size(); ci++) {
366 for (
unsigned hi = 0; hi < hitList.size(); hi++) {
367 if ((*hitList[hi]).state(cList[ci]).active()) {
368 (*result)[9 * maxHit + hi].set(cList[ci], cList[ci] + 1);
369 if (cntHit >= maxHit)
continue;
370 for (
unsigned j = 0; j < (((*hitList[hi])).size() - 1); j++) {
371 if ((*hitList[hi])[j].state(cList[ci]))
372 (*result)[9 * (maxHit - 1) - (cntHit * 9) + j].set(cList[ci], cList[ci] + 1);
382 TSFinder::mkint(TRGState bitInput)
385 bool* binput =
new bool[bitInput.size()];
386 bitInput.copy2bool(binput);
387 for (
unsigned i = 0; i < bitInput.size(); i++) {
396 TSFinder::mkbool(
int N,
int bitSize)
398 vector<bool> boutput;
399 boutput.resize(bitSize);
401 for (
unsigned i = 0; tmpint; i++) {
402 if (tmpint % 2) boutput[i] =
true;
403 else boutput[i] =
false;
417 hitPatternInformation.Clear();
432 const unsigned nTSs = tss.size();
433 unsigned nHitTSs = 0;
434 for (
unsigned iTS = 0; iTS < nTSs; iTS++) {
435 const TCSegment& ts = * tss[iTS];
440 if (ts.wires().size() == 15) {
441 priority = ts.wires()[0];
442 secondPriorityR = ts.wires()[1];
443 secondPriorityL = ts.wires()[2];
445 priority = ts.wires()[5];
446 secondPriorityR = ts.wires()[6];
447 secondPriorityL = ts.wires()[7];
450 vector<int> priorityLRs(3);
451 vector<float> priorityPhis(3);
454 if (priority->
hit() != 0) {
456 priorityLRs[0] = SimHits[iSimHit]->getPosFlag();
457 posOnTrack = SimHits[iSimHit]->getPosTrack();
458 posOnWire = SimHits[iSimHit]->getPosWire();
459 priorityPhis[0] = (posOnTrack - posOnWire).Phi() +
m_Trg_PI / 2 -
468 priorityPhis[0] = 9999;
470 if (secondPriorityR->
hit() != 0) {
472 priorityLRs[1] = SimHits[iSimHit]->getPosFlag();
473 posOnTrack = SimHits[iSimHit]->getPosTrack();
474 posOnWire = SimHits[iSimHit]->getPosWire();
475 priorityPhis[1] = (posOnTrack - posOnWire).Phi() +
m_Trg_PI / 2 -
479 priorityPhis[1] = 9999;
481 if (secondPriorityL->
hit() != 0) {
483 priorityLRs[2] = SimHits[iSimHit]->getPosFlag();
484 posOnTrack = SimHits[iSimHit]->getPosTrack();
485 posOnWire = SimHits[iSimHit]->getPosWire();
486 priorityPhis[2] = (posOnTrack - posOnWire).Phi() +
m_Trg_PI / 2 -
490 priorityPhis[2] = 9999;
493 const unsigned nWires = ts.wires().size();
494 unsigned nHitWires = 0;
496 map<int, unsigned> particleTSPattern;
498 for (
unsigned iWire = 0; iWire < nWires; iWire++) {
500 const TRGSignal& wireSignal = ts.wires()[iWire]->signal();
501 if (wireSignal.
active()) ++nHitWires;
506 int iMCParticle = (particle) ? particle->getArrayIndex() : mcParticles.
getEntries();
508 if (particleTSPattern[iMCParticle] == 0) {
509 particleTSPattern[iMCParticle] = 1 << iWire;
511 particleTSPattern[iMCParticle] |= 1 << iWire;
522 if (nHitWires != 0) {
524 if (particleTSPattern.size() == 1) {
525 map<int, unsigned>::const_iterator it = particleTSPattern.begin();
526 bitset<15> printPattern((*it).second);
530 TVectorD tsPatternInformation(9);
531 tsPatternInformation[0] = (*it).first;
532 tsPatternInformation[1] = ts.superLayerId();
533 tsPatternInformation[2] = double((*it).second);
534 tsPatternInformation[3] = priorityLRs[0];
535 tsPatternInformation[4] = priorityPhis[0];
536 tsPatternInformation[5] = priorityLRs[1];
537 tsPatternInformation[6] = priorityPhis[1];
538 tsPatternInformation[7] = priorityLRs[2];
539 tsPatternInformation[8] = priorityPhis[2];
540 new(hitPatternInformation[nHitTSs++]) TVectorD(tsPatternInformation);
557 particleEfficiency.Clear();
558 tsInformation.Clear();
560 int mcInformation = 1;
575 map<int, int> simHitsMCParticlesMap;
577 for (
int iPart = 0; iPart < cdcSimHitRel.
getEntries(); iPart++) {
579 for (
unsigned iHit = 0; iHit < cdcSimHitRel[iPart].getToIndices().size();
582 simHitsMCParticlesMap[cdcSimHitRel[iPart].getToIndex(iHit)] =
583 cdcSimHitRel[iPart].getFromIndex();
593 map<int, unsigned> particleNHitTS;
595 for (
int iSuperLayer = 0; iSuperLayer < 9; iSuperLayer++) {
597 for (
unsigned iTS = 0; iTS < segmentHitsSL[iSuperLayer].size(); iTS++) {
598 const TCSegment& ts = segmentHitsSL[iSuperLayer][iTS]->segment();
599 unsigned nWires = ts.wires().size();
600 for (
unsigned iWire = 0; iWire < nWires; iWire++) {
603 int iMCParticle = simHitsMCParticlesMap[wireHit->
iCDCSimHit()];
604 if (particleNHitTS[iMCParticle] == 0) {
606 hitTSSL = 1 << iSuperLayer;
607 particleNHitTS[iMCParticle] = hitTSSL;
609 particleNHitTS[iMCParticle] |= 1 << iSuperLayer;
624 vector<vector<float>> tsEfficiency;
626 for (
int iPart = 0; iPart < cdcSimHitRel.
getEntries(); iPart++) {
627 int lastWireHit = -1;
629 for (
unsigned iHit = 0; iHit < cdcSimHitRel[iPart].getToIndices().size();
631 int iSimHit = cdcSimHitRel[iPart].getToIndex(iHit);
632 if (SimHits[iSimHit]->getWireID().getICLayer() > lastWireHit) lastWireHit =
633 SimHits[iSimHit]->getWireID().getICLayer();
640 if (lastWireHit >= 53) lastSLHit = 9;
641 else if (lastWireHit >= 47) lastSLHit = 8;
642 else if (lastWireHit >= 41) lastSLHit = 7;
643 else if (lastWireHit >= 35) lastSLHit = 6;
644 else if (lastWireHit >= 29) lastSLHit = 5;
645 else if (lastWireHit >= 23) lastSLHit = 4;
646 else if (lastWireHit >= 17) lastSLHit = 3;
647 else if (lastWireHit >= 11) lastSLHit = 2;
648 else if (lastWireHit >= 5) lastSLHit = 1;
650 int iMCParticle = cdcSimHitRel[iPart].getFromIndex();
651 bitset<9> hitSuperLayers(particleNHitTS[iMCParticle]);
652 int numberHitSuperLayers = hitSuperLayers.count();
654 float mcPt = mcParticles[iMCParticle]->getMomentum().Perp();
656 if (lastSLHit == 0) efficiency = -1;
657 else efficiency = float(numberHitSuperLayers) / lastSLHit;
659 vector<float> tempEfficiency;
660 tempEfficiency.resize(3);
661 tempEfficiency[0] = efficiency;
662 tempEfficiency[1] = mcPt;
663 tempEfficiency[2] = lastSLHit;
664 tsEfficiency.push_back(tempEfficiency);
672 for (
unsigned iEfficiency = 0; iEfficiency < tsEfficiency.size();
674 TVectorD t_particleEfficiency(3);
675 t_particleEfficiency[0] = tsEfficiency[iEfficiency][0];
676 t_particleEfficiency[1] = tsEfficiency[iEfficiency][1];
677 t_particleEfficiency[2] = tsEfficiency[iEfficiency][2];
678 new(particleEfficiency[iEfficiency]) TVectorD(t_particleEfficiency);
687 for (
int iSuperLayer = 0; iSuperLayer < 9; iSuperLayer++) {
688 for (
unsigned iTS = 0; iTS < segmentHitsSL[iSuperLayer].size(); iTS++) {
689 const TCSegment& ts = segmentHitsSL[iSuperLayer][iTS]->segment();
692 if (iSuperLayer == 0) iWire = 0;
696 unsigned nHits = ts.wires()[iWire]->signal().nSignals();
697 for (
unsigned iHit = 0; iHit < nHits; iHit++) {
698 if (iHit % 2 == 1)
continue;
699 TVectorD tempTSInformation(3);
700 tempTSInformation[0] = iSuperLayer;
701 tempTSInformation[1] = ts.localId();
702 tempTSInformation[2] = ts.wires()[iWire]->signal().stateChanges()[iHit];
703 new(tsInformation[iHitTS++]) TVectorD(tempTSInformation);
719 std::vector<TRGCDCSegment*>& tss)
729 nnPatternInformation.Clear();
733 const unsigned nTSs = tss.size();
734 unsigned indexSaving = 0;
735 for (
unsigned iTS = 0; iTS < nTSs; iTS++) {
737 const TCSegment& ts = * tss[iTS];
738 const TCSHit* tsHit = ts.hit();
741 if (ts.wires().size() == 15) priority = ts.wires()[0];
742 else priority = ts.wires()[5];
744 if (priority->
hit()) {
748 vector<float> wireTime;
749 if (ts.superLayerId() == 0)
755 const unsigned nWires = ts.wires().size();
756 for (
unsigned iWire = 0; iWire < nWires; iWire++) {
765 wireTime[iWire] = 9999;
775 int lastLayer = ts.wires().back()->layerId();
776 int lastWire = ts.wires().back()->localId();
779 for (
unsigned iWire = 0; iWire < 6; iWire++) {
780 int wireIndex = lastWire - 4 + iWire;
781 if (wireIndex < 0) wireIndex += nWiresLayer;
782 if (wireIndex >= nWiresLayer) wireIndex -= nWiresLayer;
792 wireTime.push_back(9999);
795 for (
unsigned iWire = 0; iWire < 5; iWire++) {
796 int wireIndex = lastWire - 3 + iWire;
797 if (wireIndex < 0) wireIndex += nWiresLayer;
798 if (wireIndex >= nWiresLayer) wireIndex -= nWiresLayer;
808 wireTime.push_back(9999);
832 if (priority->
hit()->
mcLR()) mcLRDriftTime *= -1;
836 TVectorD t_nnPatternInformation;
837 if (ts.superLayerId() == 0) {
839 t_nnPatternInformation.ResizeTo(23);
840 t_nnPatternInformation[0] = ts.superLayerId();
841 t_nnPatternInformation[1] = mcLRDriftTime;
843 for (
unsigned iWire = 0; iWire < 21; iWire++)
844 t_nnPatternInformation[iWire + 2] = wireTime[iWire];
845 new(nnPatternInformation[indexSaving++]) TVectorD(t_nnPatternInformation);
848 t_nnPatternInformation.ResizeTo(17);
849 t_nnPatternInformation[0] = ts.superLayerId();
850 t_nnPatternInformation[1] = mcLRDriftTime;
852 for (
unsigned iWire = 0; iWire < 15; iWire++)
853 t_nnPatternInformation[iWire + 2] = wireTime[iWire];
854 new(nnPatternInformation[indexSaving++]) TVectorD(t_nnPatternInformation);
868 std::vector<const TRGCDCMerger*>::push_back(a);
876 const string sn =
"TSF::simulateOuter : " +
name();
880 for (
unsigned m = 0; m <
nInput(); m++) {
883 for (
unsigned i = 0; i < 16; i++) {
884 _secMap.push_back(& ((* b)[0][0][208 + i]));
885 for (
unsigned j = 0; j < 5; j++)
887 for (
unsigned j = 0; j < 4; j++)
888 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
889 for (
unsigned j = 0; j < 4; j++)
890 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
893 for (
unsigned i = 0; i < 4; i++)
894 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
895 for (
unsigned i = 0; i < 4; i++)
896 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
897 for (
unsigned i = 0; i < 4; i++)
898 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
902 const unsigned nTSF =
nInput() * 16;
903 vector<TRGSignalVector*> trker[4];
904 vector<int> tsfStateChanges;
907 for (
unsigned t = 0; t < nTSF; t++) {
916 s->push_back(* (
_hitMap[0][nTSF - 1]));
917 s->push_back(* (
_hitMap[0][0]));
918 s->push_back(* (
_hitMap[0][1]));
919 s->push_back(* (
_hitMap[1][nTSF - 1]));
920 s->push_back(* (
_hitMap[1][0]));
921 s->push_back(* (
_hitMap[2][0]));
922 s->push_back(* (
_hitMap[3][nTSF - 1]));
923 s->push_back(* (
_hitMap[3][0]));
924 s->push_back(* (
_hitMap[4][nTSF - 1]));
925 s->push_back(* (
_hitMap[4][0]));
926 s->push_back(* (
_hitMap[4][1]));
927 }
else if (t == (nTSF - 1)) {
928 s->push_back(* (
_hitMap[0][nTSF - 2]));
929 s->push_back(* (
_hitMap[0][nTSF - 1]));
930 s->push_back(* (
_hitMap[0][0]));
931 s->push_back(* (
_hitMap[1][nTSF - 2]));
932 s->push_back(* (
_hitMap[1][nTSF - 1]));
933 s->push_back(* (
_hitMap[2][nTSF - 1]));
934 s->push_back(* (
_hitMap[3][nTSF - 2]));
935 s->push_back(* (
_hitMap[3][nTSF - 1]));
937 s->push_back(* (
_hitMap[4][nTSF - 2]));
938 s->push_back(* (
_hitMap[4][nTSF - 1]));
939 s->push_back(* (
_hitMap[4][0]));
941 s->push_back(* (
_hitMap[0][t - 1]));
942 s->push_back(* (
_hitMap[0][t]));
943 s->push_back(* (
_hitMap[0][t + 1]));
944 s->push_back(* (
_hitMap[1][t - 1]));
945 s->push_back(* (
_hitMap[1][t]));
946 s->push_back(* (
_hitMap[2][t]));
947 s->push_back(* (
_hitMap[3][t - 1]));
948 s->push_back(* (
_hitMap[3][t]));
949 s->push_back(* (
_hitMap[4][t - 1]));
950 s->push_back(* (
_hitMap[4][t]));
951 s->push_back(* (
_hitMap[4][t + 1]));
955 s->push_back(*
_priMap[t * 4 + 0]);
956 s->push_back(*
_priMap[t * 4 + 1]);
957 s->push_back(*
_priMap[t * 4 + 2]);
958 s->push_back(*
_priMap[t * 4 + 3]);
975 _tsfOut.push_back(forTracker0);
976 _tsfOut.push_back(forTracker1);
981 for (
unsigned i = 0; i < sc.size(); i++) {
983 for (
unsigned j = 0; j < tsfStateChanges.size(); j++) {
984 if (tsfStateChanges[j] == sc[i]) {
989 if (! skip) tsfStateChanges.push_back(sc[i]);
993 const unsigned pos = t / (nTSF / 4);
995 addID(* forTracker0, t + (nTSF / 4));
996 addID(* forTracker1, t);
997 trker[3].push_back(forTracker0);
998 trker[0].push_back(forTracker1);
999 }
else if (pos == 1) {
1000 addID(* forTracker0, t);
1001 addID(* forTracker1, t - 1 * (nTSF / 4));
1002 trker[0].push_back(forTracker0);
1003 trker[1].push_back(forTracker1);
1004 }
else if (pos == 2) {
1005 addID(* forTracker0, t - 1 * (nTSF / 4));
1006 addID(* forTracker1, t - 2 * (nTSF / 4));
1007 trker[1].push_back(forTracker0);
1008 trker[2].push_back(forTracker1);
1010 addID(* forTracker0, t - 2 * (nTSF / 4));
1011 addID(* forTracker1, t - 3 * (nTSF / 4));
1012 trker[2].push_back(forTracker0);
1013 trker[3].push_back(forTracker1);
1017 if (forTracker0->
active())
1023 std::sort(tsfStateChanges.begin(), tsfStateChanges.end());
1026 for (
unsigned i = 0; i < 4; i++) {
1048 vector <TRGSignalVector*>
1055 TCSegment* tsi = _tsSL[tsid];
1056 vector <TRGSignalVector*> result;
1059 vector<bool> fTimeVect;
1063 vector <bool> tmpOutBool;
1071 for (
unsigned i = 0; i < 12; i++) {
1072 Hitmap->push_back((*in)[i]);
1073 (*Hitmap)[i].widen(16);
1075 for (
unsigned i = 0; i < 4; i++) {
1076 pTime.push_back((*in)[i + 12]);
1077 fTime.push_back((*in)[i + 16]);
1082 for (
unsigned i = 0; i < 5; i++) {
1083 pTime.push_back(cc[i]);
1084 fTime.push_back(cc[i]);
1089 int* LUTValue =
new int[changeTime.size()];
1090 if (changeTime.size()) {
1091 int hitPosition = 0;
1096 fTime.state(changeTime[0]).copy2bool(fTimeBool);
1097 fTimeBool[9] =
true;
1098 fTimeVect.insert(fTimeVect.begin(), fTimeBool, fTimeBool + 10);
1101 for (
unsigned i = 0; i < changeTime.size(); i++) {
1102 LUTValue[i] = tsi->LUT()->getValue(mkint(Hitmap->
state(changeTime[i])));
1105 if ((LUTValue[i]) && (eOUT)) {
1106 resultE->
set(fTimeVect, changeTime[i]);
1110 bool priority1rise = (*Hitmap)[6].riseEdge(changeTime[i]);
1111 bool priority2rise = ((*Hitmap)[7].riseEdge(changeTime[i]) |
1112 (*Hitmap)[8].riseEdge(changeTime[i]));
1116 if (priority1rise) {
1118 tmpPTime = mkint(pTime.state(changeTime[i]));
1119 tmpCTime = changeTime[i];
1120 }
else if (priority2rise) {
1122 tmpPTime = mkint(pTime.state(changeTime[i]));
1123 tmpCTime = changeTime[i];
1124 if ((*Hitmap)[0].state(changeTime[i])) hitPosition = 2;
1125 else hitPosition = 1;
1130 if ((hitPosition) && (LUTValue[i]) && ((changeTime[i] - tmpCTime) < 16)) {
1133 tmpOutInt = tmpPTime * pow(2, 4) +
1134 LUTValue[i] * pow(2, 2) + hitPosition;
1135 tmpOutBool = mkbool(tmpOutInt, 13);
1136 if (hitPosition == 3) {
1137 if (priority1rise) resultT->
set(tmpOutBool, changeTime[i]);
1139 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
1140 if (!((LUTValue[i - 1] == 1) |
1141 (LUTValue[i - 1] == 2)))
1142 resultT->
set(tmpOutBool, changeTime[i]);
1144 if (!(LUTValue[i - 1])) resultT->
set(tmpOutBool, changeTime[i]);
1148 if (priority2rise) resultT->
set(tmpOutBool, changeTime[i]);
1150 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
1151 if (!((LUTValue[i - 1] == 1) |
1152 (LUTValue[i - 1] == 2)))
1153 resultT->
set(tmpOutBool, changeTime[i]);
1155 if (!(LUTValue[i])) resultT->
set(tmpOutBool, changeTime[i]);
1164 result.push_back(resultT);
1165 result.push_back(resultE);
1175 const unsigned nTSF,
1182 unsigned rem = t % 16;
1185 s.push_back(*
_priMap[t * 4 + 0]);
1186 s.push_back(*
_priMap[t * 4 + 1]);
1187 s.push_back(*
_priMap[t * 4 + 2]);
1188 s.push_back(*
_priMap[t * 4 + 3]);
1194 tc.push_back(center);
1195 tc.push_back(right);
1200 s.push_back(*
_priMap[t * 4 + 0]);
1201 s.push_back(*
_priMap[t * 4 + 1]);
1202 s.push_back(*
_priMap[t * 4 + 2]);
1203 s.push_back(*
_priMap[t * 4 + 3]);
1207 const string sn =
"TSF priority timing outer";
1212 t0.push_back(*
_priMap[t * 4 + 0]);
1213 t0.push_back(*
_priMap[t * 4 + 1]);
1214 t0.push_back(*
_priMap[t * 4 + 2]);
1215 t0.push_back(*
_priMap[t * 4 + 3]);
1218 unsigned p = t / 16;
1222 t1.push_back(*
_edg0Map[p * 4 + 0]);
1223 t1.push_back(*
_edg0Map[p * 4 + 1]);
1224 t1.push_back(*
_edg0Map[p * 4 + 2]);
1225 t1.push_back(*
_edg0Map[p * 4 + 3]);
1228 vector<TRGState*> outputTimingStates;
1229 vector<int> clkStates;
1232 for (
unsigned i = 0; i < sc.size(); i++) {
1240 else if (stt[1] && (! stt[2]))
1242 else if ((! stt[1]) && stt[2])
1245 if (
unsigned(t0.state(clk)) <
unsigned(t1.state(clk)))
1252 outputTimingStates.push_back(
new TRGState(t0.state(clk)));
1253 sb.push_back(
false);
1255 outputTimingStates.push_back(
new TRGState(t1.state(clk)));
1258 clkStates.push_back(clk);
1262 const unsigned n = outputTimingStates.size();
1264 for (
unsigned i = 0; i < n; i++) {
1266 s[0].unset(clkStates[i], clkStates[i] + 1);
1267 st.set(* outputTimingStates[i], clkStates[i]);
1268 delete outputTimingStates[i];
1290 const unsigned nTSF,
1294 const unsigned rem = t % 16;
1296 if ((rem != 0) && (rem != 15)) {
1297 s.push_back(*
_fasMap[t * 4 + 0]);
1298 s.push_back(*
_fasMap[t * 4 + 1]);
1299 s.push_back(*
_fasMap[t * 4 + 2]);
1300 s.push_back(*
_fasMap[t * 4 + 3]);
1306 for (
unsigned i = 0; i < 11; i++) {
1307 if (s[i + 1].active()) {
1315 s.push_back(*
_fasMap[t * 4 + 0]);
1316 s.push_back(*
_fasMap[t * 4 + 1]);
1317 s.push_back(*
_fasMap[t * 4 + 2]);
1318 s.push_back(*
_fasMap[t * 4 + 3]);
1322 const string sn =
"TSF fastest timing outer";
1327 t0.push_back(*
_fasMap[t * 4 + 0]);
1328 t0.push_back(*
_fasMap[t * 4 + 1]);
1329 t0.push_back(*
_fasMap[t * 4 + 2]);
1330 t0.push_back(*
_fasMap[t * 4 + 3]);
1336 unsigned n = t / 16;
1342 t1.push_back(*
_edg2Map[n * 4 + 0]);
1343 t1.push_back(*
_edg2Map[n * 4 + 1]);
1344 t1.push_back(*
_edg2Map[n * 4 + 2]);
1345 t1.push_back(*
_edg2Map[n * 4 + 3]);
1360 unsigned n = t / 16 + 1;
1364 t1.push_back(*
_edg1Map[n * 4 + 0]);
1365 t1.push_back(*
_edg1Map[n * 4 + 1]);
1366 t1.push_back(*
_edg1Map[n * 4 + 2]);
1367 t1.push_back(*
_edg1Map[n * 4 + 3]);
1384 vector<int> sc = t0.stateChanges();
1385 vector<int> tmp = t1.stateChanges();
1386 sc.insert(sc.end(), tmp.begin(), tmp.end());
1387 std::sort(sc.begin(), sc.end());
1392 for (
unsigned i = 0; i < sc.size(); i++) {
1400 unsigned tm0 = unsigned(ts0);
1401 unsigned tm1 = unsigned(ts1);
1402 bool th0 = ht0.
state(clk);
1403 bool th1 = ht1.
state(clk);
1405 if ((! th0) && (! th1))
1407 else if (th0 && th1) {
1444 const string sn =
"TSF::simulateInner : " +
name();
1448 for (
unsigned i = 0; i < 4; i++) {
1452 b->push_back(dummy);
1467 for (
unsigned m = 0; m <
nInput(); m++) {
1470 for (
unsigned i = 0; i < 16; i++) {
1471 _secMap.push_back(& ((* b)[0][0][208 + i]));
1472 for (
unsigned j = 0; j < 5; j++)
1474 for (
unsigned j = 0; j < 4; j++)
1475 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
1476 for (
unsigned j = 0; j < 4; j++)
1477 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
1480 for (
unsigned i = 0; i < 4; i++)
1481 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
1482 for (
unsigned i = 0; i < 4; i++)
1483 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
1484 for (
unsigned i = 0; i < 4; i++)
1485 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
1486 for (
unsigned i = 0; i < 4; i++)
1487 _edg3Map.push_back(& ((* b)[0][0][224 + 12 + i]));
1488 for (
unsigned i = 0; i < 4; i++)
1489 _edg4Map.push_back(& ((* b)[0][0][224 + 16 + i]));
1493 const unsigned nTSF =
nInput() * 16;
1494 vector<TRGSignalVector*> trker[4];
1495 vector<int> tsfStateChanges;
1498 for (
unsigned t = 0; t < nTSF; t++) {
1507 s->push_back(* (
_hitMap[0][0]));
1508 s->push_back(* (
_hitMap[1][nTSF - 1]));
1509 s->push_back(* (
_hitMap[1][0]));
1510 s->push_back(* (
_hitMap[2][nTSF - 1]));
1511 s->push_back(* (
_hitMap[2][0]));
1512 s->push_back(* (
_hitMap[2][1]));
1513 s->push_back(* (
_hitMap[3][nTSF - 2]));
1514 s->push_back(* (
_hitMap[3][nTSF - 1]));
1515 s->push_back(* (
_hitMap[3][0]));
1516 s->push_back(* (
_hitMap[3][1]));
1517 s->push_back(* (
_hitMap[4][nTSF - 2]));
1518 s->push_back(* (
_hitMap[4][nTSF - 1]));
1519 s->push_back(* (
_hitMap[4][0]));
1520 s->push_back(* (
_hitMap[4][1]));
1521 s->push_back(* (
_hitMap[4][2]));
1522 }
else if (t == 1) {
1523 s->push_back(* (
_hitMap[0][1]));
1524 s->push_back(* (
_hitMap[1][0]));
1525 s->push_back(* (
_hitMap[1][1]));
1526 s->push_back(* (
_hitMap[2][0]));
1527 s->push_back(* (
_hitMap[2][1]));
1528 s->push_back(* (
_hitMap[2][2]));
1529 s->push_back(* (
_hitMap[3][nTSF - 1]));
1530 s->push_back(* (
_hitMap[3][0]));
1531 s->push_back(* (
_hitMap[3][1]));
1532 s->push_back(* (
_hitMap[3][2]));
1533 s->push_back(* (
_hitMap[4][nTSF - 1]));
1534 s->push_back(* (
_hitMap[4][0]));
1535 s->push_back(* (
_hitMap[4][1]));
1536 s->push_back(* (
_hitMap[4][2]));
1537 s->push_back(* (
_hitMap[4][3]));
1538 }
else if (t == (nTSF - 2)) {
1539 s->push_back(* (
_hitMap[0][t]));
1540 s->push_back(* (
_hitMap[1][t - 11]));
1541 s->push_back(* (
_hitMap[1][t]));
1542 s->push_back(* (
_hitMap[2][t - 1]));
1543 s->push_back(* (
_hitMap[2][t]));
1544 s->push_back(* (
_hitMap[2][0]));
1545 s->push_back(* (
_hitMap[3][t - 2]));
1546 s->push_back(* (
_hitMap[3][t - 1]));
1547 s->push_back(* (
_hitMap[3][t]));
1548 s->push_back(* (
_hitMap[3][0]));
1549 s->push_back(* (
_hitMap[4][t - 2]));
1550 s->push_back(* (
_hitMap[4][t - 1]));
1551 s->push_back(* (
_hitMap[4][t]));
1552 s->push_back(* (
_hitMap[4][t + 1]));
1553 s->push_back(* (
_hitMap[4][0]));
1554 }
else if (t == (nTSF - 1)) {
1555 s->push_back(* (
_hitMap[0][t]));
1556 s->push_back(* (
_hitMap[1][t - 11]));
1557 s->push_back(* (
_hitMap[1][t]));
1558 s->push_back(* (
_hitMap[2][t - 1]));
1559 s->push_back(* (
_hitMap[2][t]));
1560 s->push_back(* (
_hitMap[2][0]));
1561 s->push_back(* (
_hitMap[3][t - 2]));
1562 s->push_back(* (
_hitMap[3][t - 1]));
1563 s->push_back(* (
_hitMap[3][t]));
1564 s->push_back(* (
_hitMap[3][0]));
1565 s->push_back(* (
_hitMap[4][t - 2]));
1566 s->push_back(* (
_hitMap[4][t - 1]));
1567 s->push_back(* (
_hitMap[4][t]));
1568 s->push_back(* (
_hitMap[4][0]));
1569 s->push_back(* (
_hitMap[4][1]));
1571 s->push_back(* (
_hitMap[0][t]));
1572 s->push_back(* (
_hitMap[1][t - 11]));
1573 s->push_back(* (
_hitMap[1][t]));
1574 s->push_back(* (
_hitMap[2][t - 1]));
1575 s->push_back(* (
_hitMap[2][t]));
1576 s->push_back(* (
_hitMap[2][0]));
1577 s->push_back(* (
_hitMap[3][t - 2]));
1578 s->push_back(* (
_hitMap[3][t - 1]));
1579 s->push_back(* (
_hitMap[3][t]));
1580 s->push_back(* (
_hitMap[3][0]));
1581 s->push_back(* (
_hitMap[4][t - 2]));
1582 s->push_back(* (
_hitMap[4][t - 1]));
1583 s->push_back(* (
_hitMap[4][t]));
1584 s->push_back(* (
_hitMap[4][t + 1]));
1585 s->push_back(* (
_hitMap[4][t + 2]));
1589 s->push_back(*
_priMap[t * 4 + 0]);
1590 s->push_back(*
_priMap[t * 4 + 1]);
1591 s->push_back(*
_priMap[t * 4 + 2]);
1592 s->push_back(*
_priMap[t * 4 + 3]);
1606 _tsfOut.push_back(forTracker);
1611 for (
unsigned i = 0; i < sc.size(); i++) {
1613 for (
unsigned j = 0; j < tsfStateChanges.size(); j++) {
1614 if (tsfStateChanges[j] == sc[i]) {
1619 if (! skip) tsfStateChanges.push_back(sc[i]);
1623 const unsigned pos = t / (nTSF / 4);
1625 trker[0].push_back(forTracker);
1626 trker[1].push_back(forTracker);
1627 }
else if (pos == 1) {
1628 trker[1].push_back(forTracker);
1629 trker[2].push_back(forTracker);
1630 }
else if (pos == 2) {
1631 trker[2].push_back(forTracker);
1632 trker[3].push_back(forTracker);
1634 trker[3].push_back(forTracker);
1635 trker[0].push_back(forTracker);
1658 std::sort(tsfStateChanges.begin(), tsfStateChanges.end());
1661 for (
unsigned i = 0; i < 4; i++) {
1676 const unsigned nTSF,
1680 const unsigned rem = t % 16;
1682 if ((rem > 1) && (rem < 14)) {
1683 s.push_back(*
_fasMap[t * 4 + 0]);
1684 s.push_back(*
_fasMap[t * 4 + 1]);
1685 s.push_back(*
_fasMap[t * 4 + 2]);
1686 s.push_back(*
_fasMap[t * 4 + 3]);
1692 for (
unsigned i = 0; i < 11; i++) {
1693 if (s[i + 1].active()) {
1701 s.push_back(*
_fasMap[t * 4 + 0]);
1702 s.push_back(*
_fasMap[t * 4 + 1]);
1703 s.push_back(*
_fasMap[t * 4 + 2]);
1704 s.push_back(*
_fasMap[t * 4 + 3]);
1708 const string sn =
"TSF fastest timing inner";
1713 t0.push_back(*
_fasMap[t * 4 + 0]);
1714 t0.push_back(*
_fasMap[t * 4 + 1]);
1715 t0.push_back(*
_fasMap[t * 4 + 2]);
1716 t0.push_back(*
_fasMap[t * 4 + 3]);
1722 unsigned n = t / 16;
1728 t1.push_back(*
_edg3Map[n * 4 + 0]);
1729 t1.push_back(*
_edg3Map[n * 4 + 1]);
1730 t1.push_back(*
_edg3Map[n * 4 + 2]);
1731 t1.push_back(*
_edg3Map[n * 4 + 3]);
1748 }
else if (rem == 1) {
1749 unsigned n = t / 16;
1755 t1.push_back(*
_edg4Map[n * 4 + 0]);
1756 t1.push_back(*
_edg4Map[n * 4 + 1]);
1757 t1.push_back(*
_edg4Map[n * 4 + 2]);
1758 t1.push_back(*
_edg4Map[n * 4 + 3]);
1775 }
else if (rem == 14) {
1776 unsigned n = t / 16 + 1;
1780 t1.push_back(*
_edg1Map[n * 4 + 0]);
1781 t1.push_back(*
_edg1Map[n * 4 + 1]);
1782 t1.push_back(*
_edg1Map[n * 4 + 2]);
1783 t1.push_back(*
_edg1Map[n * 4 + 3]);
1801 unsigned n = t / 16 + 1;
1805 t1.push_back(*
_edg2Map[n * 4 + 0]);
1806 t1.push_back(*
_edg2Map[n * 4 + 1]);
1807 t1.push_back(*
_edg2Map[n * 4 + 2]);
1808 t1.push_back(*
_edg2Map[n * 4 + 3]);
1828 vector<int> sc = t0.stateChanges();
1829 vector<int> tmp = t1.stateChanges();
1830 sc.insert(sc.end(), tmp.begin(), tmp.end());
1831 std::sort(sc.begin(), sc.end());
1836 for (
unsigned i = 0; i < sc.size(); i++) {
1844 unsigned tm0 = unsigned(ts0);
1845 unsigned tm1 = unsigned(ts1);
1846 bool th0 = ht0.
state(clk);
1847 bool th1 = ht1.
state(clk);
1849 if ((! th0) && (! th1))
1851 else if (th0 && th1) {
1884 vector<TRGSignalVector*>
1914 vector<int> sc = s.stateChanges();
1915 for (
unsigned i = 0; i < sc.size(); i++) {
1917 TRGState st = s.state(clk).subset(1, 3);
1921 if (st[1] && st[2]) {
1930 vector<TRGSignalVector*> v;
1943 vector<int> sc = s.stateChanges();
1944 for (
unsigned i = 0; i < sc.size(); i++) {
1945 if (s.active(sc[i]))
1946 idv.
set(sid, sc[i]);
1958 for (
unsigned i = 0; i <
nOutput(); i++) {
1963 for (
unsigned i = 0; i <
_tsfIn.size(); i++)
1966 for (
unsigned i = 0; i <
_tsfOut.size(); i++)
1974 for (
unsigned i = 0; i < 5; i++)
1985 if (
_type == innerType)
1995 const string sn =
"TSF::simulate2 : " +
name();
2005 for (
unsigned i = 0; i <
nOutput(); i++) {
2010 for (
unsigned i = 0; i <
_tsfIn.size(); i++)
2013 for (
unsigned i = 0; i <
_tsfOut.size(); i++)
2021 for (
unsigned i = 0; i < 5; i++)
2033 const unsigned nTSF =
nInput() * 16;
2034 vector<TRGSignalVector*> trker[4];
2035 vector<int> tsfStateChanges;
2038 if (
_type == innerType)
2044 for (
unsigned t = 0; t < nTSF; t++) {
2051 if (
_type == innerType)
2057 vector<TRGSignalVector*> result =
simulateTSF(s, t);
2062 if (result.size() != result2.size()) {
2063 cout <<
"TSF::simulateTSF2 has different response(size)"
2066 for (
unsigned i = 0; i < result.size(); i++) {
2067 if ((* result[i]) != (* result2[i]))
2068 cout <<
"TSF::simulateTSF2 has different response"
2069 <<
"(contents)" << endl;
2077 _tsfOut.push_back(forTracker0);
2078 _tsfOut.push_back(forTracker1);
2082 for (
unsigned i = 0; i < sc.size(); i++) {
2084 for (
unsigned j = 0; j < tsfStateChanges.size(); j++) {
2085 if (tsfStateChanges[j] == sc[i]) {
2090 if (! skip) tsfStateChanges.push_back(sc[i]);
2094 const unsigned pos = t / (nTSF / 4);
2096 addID(* forTracker0, t - 3 * (nTSF / 4));
2097 addID(* forTracker1, t);
2098 trker[3].push_back(forTracker0);
2099 trker[0].push_back(forTracker1);
2100 }
else if (pos == 1) {
2101 addID(* forTracker0, t);
2102 addID(* forTracker1, t - 1 * (nTSF / 4));
2103 trker[0].push_back(forTracker0);
2104 trker[1].push_back(forTracker1);
2105 }
else if (pos == 2) {
2106 addID(* forTracker0, t - 1 * (nTSF / 4));
2107 addID(* forTracker1, t - 2 * (nTSF / 4));
2108 trker[1].push_back(forTracker0);
2109 trker[2].push_back(forTracker1);
2111 addID(* forTracker0, t - 2 * (nTSF / 4));
2112 addID(* forTracker1, t - 3 * (nTSF / 4));
2113 trker[2].push_back(forTracker0);
2114 trker[3].push_back(forTracker1);
2118 if (forTracker0->
active())
2124 std::sort(tsfStateChanges.begin(), tsfStateChanges.end());
2127 for (
unsigned i = 0; i < 4; i++) {
2155 for (
unsigned m = 0; m <
nInput(); m++) {
2160 for (
unsigned i = 0; i < 16; i++) {
2161 _secMap.push_back(& ((* b)[0][0][208 + i]));
2162 for (
unsigned j = 0; j < 5; j++) {
2163 _hitMap[j].push_back(& ((* b)[0][0][j * 16 + i]));
2168 for (
unsigned j = 0; j < 4; j++)
2169 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
2170 for (
unsigned j = 0; j < 4; j++)
2171 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
2174 for (
unsigned i = 0; i < 4; i++)
2175 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
2176 for (
unsigned i = 0; i < 4; i++)
2177 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
2178 for (
unsigned i = 0; i < 4; i++)
2179 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
2180 for (
unsigned i = 0; i < 4; i++)
2181 _edg3Map.push_back(& ((* b)[0][0][224 + 12 + i]));
2182 for (
unsigned i = 0; i < 4; i++)
2183 _edg4Map.push_back(& ((* b)[0][0][224 + 16 + i]));
2192 for (
unsigned m = 0; m <
nInput(); m++) {
2195 for (
unsigned i = 0; i < 16; i++) {
2196 _secMap.push_back(& ((* b)[0][0][208 + i]));
2197 for (
unsigned j = 0; j < 5; j++)
2199 for (
unsigned j = 0; j < 4; j++)
2200 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
2201 for (
unsigned j = 0; j < 4; j++)
2202 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
2205 for (
unsigned i = 0; i < 4; i++)
2206 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
2207 for (
unsigned i = 0; i < 4; i++)
2208 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
2209 for (
unsigned i = 0; i < 4; i++)
2210 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
2216 const unsigned nTSF,
2222 s->push_back(* (
_hitMap[0][0]));
2223 s->push_back(* (
_hitMap[1][nTSF - 1]));
2224 s->push_back(* (
_hitMap[1][0]));
2225 s->push_back(* (
_hitMap[2][nTSF - 1]));
2226 s->push_back(* (
_hitMap[2][0]));
2227 s->push_back(* (
_hitMap[2][1]));
2228 s->push_back(* (
_hitMap[3][nTSF - 2]));
2229 s->push_back(* (
_hitMap[3][nTSF - 1]));
2230 s->push_back(* (
_hitMap[3][0]));
2231 s->push_back(* (
_hitMap[3][1]));
2232 s->push_back(* (
_hitMap[4][nTSF - 2]));
2233 s->push_back(* (
_hitMap[4][nTSF - 1]));
2234 s->push_back(* (
_hitMap[4][0]));
2235 s->push_back(* (
_hitMap[4][1]));
2236 s->push_back(* (
_hitMap[4][2]));
2237 }
else if (t == 1) {
2238 s->push_back(* (
_hitMap[0][1]));
2239 s->push_back(* (
_hitMap[1][0]));
2240 s->push_back(* (
_hitMap[1][1]));
2241 s->push_back(* (
_hitMap[2][0]));
2242 s->push_back(* (
_hitMap[2][1]));
2243 s->push_back(* (
_hitMap[2][2]));
2244 s->push_back(* (
_hitMap[3][nTSF - 1]));
2245 s->push_back(* (
_hitMap[3][0]));
2246 s->push_back(* (
_hitMap[3][1]));
2247 s->push_back(* (
_hitMap[3][2]));
2248 s->push_back(* (
_hitMap[4][nTSF - 1]));
2249 s->push_back(* (
_hitMap[4][0]));
2250 s->push_back(* (
_hitMap[4][1]));
2251 s->push_back(* (
_hitMap[4][2]));
2252 s->push_back(* (
_hitMap[4][3]));
2253 }
else if (t == (nTSF - 2)) {
2254 s->push_back(* (
_hitMap[0][t]));
2255 s->push_back(* (
_hitMap[1][t - 11]));
2256 s->push_back(* (
_hitMap[1][t]));
2257 s->push_back(* (
_hitMap[2][t - 1]));
2258 s->push_back(* (
_hitMap[2][t]));
2259 s->push_back(* (
_hitMap[2][0]));
2260 s->push_back(* (
_hitMap[3][t - 2]));
2261 s->push_back(* (
_hitMap[3][t - 1]));
2262 s->push_back(* (
_hitMap[3][t]));
2263 s->push_back(* (
_hitMap[3][0]));
2264 s->push_back(* (
_hitMap[4][t - 2]));
2265 s->push_back(* (
_hitMap[4][t - 1]));
2266 s->push_back(* (
_hitMap[4][t]));
2267 s->push_back(* (
_hitMap[4][t + 1]));
2268 s->push_back(* (
_hitMap[4][0]));
2269 }
else if (t == (nTSF - 1)) {
2270 s->push_back(* (
_hitMap[0][t]));
2271 s->push_back(* (
_hitMap[1][t - 11]));
2272 s->push_back(* (
_hitMap[1][t]));
2273 s->push_back(* (
_hitMap[2][t - 1]));
2274 s->push_back(* (
_hitMap[2][t]));
2275 s->push_back(* (
_hitMap[2][0]));
2276 s->push_back(* (
_hitMap[3][t - 2]));
2277 s->push_back(* (
_hitMap[3][t - 1]));
2278 s->push_back(* (
_hitMap[3][t]));
2279 s->push_back(* (
_hitMap[3][0]));
2280 s->push_back(* (
_hitMap[4][t - 2]));
2281 s->push_back(* (
_hitMap[4][t - 1]));
2282 s->push_back(* (
_hitMap[4][t]));
2283 s->push_back(* (
_hitMap[4][0]));
2284 s->push_back(* (
_hitMap[4][1]));
2290 s->push_back(* (
_hitMap[0][t]));
2293 s->push_back(* (
_hitMap[1][t]));
2294 s->push_back(* (
_hitMap[2][t - 1]));
2295 s->push_back(* (
_hitMap[2][t]));
2296 s->push_back(* (
_hitMap[2][0]));
2297 s->push_back(* (
_hitMap[3][t - 2]));
2298 s->push_back(* (
_hitMap[3][t - 1]));
2299 s->push_back(* (
_hitMap[3][t]));
2300 s->push_back(* (
_hitMap[3][0]));
2301 s->push_back(* (
_hitMap[4][t - 2]));
2302 s->push_back(* (
_hitMap[4][t - 1]));
2303 s->push_back(* (
_hitMap[4][t]));
2304 s->push_back(* (
_hitMap[4][t + 1]));
2305 s->push_back(* (
_hitMap[4][t + 2]));
2325 const unsigned nTSF,
2331 s->push_back(* (
_hitMap[0][nTSF - 1]));
2332 s->push_back(* (
_hitMap[0][0]));
2333 s->push_back(* (
_hitMap[0][1]));
2334 s->push_back(* (
_hitMap[1][nTSF - 1]));
2335 s->push_back(* (
_hitMap[1][0]));
2336 s->push_back(* (
_hitMap[2][0]));
2337 s->push_back(* (
_hitMap[3][nTSF - 1]));
2338 s->push_back(* (
_hitMap[3][0]));
2339 s->push_back(* (
_hitMap[4][nTSF - 1]));
2340 s->push_back(* (
_hitMap[4][0]));
2341 s->push_back(* (
_hitMap[4][1]));
2342 }
else if (t == (nTSF - 1)) {
2343 s->push_back(* (
_hitMap[0][nTSF - 2]));
2344 s->push_back(* (
_hitMap[0][nTSF - 1]));
2345 s->push_back(* (
_hitMap[0][0]));
2346 s->push_back(* (
_hitMap[1][nTSF - 2]));
2347 s->push_back(* (
_hitMap[1][nTSF - 1]));
2348 s->push_back(* (
_hitMap[2][nTSF - 1]));
2349 s->push_back(* (
_hitMap[3][nTSF - 2]));
2350 s->push_back(* (
_hitMap[3][nTSF - 1]));
2352 s->push_back(* (
_hitMap[4][nTSF - 2]));
2353 s->push_back(* (
_hitMap[4][nTSF - 1]));
2354 s->push_back(* (
_hitMap[4][0]));
2356 s->push_back(* (
_hitMap[0][t - 1]));
2357 s->push_back(* (
_hitMap[0][t]));
2358 s->push_back(* (
_hitMap[0][t + 1]));
2359 s->push_back(* (
_hitMap[1][t - 1]));
2360 s->push_back(* (
_hitMap[1][t]));
2361 s->push_back(* (
_hitMap[2][t]));
2362 s->push_back(* (
_hitMap[3][t - 1]));
2363 s->push_back(* (
_hitMap[3][t]));
2364 s->push_back(* (
_hitMap[4][t - 1]));
2365 s->push_back(* (
_hitMap[4][t]));
2366 s->push_back(* (
_hitMap[4][t + 1]));
2385 TSFinder::packerForTracker(vector<TRGSignalVector*>& hitList,
2387 const unsigned maxHit)
2393 for (
unsigned ci = 0; ci < cList.size(); ci++) {
2394 unsigned cntHit = 0;
2395 for (
unsigned hi = 0; hi < hitList.size(); hi++) {
2396 TRGState s = (* hitList[hi]).state(cList[ci]);
2398 if (cntHit >= maxHit)
continue;
2399 for (
unsigned j = 0; j < 21; j++) {
2400 if ((* hitList[hi])[j].state(cList[ci])) {
2401 (* result)[21 * (maxHit - 1) - (cntHit * 21) + j]
2402 .set(cList[ci], cList[ci] + 1);
2406 TRGState t = hitList[hi]->state(cList[ci]).subset(13, 8);
2408 << unsigned(t) <<
"(" << t <<
")" << endl;
2420 vector <TRGSignalVector*>
2421 TSFinder::simulateTSFOld(TRGSignalVector* in,
unsigned tsid)
2427 TCSegment* tsi = _tsSL[tsid];
2428 vector <TRGSignalVector*> result;
2431 vector<bool> fTimeVect;
2435 vector <bool> tmpOutBool;
2438 TRGSignalVector* resultT =
new TRGSignalVector(na, in->clock(), 13);
2439 TRGSignalVector* resultE =
new TRGSignalVector(na, in->clock(), 10);
2440 TRGSignalVector* Hitmap =
new TRGSignalVector(na +
"HitMap", in->clock(), 0);
2441 TRGSignalVector pTime(na +
"PriorityTime", in->clock(), 0);
2442 TRGSignalVector fTime(na +
"FastestTime", in->clock(), 0);
2443 TRGSignal* pri0 = 0;
2444 TRGSignal* pri1 = 0;
2445 TRGSignal* pri2 = 0;
2446 if (_type == innerType) {
2447 for (
unsigned i = 0; i < 16; i++) {
2448 Hitmap->push_back((* in)[i]);
2449 (* Hitmap)[i].widen(16);
2451 for (
unsigned i = 0; i < 4; i++) {
2452 pTime.push_back((* in)[i + 16]);
2453 fTime.push_back((* in)[i + 20]);
2455 pri0 = & (*Hitmap)[1];
2456 pri1 = & (*Hitmap)[2];
2457 pri2 = & (*Hitmap)[3];
2459 for (
unsigned i = 0; i < 12; i++) {
2460 Hitmap->push_back((* in)[i]);
2461 (* Hitmap)[i].widen(16);
2463 for (
unsigned i = 0; i < 4; i++) {
2464 pTime.push_back((* in)[i + 12]);
2465 fTime.push_back((* in)[i + 16]);
2467 pri0 = & (*Hitmap)[6];
2468 pri1 = & (*Hitmap)[7];
2469 pri2 = & (*Hitmap)[8];
2473 const TRGSignalVector& cc = in->clock().clockCounter();
2474 for (
unsigned i = 0; i < 5; i++) {
2475 pTime.push_back(cc[i]);
2476 fTime.push_back(cc[i]);
2479 vector <int> changeTime = Hitmap->stateChanges();
2481 int* LUTValue =
new int[changeTime.size()];
2482 if (changeTime.size()) {
2484 const string fn =
"TSF::simulateTSF:tsid=" + to_string(tsid);
2487 int hitPosition = 0;
2492 fTime.state(changeTime[0]).copy2bool(fTimeBool);
2493 fTimeBool[9] =
true;
2494 fTimeVect.insert(fTimeVect.begin(), fTimeBool, fTimeBool + 10);
2497 for (
unsigned i = 0; i < changeTime.size(); i++) {
2498 int ct = changeTime[i];
2501 LUTValue[i] = tsi->LUT()->getValue(
unsigned(Hitmap->state(ct)));
2504 if ((LUTValue[i]) && (eOUT)) {
2505 resultE->set(fTimeVect, ct);
2509 bool priority1rise = pri0->riseEdge(ct);
2510 bool priority2rise = pri1->riseEdge(ct) | pri2->riseEdge(ct);
2514 if (priority1rise) {
2517 tmpPTime = unsigned(pTime.state(ct));
2519 }
else if (priority2rise) {
2522 tmpPTime = unsigned(pTime.state(ct));
2524 if ((*Hitmap)[0].state(ct)) hitPosition = 2;
2525 else hitPosition = 1;
2530 if ((hitPosition) && (LUTValue[i]) && ((ct - tmpCTime) < 16)) {
2531 tmpOutInt = tmpPTime * pow(2, 4) +
2532 LUTValue[i] * pow(2, 2) + hitPosition;
2533 tmpOutBool = mkbool(tmpOutInt, 13);
2535 if (hitPosition == 3) {
2536 if (priority1rise) {
2537 resultT->set(tmpOutBool, ct);
2539 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2540 if (!((LUTValue[i - 1] == 1) |
2541 (LUTValue[i - 1] == 2)))
2542 resultT->set(tmpOutBool, ct);
2544 if (!(LUTValue[i - 1])) resultT->set(tmpOutBool, ct);
2548 if (priority2rise) resultT->set(tmpOutBool, ct);
2550 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2551 if (!((LUTValue[i - 1] == 1) |
2552 (LUTValue[i - 1] == 2)))
2553 resultT->set(tmpOutBool, ct);
2555 if (!(LUTValue[i])) resultT->set(tmpOutBool, ct);
2563 <<
", pattern=" << Hitmap->state(ct)
2564 <<
", LUT=" << LUTValue[i]
2565 <<
", pri=" << priority1rise
2566 <<
", sec=" << priority2rise
2567 <<
", hitPos=" << hitPosition
2568 <<
", (clk-tmpCTime)=" << (ct - tmpCTime)
2576 result.push_back(resultT);
2577 result.push_back(resultE);
2585 vector <TRGSignalVector*>
2586 TSFinder::simulateTSF(TRGSignalVector* in,
unsigned tsid)
2592 TCSegment* tsi = _tsSL[tsid];
2593 vector <TRGSignalVector*> result;
2596 vector<bool> fTimeVect;
2600 vector <bool> tmpOutBool;
2602 TRGSignalVector* resultT =
new TRGSignalVector(na, in->clock(), 13);
2603 TRGSignalVector* resultE =
new TRGSignalVector(na, in->clock(), 10);
2604 TRGSignalVector* Hitmap =
new TRGSignalVector(na +
"HitMap",
2607 TRGSignalVector pTime(na +
"PriorityTime", in->clock(), 0);
2608 TRGSignalVector fTime(na +
"FastestTime", in->clock(), 0);
2609 TRGSignal* pri0 = 0;
2610 TRGSignal* pri1 = 0;
2611 TRGSignal* pri2 = 0;
2612 if (_type == innerType) {
2613 for (
unsigned i = 0; i < 16; i++) {
2614 Hitmap->push_back((* in)[i]);
2615 (* Hitmap)[i].widen(16);
2617 for (
unsigned i = 0; i < 4; i++) {
2618 pTime.push_back((* in)[i + 16]);
2619 fTime.push_back((* in)[i + 20]);
2621 pri0 = & (*Hitmap)[1];
2622 pri1 = & (*Hitmap)[2];
2623 pri2 = & (*Hitmap)[3];
2625 for (
unsigned i = 0; i < 12; i++) {
2626 Hitmap->push_back((* in)[i]);
2627 (* Hitmap)[i].widen(16);
2629 for (
unsigned i = 0; i < 4; i++) {
2630 pTime.push_back((* in)[i + 12]);
2631 fTime.push_back((* in)[i + 16]);
2633 pri0 = & (*Hitmap)[6];
2634 pri1 = & (*Hitmap)[7];
2635 pri2 = & (*Hitmap)[8];
2639 const TRGSignalVector& cc = in->clock().clockCounter();
2640 for (
unsigned i = 0; i < 5; i++) {
2641 pTime.push_back(cc[i]);
2642 fTime.push_back(cc[i]);
2645 vector<int> changeTime = Hitmap->stateChanges();
2647 int* LUTValue =
new int[changeTime.size()];
2649 int lastFastHit = in->clock().min();
2650 if (changeTime.size()) {
2653 const string fn =
"TSF::simulateTSF:tsid=" + to_string(tsid);
2656 int hitPosition = 0;
2662 for (
unsigned i = 0; i < changeTime.size(); i++) {
2664 int ct = changeTime[i];
2665 TRGState st = Hitmap->state(ct);
2669 LUTValue[i] = tsi->LUT()->getValue(
unsigned(st));
2672 bool active = st.active();
2674 const int timeCounter = ct - lastFastHit;
2677 if (timeCounter > 15) {
2679 TRGState ftnow = fTime.state(ct);
2680 ftnow += TRGState(1, 1);
2687 if ((LUTValue[i])) {
2689 resultE->set(fTimeVect, ct);
2694 bool priority1rise = pri0->riseEdge(ct);
2695 bool priority2rise = pri1->riseEdge(ct) | pri2->riseEdge(ct);
2699 if (priority1rise) {
2701 tmpPTime = unsigned(pTime.state(ct));
2703 }
else if (priority2rise) {
2705 tmpPTime = unsigned(pTime.state(ct));
2707 if ((*Hitmap)[0].state(ct)) hitPosition = 2;
2708 else hitPosition = 1;
2713 if ((ct - tmpCTime) < 16) {
2714 if ((hitPosition) && (LUTValue[i])) {
2717 tmpOutInt = tmpPTime * pow(2, 4) +
2718 LUTValue[i] * pow(2, 2) + hitPosition;
2719 tmpOutBool = mkbool(tmpOutInt, 13);
2721 if (hitPosition == 3) {
2722 if (priority1rise) {
2723 resultT->set(tmpOutBool, ct);
2724 oldLUT = LUTValue[i];
2726 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2727 if (!((oldLUT == 1) |
2729 resultT->set(tmpOutBool, ct);
2730 oldLUT = LUTValue[i];
2733 if (!(LUTValue[i - 1])) {
2734 resultT->set(tmpOutBool, ct);
2735 oldLUT = LUTValue[i];
2740 if ((priority2rise) && (!oldLUT)) resultT->set(tmpOutBool, ct);
2742 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2743 if (!((oldLUT == 1) |
2745 resultT->set(tmpOutBool, ct);
2746 oldLUT = LUTValue[i];
2750 resultT->set(tmpOutBool, ct);
2751 oldLUT = LUTValue[i];
2764 <<
", pattern=" << st
2765 <<
", LUT=" << LUTValue[i]
2766 <<
", pri=" << priority1rise
2767 <<
", sec=" << priority2rise
2768 <<
", hitPos=" << hitPosition
2769 <<
", (clk-tmpCTime)=" << (ct - tmpCTime)
2777 vector<int> sc = resultT->stateChanges();
2778 vector<unsigned> lv;
2779 for (
unsigned i = 0; i < sc.size(); i++) {
2781 unsigned l = unsigned(resultT->state(sc[i]).subset(2, 2));
2783 cout <<
"clk=" << sc[i] <<
" LUT output[" << i <<
"]=" << l << endl;
2785 bool found1or2 =
false;
2786 bool found3 =
false;
2787 for (
unsigned i = 0; i < lv.size(); i++) {
2788 if (found1or2 && (lv[i] > 0))
2789 cout <<
"!!! simulateTSF something wrong(found1or2)" << endl;
2790 if (found3 && (lv[i] == 3))
2791 cout <<
"!!! simulateTSF something wrong(found3)" << endl;
2793 if ((lv[i] == 1) & (lv[i] == 2))
2795 else if (lv[i] == 3)
2800 result.push_back(resultT);
2801 result.push_back(resultE);
2808 vector <TRGSignalVector*>
2809 TSFinder::simulateTSF2(TRGSignalVector* in,
unsigned tsid)
2815 TCSegment* tsi = _tsSL[tsid];
2816 vector <TRGSignalVector*> result;
2819 vector<bool> fTimeVect;
2823 TRGSignalVector* resultT =
new TRGSignalVector(na, in->clock(), 13);
2824 TRGSignalVector* resultE =
new TRGSignalVector(na, in->clock(), 10);
2825 TRGSignalVector* Hitmap =
new TRGSignalVector(na +
"HitMap",
2828 TRGSignalVector pTime(na +
"PriorityTime", in->clock(), 0);
2829 TRGSignalVector fTime(na +
"FastestTime", in->clock(), 0);
2830 TRGSignal* pri0 = 0;
2831 TRGSignal* pri1 = 0;
2832 TRGSignal* pri2 = 0;
2834 if (_type == innerType) {
2835 for (
unsigned i = 0; i < 16; i++) {
2836 Hitmap->push_back((* in)[i]);
2837 (* Hitmap)[i].widen(16);
2839 for (
unsigned i = 0; i < 4; i++) {
2840 pTime.push_back((* in)[i + 16]);
2841 fTime.push_back((* in)[i + 20]);
2843 pri0 = & (*Hitmap)[1];
2844 pri1 = & (*Hitmap)[2];
2845 pri2 = & (*Hitmap)[3];
2847 for (
unsigned i = 0; i < 12; i++) {
2848 Hitmap->push_back((* in)[i]);
2849 (* Hitmap)[i].widen(16);
2851 for (
unsigned i = 0; i < 4; i++) {
2852 pTime.push_back((* in)[i + 12]);
2853 fTime.push_back((* in)[i + 16]);
2855 pri0 = & (*Hitmap)[6];
2856 pri1 = & (*Hitmap)[7];
2857 pri2 = & (*Hitmap)[8];
2861 const TRGSignalVector& cc = in->clock().clockCounter();
2862 for (
unsigned i = 0; i < 5; i++) {
2863 pTime.push_back(cc[i]);
2864 fTime.push_back(cc[i]);
2867 vector<int> changeTime = Hitmap->stateChanges();
2869 vector<unsigned> luts;
2870 int lastFastHit = in->clock().min();
2872 if (changeTime.size()) {
2874 const string fn =
"TSF::simulateTSF2:tsid=" + to_string(tsid);
2880 unsigned stateHitPos = 0;
2881 unsigned hitPos = 0;
2882 unsigned timing = 0;
2883 int timePosFound = 0;
2886 unsigned stateLR = 0;
2890 for (
unsigned i = 0; i < changeTime.size(); i++) {
2892 const int ct = changeTime[i];
2893 const TRGState st = Hitmap->state(ct);
2897 const unsigned lut = tsi->LUT()->getValue(
unsigned(st));
2898 luts.push_back(lut);
2901 const bool active = st.active();
2903 const int timeCounter = ct - lastFastHit;
2906 if (timeCounter > 15) {
2908 TRGState ftnow = fTime.state(ct);
2909 ftnow += TRGState(1, 1);
2918 resultE->set(fTimeVect, ct);
2924 const bool hit1st = pri0->riseEdge(ct);
2925 const bool hit2nd0 = pri1->riseEdge(ct);
2926 const bool hit2nd1 = pri2->riseEdge(ct);
2927 const bool hit2nd = hit2nd0 || hit2nd1;
2932 if (stateHitPos == 0) {
2938 timing = unsigned(pTime.state(ct));
2941 }
else if (hit2nd) {
2942 if ((* Hitmap)[0].state(ct))
2946 timing = unsigned(pTime.state(ct));
2953 else if (stateHitPos == 1) {
2954 counterPos = ct - timePosFound;
2955 if (counterPos > 15)
2960 else if (stateHitPos == 2) {
2963 timing = unsigned(pTime.state(ct));
2967 counterPos = ct - timePosFound;
2968 if (counterPos > 15)
2975 cout <<
"TSF::simulateTSF2 !!! strange state in hit position"
2984 const unsigned val = (timing << 4) | (lut << 2) | hitPos;
2985 const TRGState output(13, val);
2986 resultT->set(output, ct);
2988 if ((lut == 1) || (lut == 2))
2994 if (((lut == 1) || (lut == 2)) && (stateHitPos == 0))
2996 <<
"!!! state machines incosistent" << endl;
3002 else if (stateLR == 1) {
3004 if (counterPos > 15)
3009 else if (stateLR == 2) {
3011 if ((lut == 1) || (lut == 2)) {
3012 const unsigned val = (timing << 4) | (lut << 2) |
3014 const TRGState output(13, val);
3015 resultT->set(output, ct);
3020 if (counterPos > 15)
3028 cout <<
"TSF::simulateTSF2 !!! strange state in L/R decision"
3036 <<
", pri=" << hit1st
3037 <<
", sec=" << hit2nd
3038 <<
", hPos=" << hitPos
3039 <<
", ctr=" << counterPos
3040 <<
", states=" << stateHitPos <<
"," << stateLR
3048 vector<int> sc = resultT->stateChanges();
3049 vector<unsigned> lv;
3050 for (
unsigned i = 0; i < sc.size(); i++) {
3052 unsigned l = unsigned(resultT->state(sc[i]).subset(2, 2));
3054 cout <<
"clk=" << sc[i] <<
" LUT output[" << i <<
"]=" << l << endl;
3058 result.push_back(resultT);
3059 result.push_back(resultE);
A Class to store the Monte Carlo particle information.
Low-level class to create/modify relations between StoreArrays.
int getEntries() const
Get the number of elements.
Accessor to arrays stored in the data store.
int getEntries() const
Get the number of objects in the array.
A class to represent a trigger board.
A class to represent a wire hit in CDC.
A class to represent a wire in CDC.
virtual const TRGSignal & signal(void) const =0
returns trigger output. Null will returned if no signal.
A class to represent a CDC merger board.
std::vector< TRGSignal * > _priMap
Internal data of the priority hit timing.
TClonesArray * m_hitPatternInformation
Stores hitpattern information.
std::vector< TRGSignal * > _edg4Map
Internal data of the edge timing information.
boardType _type
Unit type.
TRGSignalVector * packerOuterTracker(vector< TRGSignalVector * > &, vector< int > &, const unsigned)
Packing output for tracker.
vector< TRGSignalVector * > simulateTSF(TRGSignalVector *in, unsigned id)
Simulate TSF response (unified version, 2016/07/12)
std::vector< TRGSignal * > _edg0Map
Internal data of the edge timing information.
TRGSignalVector * packerForTracker(vector< TRGSignalVector * > &, vector< int > &, const unsigned)
Output packer for tracker.
TTree * m_treeInputTSF
ROOT TTree for input.
bool m_makeRootFile
make ROOT file or not
const TRGCDC & _cdc
Members.
TClonesArray * m_particleEfficiency
[Efficiency, Pt, # MC TS] Efficiency = -1 means that # MC TS is 0.
std::vector< TRGSignalVector * > _toBeDeleted
One time info. to be deleted in next event;.
std::vector< TRGSignal * > _edg1Map
Internal data of the edge timing information.
TClonesArray * m_nnPatternInformation
[superlayer id, lrDriftTime, timeWire0, timeWire1, ..., ...]
vector< TRGSignalVector * > simulateTSF2(TRGSignalVector *in, unsigned id)
Simulate TSF response (unified version, state machine)
TTree * m_treeOutputTSF
ROOT TTree for output.
std::vector< TRGSignal * > _edg2Map
Internal data of the edge timing information.
TClonesArray * m_tsInformation
[SuperLayer Id, Wire Id, Priority Timing]
std::vector< TRGSignalVector * > _tsfOut
TSF response storeage.
std::vector< TRGSignal * > _hitMap[5]
Internal data of wire hit map.
TTree * m_treeNNTSF
ROOT Tree for NNTSF.
std::vector< TRGSignal * > _secMap
Internal data of the priority cell hit position flag.
std::vector< TRGSignalVector * > _tsfIn
TSF input storage.
TFile * m_fileTSF
ROOT file.
std::vector< TRGSignal * > _edg3Map
Internal data of the edge timing information.
bool m_logicLUTFlag
0 is Logic. 1 is LUT.
std::vector< TRGSignal * > _fasMap
Internal data of the fastest hit timing.
boardType
enum of boardType of TrackSegmentFinder
A class to represent a wire hit in CDC.
A class to represent a wire in CDC.
The instance of TRGCDC is a singleton.
A class to represent a digitized signal. Unit is nano second.
A class to represent a bundle of SignalVectors.
A class to represent a bundle of digitized signals.
A class to represent a digitized signal. Unit is nano second.
A class to represent a state of multi bits.
static std::string itostring(int i)
converts int to string. (Use boost::lexical_cast)
static std::string tab(void)
returns tab spaces.
~TRGCDCTrackSegmentFinder()
Destructor.
const TRGSignalVector & set(const TRGState &, int clockPosition)
sets state at given clock.
static TRGCDC * getTRGCDC(void)
returns TRGCDC object.
void fastestTimingOuter(unsigned tsfID, const unsigned nTSF, TRGSignalVector &s) const
Make TRGSignals for the fastest timing bits.
int mcLR(void) const
returns mc left/right information
const TRGChannel * input(unsigned i) const
returns input channel i.
void simulateOuter(void)
Firmware simulation for the outers. yi.
TRGState state(int clockPosition) const
returns state at given clock position.
const TRGClock & clock(void) const
returns clock.
void priorityTiming(unsigned tsfID, const unsigned nTSF, TRGSignalVector &s, const TRGSignal ¢er, const TRGSignal &right, const TRGSignal &left) const
Make TRGSignals for the priority timing bits.
void terminate(void)
terminate
const TRGClock & clockData(void) const
returns data clock.
const CDCHit * hit(void) const
Access to CDCHit.
void push_back(const TRGCDCMerger *)
push back the Mergers of this TSF
void inputOuter(const unsigned id, const unsigned nTSF, TRGSignalVector *s)
Creates input signals to TSF for the outer.
const std::string & name(void) const
returns name.
std::vector< int > stateChanges(void) const
returns a list of clock position of state change.
static void enterStage(const std::string &stageName)
Declare that you enter new stage.
unsigned nInput(void) const
returns input channels.
TRGCDCTrackSegmentFinder(const TRGCDC &, bool makeRootFile, bool logicLUTFlag)
Constructor.
const TRGCDCCellHit * hit(void) const
returns a pointer to a TRGCDCCellHit.
const TRGSignal & signal(void) const override
returns an input to the trigger. This is sync'ed to 1GHz clock.
void simulateInner(void)
Firmware simulation for the outers. yi.
int max(void) const
returns max. clock point.
unsigned nSegments(void) const
returns # of track segments.
void saveTSFResults(std::vector< TRGCDCSegmentHit * > *segmentHitsSL)
save result of TSF
static void addID(TRGSignalVector &s, unsigned id)
Add TSF ID to timing signal vector for the output.
const TRGCDCWireHit * hit(void) const
returns a pointer to a TRGCDCWireHit.
unsigned nSuperLayers(void) const
returns # of super layers.
void saveTSInformation(std::vector< TRGCDCSegment * > &tss)
save the TS info
const TRGCDCSegment & segment(unsigned id) const
returns a track segment.
void hitMapOuter(void)
Creates the hit maps for the outer.
TRGSignalBundle * signal(void) const
returns signal.
void simulate2(void)
Firmware simulation. Unified version of inner and outer : yi.
bool state(int clockPosition) const
returns true if signal is active in given clock position.
void doit(std::vector< TRGCDCSegment * > &tss, const bool trackSegmentClockSimulation, std::vector< TRGCDCSegmentHit * > &segmentHits, std::vector< TRGCDCSegmentHit * > *segmentHitsSL)
Member functions of doing TSF.
static int level(void)
returns the debug level.
bool active(void) const
returns true if there is a signal.
const TRGSignalVector & clockCounter(void) const
returns the clock counter.
void inputInner(const unsigned id, const unsigned nTSF, TRGSignalVector *s)
Creates input signals to TSF for the inner.
const TRGCDCLayer * layer(unsigned id) const
returns a pointer to a layer. 0 will be returned if 'id' is invalid.
static void leaveStage(const std::string &stageName)
Declare that you leave a stage.
unsigned nCells(void) const
returns # of cells.
unsigned iCDCSimHit(void) const
return index of CDCSimHit
void saveNNTSInformation(std::vector< TRGCDCSegment * > &tss)
Saves NNTS information. Only when ts is hit.
void simulate(void)
Firmware simulation. yi.
void hitMapInner(void)
Creates the hit maps for the inner.
unsigned nOutput(void) const
returns output channels.
boardType type(void) const
board type of TSF
TRGChannel * output(unsigned i) const
returns output channel i.
void fastestTimingInner(unsigned tsfID, const unsigned nTSF, TRGSignalVector &s) const
Make TRGSignals for the fastest timing bits.
void dump(const std::string &message="", const std::string &pre="") const
dumps contents.
Abstract base class for different kinds of events.