179 std::vector<MuFilterPoint*> muFilterPoints;
180 std::vector<double> muArrivalTimes;
181 std::vector<int> muTrackIDs;
183 for (
auto* p : ROOT::RRangeCast<MuFilterPoint*, false, decltype(*fInMufiArray)>(*
fInMufiArray)) {
184 muFilterPoints.push_back(p);
185 muTrackIDs.push_back(p->GetTrackID());
187 int detID = p->GetDetectorID();
190 if (floor(detID / 10000) == 3)
191 propspeed = DsPropSpeed;
193 propspeed = VandUpPropSpeed;
195 TVector3 vLeft,vRight;
196 TVector3 impact(p->GetX(), p->GetY(), p->GetZ());
198 TVector3 vTop = vLeft;
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);
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);
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];
221 std::vector<MuFilterPoint*> sortedMuPoints;
222 std::vector<double> sortedMuArrivalTimes;
223 std::vector<int> sortedMuTrackIDs;
225 sortedMuPoints.reserve(muFilterPoints.size());
226 sortedMuArrivalTimes.reserve(muArrivalTimes.size());
227 sortedMuTrackIDs.reserve(muTrackIDs.size());
229 for (
auto i : idxM) {
230 sortedMuPoints.push_back(muFilterPoints[i]);
231 sortedMuArrivalTimes.push_back(muArrivalTimes[i]);
232 sortedMuTrackIDs.push_back(muTrackIDs[i]);
236 std::vector<ScifiPoint*> scifiPoints;
237 std::vector<double> scifiArrivalTimes;
238 std::vector<int> scifiTrackIDs;
240 float signalSpeed = ScifisignalSpeed;
242 for (
auto* p : ROOT::RRangeCast<ScifiPoint*, false, decltype(*fInSciFiArray)>(*
fInSciFiArray)) {
243 scifiPoints.push_back(p);
244 scifiTrackIDs.push_back(p->GetTrackID());
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;
254 bool verticalHit = int(detID_geo / 100000) % 10 == 1;
257 distance = (b - impact).Mag();
259 distance = (impact - a).Mag();
261 double arrivalTime = p->GetTime() + distance / signalSpeed;
262 scifiArrivalTimes.push_back(arrivalTime);
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];
271 std::vector<ScifiPoint*> sortedScifiPoints;
272 std::vector<double> sortedScifiArrivalTimes;
273 std::vector<int> sortedScifiTrackIDs;
275 sortedScifiPoints.reserve(scifiPoints.size());
276 sortedScifiArrivalTimes.reserve(scifiArrivalTimes.size());
277 sortedScifiTrackIDs.reserve(scifiTrackIDs.size());
279 for (
auto i : idxS) {
280 sortedScifiPoints.push_back(scifiPoints[i]);
281 sortedScifiArrivalTimes.push_back(scifiArrivalTimes[i]);
282 sortedScifiTrackIDs.push_back(scifiTrackIDs[i]);
286 std::vector<ShipMCTrack*> mcTrackClones;
287 for (
auto* t : ROOT::RRangeCast<ShipMCTrack*, false, decltype(*fInMCTrackArray)>(*
fInMCTrackArray)) {
288 mcTrackClones.push_back(t);
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;
306 auto idsMufi =
OrderedIds(sortedMuArrivalTimes, firstT);
307 auto idsScifi =
OrderedIds(sortedScifiArrivalTimes, firstT);
309 bool FirstEvent =
true;
311 std::vector<int> used;
312 int i_mufi = 0, i_scifi = 0, sliceMufi = 0, sliceScifi = 0;
314 while (i_mufi < (
int)sortedMuArrivalTimes.size() || i_scifi < (
int)sortedScifiArrivalTimes.size()) {
323 std::vector<MuFilterPoint*> muSlicePoints;
324 std::vector<ScifiPoint*> scifiSlicePoints;
328 if (sliceMufi==0 && sliceScifi==0){
332 if (mcTrackClones.size()>1 && std::set({12,14,16}).count(fabs(mcTrackClones[1]->GetPdgCode()))){
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();
351 MuFilterPoint(trackID, detID, pos, mom, time, length, eLoss, pdgCode);
353 int tid = sortedMuTrackIDs[i_mufi++];
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();
375 ScifiPoint(trackID, detID, pos, mom, time, length, eLoss, pdgCode);
377 int tid = sortedScifiTrackIDs[i_scifi++];