-void AliITSsimulationSPD::ChargeSharing(Float_t x1l,Float_t z1l,Float_t x2l,
- Float_t z2l,Int_t c1,Int_t r1,Int_t c2,
- Int_t r2,Float_t etot,
- Int_t &npixel,Int_t *frowpixel,
- Int_t *fcolpixel,Double_t *fenepixel){
- // Take into account the geometrical charge sharing when the track
- // crosses more than one pixel.
- // Inputs:
- // Float_t x1l
- // Float_t z1l
- // Float_t x2l
- // Float_t z2l
- // Int_t c1
- // Int_t r1
- // Int_t c2
- // Int_t r2
- // Float_t etot
- // Int_t &npixel
- // Int_t *frowpixel array of pixel rows
- // Int_t *fcolpixel array of pixel columns
- // Double_t *fenepiexel array of pixel energies
- // Outputs:
- // Int_t &npixel
- // Return:
- // none.
- //
- //Begin_Html
- /*
- <img src="picts/ITS/barimodel_2.gif">
- </pre>
- <br clear=left>
- <font size=+2 color=red>
- <a href="mailto:Rocco.Caliandro@ba.infn.it"></a>.
- </font>
- <pre>
- */
- //End_Html
- //Float_t dm;
- Float_t xa,za,xb,zb,dx,dz,dtot,refr,refm,refc;
- Float_t refn=0.;
- Float_t arefm, arefr, arefn, arefc, azb, az2l, axb, ax2l;
- Int_t dirx,dirz,rb,cb;
- Int_t flag,flagrow,flagcol;
- Double_t epar;
-
- npixel = 0;
- xa = x1l;
- za = z1l;
-// dx = x1l-x2l;
-// dz = z1l-z2l;
- dx = x2l-x1l;
- dz = z2l-z1l;
- dtot = TMath::Sqrt((dx*dx)+(dz*dz));
- if (dtot==0.0) dtot = 0.01;
- dirx = (Int_t) TMath::Sign((Float_t)1,dx);
- dirz = (Int_t) TMath::Sign((Float_t)1,dz);
-
- // calculate the x coordinate of the pixel in the next column
- // and the z coordinate of the pixel in the next row
- Float_t xpos, zpos;
-
- fSegmentation->GetPadCxz(c1, r1-1, xpos, zpos);
-
- Float_t xsize = fSegmentation->Dpx(0);
- Float_t zsize = fSegmentation->Dpz(r1-1);
-
- if (dirx == 1) refr = xpos+xsize/2.;
- else refr = xpos-xsize/2.;
-
- if (dirz == 1) refn = zpos+zsize/2.;
- else refn = zpos-zsize/2.;
-
- flag = 0;
- flagrow = 0;
- flagcol = 0;
- do{
- // calculate the x coordinate of the intersection with the pixel
- // in the next cell in row direction
- if(dz!=0)
- refm = dx*((refn - z1l)/dz) + x1l;
- else
- refm = refr+dirx*xsize;
-
- // calculate the z coordinate of the intersection with the pixel
- // in the next cell in column direction
- if (dx!=0)
- refc = dz*((refr - x1l)/dx) + z1l;
- else
- refc = refn+dirz*zsize;
-
- arefm = refm * dirx;
- arefr = refr * dirx;
- arefn = refn * dirz;
- arefc = refc * dirz;
-
- if ((arefm < arefr) && (arefn < arefc)){
- // the track goes in the pixel in the next cell in row direction
- xb = refm;
- zb = refn;
- cb = c1;
- rb = r1 + dirz;
- azb = zb * dirz;
- az2l = z2l * dirz;
- if (rb == r2) flagrow=1;
- if (azb > az2l) {
- zb = z2l;
- xb = x2l;
- } // end if
- // shift to the pixel in the next cell in row direction
- Float_t zsizeNext = fSegmentation->Dpz(rb-1);
- //to account for cell at the borders of the detector
- if(zsizeNext==0) zsizeNext = zsize;
- refn += zsizeNext*dirz;
- }else {
- // the track goes in the pixel in the next cell in column direction
- xb = refr;
- zb = refc;
- cb = c1 + dirx;
- rb = r1;
- axb = xb * dirx;
- ax2l = x2l * dirx;
- if (cb == c2) flagcol=1;
- if (axb > ax2l) {
- zb = z2l;
- xb = x2l;
- } // end ifaxb > ax2l
-
- // shift to the pixel in the next cell in column direction
- Float_t xsizeNext = fSegmentation->Dpx(cb-1);
- //to account for cell at the borders of the detector
- if(xsizeNext==0) xsizeNext = xsize;
- refr += xsizeNext*dirx;
- } // end if (arefm < arefr) && (arefn < arefc)
-
- //calculate the energy lost in the crossed pixel
- epar = TMath::Sqrt((xb-xa)*(xb-xa)+(zb-za)*(zb-za));
- epar = etot*(epar/dtot);
-
- //store row, column and energy lost in the crossed pixel
- frowpixel[npixel] = r1;
- fcolpixel[npixel] = c1;
- fenepixel[npixel] = epar;
- npixel++;
-
- // the exit point of the track is reached
- if (epar == 0) flag = 1;
- if ((r1 == r2) && (c1 == c2)) flag = 1;
- if (flag!=1) {
- r1 = rb;
- c1 = cb;
- xa = xb;
- za = zb;
- } // end if flag!=1
- } while (flag==0);
+void AliITSsimulationSPD::SpreadChargeAsym(Double_t x0,Double_t z0,
+ Int_t ix0,Int_t iz0,
+ Double_t el,Double_t sigx,Double_t sigz,
+ Double_t ld,Int_t t,Int_t hi){
+ // Spreads the charge over neighboring cells. Assume charge is distributed
+ // as charge(x,z) = (el/2*pi*sigx*sigz)*exp(-arg)
+ // arg=((x-x0)*(x-x0)/2*sigx*sigx)+((z-z0*z-z0)/2*sigz*sigz)
+ // if fLorentz=kTRUE, then x0=x0+ld (Lorentz drift taken into account)
+ // Defined this way, the integral over all x and z is el.
+ // Inputs:
+ // Double_t x0 x position of point where charge is liberated
+ // Double_t z0 z position of point where charge is liberated
+ // Int_t ix0 row of cell corresponding to point x0
+ // Int_t iz0 columb of cell corresponding to point z0
+ // Double_t el number of electrons liberated in this step
+ // Double_t sigx Sigma difusion along x for this step (y0 dependent)
+ // Double_t sigz Sigma difusion along z for this step (y0 dependent)
+ // Double_t ld lorentz drift in x for this stip (y0 dependent)
+ // Int_t t track number
+ // Int_t ti hit track index number
+ // Int_t hi hit "hit" index number
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+ const Int_t knx = 3,knz = 2;
+ const Double_t kRoot2 = 1.414213562; // Sqrt(2).
+ const Double_t kmictocm = 1.0e-4; // convert microns to cm.
+ Int_t ix,iz,ixs,ixe,izs,ize;
+ Float_t x,z;
+ Double_t x1,x2,z1,z2,s,spx,spz;
+ AliITSsegmentationSPD* seg = (AliITSsegmentationSPD*)GetSegmentationModel(0);
+
+
+ if(GetDebug(4)) Info("SpreadChargeAsym","(x0=%e,z0=%e,ix0=%d,iz0=%d,el=%e,"
+ "sig=%e,t=%d,i=%d)",x0,z0,ix0,iz0,el,sigx,sigz,t,hi);
+ if(sigx<=0.0 || sigz<=0.0) { // if sig<=0 No diffusion to simulate.
+ GetMap()->AddSignal(iz0,ix0,t,hi,GetModuleNumber(),el);
+ if(GetDebug(2)){
+ cout << "sigx<=0.0=" << sigx << endl;
+ cout << "sigz<=0.0=" << sigz << endl;
+ } // end if GetDebug
+ return;
+ } // end if
+ spx = 1.0/(sigx*kRoot2); spz = 1.0/(sigz*kRoot2);
+ if(GetDebug(2)){
+ cout << "sigx=" << sigx << " spx=" << spx << endl;
+ cout << "sigz=" << sigz << " spz=" << spz << endl;
+ } // end if GetDebug
+ ixs = TMath::Max(-knx+ix0,0);
+ ixe = TMath::Min(knx+ix0,seg->Npx()-1);
+ izs = TMath::Max(-knz+iz0,0);
+ ize = TMath::Min(knz+iz0,seg->Npz()-1);
+ for(ix=ixs;ix<=ixe;ix++) for(iz=izs;iz<=ize;iz++){
+ seg->DetToLocal(ix,iz,x,z); // pixel center
+ x1 = x;
+ z1 = z;
+ x2 = x1 + 0.5*kmictocm*seg->Dpx(ix); // Upper
+ x1 -= 0.5*kmictocm*seg->Dpx(ix); // Lower
+ z2 = z1 + 0.5*kmictocm*seg->Dpz(iz); // Upper
+ z1 -= 0.5*kmictocm*seg->Dpz(iz); // Lower
+ x1 -= x0+ld; // Distance from where track traveled (taking into account the Lorentz drift)
+ x2 -= x0+ld; // Distance from where track traveled (taking into account the Lorentz drift)
+ z1 -= z0; // Distance from where track traveled
+ z2 -= z0; // Distance from where track traveled
+ s = 0.25; // Correction based on definision of Erfc
+ s *= TMath::Erfc(spx*x1) - TMath::Erfc(spx*x2);
+ if(GetDebug(3)){
+ cout <<"el="<<el<<" ix0="<<ix0<<" ix="<<ix<<" x0="<<x<<
+ " iz0="<<iz0<<" iz="<<iz<<" z0="<<z<<
+ " spx*x1="<<spx*x1<<" spx*x2="<<spx*x2<<" s="<<s;
+ } // end if GetDebug
+ s *= TMath::Erfc(spz*z1) - TMath::Erfc(spz*z2);
+ if(GetDebug(3)){
+ cout<<" spz*z1="<<spz*z1<<" spz*z2="<<spz*z2<<" s="<<s<< endl;
+ } // end if GetDebug
+ GetMap()->AddSignal(iz,ix,t,hi,GetModuleNumber(),s*el);
+ } // end for ix, iz