diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
index e8daf6cea653aac8a9793fb493d7e0d40ebd01b2..7dc182d8b6a8dd0c4083105d436875ddc2cd903b 100644
--- a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
+++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
@@ -40,6 +40,7 @@ ClusterFitAlg::ClusterFitAlg(const std::string& name, ISvcLocator* pSvcLocator)
 // Initialize method:
 StatusCode ClusterFitAlg::initialize() {
   ATH_MSG_INFO("ClusterFitAlg::initialize()");
+  ATH_MSG_ALWAYS("zCenter: " << m_zCenter[0] << " / " << m_zCenter[1] << " / " << m_zCenter[2] << " / " << m_zCenter[3]);
 
   ATH_CHECK(m_faserTriggerDataKey.initialize());
   ATH_CHECK(m_clusterContainerKey.initialize());
@@ -76,9 +77,11 @@ StatusCode ClusterFitAlg::execute(const EventContext& ctx) const
 
   SG::ReadHandle<xAOD::FaserTriggerData> triggerContainer{m_faserTriggerDataKey, ctx};
   ATH_CHECK(triggerContainer.isValid());
-
+  uint32_t eventNumber = triggerContainer->eventId();
   uint8_t triggerBits = triggerContainer->tap();
+//   if ((triggerBits & 0x4) == 0) 
   if (m_triggerMask != 0 && ((triggerBits & m_triggerMask) == 0))
+//   if (eventNumber != 10841)
   {
       ATH_CHECK(trackContainer.record(std::move(outputTracks)));
       return StatusCode::SUCCESS;
@@ -111,22 +114,65 @@ StatusCode ClusterFitAlg::execute(const EventContext& ctx) const
         const TrackerDD::SiDetectorElement* elem = (*clusters)->detectorElement();
         if (elem != nullptr)
         {
-            ATH_MSG_VERBOSE("( " << m_idHelper->wafer_hash(elem->identify()) << " = " << m_idHelper->layer(elem->identify()) <<  "/" << m_idHelper->eta_module(elem->identify()) << "/" << m_idHelper->phi_module(elem->identify()) << "|" << m_idHelper->side(elem->identify()) <<
+            ATH_MSG_VERBOSE("( " << m_idHelper->wafer_hash(elem->identify()) << " = " << m_idHelper->station(elem->identify()) << "/" << m_idHelper->layer(elem->identify()) <<  "/" << m_idHelper->eta_module(elem->identify()) << "/" << m_idHelper->phi_module(elem->identify()) << "|" << m_idHelper->side(elem->identify()) <<
                          " ): isStereo? " << elem->isStereo() << " sinStereo: " << elem->sinStereo() << " Swap phi? " << elem->swapPhiReadoutDirection() << " Depth, Eta, Phi directions: " << 
                          elem->hitDepthDirection() << " : " << elem->hitEtaDirection() << " : " << elem->hitPhiDirection() << " / zGlobal = " << (*clusters)->globalPosition().z());
-            stations.emplace(m_idHelper->station(elem->identify()));
+            Identifier id = elem->identify();
+            stations.emplace(m_idHelper->station(id));
             clusterInfo* info = new clusterInfo { };
             info->cluster  = *clusters;
-            info->sinAlpha = elem->sinStereo();
-            info->cosAlpha = sqrt(1.0 - info->sinAlpha * info->sinAlpha);
+            double alpha = std::abs(asin(elem->sinStereo()));
+            int layer = m_idHelper->layer(id);
+            int eta = m_idHelper->eta_module(id); // -1 or +1
+            int etaIndex = (eta + 1)/2; // 0 or 1
+            int phi = m_idHelper->phi_module(id); // 0 to 3
+            int moduleIndex = ((etaIndex + phi)%2 == 1 ? phi : phi + 4); // 0 to 7
+            switch (moduleIndex)
+            {
+                case 0:
+                case 2:
+                {
+                    // info->sinAlpha = sin(alpha);
+                    // info->cosAlpha = -cos(alpha);
+                    info->sinAlpha = -sin(alpha);
+                    info->cosAlpha = cos(alpha);
+                    break;
+                }
+                case 1:
+                case 3:
+                {
+                    info->sinAlpha = -sin(alpha);
+                    info->cosAlpha = cos(alpha);
+                    break;
+                }
+                case 4:
+                case 6:
+                {
+                    // info->sinAlpha = -sin(alpha);
+                    // info->cosAlpha = -cos(alpha);
+                    info->sinAlpha = sin(alpha);
+                    info->cosAlpha = cos(alpha);
+                    break;
+                }
+                case 5:
+                case 7:
+                {
+                    info->sinAlpha = sin(alpha);
+                    info->cosAlpha = cos(alpha);
+                    break;
+                }
+            }
+            int side = m_idHelper->side(id);
+            if (side > 0) info->sinAlpha = - info->sinAlpha; // always reverse angle for back side wafer
             info->u        = (*clusters)->globalPosition().y() * info->cosAlpha + (*clusters)->globalPosition().x() * info->sinAlpha;
             info->z        = (*clusters)->globalPosition().z();
+            ATH_MSG_VERBOSE("Event: " << eventNumber << " Adding cluster " << layer << "/" << eta << "/" << phi << "/" << side << ", u= " << info->u << ", z= " << info->z << ", sin= " << info->sinAlpha << ", cos= " << info->cosAlpha );
             info->sigmaSq  = (*clusters)->localCovariance()(0,0);
-            if (info->sinAlpha < 0)
+            if (info->sinAlpha * info->cosAlpha < 0)
             {
                 clusterMap[hash/2].first.push_back(info);
             }
-            else if (info->sinAlpha > 0)
+            else if (info->sinAlpha * info->cosAlpha > 0)
             {
                 clusterMap[hash/2].second.push_back(info);
             }
@@ -162,18 +208,21 @@ StatusCode ClusterFitAlg::execute(const EventContext& ctx) const
               std::vector<clusterInfo*>& stereoMinus = entry.second.first;
               std::vector<clusterInfo*>& stereoPlus  = entry.second.second;
               ATH_MSG_VERBOSE("Module entry in layer " << layer << " has " << stereoMinus.size() << " negative and " << stereoPlus.size() << " positive stereo clusters");
-              if (stereoMinus.size() > 0 && stereoPlus.size() > 0 && !layerGood[layer])
+              if (stereoMinus.size() > 0 && stereoPlus.size() > 0)
               {
-                nGoodLayers++;
-                layerGood[layer] = true;
+                if (!layerGood[layer])
+                {
+                    nGoodLayers++;
+                    layerGood[layer] = true;
+                }
                 for (clusterInfo* minus : stereoMinus)
                 {
                     for (clusterInfo* plus : stereoPlus)
                     {
                         layerCombo* combo = new layerCombo { };
                         combo->initialize();
-                        combo->addCluster(plus, m_zCenter);
-                        combo->addCluster(minus, m_zCenter);
+                        combo->addCluster(plus, m_zCenter[thisStation]);
+                        combo->addCluster(minus, m_zCenter[thisStation]);
                         layerCombos[layer].push_back( combo );
                     }
                 }
@@ -218,11 +267,40 @@ StatusCode ClusterFitAlg::execute(const EventContext& ctx) const
                        }
                   }
               }
-              ATH_MSG_VERBOSE("best fit: (" << bestFit(0) << "+/-" << sqrt(bestCov(0,0)) << "," << 
+              ATH_MSG_VERBOSE("Event #" << eventNumber << " best fit: (" << bestFit(0) << "+/-" << sqrt(bestCov(0,0)) << "," << 
                                                bestFit(1) << "+/-" << sqrt(bestCov(1,1)) << "," << 
                                                bestFit(2) << "+/-" << sqrt(bestCov(2,2)) << "," << 
                                                bestFit(3) << "+/-" << sqrt(bestCov(3,3)) << "); chi2 = " << bestChi2 );
-              Residuals(bestClusters);
+              if (eventNumber == 10841) std::cout << "fit = ParametricPlot3D[{" << bestFit(0) << " + (" << bestFit(2) << ") z, " << bestFit(1) << " + ( " << bestFit(3) << ") z, z}, {z, -50, 50}, Boxed->False];" << std::endl;                                               
+              int iC = 0;
+              for (auto info : bestClusters)
+              {
+                  if (info->sinAlpha * info->cosAlpha < 0) continue;
+                  double dz = info->z - m_zCenter[thisStation];
+                  double xFit = bestFit(0) + bestFit(2) * dz;
+                  double yFit = bestFit(1) + bestFit(3) * dz;
+                  double uFit = yFit * info->cosAlpha + xFit * info->sinAlpha;
+                  ATH_MSG_VERBOSE("Event: " << eventNumber << " z: " << info->z << " z-zC: " << dz<< " uFit: " << uFit << " u: " << info->u);
+                  auto stripEnds = info->cluster->detectorElement()->endsOfStrip(info->cluster->localPosition());
+                  if (eventNumber == 10841) std::cout << "l" << iC << " = Line[{{" << stripEnds.first.x() << ", " << stripEnds.first.y() << ", " << stripEnds.first.z() - m_zCenter[thisStation] << "}, {" << 
+                                                                      stripEnds.second.x() << ", " << stripEnds.second.y() << ", " << stripEnds.second.z() - m_zCenter[thisStation] << "}}];" << std::endl;
+                  iC++;
+              }
+              for (auto info : bestClusters)
+              {
+                  if (info->sinAlpha * info->cosAlpha > 0) continue;
+                  double dz = info->z - m_zCenter[thisStation];
+                  double xFit = bestFit(0) + bestFit(2) * dz;
+                  double yFit = bestFit(1) + bestFit(3) * dz;
+                  double uFit = yFit * info->cosAlpha + xFit * info->sinAlpha;
+                  ATH_MSG_VERBOSE("Event: " << eventNumber << " z: " << info->z << " z-zC: " << dz<< " uFit: " << uFit << " u: " << info->u);
+                  auto stripEnds = info->cluster->detectorElement()->endsOfStrip(info->cluster->localPosition());
+                  if (eventNumber == 10841) std::cout << "l" << iC << " = Line[{{" << stripEnds.first.x() << ", " << stripEnds.first.y() << ", " << stripEnds.first.z() - m_zCenter[thisStation] << "}, {" << 
+                                                                      stripEnds.second.x() << ", " << stripEnds.second.y() << ", " << stripEnds.second.z() - m_zCenter[thisStation] << "}}];" << std::endl;
+                  iC++;
+              }
+              if (eventNumber == 10841) std::cout << "Show[Graphics3D[{l1, l2, l3, l4, l5, l6}, Boxed -> False], fit]" << std::endl;
+              //Residuals(bestClusters);
               ATH_CHECK(AddTrack(outputTracks, bestFit, bestCov, bestClusters, bestChi2, bestClusters.size()-4));
               m_chi2->Fill(bestChi2);
               setFilterPassed(true, ctx);
@@ -293,13 +371,15 @@ ClusterFitAlg::AddTrack(std::unique_ptr<TrackCollection>& tracks,
     Trk::FitQuality* q = new Trk::FitQuality {chi2, ndof};
     DataVector<const Trk::TrackStateOnSurface>* s = new DataVector<const Trk::TrackStateOnSurface> {};
 
+    int station = m_idHelper->station(fitClusters[0]->cluster->detectorElement()->identify());
+
     // translate parameters to nominal fit point
-    s->push_back( GetState(fitResult, fitCovariance, nullptr) );
+    s->push_back( GetState(fitResult, fitCovariance, nullptr, station) );
 
-    for (const clusterInfo* cInfo : fitClusters)
-    {
-        s->push_back( GetState(fitResult, fitCovariance, cInfo->cluster) );
-    }
+    // for (const clusterInfo* cInfo : fitClusters)
+    // {
+    //     s->push_back( GetState(fitResult, fitCovariance, cInfo->cluster, station) );
+    // }
 
     // Create and store track
     tracks->push_back(new Trk::Track(i, s , q));
@@ -309,12 +389,13 @@ ClusterFitAlg::AddTrack(std::unique_ptr<TrackCollection>& tracks,
 Trk::TrackStateOnSurface*
 ClusterFitAlg::GetState( const Eigen::Matrix< double, 4, 1 >& fitResult, 
                          const Eigen::Matrix< double, 4, 4 >& fitCovariance,  
-                         const FaserSCT_Cluster* fitCluster ) const
+                         const FaserSCT_Cluster* fitCluster, int station ) const
 {
     // position of fit point:
-    double zFit = m_zCenter;
+    // int station = m_idHelper->station(fitCluster->detectorElement()->identify());
+    double zFit = m_zCenter[station];
     if (fitCluster != nullptr) zFit = fitCluster->globalPosition()[2];
-    Amg::Vector3D pos { fitResult[0] + fitResult[2] * (zFit - m_zCenter), fitResult[1] + fitResult[3] * (zFit - m_zCenter), zFit };
+    Amg::Vector3D pos { fitResult[0] + fitResult[2] * (zFit - m_zCenter[station]), fitResult[1] + fitResult[3] * (zFit - m_zCenter[station]), zFit };
     double phi = atan2( fitResult[3], fitResult[2] );
     double theta = atan( sqrt(fitResult[2]*fitResult[2] + fitResult[3]*fitResult[3]) );
     double qoverp = 1.0/100000.0;
@@ -352,17 +433,24 @@ ClusterFitAlg::ClusterFit(layerCombo* c0, layerCombo* c1, layerCombo* c2) const
     {
         sums[i] = c0->sums[i] + c1->sums[i] + c2->sums[i];
     }
-    Amg::MatrixX s(5,5);
+    Eigen::Matrix< double, 5, 5 > s;
     s << sums[1] , sums[2] , sums[4] , sums[5] , sums[10] ,
         sums[2] , sums[3] , sums[5] , sums[6] , sums[11] ,
         sums[4] , sums[5] , sums[7] , sums[8] , sums[12] ,
         sums[5] , sums[6] , sums[8] , sums[9] , sums[13] ,
         sums[10] , sums[11] , sums[12] , sums[13] , sums[14];
-    Amg::MatrixX s4(4,4);
+    Eigen::Matrix< double, 4, 4 > s4;
     s4 = s.block<4,4>(0,0);
     Eigen::Matrix< double, 4, 1 > v;
     v << sums[10] , sums[11] , sums[12] , sums[13];
-    Eigen::Matrix< double, 4, 1 > x = s4.colPivHouseholderQr().solve(v);                
+    ATH_MSG_VERBOSE(s4);
+    ATH_MSG_VERBOSE(v);
+    ATH_MSG_VERBOSE(s4.inverse());
+//    Eigen::Matrix< double, 4, 1 > x = s4.colPivHouseholderQr().solve(v);                
+    Eigen::Matrix< double, 4, 1 > x = s4.fullPivLu().solve(v);       
+    ATH_MSG_VERBOSE("Check solution");
+    ATH_MSG_VERBOSE(s4*x);
+    ATH_MSG_VERBOSE(v);
     Eigen::Matrix< double, 5, 1 > x5;
     x5 << x(0), x(1), x(2), x(3), -1;
     double chi2 = x5.transpose()*s*x5;  
diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h
index a6bc1bf981d443b466ac9450de3ca8118bdbc5f2..54868f69ebbfabce756163e0c7180e00e794747f 100644
--- a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h
+++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h
@@ -173,7 +173,8 @@ class ClusterFitAlg : public AthReentrantAlgorithm, AthHistogramming
 
     Trk::TrackStateOnSurface* GetState( const Eigen::Matrix< double, 4, 1 >& fitResult, 
                                         const Eigen::Matrix< double, 4, 4 >& fitCovariance,  
-                                        const FaserSCT_Cluster* fitCluster ) const; 
+                                        const FaserSCT_Cluster* fitCluster,
+                                        int station ) const; 
 
     std::tuple<Eigen::Matrix<double, 4, 1>, 
                Eigen::Matrix<double, 4, 4>, 
@@ -189,7 +190,7 @@ class ClusterFitAlg : public AthReentrantAlgorithm, AthHistogramming
     SG::ReadHandleKey<FaserSCT_ClusterContainer> m_clusterContainerKey { this, "ClustersName", "SCT_ClusterContainer", "FaserSCT cluster container" };
     SG::WriteHandleKey<TrackCollection> m_trackCollection { this, "OutputCollection", "ClusterFit", "Output track collection name" };
 
-    DoubleProperty m_zCenter { this, "ZCenter", 2300.0, "Global z position at which to reconstruct track parameters"};
+    DoubleArrayProperty m_zCenter { this, "ZCenter", { -1452.2925, 47.7075 , 1237.7075, 2427.7075 }, "Global z position at which to reconstruct track parameters"};
     UnsignedIntegerProperty m_triggerMask { this, "TriggerMask", 0x0, "Trigger mask to analyze (0 = pass all)" };
 /// a handle on the Hist/TTree registration service
     ServiceHandle<ITHistSvc> m_histSvc;
diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TrackerClusterFitDbg.py b/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TrackerClusterFitDbg.py
index 77182425696ee70043778ba15026b8a167ebfad5..8c0309ca4f3495d42e87e6be720f63ec7db20688 100644
--- a/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TrackerClusterFitDbg.py
+++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/test/TrackerClusterFitDbg.py
@@ -26,7 +26,7 @@ Configurable.configurableRun3Behavior = True
 
 # Configure
 ConfigFlags.Input.Files = [
-    '/eos/project-f/faser-commissioning/TI12Data/Run-001261/Faser-Physics-001261-00000.raw',
+    '/eos/project-f/faser-commissioning/TI12Data/Run-001332/Faser-Physics-001332-00000.raw',
     #'/eos/project-f/faser-commissioning/winter2020CosmicsStand/Run-000608/Faser-Physics-000608-00000.raw',
     # '/eos/project-f/faser-commissioning/winter2020CosmicsStand/Run-000608/Faser-Physics-000608-00001.raw',
     # '/eos/project-f/faser-commissioning/winter2020CosmicsStand/Run-000608/Faser-Physics-000608-00002.raw',
@@ -92,7 +92,7 @@ ConfigFlags.Input.Files = [
     # '/eos/project-f/faser-commissioning/winter2020CosmicsStand/Run-000608/Faser-Physics-000608-00062.raw'
 ]
 #ConfigFlags.Output.ESDFileName = "run608.ESD.pool.root"
-ConfigFlags.Output.ESDFileName = "run001261.ESD.pool.root"
+ConfigFlags.Output.ESDFileName = "run001332.ESD.pool.root"
 ConfigFlags.IOVDb.GlobalTag = "OFLCOND-XXXX-XXX-XX"          # Needed to bypass autoconfig, only the "OFLCOND" matters at the moment
 ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"               # Use MC conditions for now
 ConfigFlags.Input.ProjectName = "data21"                     # Needed to bypass autoconfig
diff --git a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx
index b8c6cfbae285b0470f32d511df4a8b220613d4f7..dece2904daf8acc0ac4ac9e2d71c681713df8353 100644
--- a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx
+++ b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx
@@ -593,7 +593,8 @@ namespace Tracker
     // when this is the case here, and set hitsInThirdTimeBin to zero later on
     //
     double iphipitch  = 1./element->phiPitch();
-    double shift = m_lorentzAngleTool->getLorentzShift(element->identifyHash());
+    // double shift = m_lorentzAngleTool->getLorentzShift(element->identifyHash());
+    double shift = 0;
     double stripPitch = design->stripPitch();
     bool badStripInClusterOnThisModuleSide = (idGroups.size() != tbinGroups.size());
     bool rotate = element->design().shape() == TrackerDD::Trapezoid || element->design().shape() == TrackerDD::Annulus;
diff --git a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx
index 78bcb43a710e8e7866a06dfea1136b819c162bb8..2313a1584a00f63827cbfd9183c5fbf9acd29feb 100644
--- a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx
+++ b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx
@@ -81,7 +81,8 @@ Tracker::FaserSCT_Cluster* TrackerClusterMakerTool::sctCluster(
                          const TrackerDD::SiDetectorElement* element,
                          int errorStrategy) const{
 
-        double shift = m_sctLorentzAngleTool->getLorentzShift(element->identifyHash());
+        // double shift = m_sctLorentzAngleTool->getLorentzShift(element->identifyHash());
+		double shift = 0;
 //        const InDetDD::SiLocalPosition& localPosition = 
 //                        InDetDD::SiLocalPosition(localPos[Trk::locY),
 //                                        localPos[Trk::locX)+shift,0);