26 {
27 MsgStream log(
msgSvc(), name() );
28 log << MSG::DEBUG << "TrigEventMaker: in execute()" << endmsg;
29
30
31
32 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
33 if ( !eventHeader )
34 {
35 log << MSG::FATAL << "Could not find Event Header" << endmsg;
36 return StatusCode::FAILURE;
37 }
38
39 int eventId = eventHeader->eventNumber();
40 int runId = eventHeader->runNumber();
41 log << MSG::INFO << "TrigEventMaker: retrieved event: "
42 << " Event Number " << eventId << " run: " << runId << endmsg;
43
44
45 int trgCond[48];
46 int trgChan[16];
47 int window = 0;
48 int timing = 0;
49 bool preScale = false;
50
51
52 for ( int i = 0; i < 48; i++ )
53 {
54 if ( i < 16 ) trgChan[i] = 0;
55 trgCond[i] = 0;
56 }
57
58
59 SmartDataPtr<TrigGTDCol> trigGTDCol( eventSvc(), "/Event/Trig/TrigGTDCol" );
60 if ( !trigGTDCol )
61 {
62 log << MSG::FATAL << "Could not find TrigGTDCol!" << endmsg;
63 return StatusCode::FAILURE;
64 }
65
66 TrigGTDCol::iterator
iter = trigGTDCol->begin();
67 for ( ;
iter != trigGTDCol->end();
iter++ )
68 {
69 const uint32_t boardId =
70 ( *iter )->getId();
71 const uint32_t timeWindow =
72 ( *iter )->getTimeWindow();
73
74 const uint32_t size =
75 ( *iter )->getDataSize();
76 const uint32_t* trigData = ( *iter )->getDataPtr();
77
78 window = timeWindow;
79
80
81 if ( boardId == 0xd3 )
82 {
83 if ( size % timeWindow != 0 )
84 {
85 log << MSG::FATAL << "GTL data is NOT completed" << endmsg;
86 return StatusCode::FAILURE;
87 }
88 for ( uint32_t j = 0; j < size; j++ )
89 {
90 uint32_t dataId = ( ( trigData[j] >> 24 ) & 0x7 );
91 if ( dataId != 5 ) continue;
92 for ( uint32_t i = 1, loop = 0; loop < 24; i <<= 1, loop++ )
93 {
94 if ( loop < 16 )
95 {
96 if ( trigData[j] & i ) trgChan[loop] = 1;
97 }
98 if ( ( loop == 16 ) && ( trigData[j] & i ) ) timing = 1;
99 if ( ( loop == 17 ) && ( trigData[j] & i ) && ( timing != 1 ) ) timing = 2;
100 if ( ( loop == 18 ) && ( trigData[j] & i ) && ( timing == 0 ) ) timing = 3;
101 if ( ( loop == 21 ) && ( trigData[j] & i ) ) preScale = true;
102 }
103 }
104 }
105
106 if ( boardId == 0xd2 || boardId == 0xd4 || boardId == 0xd6 )
107 {
108 for ( uint32_t j = 0; j < size; j++ )
109 {
110 uint32_t dataId = ( ( trigData[j] >> 16 ) & 0xFF );
111 if ( dataId != 4 ) continue;
112 for ( uint32_t i = 1, loop = 0; loop < 16; i <<= 1, loop++ )
113 {
114 if ( ( boardId == 0xd2 ) && ( trigData[j] & i ) ) trgCond[32 + loop] = 1;
115 if ( ( boardId == 0xd4 ) && ( trigData[j] & i ) ) trgCond[16 + loop] = 1;
116 if ( ( boardId == 0xd6 ) && ( trigData[j] & i ) ) trgCond[loop] = 1;
117 }
118 }
119 }
120 }
121
122
123 TrigData* aTrigData =
new TrigData( window, timing, trgCond, trgChan, preScale );
124
125 StatusCode sc = StatusCode::SUCCESS;
127 if ( sc != StatusCode::SUCCESS )
128 {
129 log << MSG::DEBUG << "Could not register TrigData" << endmsg;
130 return StatusCode::FAILURE;
131 }
132
133 return StatusCode::SUCCESS;
134}
_EXTERN_ std::string TrigData