53 if ( !afpSiHitContainer.
isValid() ) {
55 return StatusCode::SUCCESS;
60 if ( !afpTrackContainer.
isValid() ) {
62 return StatusCode::SUCCESS;
67 if ( !afpToFHitContainer.
isValid() ) {
69 return StatusCode::SUCCESS;
99 std::vector<std::pair<int, int>> fsp[ 2 ][ 2 ] = {};
100 std::vector<std::pair<int, int>> fsp_full[ 4 ][ 2 ] = {};
103 if ( hitsItr->stationID() != 0 && hitsItr->stationID() != 3 )
continue;
104 int side = hitsItr->stationID() / 2;
105 if ( hitsItr->pixelLayerID() >= 0 && hitsItr->pixelLayerID() < 4 )
107 int plane_full = hitsItr->pixelLayerID();
108 fsp_full[ plane_full ][ side ].emplace_back( hitsItr->pixelRowIDChip(), hitsItr->pixelColIDChip() );
111 if ( hitsItr->pixelLayerID() != 0 && hitsItr->pixelLayerID() != 2 )
continue;
112 int plane = hitsItr->pixelLayerID() / 2;
114 fsp[ plane ][ side ].emplace_back( hitsItr->pixelRowIDChip(), hitsItr->pixelColIDChip() );
117 int numToFHitsTrain[ 4 ][ 2 ] = {};
118 bool ToFHasHit =
false;
121 int side = hitsItr->stationID() / 2;
122 float bar = hitsItr->trainID() + hitsItr->barInTrainID() / 4.0;
123 for (
auto&
coord : fsp[ 0 ][ side ] ) {
125 if ( fsp[ 0 ][ side ].
size() == 2 && fsp[ 1 ][ side ].
size() == 2 ) {
126 for (
auto& coord2 : fsp[ 1 ][ side ] ) {
127 match |= std::abs( coord2.first -
coord.first ) < 3 && std::abs( coord2.second -
coord.second ) < 2;
131 lqbar_tight[ side ] = bar;
132 fsp0_rows_tight[ side ] =
coord.first;
133 fsp0_columns_tight[ side ] =
coord.second;
135 fill( afpToFsiToolStr, lqbar_tight[ side ], fsp0_rows_tight[ side ] );
136 fill( afpToFsiToolStr, lqbar_tight[ side ], fsp0_columns_tight[ side ] );
138 lqbar_tight[ side ] = -0.5;
140 fill( afpToFsiToolStr, lqbar_tight[ side ], fsp0_rows_tight[ side ] );
141 fill( afpToFsiToolStr, lqbar_tight[ side ], fsp0_columns_tight[ side ] );
145 for (
int j = 0; j < 4; j++)
146 for (
auto&
coord : fsp_full[ j ][ side ] )
149 fs_rows[ side ] =
coord.first;
150 fs_columns[ side ] =
coord.second;
151 fs_rows_full[ side ] =
coord.first;
154 fill( afpToFsiToolStr, lqbar[ side ], fs_rows_full[ side ] );
157 for (
int j = 0; j < 4; j++)
159 if ( fsp_full[ j ][ side ].
empty() )
162 fs_columns[ side ] = -5;
163 for (
int k = -10; k < -1; ++k )
166 fs_rows_full[ side ] = k;
173 ++numToFHitsTrain[ hitsItr->trainID() ][ side ];
179 for (
auto side : { 0, 1 } ) {
180 bool wasMatch =
false;
181 if ( fsp[ 0 ][ side ].
size() == 2 && fsp[ 1 ][ side ].
size() == 2 ) {
182 for (
auto&
coord : fsp[ 0 ][ side ] ) {
184 for (
auto& coord2 : fsp[ 1 ][ side ] ) {
185 match |= std::abs( coord2.first -
coord.first ) < 3 && std::abs( coord2.second -
coord.second ) < 2;
188 for (
int itrain = 0; itrain < 4; ++itrain ) {
189 trainHits[ side ] = itrain + numToFHitsTrain[ itrain ][ side ] / 5.0;
190 fsp0_rows_tight[ side ] =
coord.first;
191 fsp0_columns_tight[ side ] =
coord.second;
193 fill( afpToFsiToolStr, trainHits[ side ], fsp0_rows_tight[ side ] );
194 fill( afpToFsiToolStr, trainHits[ side ], fsp0_columns_tight[ side ] );
196 if ( numToFHitsTrain[ 0 ][ side ] > 4 || numToFHitsTrain[ 1 ][ side ] > 4
197 || numToFHitsTrain[ 2 ][ side ] > 4 || numToFHitsTrain[ 3 ][ side ] > 4 ) {
198 trainHits[ side ] = -1;
199 fsp0_rows_tight[ side ] =
coord.first;
200 fsp0_columns_tight[ side ] =
coord.second;
202 fill( afpToFsiToolStr, trainHits[ side ], fsp0_rows_tight[ side ] );
203 fill( afpToFsiToolStr, trainHits[ side ], fsp0_columns_tight[ side ] );
211 for (
auto&
coord : fsp[ 0 ][ side ] ) {
213 lqbar_tight[ side ] = -1;
214 fsp0_rows_tight[ side ] =
coord.first;
215 fsp0_columns_tight[ side ] =
coord.second;
217 fill( afpToFsiToolStr, lqbar_tight[ side ], fsp0_rows_tight[ side ] );
218 fill( afpToFsiToolStr, lqbar_tight[ side ], fsp0_columns_tight[ side ] );
221 for (
int j = 0; j < 4; j++)
222 for (
auto&
coord : fsp_full[ j ][ side ] )
225 fs_rows[ side ] =
coord.first;
226 fs_columns[ side ] =
coord.second;
232 fsp0Hits[ side ] = fsp[ 0 ][ side ].size();
233 fill( afpToFsiToolStr, tofHits[ side ], fsp0Hits[ side ] );
256 bool bar_hit[2][5] = {};
257 bool channel_present[2][16] = {};
258 bool multihit[2] = {};
259 uint8_t track_train[2] = {};
260 std::size_t track_count[2] = {};
264 const auto side = tracksItr->stationID() == 3;
267 if (tracksItr->stationID() != 0 && tracksItr->stationID() != 3)
270 const auto xLocal = tracksItr->xLocal();
271 for (uint8_t train = 0; train < 4; ++train) {
275 track_train[side] = train;
281 const auto side = hitsItr->stationID() == 3;
282 const auto train = hitsItr->trainID();
283 const auto bar = hitsItr->barInTrainID();
284 const auto channel = 4 * train + bar;
287 if (hitsItr->stationID() != 0 && hitsItr->stationID() != 3)
289 if (channel >= 16)
continue;
291 if (train == track_train[side])
292 bar_hit[side][bar] = bar_hit[side][4] =
true;
293 if (channel_present[side][channel])
294 multihit[side] =
true;
295 channel_present[side][channel] =
true;
298 for (uint8_t side : {0, 1}) {
300 if (track_count[side] != 1)
continue;
302 if (multihit[side])
continue;
304 tof_eff_OFF_trains[side] = track_train[side];
305 for (uint8_t bar = 0; bar <= 4; ++bar) {
306 tof_eff_OFF_bars[side] = bar;
307 tof_eff_OFF_passed[side] = bar_hit[side][bar];
308 fill( afpToFsiToolStr, tof_eff_OFF_passed[side], tof_eff_OFF_bars[side], tof_eff_OFF_trains[side] );
312 return StatusCode::SUCCESS;