X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSsegmentationSSD.cxx;h=3183732111e3d99b0713e3cc14390fabf3cc179a;hb=3a282863bcc86e188d6f4d7697c46efef2facbbd;hp=5ca62512dd48634e3a6d669a99cf1d387db86ce2;hpb=f6b6d58eb61ce9204a5ac3be880a8ee50112d01b;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSsegmentationSSD.cxx b/ITS/AliITSsegmentationSSD.cxx index 5ca62512dd4..3183732111e 100644 --- a/ITS/AliITSsegmentationSSD.cxx +++ b/ITS/AliITSsegmentationSSD.cxx @@ -17,6 +17,9 @@ #include #include +#include +#include +#include #include "AliITSsegmentationSSD.h" ////////////////////////////////////////////////////// @@ -24,45 +27,44 @@ // silicon strips // // // ////////////////////////////////////////////////////// -const Float_t AliITSsegmentationSSD::fgkDxDefault = 72960.; +const Float_t AliITSsegmentationSSD::fgkDxDefault = 73000.; const Float_t AliITSsegmentationSSD::fgkDzDefault = 40000.; const Float_t AliITSsegmentationSSD::fgkDyDefault = 300.; const Float_t AliITSsegmentationSSD::fgkPitchDefault = 95.; const Int_t AliITSsegmentationSSD::fgkNstripsDefault = 768; +const Int_t AliITSsegmentationSSD::fgkNchipsPerSide = 6; +const Int_t AliITSsegmentationSSD::fgkNstripsPerChip = 128; ClassImp(AliITSsegmentationSSD) -AliITSsegmentationSSD::AliITSsegmentationSSD(): AliITSsegmentation(), + +AliITSsegmentationSSD::AliITSsegmentationSSD(Option_t *opt): AliITSsegmentation(), fNstrips(0), fStereoP(0), fStereoN(0), fPitch(0), -fStereoPl5(0), -fStereoNl5(0), -fStereoPl6(0), -fStereoNl6(0), fLayer(0){ // default constructor + SetDetSize(fgkDxDefault,fgkDzDefault,fgkDyDefault); + SetPadSize(fgkPitchDefault,0.); + SetNPads(fgkNstripsDefault,0); + SetAngles(); + if(strstr(opt,"TGeo")){ + if(!gGeoManager){ + AliError("Geometry is not initialized\n"); + return; + } + TGeoVolume *v=NULL; + v = gGeoManager->GetVolume("ITSssdSensitivL5"); + if(!v){ + AliWarning("TGeo volumeITSssdSensitivL5 not found (hint: use v11Hybrid geometry)\n Using hardwired default values"); + } + else { + TGeoBBox *s=(TGeoBBox*)v->GetShape(); + SetDetSize(s->GetDX()*20000.,s->GetDZ()*20000.,s->GetDY()*20000.); + } + } } -//---------------------------------------------------------------------- -AliITSsegmentationSSD::AliITSsegmentationSSD(AliITSgeom *geom): -AliITSsegmentation(geom), -fNstrips(0), -fStereoP(0), -fStereoN(0), -fPitch(0), -fStereoPl5(0), -fStereoNl5(0), -fStereoPl6(0), -fStereoNl6(0), -fLayer(0){ - // constuctor - fCorr = 0; - SetDetSize(fgkDxDefault,fgkDzDefault,fgkDyDefault); - SetPadSize(fgkPitchDefault,0.); - SetNPads(fgkNstripsDefault,0); - SetAngles(); - fLayer = 0; -} + //______________________________________________________________________ void AliITSsegmentationSSD::Copy(TObject &obj) const { // protected method. copy this to obj @@ -71,10 +73,6 @@ void AliITSsegmentationSSD::Copy(TObject &obj) const { ((AliITSsegmentationSSD& ) obj).fNstrips = fNstrips; ((AliITSsegmentationSSD& ) obj).fStereoP = fStereoP; ((AliITSsegmentationSSD& ) obj).fStereoN = fStereoN; - ((AliITSsegmentationSSD& ) obj).fStereoPl5 = fStereoPl5; - ((AliITSsegmentationSSD& ) obj).fStereoNl5 = fStereoNl5; - ((AliITSsegmentationSSD& ) obj).fStereoPl6 = fStereoPl6; - ((AliITSsegmentationSSD& ) obj).fStereoNl6 = fStereoNl6; ((AliITSsegmentationSSD& ) obj).fLayer = fLayer; ((AliITSsegmentationSSD& ) obj).fPitch = fPitch; ((AliITSsegmentationSSD& ) obj).fLayer = fLayer; @@ -97,10 +95,6 @@ fNstrips(0), fStereoP(0), fStereoN(0), fPitch(0), -fStereoPl5(0), -fStereoNl5(0), -fStereoPl6(0), -fStereoNl6(0), fLayer(0){ // copy constructor source.Copy(*this); @@ -116,21 +110,15 @@ void AliITSsegmentationSSD::Init(){ //---------------------------------------------------------------------- void AliITSsegmentationSSD::Angles(Float_t &aP,Float_t &aN) const{ // P and N side stereo angles - if (fLayer == 5){ - aP = fStereoPl5; - aN = fStereoNl5; - } // end if - if (fLayer == 6){ - aP = fStereoPl6; - aN = fStereoNl6; - } // end if + aP = fStereoP; + aN = fStereoN; } //---------------------------------------------------------------------- void AliITSsegmentationSSD::SetLayer(Int_t l){ //set fLayer data member (only 5 or 6 are allowed) if (l==5) fLayer =5; - if (l==6) fLayer =6; - if((l!=5) && (l!=6))AliError(Form("Layer can be 5 or 6, not %d",l)); + else if (l==6) fLayer =6; + else AliError(Form("Layer can be 5 or 6, not %d",l)); } //---------------------------------------------------------------------- void AliITSsegmentationSSD::GetPadTxz(Float_t &x,Float_t &z) const{ @@ -155,8 +143,10 @@ void AliITSsegmentationSSD::GetPadTxz(Float_t &x,Float_t &z) const{ Dead region: |000/ |00/ |0/ - // expects x, z in microns + // expects x, z in cm */ + + /* Float_t stereoP, stereoN; Angles(stereoP,stereoN); Float_t tanP = TMath::Tan(stereoP); @@ -167,75 +157,57 @@ void AliITSsegmentationSSD::GetPadTxz(Float_t &x,Float_t &z) const{ z1 += fDz/2; x = (x1 - z1*tanP)/fPitch; z = (x1 - tanN*(z1 - fDz))/fPitch; + */ + + Float_t P=0; + Float_t N=0; + if(fLayer==5) { + P = 105.26*x - 0.7895*z + 382.000; //- 0.79*z + 381.89; + N = P + 3.684*z - 4; + } + else if(fLayer==6) { + P = -105.26*x - 0.7895*z + 385.000; //- 0.79*z + 384.66; + N = P + 3.684*z + 4; + } + else AliError("Layer can be 5 or 6"); + + x=P; + z=N; + } //---------------------------------------------------------------------- void AliITSsegmentationSSD::GetPadIxz(Float_t x,Float_t z,Int_t &iP,Int_t &iN) const { // returns P and N sided strip numbers for a given location. - /* _- Z - + angle / ^ - fNstrips v | N-Side ...0 - \-------/------------|-----------\--------\ - |\\\\\\/////////////.|\\\\\\\\\\\\\\\\\\\\| - |0\\\\/////////////..|.\\\\\\\\\\\\\\\\\\\| - |00\\/////////////...|..\\\\\\\\\\\\\\\\\\| - X <--|000/////////////... |...\\\\\\\\\\\\\\\\\| - |00/////////////... | ...\\\\\\\\\\\\\\\\| - |0/////////////... | ...\\\\\\\\\\\\\\\| - |//////////////... | ...\\\\\\\\\\\\\\\| - /-----\--------------|--------------------/ - fNstrips-1 P-Side ...0 - |0\ - |00\ - Dead region: |000/ - |00/ - |0/ - - // expects x, z in microns - */ - - Float_t stereoP, stereoN; - Angles(stereoP,stereoN); - Float_t tanP=TMath::Tan(stereoP); - Float_t tanN=TMath::Tan(stereoN); - Float_t x1=x,z1=z; - x1 += fDx/2; - z1 += fDz/2; - Float_t ldX = x1 - z1*tanP; // distance from left-down edge - iP = (Int_t)(ldX/fPitch); - iP = (iP<0)? -1: iP; - iP = (iP>fNstrips)? -1: iP; - - ldX = x1 - tanN*(fDz - z1); - iN = (Int_t)(ldX/fPitch); - iN = (iN<0)? -1: iN; - iN = (iN>fNstrips)? -1: iN; + // expects x, z in cm + GetPadTxz(x,z); + iP = Int_t(x+0.5); + iN = Int_t(z+0.5); } //------------------------------------------------------- -void AliITSsegmentationSSD::GetPadCxz(Int_t iP,Int_t iN,Float_t &x,Float_t &z) const { +void AliITSsegmentationSSD::GetPadCxz(Float_t iP,Float_t iN,Float_t &x,Float_t &z) const { // actually this is the GetCrossing(Float_t &,Float_t &) - // returns local x, z in microns ! - - Float_t lDx = fDx; // detector size in x direction, microns - Float_t lDz = fDz; // detector size in z direction, microns - Float_t xP; // x coordinate in the P side from the first P strip - Float_t xN; // x coordinate in the N side from the first N strip - Float_t stereoP, stereoN; - Angles(stereoP,stereoN); - Float_t kP=TMath::Tan(stereoP); - Float_t kN=TMath::Tan(stereoN); + // returns local x, z in cm + const Float_t kStartXzero=3.64325; + const Float_t kDeltaXzero5or6=0.02239; + const Float_t kDeltaZ5to6=7.6/7.0; - xP=iP*fPitch; - xN=iN*fPitch; - x = xP + kP*(lDz*kN-xP+xN)/(kP+kN); - z = (lDz*kN-xP+xN)/(kP+kN); - x -= lDx/2; - z -= lDz/2; - //if(TMath::Abs(z) > Dz/2) cout<<"Warning, wrong z local ="<GetPadTxz(x,z); - - // first for P side - iP = (Int_t) x; - if(iP<0 || iP>=fNstrips) iP=-1; // strip number must be in range. - // Now for N side) - iN = (Int_t) z; - if(iN<0 || iN>=fNstrips) iN=-1; // strip number must be in range. - return kTRUE; + Float_t dx,dz; + const Double_t kconst = 1.0E-04; // convert microns to cm. + dx = 0.5*kconst*Dx(); + dz = 0.5*kconst*Dz(); + if( (x<-dx) || (x>dx) ) { + iP=-1; + AliWarning(Form("Input argument %f out of range (%f, %f)",x,dx,-dx)); + return kFALSE; // outside of defined volume. + } // outside x range. + if( (z<-dz) || (z>dz) ) { + iN=-1; + AliWarning(Form("Input argument %f out of range (%f, %f)",z,dz,-dz)); + return kFALSE; // outside of defined volume. + } + + //x /= kconst; // convert to microns + //z /= kconst; // convert to microns + this->GetPadTxz(x,z); + + // first for P side + iP = (Int_t) x; + if(iP<0 || iP>=fNstrips) iP=-1; // strip number must be in range. + // Now for N side) + iN = (Int_t) z; + if(iN<0 || iN>=fNstrips) iN=-1; // strip number must be in range. + return kTRUE; } //---------------------------------------------------------------------- void AliITSsegmentationSSD::DetToLocal(Int_t ix,Int_t iPN, @@ -304,6 +289,7 @@ void AliITSsegmentationSSD::DetToLocal(Int_t ix,Int_t iPN, // x = a + b + z*tan(fStereoP); a = Dpx(iP)*(iP+0.5)-dx; b = dz*th; // for strips n-side // x = a + b + z*tan(fStereoP); a = Dpx(iN)*(iN+0.5)-dx; b = -dz*th; + AliWarning("This function has not been verified. Should probably use GetPadCxz"); const Double_t kconst = 1.0E-04; // convert microns to cm. Float_t flag=kconst*Dx(); // error value Double_t th=0.0,dx,dz,i,a,b=0.0,xb[4],zb[4]; @@ -347,66 +333,101 @@ void AliITSsegmentationSSD::DetToLocal(Int_t ix,Int_t iPN, return; } //---------------------------------------------------------------------- -Bool_t AliITSsegmentationSSD::GetCrossing(Int_t iP,Int_t iN, - Float_t &x,Float_t &z, - Float_t c[2][2]){ - // Given one P side strip and one N side strip, Returns kTRUE if they - // cross each other and the location of the two crossing strips and - // their correxlation matrix c[2][2]. - /* _- Z - + angle / ^ - fNstrips v | N-Side ...0 - \-------/------------|-----------\--------\ - |\\\\\\/////////////.|\\\\\\\\\\\\\\\\\\\\| - |0\\\\/////////////..|.\\\\\\\\\\\\\\\\\\\| - |00\\/////////////...|..\\\\\\\\\\\\\\\\\\| - X <--|000/////////////... |...\\\\\\\\\\\\\\\\\| - |00/////////////... | ...\\\\\\\\\\\\\\\\| - |0/////////////... | ...\\\\\\\\\\\\\\\| - |//////////////... | ...\\\\\\\\\\\\\\\| - /-----\--------------|--------------------/ - fNstrips-1 P-Side ...0 - |0\ - |00\ - Dead region: |000/ - |00/ - |0/ - c[2][2] is defined as follows - /c[0][0] c[0][1]\ /delta iP\ = /delta x\ - \c[1][0] c[1][1]/ \delta iN/ = \delta z/ - */ - const Double_t kconst = 1.0E-04; // convert microns to cm. - Double_t thp,thn,th,dx,dz,p,ip,in; - Float_t stereoP, stereoN; - Angles(stereoP,stereoN); - - thp = TMath::Tan(stereoP); - thn = TMath::Tan(-stereoN); - th = thp-thn; - if(th==0.0) { // parall strips then never cross. - x = 0.0; - z = 0.0; - c[0][0] = c[1][0] = c[0][1] = c[1][1] = 0.0; - return kFALSE; - } // end if - // The strips must cross some place in space. - ip = (Double_t) iP; // convert to double now for speed - in = (Double_t) iN; // convert to double now for speed - dx = 0.5*kconst*Dx(); // half distance in x in cm - dz = 0.5*kconst*Dz(); // half distance in z in cm - p = kconst*Dpx(iP); // Get strip spacing/pitch now - x = 0.5*p+dx + (p*(in*thp-ip*thn)-2.0*dz*thp*thn)/th; - z =(p*(in-ip)-dz*(thp+thn))/th; - // compute correlations. - c[0][0] = -thn*p/th; // dx/diP - c[1][1] = p/th; // dz/diN - c[0][1] = p*thp/th; // dx/diN - c[1][0] = -p/th; // dz/diP - if(x<-dx || x>dx || z<-dz || z>dz) return kFALSE; // crossing is outside - // of the detector so - // these strips don't - // cross. - return kTRUE; +Int_t AliITSsegmentationSSD::GetChipFromChannel(Int_t ix, Int_t iz) const { + // returns chip number (in range 0-11) starting from channel number + + if( (iz>=fgkNstripsDefault) || (iz<0) || (ix<0) || (ix>1) ) { + AliError("Bad cell number"); + return -1; + } + + if(ix==1) iz = 1535-iz; + Int_t theChip =iz/fgkNstripsPerChip; + return theChip; + +} +//---------------------------------------------------------------------- +Int_t AliITSsegmentationSSD::GetChipFromLocal(Float_t xloc, Float_t zloc) const +{ + // returns chip numbers starting from local coordinates + // The two Nside chip number and Pside chip number are + // coded as chip=Nchip*10+Pchip + + Int_t iP=0; + Int_t iN=0; + if (!LocalToDet(xloc,zloc,iP,iN) || + (iP<0) || (iP>=fNstrips) || (iN<0) || (iN>=fNstrips) ) { + //AliWarning("Bad local coordinate"); + return -1; + } + + Int_t iChip = GetChipFromChannel(0,iP); + iChip += 10*GetChipFromChannel(1,iN); // add Nside + + return iChip; + +} +// + +Int_t AliITSsegmentationSSD::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*1.0E-04/2.; + Float_t zmaxDet=fDz*1.0E-04/2.; + if(zminzmaxDet) zmax=zmaxDet; + + Float_t xminDet=-fDx*1.0E-04/2; + Float_t xmaxDet=fDx*1.0E-04/2; + if(xminxmaxDet) xmax=xmaxDet; + + Int_t n1N=-1; + Int_t n1P=-1; + Int_t n1=GetChipFromLocal(xmin,zmin); + if(n1!=-1) { // Note! Recpoint can be on the sensor but in the dead area not covered by strips! + n1N = (Int_t) (n1/10); // N-side chip coded as 10*chip_index + n1P = n1 - 10 * n1N; // P-side chip coded 0-5 + array[nChipInW]=n1P; + nChipInW++; + array[nChipInW]=n1N; + nChipInW++; + } + + Int_t n2N=-1; + Int_t n2P=-1; + Int_t n2=GetChipFromLocal(xmin,zmax); + if(n2!=-1) { // Note! Recpoint can be on the sensor but in the dead area not covered by strips! + n2N = (Int_t) (n2/10); // N-side chip coded as 10*chip_index + n2P = n2 - 10 * n2N; // P-side chip coded 0-5 + if(n2P!=n1P) { array[nChipInW]=n2P; nChipInW++;} + if(n2N!=n1N) { array[nChipInW]=n2N; nChipInW++;} + } + + Int_t n3N=-1; + Int_t n3P=-1; + Int_t n3=GetChipFromLocal(xmax,zmin); + if(n3!=-1) { + n3N=(Int_t) (n3/10); // N-side chip coded as 10*chip_index + n3P=n3 - 10 * n3N; // P-side chip coded 0-5 + if((n3P!=n1P)&&(n3P!=n2P)) { array[nChipInW]=n3P; nChipInW++;} + if((n3N!=n1N)&&(n3N!=n2N)) { array[nChipInW]=n3N; nChipInW++;} + } + + Int_t n4N=-1; + Int_t n4P=-1; + Int_t n4=GetChipFromLocal(xmax,zmax); + if(n4!=-1) { + n4N=(Int_t) (n4/10); // N-side chip coded as 10*chip_index + n4P=n4 - 10 * n4N; // P-side chip coded 0-5 + if((n4P!=n1P)&&(n4P!=n2P)&&(n4P!=n3P)) { array[nChipInW]=n4P; nChipInW++;} + if((n4N!=n1N)&&(n4N!=n2N)&&(n4N!=n3N)) { array[nChipInW]=n4N; nChipInW++;} + } + + return nChipInW; + } //----------------------------------------------------------------------