29 {
30 MsgStream log(
msgSvc(), name() );
31 log << MSG::INFO << "in execute()" << endmsg;
32
33
34 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
35 if ( !eventHeader )
36 {
37 log << MSG::FATAL << "Could not find Event Header" << endmsg;
38 return StatusCode::FAILURE;
39 }
40 log << MSG::DEBUG << "Retrieved event: " << eventHeader->eventNumber()
41 << " run: " << eventHeader->runNumber() << endmsg;
42
43
44 DataObject* aRecEvent = 0;
45 eventSvc()->findObject( "/Event/Recon", aRecEvent );
46 if ( aRecEvent == 0 )
47 {
48 aRecEvent = new ReconEvent();
49 StatusCode sc = eventSvc()->registerObject( "/Event/Recon", aRecEvent );
50 if ( sc.isFailure() )
51 {
52 log << MSG::FATAL << "Could not register ReconEvent" << endmsg;
53 return StatusCode::FAILURE;
54 }
55 }
56
59 if ( sc.isFailure() )
60 {
61 log << MSG::FATAL << "Could not register RecZddChannelCol" << endmsg;
62 return StatusCode::FAILURE;
63 }
64
65
66
67 if ( m_errStat ) return StatusCode::SUCCESS;
68
69
70 SmartDataPtr<Event::ZddEvent> zddEvt( eventSvc(), "/Event/ZddEvent" );
71 int zddCheck = zddDataStat( zddEvt.ptr(), eventHeader->eventNumber() + 1 );
72
73 if ( zddCheck != 0 )
74 {
75 if ( zddCheck < 0 )
76 {
77
78 m_errStat = true;
79
80 if ( m_errQuit )
81 {
82 return StatusCode::FAILURE;
83 }
84 }
85
86
87 return StatusCode::SUCCESS;
88 }
89
90
91 double bes3_t0 = -10000.0;
92 SmartDataPtr<RecEsTimeCol> evTimeCol( eventSvc(), "/Event/Recon/RecEsTimeCol" );
93 if ( !evTimeCol || evTimeCol->size() == 0 )
94 {
95 log << MSG::WARNING << " Could not find RecEsTimeCol" << endmsg;
96
97 }
98 else
99 {
100 RecEsTimeCol::iterator iter_evt = evTimeCol->begin();
101 if ( iter_evt != evTimeCol->end() )
102 {
103 bes3_t0 = ( *iter_evt )->getTest();
104
105 bes3_t0 = 6400 - bes3_t0;
106 }
107 }
108
109
111
112
113 Event::ZddEvent::Channels::const_iterator end_ch = chs.end();
114 for ( Event::ZddEvent::Channels::const_iterator it = chs.begin(); it != end_ch; ++it )
115 {
116 const ZddChannel* pch = *it;
118
119
120
121 RecZddChannel* recZddCh = new RecZddChannel;
124 double e_K = getEK( pch->
getChId() );
125
126
127 int maxSamples = 800;
128 unsigned char waveform[800];
129 memset( waveform, 0, maxSamples );
130 ZddChannel::Fragments::const_iterator end_fg = frags.end();
131 bool quit_event = false;
132 int start = 0;
133 for ( ZddChannel::Fragments::const_iterator jt = frags.begin(); jt != end_fg; ++jt )
134 {
135 const ZddFragment& frag = *jt;
136
137
138
139
140
142
143
144 if ( start + frag.
length > maxSamples )
145 {
147 MsgStream log(
msgSvc(), name() );
148 log << MSG::ERROR << "ZDD BAD DATA: CAEN corruption problem" << endmsg;
149 quit_event = true;
150 break;
151 }
152
153 for (
int i = 0; i < frag.
length; ++i ) waveform[start++] = frag.
sample[i];
154 }
155
156
157 unsigned char threshold = 20;
158 unsigned char rephaseThreshold = 40;
159 unsigned char minSample = 255, maxSample = -1;
160 int maxTime = -1;
161 bool closed = true;
162 int phases[4] = { -1, -1, -1, -1 };
163 for ( int pt = 0; pt < maxSamples; pt++ )
164 {
165 bool notZero = waveform[pt] > 0;
166 bool smaller = waveform[pt] < minSample;
167 if ( notZero && smaller ) minSample = waveform[pt];
168 if ( waveform[pt] > threshold )
169 {
170 if ( closed )
171 {
172 closed = false;
173 maxSample = waveform[pt];
174 maxTime = pt;
175 }
176 else
177 {
178 if ( waveform[pt] > maxSample )
179 {
180 maxSample = waveform[pt];
181 maxTime = pt;
182 }
183 }
184 }
185 else
186 {
187 if ( !closed )
188 {
189 closed = true;
190 double tNsec = 2. * maxTime;
192 maxSample * e_K );
193
194
195 if ( maxSample > rephaseThreshold )
196 {
197 int phase = maxTime % 4;
198 phases[phase]++;
199 }
200 }
201 }
202 }
203 if ( !closed )
204 {
205 closed = true;
206 double tNsec = 2. * maxTime;
208
209 if ( maxSample > rephaseThreshold )
210 {
211 int phase = maxTime % 4;
212 phases[phase]++;
213 }
214 }
215
216
217 int mostProb = -1;
218 int chPhase = -1;
219 for ( int ph = 0; ph < 4; ph++ )
220 {
221 if ( phases[ph] > mostProb )
222 {
223 mostProb = phases[ph];
224 chPhase = ph;
225 }
226 }
227
228 if ( chPhase == -1 )
229 {
231 chPhase = -2;
232 }
233
236 recZddCol->push_back( recZddCh );
237
238
239
240
241
242
243
244
245
246
247 if ( quit_event )
248 break;
249
250 }
251 return StatusCode::SUCCESS;
252}
ObjectVector< RecZddChannel > RecZddChannelCol
std::vector< ZddChannel * > Channels
void setBaseLine(int baseLine)
void setScanCode(int scanCode)
void setChannelId(int chId)
void addFragment(int time, float energy)
const Fragments & fragments() const
std::vector< ZddFragment > Fragments
_EXTERN_ std::string RecZddChannelCol