/*
$Log$
+Revision 1.11 2007/05/09 08:37:40 arcelli
+Fix a bug in getting the pad volume path (in case of holes for PHOS)
+
+Revision 1.10 2007/05/03 08:04:19 decaro
+Coding convention: RN17 violation -> suppression
+
+Revision 1.9 2007/04/27 17:41:01 arcelli
+merge DistanceToPad and IsInsideThePad methods
+
+Revision 1.8 2007/02/19 18:55:26 decaro
+Added getter methods for volume path (for Event Display)
+
+Revision 1.17.1 2006/12/15
+ Added methods:
+ DetToSectorRF(...) to get pad corners
+ coordinates in its sector reference frame;
+ GetVolumePath(Int_t sector, Char_t *path)
+ to get the volume path for a sector
+ GetVolumePath(Int_t sector, Int_t plate, Int_t strip, Char_t *path)
+ to get the volume path for a strip
+ (A.De Caro, M.Di Stefano)
+Revision 1.7 2006/07/12 16:03:59 arcelli
+updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
+
+Revision 1.6 2006/05/04 19:41:42 hristov
+Possibility for partial TOF geometry (S.Arcelli)
+
Revision 1.5 2006/04/20 22:30:50 hristov
Coding conventions (Annalisa)
//const Float_t klstripx = fgkStripLength;
*/
- const Float_t khsensmy = 0.5;//0.05;//0.11;//0.16;// // heigth of Sensitive Layer
+ const Float_t kPadDepth = 0.5;//0.05;//0.11;//0.16;// // heigth of Sensitive Layer
//Transform pos into Sector Frame
Float_t yr = yt;
Float_t zr = -xt*TMath::Sin(alpha/kRaddeg)+zt*TMath::Cos(alpha/kRaddeg);
- if(TMath::Abs(xr)<=khsensmy*0.5 && TMath::Abs(yr)<= (fgkXPad*0.5) && TMath::Abs(zr)<= (fgkZPad*0.5))
+ if(TMath::Abs(xr)<=kPadDepth*0.5 && TMath::Abs(yr)<= (fgkXPad*0.5) && TMath::Abs(zr)<= (fgkZPad*0.5))
isInside=true;
return isInside;
//_____________________________________________________________________________
-Float_t AliTOFGeometryV5::DistanceToPad(Int_t *det, TGeoHMatrix mat, Float_t *pos, Float_t *dist3d) const
-{
-//
-// Returns distance of space point with coor pos (x,y,z) (cm) wrt
-// pad with Detector Indices idet (iSect,iPlate,iStrip,iPadX,iPadZ)
-//
- if (!gGeoManager) {
- printf("ERROR: no TGeo\n");
- return 0.;
- }
- Double_t vecg[3];
- vecg[0]=pos[0];
- vecg[1]=pos[1];
- vecg[2]=pos[2];
- Double_t veclr[3]={-1.,-1.,-1.};
- Double_t vecl[3]={-1.,-1.,-1.};
- mat.MasterToLocal(vecg,veclr);
- vecl[0]=veclr[1];
- vecl[1]=veclr[0];
- //take into account reflections
- if(det[1]>-1)vecl[2]=-veclr[2];
-
- Float_t dist = TMath::Sqrt(vecl[0]*vecl[0]+vecl[1]*vecl[1]+vecl[2]*vecl[2]);
-
-
- if (dist3d){
- dist3d[0] = vecl[0];
- dist3d[1] = vecl[1];
- dist3d[2] = vecl[2];
- }
-
- return dist;
-
-}
-
-
-//_____________________________________________________________________________
-Bool_t AliTOFGeometryV5::IsInsideThePad( Int_t *det, TGeoHMatrix mat, Float_t *pos) const
+Bool_t AliTOFGeometryV5::IsInsideThePad(TGeoHMatrix mat, Float_t *pos, Float_t *dist3d) const
{
//
// Returns true if space point with coor pos (x,y,z) (cm) falls
// inside pad with Detector Indices idet (iSect,iPlate,iStrip,iPadX,iPadZ)
//
- const Float_t khsensmy = 0.5; // heigth of Sensitive Layer
+ const Float_t kPadDepth = 0.5; // heigth of Sensitive Layer
Double_t vecg[3];
vecg[0]=pos[0];
vecg[1]=pos[1];
vecg[2]=pos[2];
Double_t veclr[3]={-1.,-1.,-1.};
Double_t vecl[3]={-1.,-1.,-1.};
- mat.MasterToLocal(vecg,vecl);
+ mat.MasterToLocal(vecg,veclr);
vecl[0]=veclr[1];
vecl[1]=veclr[0];
//take into account reflections
- if(det[1]>-1)vecl[2]=-veclr[2];
+ vecl[2]=-veclr[2];
Float_t xr = vecl[0];
Float_t yr = vecl[1];
Float_t zr = vecl[2];
+ if (dist3d){
+ dist3d[0] = vecl[0];
+ dist3d[1] = vecl[1];
+ dist3d[2] = vecl[2];
+ }
+
Bool_t isInside=false;
- if(TMath::Abs(xr)<= khsensmy*0.5 && TMath::Abs(yr)<= (fgkXPad*0.5) && TMath::Abs(zr)<= (fgkZPad*0.5))
+ if(TMath::Abs(xr)<= kPadDepth*0.5 && TMath::Abs(yr)<= (fgkXPad*0.5) && TMath::Abs(zr)<= (fgkZPad*0.5))
isInside=true;
return isInside;
Float_t AliTOFGeometryV5::GetPadDy(Float_t *pos)
{
//
- // Returns the x coordinate in the Pad reference frame
+ // Returns the y coordinate in the Pad reference frame
//
Float_t ypad = -2.;
Float_t AliTOFGeometryV5::GetPadDz(Float_t *pos)
{
//
- // Returns the x coordinate in the Pad reference frame
+ // Returns the z coordinate in the Pad reference frame
//
Float_t zpad = -2.;
Char_t string3[100];
Int_t icopy=-1;
-
- if(sector<13){
- icopy=sector+5;}
- else{ icopy=sector-13;}
- sprintf(string1,"/ALIC_1/B077_1/BSEGMO%i_1/BTOF%i_1/FTOA_0/FLTA_0",icopy,icopy);
+ icopy=sector;
+
+ sprintf(string1,"/ALIC_1/B077_1/BSEGMO%i_1/BTOF%i_1",icopy,icopy);
Int_t iplate=ind[1];
Int_t istrip=ind[2];
if( iplate==3) icopy=istrip+NStripC()+NStripB()+NStripA();
if( iplate==4) icopy=istrip+NStripC()+2*NStripB()+NStripA();
icopy++;
- sprintf(string2,"FSTR_%i",icopy);
+ sprintf(string2,"FTOA_0/FLTA_0/FSTR_%i",icopy);
if(fHoles && (sector==11 || sector==12)){
if(iplate<2) sprintf(string2,"FTOB_0/FLTB_0/FSTR_%i",icopy);
if(iplate>2) sprintf(string2,"FTOC_0/FLTC_0/FSTR_%i",icopy);
}
-
Int_t padz = ind[3]+1;
Int_t padx = ind[4]+1;
sprintf(string3,"FPCB_1/FSEN_1/FSEZ_%i/FPAD_%i",padz,padx);
sprintf(path,"%s/%s/%s",string1,string2,string3);
+}
+//_____________________________________________________________________________
+void AliTOFGeometryV5::GetVolumePath(Int_t sector, Char_t *path ){
+ //--------------------------------------------------------------------
+ // This function returns the colume path of a given sector
+ //--------------------------------------------------------------------
+
+ Char_t string[100];
+
+ Int_t icopy = sector;
+
+ sprintf(string,"/ALIC_1/B077_1/BSEGMO%i_1/BTOF%i_1",icopy,icopy);
+ sprintf(path,"%s",string);
+
+}
+//_____________________________________________________________________________
+void AliTOFGeometryV5::GetVolumePath(Int_t sector, Int_t plate, Int_t strip, Char_t *path ) {
+ //--------------------------------------------------------------------
+ // This function returns the colume path of a given strip
+ //--------------------------------------------------------------------
+
+ Char_t string1[100];
+ Char_t string2[100];
+ Char_t string3[100];
+
+ Int_t icopy = sector;
+
+ sprintf(string1,"/ALIC_1/B077_1/BSEGMO%i_1/BTOF%i_1",icopy,icopy);
+
+ if(plate==0) icopy=strip;
+ if(plate==1) icopy=strip+NStripC();
+ if(plate==2) icopy=strip+NStripC()+NStripB();
+ if(plate==3) icopy=strip+NStripC()+NStripB()+NStripA();
+ if(plate==4) icopy=strip+NStripC()+2*NStripB()+NStripA();
+ icopy++;
+ sprintf(string2,"FTOA_0/FLTA_0/FSTR_%i",icopy);
+ if(fHoles && (sector==11 || sector==12)) {
+ if(plate<2) sprintf(string2,"FTOB_0/FLTB_0/FSTR_%i",icopy);
+ if(plate>2) sprintf(string2,"FTOC_0/FLTC_0/FSTR_%i",icopy);
+ }
+
+ sprintf(string3,"FPCB_1/FSEN_1");
+ sprintf(path,"%s/%s/%s",string1,string2,string3);
+
}
//_____________________________________________________________________________
void AliTOFGeometryV5::GetPos(Int_t *det, Float_t *pos)
pos[2]=tr[2];
}
//_____________________________________________________________________________
+
+void AliTOFGeometryV5::DetToSectorRF(Int_t vol[5], Double_t **coord)
+{
+ //
+ // Returns the local coordinates (x, y, z) in sector reference frame
+ // for the 4 corners of each sector pad (vol[1], vol[2], vol[3], vol[4])
+ //
+
+ if (!gGeoManager) printf("ERROR: no TGeo\n");
+
+ // ALICE -> TOF Sector
+ Char_t path1[100]="";
+ GetVolumePath(vol[0],path1);
+ gGeoManager->cd(path1);
+ TGeoHMatrix aliceToSector;
+ aliceToSector = *gGeoManager->GetCurrentMatrix();
+
+ // TOF Sector -> ALICE
+ //TGeoHMatrix sectorToALICE = aliceToSector.Inverse();
+
+ // ALICE -> TOF Pad
+ Char_t path2[100]="";
+ GetVolumePath(vol,path2);
+ gGeoManager->cd(path2);
+ TGeoHMatrix aliceToPad;
+ aliceToPad = *gGeoManager->GetCurrentMatrix();
+
+ // TOF Pad -> ALICE
+ TGeoHMatrix padToALICE = aliceToPad.Inverse();
+
+ // TOF Pad -> TOF Sector
+ TGeoHMatrix padToSector = padToALICE*aliceToSector;
+
+ // TOF Sector -> TOF Pad
+ //TGeoHMatrix sectorToPad = sectorToALICE*aliceToPad;
+
+ // coordinates of the pad bottom corner
+ Double_t **cornerPad = new Double_t*[4];
+ for (Int_t ii=0; ii<4; ii++) cornerPad[ii] = new Double_t[3];
+
+ cornerPad[0][0] = -fgkXPad/2.;
+ cornerPad[0][1] = 0.;
+ cornerPad[0][2] = -fgkZPad/2.;
+
+ cornerPad[1][0] = fgkXPad/2.;
+ cornerPad[1][1] = 0.;
+ cornerPad[1][2] = -fgkZPad/2.;
+
+ cornerPad[2][0] = fgkXPad/2.;
+ cornerPad[2][1] = 0.;
+ cornerPad[2][2] = fgkZPad/2.;
+
+ cornerPad[3][0] = -fgkXPad/2.;
+ cornerPad[3][1] = 0.;
+ cornerPad[3][2] = fgkZPad/2.;
+
+ for(Int_t aa=0; aa<4; aa++) for(Int_t bb=0; bb<3; bb++) coord[aa][bb]=0.;
+
+ for (Int_t jj=0; jj<4; jj++) padToSector.MasterToLocal(&cornerPad[jj][0], &coord[jj][0]);
+
+ delete cornerPad;
+
+ //sectorToPad.LocalToMaster(cornerPad, coord);
+
+}