165 {
166
177
178
179 std::vector<MuFilterPoint*> muFilterPoints;
180 std::vector<double> muArrivalTimes;
181 std::vector<int> muTrackIDs;
182
184 muFilterPoints.push_back(p);
185 muTrackIDs.push_back(
p->GetTrackID());
186
187 int detID =
p->GetDetectorID();
188
189 float propspeed;
190 if (floor(detID / 10000) == 3)
192 else
194
195 TVector3 vLeft,vRight;
196 TVector3 impact(
p->GetX(),
p->GetY(),
p->GetZ());
197 MuFilterDet->GetPosition(detID, vLeft, vRight);
198 TVector3 vTop = vLeft;
199
200
201 if ( (floor(detID/10000)==3&&detID%1000>59) ||
202 (floor(detID/10000)==1&&int(detID/1000)%10==2) ) {
203 double arrivalTime =
p->GetTime() + (vTop - impact).Mag() / propspeed;
204 muArrivalTimes.push_back(arrivalTime);
205 }
206
207 else{
208 double tLeft =
p->GetTime() + (vLeft - impact).Mag() / propspeed;
209 double tRight =
p->GetTime() + (vRight - impact).Mag() / propspeed;
210 double arrivalTime = std::min(tLeft, tRight);
211 muArrivalTimes.push_back(arrivalTime);
212 }
213 }
214
215 std::vector<size_t> idxM(muArrivalTimes.size());
216 std::iota(idxM.begin(), idxM.end(), 0);
217 std::sort(idxM.begin(), idxM.end(), [&](size_t a, size_t b) {
218 return muArrivalTimes[a] < muArrivalTimes[b];
219 });
220
221 std::vector<MuFilterPoint*> sortedMuPoints;
222 std::vector<double> sortedMuArrivalTimes;
223 std::vector<int> sortedMuTrackIDs;
224
225 sortedMuPoints.reserve(muFilterPoints.size());
226 sortedMuArrivalTimes.reserve(muArrivalTimes.size());
227 sortedMuTrackIDs.reserve(muTrackIDs.size());
228
229 for (auto i : idxM) {
230 sortedMuPoints.push_back(muFilterPoints[i]);
231 sortedMuArrivalTimes.push_back(muArrivalTimes[i]);
232 sortedMuTrackIDs.push_back(muTrackIDs[i]);
233 }
234
235
236 std::vector<ScifiPoint*> scifiPoints;
237 std::vector<double> scifiArrivalTimes;
238 std::vector<int> scifiTrackIDs;
239
241
243 scifiPoints.push_back(p);
244 scifiTrackIDs.push_back(
p->GetTrackID());
245
246 TVector3 impact(
p->GetX(),
p->GetY(),
p->GetZ());
247 int point_detID =
p->GetDetectorID();
248 int localFiberID = (point_detID)%100000;
249 int a_sipmChan = static_cast<int>(siPMFibres[localFiberID].begin()->first);
250 int detID_geo =
int(point_detID/100000)*100000+a_sipmChan;
251
253 ScifiDet->GetSiPMPosition(detID_geo, a, b);
254 bool verticalHit =
int(detID_geo / 100000) % 10 == 1;
255 double distance;
256 if (verticalHit) {
257 distance = (
b - impact).Mag();
258 } else {
259 distance = (impact -
a).Mag();
260 }
261 double arrivalTime =
p->GetTime() + distance /
signalSpeed;
262 scifiArrivalTimes.push_back(arrivalTime);
263 }
264
265 std::vector<size_t> idxS(scifiArrivalTimes.size());
266 std::iota(idxS.begin(), idxS.end(), 0);
267 std::sort(idxS.begin(), idxS.end(), [&](size_t a, size_t b) {
268 return scifiArrivalTimes[a] < scifiArrivalTimes[b];
269 });
270
271 std::vector<ScifiPoint*> sortedScifiPoints;
272 std::vector<double> sortedScifiArrivalTimes;
273 std::vector<int> sortedScifiTrackIDs;
274
275 sortedScifiPoints.reserve(scifiPoints.size());
276 sortedScifiArrivalTimes.reserve(scifiArrivalTimes.size());
277 sortedScifiTrackIDs.reserve(scifiTrackIDs.size());
278
279 for (auto i : idxS) {
280 sortedScifiPoints.push_back(scifiPoints[i]);
281 sortedScifiArrivalTimes.push_back(scifiArrivalTimes[i]);
282 sortedScifiTrackIDs.push_back(scifiTrackIDs[i]);
283 }
284
285
286 std::vector<ShipMCTrack*> mcTrackClones;
288 mcTrackClones.push_back(t);
289 }
290
291
292 double tMufi = sortedMuArrivalTimes.empty() ? -1 : sortedMuArrivalTimes.front();
293 double tScifi = sortedScifiArrivalTimes.empty() ? -1 : sortedScifiArrivalTimes.front();
294 bool hasMCPoints = (tMufi >= 0 || tScifi >= 0);
295 double firstT = hasMCPoints ? (tMufi < 0 ? tScifi : (tScifi < 0 ? tMufi : std::min(tMufi, tScifi))): 0;
296
297 if (!hasMCPoints) {
302 return;
303 }
304
305
306 auto idsMufi =
OrderedIds(sortedMuArrivalTimes, firstT);
307 auto idsScifi =
OrderedIds(sortedScifiArrivalTimes, firstT);
308
309 bool FirstEvent = true;
310
311 std::vector<int> used;
312 int i_mufi = 0, i_scifi = 0, sliceMufi = 0, sliceScifi = 0;
313
314 while (i_mufi < (int)sortedMuArrivalTimes.size() || i_scifi < (int)sortedScifiArrivalTimes.size()) {
315
316
317
318
322
323 std::vector<MuFilterPoint*> muSlicePoints;
324 std::vector<ScifiPoint*> scifiSlicePoints;
326
327
328 if (sliceMufi==0 && sliceScifi==0){
330
331
332 if (mcTrackClones.size()>1 && std::set({12,14,16}).
count(fabs(mcTrackClones[1]->GetPdgCode()))){
334 }
335 }
336
337
338 while (i_mufi < (int)sortedMuArrivalTimes.size() && idsMufi[i_mufi] == sliceMufi) {
340 muSlicePoints.push_back(origMu);
341 Int_t trackID = origMu->GetTrackID();
342 Int_t detID = origMu->GetDetectorID();
343 TVector3
pos; origMu->Position(pos);
344 TVector3
mom; origMu->Momentum(mom);
345 Double_t time = origMu->GetTime();
346 Double_t
length = origMu->GetLength();
347 Double_t eLoss = origMu->GetEnergyLoss();
348 Int_t pdgCode = origMu->
PdgCode();
349
351 MuFilterPoint(trackID, detID, pos, mom, time, length, eLoss, pdgCode);
352
353 int tid = sortedMuTrackIDs[i_mufi++];
354
355 if (tid != -2) {
357 }
358 }
359 ++sliceMufi;
360
361
362 while (i_scifi < (int)sortedScifiArrivalTimes.size() && idsScifi[i_scifi] == sliceScifi) {
363 ScifiPoint* origSci = sortedScifiPoints[i_scifi];
364 scifiSlicePoints.push_back(origSci);
365 Int_t trackID = origSci->GetTrackID();
366 Int_t detID = origSci->GetDetectorID();
367 TVector3
pos; origSci->Position(pos);
368 TVector3
mom; origSci->Momentum(mom);
369 Double_t time = origSci->GetTime();
370 Double_t
length = origSci->GetLength();
371 Double_t eLoss = origSci->GetEnergyLoss();
372 Int_t pdgCode = origSci->
PdgCode();
373
375 ScifiPoint(trackID, detID, pos, mom, time, length, eLoss, pdgCode);
376
377 int tid = sortedScifiTrackIDs[i_scifi++];
378
379 if (tid != -2) {
381 }
382 }
383 ++sliceScifi;
384
385
390 FirstEvent = false;
391 continue;
392 }
397 FirstEvent = false;
398 continue;
399 }
400
405 FirstEvent = false;
406 continue;
407 }
408
409
411 if (FirstEvent) {
413 FirstEvent = false;
414 break;
415 }
416 }
417
418 else {
420 }
421 }
422}
bool FastNoiseFilterScifi_Hits(TClonesArray *scifiArray, const std::map< Int_t, std::map< Int_t, std::array< float, 2 > > > &siPMFibres)
bool FastNoiseFilterMu_Boards(TClonesArray *muArray)
bool FastNoiseFilterMu_Hits(TClonesArray *muArray)
std::vector< int > OrderedIds(const std::vector< double > ×, double firstTime) const
bool AdvancedNoiseFilterScifi(TClonesArray *scifiArray, const std::map< Int_t, std::map< Int_t, std::array< float, 2 > > > &siPMFibres)
bool FastNoiseFilterScifi_Boards(TClonesArray *scifiArray, const std::map< Int_t, std::map< Int_t, std::array< float, 2 > > > &siPMFibres)
bool AdvancedNoiseFilterMu(TClonesArray *muArray)