diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx index d2132e9abe3b114b2096659c0be8c9e3ba7efeed..a9b184d2969589df08cd5c045853229e9dd20d5e 100644 --- a/reco/L1/CbmL1.cxx +++ b/reco/L1/CbmL1.cxx @@ -954,8 +954,11 @@ InitStatus CbmL1::Init() fpInitManager->InitTargetField(2.5); - // Step 4: initialize IDs of detectors active in tracking - // TODO: temporary for tests, must be initialized somewhere in run_reco.C or similar (S.Zh.) + /* + * Step 4: initialize IDs of detectors active in tracking. The order of the tracking + * detectors is defined in the L1DetectorID enumeration + */ + fActiveTrackingDetectorIDs.insert(L1DetectorID::kSts); if (fUseMVD) { fActiveTrackingDetectorIDs.insert(L1DetectorID::kMvd); } if (fUseMUCH) { fActiveTrackingDetectorIDs.insert(L1DetectorID::kMuch); } if (fUseTRD) { fActiveTrackingDetectorIDs.insert(L1DetectorID::kTrd); } @@ -983,6 +986,7 @@ InitStatus CbmL1::Init() stationInfo.SetStationType(1); // MVD // TODO: to be exchanged with specific flags (timeInfo, fieldInfo etc.) (S.Zh.) stationInfo.SetTimeInfo(0); + stationInfo.SetTimeResolution(1000.); stationInfo.SetFieldStatus(fTrackingMode == L1Algo::TrackingMode::kMcbm ? 0 : 1); stationInfo.SetZ(t.z); stationInfo.SetMaterial(t.dz, t.RadLength); @@ -991,7 +995,7 @@ InitStatus CbmL1::Init() stationInfo.SetRmin(t.r); stationInfo.SetRmax(t.R); fscal mvdFrontPhi = 0; - fscal mvdBackPhi = PI / 2.; + fscal mvdBackPhi = TMath::Pi() / 2.; fscal mvdFrontSigma = mvdStationPar->GetXRes(iSt) / 10000; fscal mvdBackSigma = mvdStationPar->GetYRes(iSt) / 10000; stationInfo.SetFrontBackStripsGeometry(mvdFrontPhi, mvdFrontSigma, mvdBackPhi, mvdBackSigma); @@ -1001,28 +1005,27 @@ InitStatus CbmL1::Init() // Setup STS stations info for (int iSt = 0; iSt < NStsStations; ++iSt) { // NOTE: example using smart pointers auto cbmSts = CbmStsSetup::Instance()->GetStation(iSt); - std::unique_ptr<L1BaseStationInfo> stationInfo(new L1BaseStationInfo(L1DetectorID::kSts, iSt)); - // TODO: replace with std::make_unique, when C++14 is avaliable!!!! (S.Zh.) - // auto stsStation = std::make_unique<L1BaseStationInfo>(L1DetectorID::kSts, iSt); - stationInfo->SetStationType(0); // STS - stationInfo->SetTimeInfo(1); - stationInfo->SetFieldStatus(fTrackingMode == L1Algo::TrackingMode::kMcbm ? 0 : 1); + auto stationInfo = L1BaseStationInfo(L1DetectorID::kSts, iSt); + stationInfo.SetStationType(0); // STS + stationInfo.SetTimeInfo(1); + stationInfo.SetTimeResolution(5.); + stationInfo.SetFieldStatus(fTrackingMode == L1Algo::TrackingMode::kMcbm ? 0 : 1); // Setup station geometry and material - stationInfo->SetZ(cbmSts->GetZ()); + stationInfo.SetZ(cbmSts->GetZ()); double stsXmax = cbmSts->GetXmax(); double stsYmax = cbmSts->GetYmax(); - stationInfo->SetXmax(stsXmax); - stationInfo->SetYmax(stsYmax); - stationInfo->SetRmin(0); - stationInfo->SetRmax(stsXmax > stsYmax ? stsXmax : stsYmax); - stationInfo->SetMaterial(cbmSts->GetSensorD(), cbmSts->GetRadLength()); + stationInfo.SetXmax(stsXmax); + stationInfo.SetYmax(stsYmax); + stationInfo.SetRmin(0); + stationInfo.SetRmax(stsXmax > stsYmax ? stsXmax : stsYmax); + stationInfo.SetMaterial(cbmSts->GetSensorD(), cbmSts->GetRadLength()); // Setup strips geometry fscal stsFrontPhi = cbmSts->GetSensorRotation() + cbmSts->GetSensorStereoAngle(0) * PI / 180.; fscal stsBackPhi = cbmSts->GetSensorRotation() + cbmSts->GetSensorStereoAngle(1) * PI / 180.; fscal stsFrontSigma = cbmSts->GetSensorPitch(0) / sqrt(12); fscal stsBackSigma = stsFrontSigma; - stationInfo->SetFrontBackStripsGeometry(stsFrontPhi, stsFrontSigma, stsBackPhi, stsBackSigma); + stationInfo.SetFrontBackStripsGeometry(stsFrontPhi, stsFrontSigma, stsBackPhi, stsBackSigma); fpInitManager->AddStation(stationInfo); } @@ -1037,17 +1040,18 @@ InitStatus CbmL1::Init() stationInfo.SetStationType(2); // MVD // TODO: to be exchanged with specific flags (timeInfo, fieldInfo etc.) (S.Zh.) stationInfo.SetTimeInfo(1); + stationInfo.SetTimeResolution(3.9); stationInfo.SetFieldStatus(0); stationInfo.SetZ(layer->GetZ()); - stationInfo.SetMaterial(layer->GetDz(), 10); // TODO: Why rad len is 0????? (S.Zh.) + stationInfo.SetMaterial(layer->GetDz(), 0); // TODO: Why rad len is 0????? (S.Zh.) stationInfo.SetXmax(100.); stationInfo.SetYmax(100.); - stationInfo.SetRmin(0.); + stationInfo.SetRmin(10.); stationInfo.SetRmax(100.); fscal muchFrontPhi = 0; - fscal muchBackPhi = PI / 2.; - fscal muchFrontSigma = 0.1; - fscal muchBackSigma = 0.1; + fscal muchBackPhi = TMath::Pi() / 2.; + fscal muchFrontSigma = 0.35; + fscal muchBackSigma = 0.35; stationInfo.SetFrontBackStripsGeometry(muchFrontPhi, muchFrontSigma, muchBackPhi, muchBackSigma); fpInitManager->AddStation(stationInfo); } @@ -1064,17 +1068,18 @@ InitStatus CbmL1::Init() int stationType = (iSt == 1 || iSt == 3) ? 6 : 3; stationInfo.SetStationType(stationType); stationInfo.SetTimeInfo(1); + stationInfo.SetTimeResolution(10.); stationInfo.SetFieldStatus(0); stationInfo.SetZ(module->GetZ()); - stationInfo.SetMaterial(2. * module->GetSizeZ(), 10.); + stationInfo.SetMaterial(2. * module->GetSizeZ(), 1.6); stationInfo.SetXmax(module->GetSizeX()); stationInfo.SetYmax(module->GetSizeY()); stationInfo.SetRmin(0.); stationInfo.SetRmax(2. * module->GetSizeX()); // TODO: Why multiplied with 2.? fscal trdFrontPhi = 0; - fscal trdBackPhi = PI / 2.; - fscal trdFrontSigma = 1.; - fscal trdBackSigma = 1.; + fscal trdBackPhi = TMath::Pi() / 2.; + fscal trdFrontSigma = 0.15; + fscal trdBackSigma = 0.15; stationInfo.SetFrontBackStripsGeometry(trdFrontPhi, trdFrontSigma, trdBackPhi, trdBackSigma); fpInitManager->AddStation(stationInfo); } @@ -1084,17 +1089,18 @@ InitStatus CbmL1::Init() auto stationInfo = L1BaseStationInfo(L1DetectorID::kTof, iSt); stationInfo.SetStationType(4); stationInfo.SetTimeInfo(1); + stationInfo.SetTimeResolution(0.075); stationInfo.SetFieldStatus(0); stationInfo.SetZ(TofStationZ[iSt]); - stationInfo.SetMaterial(10., 10.); // TODO: add Tof width dz and rad. len + stationInfo.SetMaterial(10., 2.); // TODO: add Tof width dz and rad. len stationInfo.SetXmax(20.); stationInfo.SetYmax(20.); stationInfo.SetRmin(0.); stationInfo.SetRmax(150.); fscal tofFrontPhi = 0; - fscal tofBackPhi = PI / 2.; - fscal tofFrontSigma = 1.; - fscal tofBackSigma = 1.; + fscal tofBackPhi = TMath::Pi() / 2.; + fscal tofFrontSigma = 0.42; + fscal tofBackSigma = 0.23; stationInfo.SetFrontBackStripsGeometry(tofFrontPhi, tofFrontSigma, tofBackPhi, tofBackSigma); fpInitManager->AddStation(stationInfo); } @@ -1272,7 +1278,7 @@ InitStatus CbmL1::Init() /******************************************************************************************************************** ********************************************************************************************************************/ - algo->Init(geo, fUseHitErrors, fTrackingMode, fMissingHits); + algo->Init(fUseHitErrors, fTrackingMode, fMissingHits); geo.clear(); algo->fRadThick.reset(algo->GetNstations()); diff --git a/reco/L1/CbmL1.h b/reco/L1/CbmL1.h index da09b0569a5e7e5ffa13f2cfdfc4d0f909234b2b..2ef9cd3c414974137314396243c81cc4038b5c7a 100644 --- a/reco/L1/CbmL1.h +++ b/reco/L1/CbmL1.h @@ -88,6 +88,8 @@ public: /// Enumeration for the detector subsystems used in L1 tracking +/// It is important for the subsystems to be specified in the actual order. The order is used +/// for the L1Station array filling. /// Note: L1DetectorID has a forward declaration in L1InitManager.h and L1BaseStationInfo.h enum class L1DetectorID { @@ -294,7 +296,7 @@ private: L1InitManager* fpInitManager {nullptr}; ///< Pointer to L1InitManager object of L1 algorithm core - std::set<L1DetectorID> fActiveTrackingDetectorIDs {L1DetectorID::kSts}; ///< Set of detectors active in tracking + std::set<L1DetectorID> fActiveTrackingDetectorIDs {}; ///< Set of detectors active in tracking L1AlgoInputData* fData {nullptr}; diff --git a/reco/L1/L1Algo/L1Algo.cxx b/reco/L1/L1Algo/L1Algo.cxx index 407071e5683cdeb9685e1aa552bbf4f410f30c5d..a752cafbd2b7a8c78d53f93ba9bff0814e294bc6 100644 --- a/reco/L1/L1Algo/L1Algo.cxx +++ b/reco/L1/L1Algo/L1Algo.cxx @@ -59,7 +59,7 @@ void L1Algo::SetNThreads(unsigned int n) } -void L1Algo::Init(const L1Vector<fscal>& geo, const bool UseHitErrors, const TrackingMode mode, const bool MissingHits) +void L1Algo::Init(const bool UseHitErrors, const TrackingMode mode, const bool MissingHits) { for (int iProc = 0; iProc < 4; iProc++) { for (int i = 0; i < 8; i++) { @@ -76,32 +76,6 @@ void L1Algo::Init(const L1Vector<fscal>& geo, const bool UseHitErrors, const Tra fTrackingMode = mode; fMissingHits = MissingHits; - //lxir039 - // for (int i=0; i<8; i++){ - // threadNumberToCpuMap[2*i+0] = 15-i; - // threadNumberToCpuMap[2*i+1] = 15-(i+8); - // } - - //int ind = 0; - //{ - // L1FieldValue B[3]; - // fvec z[3]; - // for (int i = 0; i < 3; i++) { - // z[i] = geo[ind++]; - // B[i].x = geo[ind++]; - // B[i].y = geo[ind++]; - // B[i].z = geo[ind++]; -//#ifndef TBB2 - // std::cout << "L1Algo Input Magnetic field:" << z[i][0] << " " << B[i].x[0] << " " << B[i].y[0] << " " << B[i].z[0] - // << std::endl; -//#endif // TBB2 - // } - // //fVtxFieldRegion.Set(B[0], z[0], B[1], z[1], B[2], z[2]); - // //fVtxFieldValue = B[0]; - //} - //vStations.clear(); - //L1Station vStations[L1Parameters::kMaxNstations] _fvecalignment; - //int NStations = static_cast<int>(geo[ind++]); //int NMvdStations = static_cast<int>(geo[ind++]); // TODO: get rid of NMbdStations (S. Zh.) int nStationsSts = fInitManager.GetStationsNumber(static_cast<L1DetectorID>(1)); @@ -113,140 +87,13 @@ void L1Algo::Init(const L1Vector<fscal>& geo, const bool UseHitErrors, const Tra if (fTrackingMode == kMcbm) { fNfieldStations = -1; } - // cout << "N MVD & STS stations: " << NMvdStations << " " << NStations-NMvdStations << endl; -//#ifndef TBB2 - //std::cout << "L1Algo Input " << NStations << " Stations:" << std::endl; -//#endif // TBB2 - // for (int i = 0; i < NStations; i++) { - // L1Station& st = vStations[i]; - // st.type = geo[ind++]; - // st.timeInfo = 1; - // if (st.type == 1) st.timeInfo = 0; - // st.z = geo[ind++]; - // st.materialInfo.thick = geo[ind++]; - // st.Rmin = geo[ind++]; - // st.Rmax = geo[ind++]; - // st.materialInfo.RL = geo[ind++]; - // st.materialInfo.RadThick = st.materialInfo.thick / st.materialInfo.RL; - // st.materialInfo.logRadThick = log(st.materialInfo.RadThick); - - // double f_phi = geo[ind++]; - // double f_sigma = geo[ind++]; - // double b_phi = geo[ind++]; - // double b_sigma = geo[ind++]; - // double dt = geo[ind++]; //TODO: Add this field to L1BaseStationInfo and to ToString fcn (S.Zharko) - // double c_f = cos(f_phi); - // double s_f = sin(f_phi); - // double c_b = cos(b_phi); - // double s_b = sin(b_phi); - - // st.frontInfo.cos_phi = c_f; - // st.frontInfo.sin_phi = s_f; - // st.frontInfo.sigma2 = f_sigma * f_sigma; - - // st.backInfo.cos_phi = c_b; - // st.backInfo.sin_phi = s_b; - // st.backInfo.sigma2 = b_sigma * b_sigma; - // st.dt = dt; - - // if (fabs(b_phi - f_phi) < .1) { - // double th = b_phi - f_phi; - // double det = cos(th); - // det *= det; - // st.XYInfo.C00 = (s_b * s_b * f_sigma * f_sigma + s_f * s_f * b_sigma * b_sigma) / det; - // st.XYInfo.C10 = -(s_b * c_b * f_sigma * f_sigma + s_f * c_f * b_sigma * b_sigma) / det; - // st.XYInfo.C11 = (c_b * c_b * f_sigma * f_sigma + c_f * c_f * b_sigma * b_sigma) / det; - // //std::cout << "!!! det "<< det<<std::endl; - // } - // else { - // double det = c_f * s_b - s_f * c_b; - // det *= det; - // st.XYInfo.C00 = (s_b * s_b * f_sigma * f_sigma + s_f * s_f * b_sigma * b_sigma) / det; - // st.XYInfo.C10 = -(s_b * c_b * f_sigma * f_sigma + s_f * c_f * b_sigma * b_sigma) / det; - // st.XYInfo.C11 = (c_b * c_b * f_sigma * f_sigma + c_f * c_f * b_sigma * b_sigma) / det; - // //std::cout << "!!! det "<< det<<std::endl; - // } - // //std::cout.precision(10); - // //std::cout << "Station "<<i<<" " << st.XYInfo.C00[0]<<" "<<st.XYInfo.C11[0]<<" "<<st.XYInfo.C10[0]<<std::endl; - // //std::cout << " "<< i<<" fsigma " << f_sigma<<" bsigma "<<b_sigma<<std::endl; - - // // st.xInfo.cos_phi = c_f/(c_f*s_b - c_b*s_f); - // // st.xInfo.sin_phi =-c_b/(c_f*s_b - c_b*s_f); - // st.xInfo.cos_phi = -s_f / (c_f * s_b - c_b * s_f); - // st.xInfo.sin_phi = s_b / (c_f * s_b - c_b * s_f); - // st.xInfo.sigma2 = st.XYInfo.C00; - - // st.yInfo.cos_phi = c_b / (c_b * s_f - c_f * s_b); - // st.yInfo.sin_phi = -c_f / (c_b * s_f - c_f * s_b); - // st.yInfo.sigma2 = st.XYInfo.C11; - // //std::cout << "st.xInfo.cos_phi "<<st.xInfo.cos_phi<< " st.yInfo.cos_phi " << st.yInfo.cos_phi << std::endl; - // //std::cout << "st.xInfo.sin_phi "<<st.xInfo.sin_phi<< " st.yInfo.sin_phi " << st.yInfo.sin_phi << std::endl; - - // //std::cout << "cos_b "<<c_b<< " sin_b " << s_b << std::endl; - // //std::cout << "cos_f "<<c_f<< " sin_f " << s_f << std::endl; - - - // int N = static_cast<int>(geo[ind++]); - // for (int iC = 0; iC < N; iC++) - // st.fieldSlice.cx[iC] = geo[ind++]; - // for (int iC = 0; iC < N; iC++) - // st.fieldSlice.cy[iC] = geo[ind++]; - // for (int iC = 0; iC < N; iC++) - // st.fieldSlice.cz[iC] = geo[ind++]; -//#ifndef TBB2 -// std::cout << " " << st.z[0] << " " << st.materialInfo.thick[0] << " " << st.materialInfo.RL[0] << ", " << N -// << " field coeff." << std::endl; -// std::cout << " " << f_phi << " " << f_sigma << " " << b_phi << " " << b_sigma << std::endl; -//#endif // TBB2 - //} - - //fTrackingLevel = static_cast<int>(geo[ind++]); - //fMomentumCutOff = geo[ind++]; - //fGhostSuppression = static_cast<int>(geo[ind++]); - - //{ - // // fvec By0 = vStations[NStations-1].fieldSlice.cy[0]; - // fvec z0 = vStations[NStations - 1].z; - // fvec sy = 0., Sy = 0.; - // for (int i = NStations - 1; i >= 0; i--) { - // L1Station& st = vStations[i]; - // fvec dz = st.z - z0; - // fvec By = vStations[i].fieldSlice.cy[0]; - // Sy += dz * sy + dz * dz * By / 2.; - // sy += dz * By; - // //st.Sy = Sy; // commented, because is not used in the code (S.Zharko) - // z0 = st.z; - // } - //} - // for( int iS = 0; iS < NStations; ++iS ) { /// Grid is created for each station with the same step: xStep,yStep - // L1Grid &grid = vGrid[iS]; - // - // // grid.Create(-1,1,-0.6,0.6,xStep,yStep); - // grid.Create(-1,1,-0.6,0.6,0.00317899,0.00105966); - // } - -//#ifndef TBB2 - //std::cout << "L1Algo initialized" << std::endl; -//#endif // TBB2 - - // - // NEW INITIALIZATION (BETA) - // - - // Final init checks (the function provides purity of fields initialization and turn on the last bits of + // Final init checks (the function provides purity of fields initialization and turns on the last bit of // the L1ObjectInitController): fInitManager.CheckInit(); // NOTE: after passing this frontier L1Algo is (will be) accounted as initialized - // Check initialization + // Print out the bits of the init manager LOG(info) << "InitManager " << fInitManager.GetInitController().ToString(); - - // Get number of stations - //int nStationsNew = fInitManager.GetStationsNumber(); - // TODO: we must to get rid of station specification in the L1Algo (S.Zh.) - //int nMvdStationsNew = fInitManager.GetStationsNumber(static_cast<L1DetectorID>(0)); - //int nStsStationsNew = fInitManager.GetStationsNumber(static_cast<L1DetectorID>(1)); - //int nFieldStationsNew = nMvdStationsNew + nStsStationsNew; - + fNstations = fInitManager.GetStationsNumber(); // Get field near target @@ -265,16 +112,16 @@ void L1Algo::Init(const L1Vector<fscal>& geo, const bool UseHitErrors, const Tra LOG(info) << " ***********************"; LOG(info) << ""; - LOG(info) << "** Number of stations (new) **"; + LOG(info) << "----- Number of stations -----"; LOG(info) << "\tTotal stations: " << fNstations; LOG(info) << "\tStations before pipe: " << fNstationsBeforePipe; LOG(info) << "\tStations in field region: " << fNfieldStations; - LOG(info) << "** Magnetic field near target **"; + LOG(info) << "----- Magnetic field near target -----"; LOG(info) << "\tField Value: " << '\n' << fVtxFieldValue.ToString(/*indent = */ 1) << '\n'; LOG(info) << "\tField Region: " << '\n' << fVtxFieldRegion.ToString(/*indent = */ 1) << '\n'; - LOG(info) << "** L1 active stations list **"; + LOG(info) << "----- L1 active stations list -----"; for (int iSt = 0; iSt < fNstations; ++iSt) { LOG(info) << " #" << iSt << " " << fStations[iSt].ToString(/*verbosity = */ 0); } diff --git a/reco/L1/L1Algo/L1Algo.h b/reco/L1/L1Algo/L1Algo.h index ef6a5199031cef43e37a15b85517779a1a75a2c0..55c7a385c8b1169436987d50ad8bbc0da015b47e 100644 --- a/reco/L1/L1Algo/L1Algo.h +++ b/reco/L1/L1Algo/L1Algo.h @@ -199,7 +199,7 @@ public: kMcbm }; - void Init(const L1Vector<fscal>& geo, const bool UseHitErrors, const TrackingMode mode, const bool MissingHits); + void Init(const bool UseHitErrors, const TrackingMode mode, const bool MissingHits); void SetData(L1Vector<L1Hit>& StsHits_, int nStsStrips_, L1Vector<unsigned char>& SFlag_, const L1HitIndex_t* StsHitsStartIndex_, const L1HitIndex_t* StsHitsStopIndex_); diff --git a/reco/L1/L1Algo/L1BaseStationInfo.cxx b/reco/L1/L1Algo/L1BaseStationInfo.cxx index 05518eb21dbb4df2ecd8a6d17ce1c6e56ed77efb..6d9ebafae04c4a29ac993e7ea95968d719efb229 100644 --- a/reco/L1/L1Algo/L1BaseStationInfo.cxx +++ b/reco/L1/L1Algo/L1BaseStationInfo.cxx @@ -336,7 +336,7 @@ void L1BaseStationInfo::SetFrontBackStripsGeometry(double frontPhi, double front // void L1BaseStationInfo::SetMaterial(double inThickness, double inRL) { - L1MASSERT(0, inRL, "Attempt of entering zero inRL (radiational length) value"); + //L1MASSERT(0, inRL, "Attempt of entering zero inRL (radiational length) value"); fL1Station.materialInfo.thick = inThickness; fL1Station.materialInfo.RL = inRL; @@ -396,6 +396,14 @@ void L1BaseStationInfo::SetTimeInfo(int inTimeInfo) fInitController.SetFlag(InitKey::keTimeInfo); } +//----------------------------------------------------------------------------------------------------------------------// +// +void L1BaseStationInfo::SetTimeResolution(double dt) +{ + fL1Station.dt = dt; + fInitController.SetFlag(InitKey::keTimeResolution); +} + //----------------------------------------------------------------------------------------------------------------------// // void L1BaseStationInfo::SetZ(double inZ) diff --git a/reco/L1/L1Algo/L1BaseStationInfo.h b/reco/L1/L1Algo/L1BaseStationInfo.h index 4dfb5b8ccb2a6c3b8a94f817b9946ec7f2609464..77e1418f3ee1cece7563a23f68f8988048dc3293 100644 --- a/reco/L1/L1Algo/L1BaseStationInfo.h +++ b/reco/L1/L1Algo/L1BaseStationInfo.h @@ -49,6 +49,7 @@ public: keStripsFrontSigma, ///< keStripsBackPhi, ///< keStripsBackSigma, ///< + keTimeResolution, ///< time resolution // The last item is equal to the number of bits in fInitFlags keEnd }; @@ -122,6 +123,8 @@ public: int GetStationID() const { return fStationID; } /// Gets station type int GetStationType() const { return fL1Station.type; } + /// Gets time resolution + fvec GetTimeResolution() const { return fL1Station.dt; } /// Gets maximum distance between station center and its edge in x direction double GetXmax() const { return fXmax; } /// Gets maximum distance between station center and its edge in y direction @@ -176,6 +179,8 @@ public: /// Sets flag: 0 - time information is not provided by this detector type /// 1 - time information is provided by the detector and can be used in tracking void SetTimeInfo(int inTimeInfo); + /// Sets time resolution + void SetTimeResolution(double dt); /// Sets maximum distance between station center and its edge in x direction void SetXmax(double aSize); /// Sets maximum distance between station center and its edge in y direction