/** LitTrackFitter.h * @author Andrey Lebedev * @since 2009 * @version 1.0 * * Functions to fit a track * for fast parallel version of the Littrack tracking. **/ #ifndef LITTRACKFITTER_H_ #define LITTRACKFITTER_H_ #include "parallel/LitTypes.h" #include "parallel/LitTrackParam.h" #include "parallel/LitDetectorGeometry.h" #include "parallel/LitExtrapolation.h" #include "parallel/LitFiltration.h" #include "parallel/LitAddMaterial.h" /* Performs SIMDized/scalar fast track fit. * Number of hits must be equal to the number of stations. * */ template inline void LitTrackFitter( LitTrack& track, const LitDetectorLayout& layout) { // track.paramLast = track.paramFirst; LitTrackParam& par = track.paramLast; unsigned char ihit = 0; for (unsigned char isg = 0; isg < layout.GetNofStationGroups(); isg++) { const LitStationGroup& 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 LitSubstation& ss1 = stationGroup.stations[0].substations[0]; const LitSubstation& 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 LitStation& station = stationGroup.stations[ist]; // const LitSubstation& substation0 = station.substations[0]; // LitRK4Extrapolation(par, substation0.Z, field); // LitAddMaterial(par, substation0.material); for (unsigned char iss = 0; iss < station.GetNofSubstations(); iss++) { const LitSubstation& 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++; } } } #endif /* LITTRACKFITTER_H_ */