/** LitTrackFitterMuon.h * @author Andrey Lebedev * @since 2009 * @version 1.0 * * Functions to fit a track. **/ #ifndef LITTRACKFITTERMUON_H_ #define LITTRACKFITTERMUON_H_ #include "LitDetectorGeometryMuon.h" #include "../LitTypes.h" #include "../LitTrackParam.h" #include "../LitExtrapolation.h" #include "../LitFiltration.h" #include "../LitAddMaterial.h" namespace lit { namespace parallel { /* Performs SIMDized/scalar fast track fit. * Number of hits must be equal to the number of stations. * */ template inline void LitTrackFitterMuon( LitTrack& track, const LitDetectorLayoutMuon& layout) { // track.paramLast = track.paramFirst; LitTrackParam& par = track.paramLast; unsigned char ihit = 0; for (unsigned char isg = 0; isg < layout.GetNofStationGroups(); isg++) { const LitStationGroupMuon& stationGroup = layout.stationGroups[isg]; //Propagation through the absorber LitFieldRegion field; LitFieldValue v1, v2; const LitAbsorber& absorber = stationGroup.absorber; absorber.fieldSliceFront.GetFieldValue(par.X, par.Y, v1); absorber.fieldSliceBack.GetFieldValue(par.X, par.Y, v2); field.Set(v1, absorber.fieldSliceFront.Z, v2, absorber.fieldSliceBack.Z); LitRK4Extrapolation(par, absorber.Z, field); LitAddMaterial(par, absorber.material); //Approximate the field between the absorbers const LitSubstationMuon& ss1 = stationGroup.stations[0].substations[0]; const LitSubstationMuon& ss2 = stationGroup.stations[1].substations[0]; ss1.fieldSlice.GetFieldValue(par.X, par.Y, v1); ss2.fieldSlice.GetFieldValue(par.X, par.Y, v2); field.Set(v1, ss1.fieldSlice.Z, v2, ss2.fieldSlice.Z); for (unsigned char ist = 0; ist < stationGroup.GetNofStations(); ist++) { const LitStationMuon& station = stationGroup.stations[ist]; // const LitSubstationMuon& substation0 = station.substations[0]; // LitRK4Extrapolation(par, substation0.Z, field); // LitAddMaterial(par, substation0.material); for (unsigned char iss = 0; iss < station.GetNofSubstations(); iss++) { const LitSubstationMuon& substation = station.substations[iss]; // Propagation through station LitRK4Extrapolation(par, substation.Z, field); // LitLineExtrapolation(par, substation.Z); LitAddMaterial(par, substation.material); } LitPixelHit* hit = track.hits[ihit]; LitFiltration(par, *hit); ihit++; } } } } // namespace parallel } // namespace lit #endif /* LITTRACKFITTERMUON_H_ */