35 Double_t sigma, Int_t side,
36 Double_t& fracL, Double_t& fracC,
40 assert( side == 0 || side == 1);
44 Double_t aRo = (side == 0 ? x + fDx / 2. : y + fDy / 2.);
47 Int_t iStrip = TMath::FloorNint(aRo /
fPitch[side]);
50 Double_t aLeftRo = Double_t(iStrip) *
fPitch[side];
51 Double_t aRightRo = aLeftRo +
fPitch[side];
54 Double_t dLeft = aRo - aLeftRo;
55 Double_t dRight = aRightRo - aRo;
60 if ( dLeft < 3. * sigma )
61 fracL = 0.5 * ( 1. - TMath::Erf( 0.707107 * dLeft / sigma) );
63 if ( dRight < 3. * sigma )
64 fracR = 0.5 * ( 1. - TMath::Erf( 0.707107 * dRight / sigma) );
65 fracC = 1. - fracL - fracR;
67 LOG(debug4) << GetName() <<
": Distances to next strip " << dLeft <<
" / "
68 << dRight <<
", charge fractions " << fracL <<
" / " << fracC
147 Double_t z, Double_t charge,
148 Double_t bY, Int_t side) {
151 assert( side == 0 || side == 1);
153 Double_t xCharge = x;
154 Double_t yCharge = y;
155 Double_t zCharge = z;
158 LOG(debug4) << GetName() <<
": Propagating charge " << charge
159 <<
" from (" << x <<
", " << y <<
", " << z
160 <<
") on side " << side <<
" of sensor " << GetName()
165 xCharge += LorentzShift(z, side, bY);
167 LOG(debug4) << GetName() <<
": After Lorentz shift: (" << xCharge <<
", "
168 << yCharge <<
", " << zCharge <<
") cm";
172 if ( ! IsInside(xCharge, yCharge) ) {
173 LOG(debug4) << GetName() <<
": Charge outside active area"
181 fStripCharge[side][iStrip] += charge;
182 LOG(debug4) << GetName() <<
": Adding charge " << charge <<
" to strip "
189 Double_t diffusionWidth =
190 CbmStsPhysics::DiffusionWidth(z + fDz / 2.,
192 GetConditions()->GetVbias(),
193 GetConditions()->GetVfd(),
194 GetConditions()->GetTemperature(),
196 assert (diffusionWidth >= 0.);
197 LOG(debug4) << GetName() <<
": Diffusion width = " << diffusionWidth
203 Diffusion(xCharge, yCharge, diffusionWidth, side, fracL, fracC, fracR);
210 Int_t iStripL = iStripC - 1;
211 Int_t iStripR = iStripC + 1;
214 fStripCharge[side][iStripC] += charge * fracC;
215 LOG(debug4) << GetName() <<
": Adding charge " << charge * fracC
216 <<
" to strip " << iStripC;
218 if ( fracL > 0. && iStripL >= 0 ) {
219 fStripCharge[side][iStripL] += charge * fracL;
220 LOG(debug4) << GetName() <<
": Adding charge " << charge * fracL
221 <<
" to strip " << iStripL;
223 if ( fracR > 0. && iStripR <
fNofStrips[side] ) {
224 fStripCharge[side][iStripR] += charge * fracR;
225 LOG(debug4) << GetName() <<
": Adding charge " << charge * fracR
226 <<
" to strip " << iStripR;
237 Int_t nStripsB, Double_t pitchB) {
240 TGeoBBox* shape =
dynamic_cast<TGeoBBox*
>(GetPnode()->GetShape());
243 fDx = Double_t(nStripsF) * pitchF;
244 assert( fDx < 2. * shape->GetDX() );
247 fDy = Double_t(nStripsB) * pitchB;
248 assert( fDy < 2. * shape->GetDY() );
251 fDz = 2. * shape->GetDZ();
265 assert ( GetSensorId() == 0);
virtual void Diffusion(Double_t x, Double_t y, Double_t sigma, Int_t side, Double_t &fracL, Double_t &fracC, Double_t &fracR)
Strip pitch front/back side [cm].