+Float_t AliITSsegmentationSDD::GetAnodeFromLocal(Float_t xloc,Float_t zloc) const {
+ // returns anode coordinate (as float) starting from local coordinates
+ Float_t xAnode=zloc*fgkCm2Micron/fPitch;
+ if(xloc>0){ // left side (anodes 0-255, anode 0 at zloc<0)
+ xAnode+=(Float_t)fNanodes/4;
+ }else{ // right side (anodes 256-511, anode 0 at zloc>0)
+ xAnode=3*fNanodes/4-xAnode;
+ }
+ return xAnode;
+}
+
+//----------------------------------------------------------------------
+Float_t AliITSsegmentationSDD::GetLocalZFromAnode(Int_t nAnode) const{
+ // returns local Z coordinate from anode number (integer)
+ Float_t zAnode=(Float_t)nAnode+0.5;
+ return GetLocalZFromAnode(zAnode);
+}
+
+//----------------------------------------------------------------------
+Float_t AliITSsegmentationSDD::GetLocalZFromAnode(Float_t zAnode) const{
+ // returns local Z coordinate from anode number (float)
+ Float_t zloc=0.;
+ if(zAnode<fNanodes/2){ // left side
+ zloc=(zAnode*fPitch-fDz/2)*fgkMicron2Cm;
+ }else{ // right side
+ zAnode-=fNanodes/2;
+ zloc=-(zAnode*fPitch-fDz/2)*fgkMicron2Cm;
+ }
+ return zloc;
+}
+//----------------------------------------------------------------------
+Int_t AliITSsegmentationSDD::GetChipFromChannel(Int_t ix, Int_t iz) const {
+ // returns chip number (in range 0-7) starting from channel number
+ if(iz>=fNanodes || iz<0 || ix>fNsamples){
+ AliError("Bad cell number");
+ return -1;
+ }
+ Int_t theChip=iz/fgkNanodesPerChip;
+ return theChip;
+}
+//----------------------------------------------------------------------
+Int_t AliITSsegmentationSDD::GetChipFromLocal(Float_t xloc, Float_t zloc) const {
+ // returns chip number (in range 0-7) starting from local coordinates
+ Float_t detsize=fDz*fgkMicron2Cm;
+ Float_t chipsize=detsize/(Float_t)fgkNchipsPerHybrid;
+ zloc+=detsize/2.;
+ if(zloc<-0.01 || zloc>detsize+0.01){ // 100 micron tolerance around edges
+ AliError("Z local value out of sensitive SDD area");
+ return -1;
+ }
+ Int_t iChip=int(zloc/chipsize);
+ if(zloc<0.) iChip=0;
+ if(zloc>=detsize) iChip=fgkNchipsPerHybrid-1;
+ if(iChip>=fgkNchipsPerHybrid || iChip<0){
+ AliError(Form("Bad chip number %d",iChip));
+ return -1;
+ }
+ Int_t iSide=GetSideFromLocalX(xloc);
+ if(iSide==1) iChip=fgkNchipsPerHybrid-iChip+3; // i.e. 7-iChip
+ return iChip;
+}
+//----------------------------------------------------------------------
+Int_t AliITSsegmentationSDD::GetChipsInLocalWindow(Int_t* array, Float_t zmin, Float_t zmax, Float_t xmin, Float_t xmax) const {
+ Int_t nChipInW = 0;
+ Float_t zminDet=-fDz*fgkMicron2Cm/2.;
+ Float_t zmaxDet=fDz*fgkMicron2Cm/2.;
+ if(zmin<zminDet) zmin=zminDet;
+ if(zmax>zmaxDet) zmax=zmaxDet;
+ Float_t xminDet=-fDx*fgkMicron2Cm;
+ Float_t xmaxDet=fDx*fgkMicron2Cm;
+ if(xmin<xminDet) xmin=xminDet;
+ if(xmax>xmaxDet) xmax=xmaxDet;
+ Int_t n1=GetChipFromLocal(xmin,zmin);
+ array[nChipInW]=n1;
+ nChipInW++;
+ Int_t n2=GetChipFromLocal(xmin,zmax);
+ if(n2!=n1){
+ Int_t imin=TMath::Min(n1,n2);
+ Int_t imax=TMath::Max(n1,n2);
+ for(Int_t ichip=imin; ichip<=imax; ichip++){
+ if(ichip==n1) continue;
+ array[nChipInW]=ichip;
+ nChipInW++;
+ }
+ }
+ Int_t n3=GetChipFromLocal(xmax,zmin);
+ if(n3!=n1){
+ array[nChipInW]=n3;
+ nChipInW++;
+ Int_t n4=GetChipFromLocal(xmax,zmax);
+ if(n4!=n3){
+ Int_t imin=TMath::Min(n3,n4);
+ Int_t imax=TMath::Max(n3,n4);
+ for(Int_t ichip=imin; ichip<=imax; ichip++){
+ if(ichip==n3) continue;
+ array[nChipInW]=ichip;
+ nChipInW++;
+ }
+ }
+ }
+ return nChipInW;
+}
+//----------------------------------------------------------------------