X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSgeom.cxx;h=502f8b0716c010abe6b23d0f4dc8388f51369293;hb=0bc46b994953eaefd4301e6e15d43fe61c912c73;hp=7b873ae34e560e99d5bf221891316f015e075565;hpb=a8a6107b8ec2a0ac82487a82099095c32cffd002;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSgeom.cxx b/ITS/AliITSgeom.cxx index 7b873ae34e5..502f8b0716c 100644 --- a/ITS/AliITSgeom.cxx +++ b/ITS/AliITSgeom.cxx @@ -13,62 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.12 2001/01/17 15:41:27 barbera -Some corrections suggested by Peter Hristov added - -Revision 1.11 2000/10/02 16:32:35 barbera -Forward declaration added - -Revision 1.4.4.15 2000/10/02 15:52:05 barbera -Forward declaration added - -Revision 1.10 2000/09/05 14:25:50 nilsen -Made fixes for HP compiler. All function parameter default values placed -in .h file. Fixed the usual problem with HP comilers and the "for(Int_t i..." -business. Replaced casting (Double_t [3][3]) to (Double_t (*)[3]) for HP. -Lastly removed all "const" before function parameters which were 2 dim. arrays, -because on HP root generates some strange code (?). Thanks Peter for the -changes. - -Revision 1.9 2000/08/29 20:19:03 nilsen -Removed dependancy on structure AliITSeomS and replaced it with class -AliITSgeomMatrix. Added many new functions with many new arguments. Most -in the form of in line functions for speed. - -Revision 1.4.4.6 2000/06/04 16:33:32 Nilsen -A restructured AliITSgeom class. Now used AliITSgeomMatrix. - -Revision 1.4.4.5 2000/03/04 23:42:39 Nilsen -Updated the comments/documentations and improved the maintainability of the -code. - -Revision 1.4.4.4 2000/03/02 21:27:07 Nilsen -Added two functions, SetByAngles and SetTrans. - -Revision 1.4.4.3 2000/01/23 03:09:10 Nilsen -// fixed compiler warnings for new function LtLErrorMatrix(...) - -Revision 1.4.4.2 2000/01/19 23:18:20 Nilsen -Added transformations of Error matrix to AliITSgeom and fixed some typos -in AliITS.h and AliITShitIndex.h - -Revision 1.4.4.1 2000/01/12 19:03:32 Nilsen -This is the version of the files after the merging done in December 1999. -See the ReadMe110100.txt file for details - -Revision 1.4 1999/10/15 07:03:20 fca -Fixed bug in GetModuleId(Int_t index,Int_t &lay,Int_t &lad, Int_t &det) and -a typo in the creator. aliroot need to be rerun to get a fixed geometry. - -Revision 1.3 1999/10/04 15:20:12 fca -Correct syntax accepted by g++ but not standard for static members, remove minor warnings - -Revision 1.2 1999/09/29 09:24:20 fca -Introduction of the Copyright and cvs Log - -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////// // ITS geometry manipulation routines. // @@ -77,8 +22,9 @@ Introduction of the Copyright and cvs Log // By: Bjorn S. Nilsen // // version: 0.0.1 // // Updated May 27 1999. // -// Added Cylindrical random and global based changes. // -// Added function PrintComparison. // +// Added Cylindrical random and global based changes. // +// // +// Modified and added functions Feb. 7 2006 // /////////////////////////////////////////////////////////////////////// @@ -138,291 +84,322 @@ pixel coordinate system. // // Data Members: // +// TString fVersion +// Transformation version. +// Int_t fTrans +// Flag to keep track of which transformation +// Int_t fNmodules +// The total number of modules // Int_t fNlayers // The number of ITS layers for this geometry. By default this // is 6, but can be modified by the creator function if there are // more layers defined. // -// Int_t *fNlad +// TArrayI fNlad // A pointer to an array fNlayers long containing the number of // ladders for each layer. This array is typically created and filled // by the AliITSgeom creator function. // -// Int_t *fNdet +// TArrayI fNdet // A pointer to an array fNlayers long containing the number of // active detector volumes for each ladder. This array is typically // created and filled by the AliITSgeom creator function. // -// AliITSgeomMatrix *fGm +// TObjArray fGm containing objects of type AliITSgeomMatrix // A pointer to an array of AliITSgeomMatrix classes. One element // per module (detector) in the ITS. AliITSgeomMatrix basicly contains // all of the necessary information about the detector and it's coordinate // transformations. // -// TObjArray *fShape -// A pointer to an array of TObjects containing the detailed shape -// information for each type of detector used in the ITS. For example -// I have created AliITSgeomSPD, AliITSgeomSDD, and AliITSgeomSSD as -// example structures, derived from TObjects, to hold the detector -// information. I would recommend that one element in each of these -// structures, that which describes the shape of the active volume, -// be one of the ROOT classes derived from TShape. In this way it would -// be easy to have the display program display the correct active -// ITS volumes. See the example classes AliITSgeomSPD, AliITSgeomSDD, -// and AliITSgeomSSD for a more detailed example. //////////////////////////////////////////////////////////////////////// -#include -#include -#include -#include -#include +#include #include -#include + #include +#include +#include #include "AliITSgeom.h" -#include "AliITSgeomMatrix.h" -#include "AliITSgeomSPD.h" -#include "AliITSgeomSDD.h" -#include "AliITSgeomSSD.h" +#include "AliLog.h" ClassImp(AliITSgeom) -//_____________________________________________________________________ -AliITSgeom::AliITSgeom(){ -//////////////////////////////////////////////////////////////////////// -// The default constructor for the AliITSgeom class. It, by default, -// sets fNlayers to zero and zeros all pointers. -//////////////////////////////////////////////////////////////////////// - // Default constructor. - // Do not allocate anything zero everything - fTrans = 0; // standard GEANT global/local coordinate system. - fNlayers = 0; - fNlad = 0; - fNdet = 0; - fGm = 0; - fShape = 0; - return; +//______________________________________________________________________ +AliITSgeom::AliITSgeom(): +TObject(), +fVersion("GEANT"),// Transformation version. +fTrans(0), // Flag to keep track of which transformation +fNmodules(0), // The total number of modules +fNlayers(0), // The number of layers. +fNlad(), //[] Array of the number of ladders/layer(layer) +fNdet(), //[] Array of the number of detector/ladder(layer) +fGm(0,0) // Structure of translation. and rotation. +{ + // The default constructor for the AliITSgeom class. It, by default, + // sets fNlayers to zero and zeros all pointers. + // Do not allocate anything zero everything. + // Inputs: + // none. + // Outputs: + // none. + // Return: + // a zeroed AliITSgeom object. + + fGm.SetOwner(kTRUE); + return; } -//_____________________________________________________________________ -AliITSgeom::~AliITSgeom(){ -//////////////////////////////////////////////////////////////////////// -// The destructor for the AliITSgeom class. If the arrays fNlad, -// fNdet, or fGm have had memory allocated to them, there pointer values -// are non zero, then this memory space is freed and they are set -// to zero. In addition, fNlayers is set to zero. The destruction of -// TObjArray fShape is, by default, handled by the TObjArray destructor. -//////////////////////////////////////////////////////////////////////// - // Default destructor. - // if arrays exist delete them. Then set everything to zero. - if(fGm!=0){ - for(Int_t i=0;i Standard GEANT + // bit 1 => ITS tracking + // bit 2 => A change in the coordinate system + // has been made. others are still to be defined + // as needed. + // Int_t nlayers The number of ITS layers also set the size of + // the arrays + // Int_t *nlads an array of the number of ladders for each + // layer. This array must be nlayers long. + // Int_t *ndets an array of the number of detectors per ladder + // for each layer. This array must be nlayers long. + // Int_t mods The number of modules. Typically the sum of all the + // detectors on every layer and ladder. + // Outputs: + // none + // Return: + // A properly inilized AliITSgeom object. + + fGm.SetOwner(kTRUE); + return; } //______________________________________________________________________ -void AliITSgeom::ReadNewFile(const char *filename){ - printf("New file format not defined yet\n"); +void AliITSgeom::Init(Int_t itype,Int_t nlayers,const Int_t *nlads, + const Int_t *ndets,Int_t mods){ + // A simple Inilizer to set basic geometry class variables + // Inputs: + // Int_t itype the type of transformation kept. + // bit 0 => Standard GEANT + // bit 1 => ITS tracking + // bit 2 => A change in the coordinate system + // has been made. others are still to be defined + // as needed. + // Int_t nlayers The number of ITS layers also set the size of + // the arrays + // Int_t *nlads an array of the number of ladders for each + // layer. This array must be nlayers long. + // Int_t *ndets an array of the number of detectors per ladder + // for each layer. This array must be nlayers long. + // Int_t mods The number of modules. Typically the sum of all the + // detectors on every layer and ladder. + // Outputs: + // none + // Return: + // A properly inilized AliITSgeom object. + + fVersion = "GEANT"; // Transformation version. + fTrans = itype; // Flag to keep track of which transformation + fNmodules = mods; // The total number of modules + fNlayers = nlayers; // The number of layers. + fNlad.Set(nlayers,nlads);//[] Array of the number of ladders/layer(layer) + fNdet.Set(nlayers,ndets);//[] Array of the number of detector/ladder(layer) + fGm.Clear(); + fGm.Expand(mods); // Structure of translation. and rotation. + fGm.SetOwner(kTRUE); return; } -//_____________________________________________________________________ -AliITSgeom::AliITSgeom(const char *filename){ -//////////////////////////////////////////////////////////////////////// -// The constructor for the AliITSgeom class. All of the data to fill -// this structure is read in from the file given my the input filename. -//////////////////////////////////////////////////////////////////////// - FILE *pf; - Int_t i,lm=0,id[3]; - Int_t l,a,d; - Float_t x,y,z,o,p,q,r,s,t; - Double_t rot6[6],tran[3]; - char buf[200],*buff=0; // input character buffer; - - pf = fopen(filename,"r"); - - fNlayers = 6; // set default number of ladders -TryAgain: - fNlad = new Int_t[fNlayers]; - fNdet = new Int_t[fNlayers]; - fNmodules = 0; - // find the number of ladders and detectors in this geometry. - for(i=0;ilm) lm = l; - if(l<1 || l>fNlayers) { - printf("error in file %s layer=%d min. is 1 max is %d/n", - filename,l,fNlayers); - continue; - }// end if l - fNmodules++; - if(l<=fNlayers&&fNlad[l-1]fNlayers){ - delete[] fNlad; - delete[] fNdet; - fNlayers = lm; - goto TryAgain; - } // end if lm>fNlayers - // counted the number of ladders and detectors now allocate space. - fGm = new AliITSgeomMatrix*[fNmodules]; - - // Set up Shapes for a default configuration of 6 layers. - fTrans = 0; // standard GEANT global/local coordinate system. - fShape = new TObjArray(3); - AddShape((TObject *) new AliITSgeomSPD()); // shape 0 - AddShape((TObject *) new AliITSgeomSDD()); // shape 1 - AddShape((TObject *) new AliITSgeomSPD()); // shape 2 - - // prepare to read in transforms - lm = 0; // reuse lm as counter of modules. - rewind(pf); // start over reading file - while(fgets(buf,200,pf)!=NULL){ // for ever loop - for(i=0;i<200;i++)if(buf[i]!=' '){ // remove blank spaces. - buff = &(buf[i]); - break; - } // end for i - // remove blank lines and comments. - if(buff[0]=='\n'||buff[0]=='#'||buff[0]=='!'|| - (buff[0]=='/'&&buff[1]=='/')) continue; - x = y = z = o = p = q = r = s = t = 0.0; - sscanf(buff,"%d %d %d %f %f %f %f %f %f %f %f %f", - &l,&a,&d,&x,&y,&z,&o,&p,&q,&r,&s,&t); - if(l<1 || l>fNlayers) { - printf("error in file %s layer=%d min. is 1 max is %d/n", - filename,l,fNlayers); - continue; - }// end if l - id[0] = l;id[1] = a;id[2] = d; - tran[0] = tran[1] = tran[2] = 0.0; - tran[0] = (Double_t)x;tran[1] = (Double_t)y;tran[2] = (Double_t)z; - rot6[0] = rot6[1] = rot6[2] = rot6[3] = rot6[4] = rot6[5] =0.0; - rot6[0] = (Double_t)o;rot6[1] = (Double_t)p;rot6[2] = (Double_t)q; - rot6[3] = (Double_t)r;rot6[4] = (Double_t)s;rot6[5] = (Double_t)t; - switch (l){ - case 1: case 2: // layer 1 or2 SPD - fGm[lm++] = new AliITSgeomMatrix(rot6,0,id,tran); - break; - case 3: case 4: // layer 3 or 4 SDD - fGm[lm++] = new AliITSgeomMatrix(rot6,1,id,tran); - break; - case 5: case 6: // layer 5 or 6 SSD - fGm[lm++] = new AliITSgeomMatrix(rot6,2,id,tran); - break; - } // end switch - } // end while ever loop - fclose(pf); +//______________________________________________________________________ +void AliITSgeom::CreateMatrix(Int_t mod,Int_t lay,Int_t lad,Int_t det, + AliITSDetector idet,const Double_t tran[3], + const Double_t rot[10]){ + // Given the translation vector tran[3] and the rotation matrix rot[1], + // this function creates and adds to the TObject Array fGm the + // AliITSgeomMatrix object. + // The rot[10] matrix is set up like: + /* / rot[0] rot[1] rot[2] \ + // | rot[3] rot[4] rot[5] | + // \ rot[6] rot[7] rot[8] / if(rot[9]!=0) then the Identity matrix + // is used regardless of the values in rot[0]-rot[8]. + */ + // Inputs: + // Int_t mod The module number. The location in TObjArray + // Int_t lay The layer where this module is + // Int_t lad On which ladder this module is + // Int_t det Which detector on this ladder this module is + // AliITSDetector idet The type of detector see AliITSgeom.h + // Double_t tran[3] The translation vector + // Double_t rot[10] The rotation matrix. + // Outputs: + // none + // Return: + // none. + Int_t id[3]; + Double_t r[3][3] = {{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}}; + + if(mod<0||mod>=fGm.GetSize()){ + Error("CreateMatrix","mod=%d is out of bounds max value=%d",mod, + fGm.GetSize()); + return; + } // end if + delete fGm.At(mod); + id[0] = lay; id[1] = lad; id[2] = det; + if(rot[9]!=0.0) { // null rotation + r[0][0] = rot[0]; r[0][1] = rot[1]; r[0][2] = rot[2]; + r[1][0] = rot[3]; r[1][1] = rot[4]; r[1][2] = rot[5]; + r[2][0] = rot[6]; r[2][1] = rot[7]; r[2][2] = rot[8]; + } // end if + fGm.AddAt(new AliITSgeomMatrix(idet,id,r,tran),mod); } - -//________________________________________________________________________ -AliITSgeom::AliITSgeom(AliITSgeom &source){ -//////////////////////////////////////////////////////////////////////// -// The copy constructor for the AliITSgeom class. It calls the -// = operator function. See the = operator function for more details. -//////////////////////////////////////////////////////////////////////// - - *this = source; // Just use the = operator for now. +//______________________________________________________________________ +AliITSgeom::~AliITSgeom(){ + // The destructor for the AliITSgeom class. If the arrays fNlad, + // fNdet, or fGm have had memory allocated to them, there pointer values + // are non zero, then this memory space is freed and they are set + // to zero. In addition, fNlayers is set to zero. The destruction of + // Inputs: + // none. + // Outputs: + // none. + // Return: + // none. return; } +//______________________________________________________________________ +AliITSgeom::AliITSgeom(const AliITSgeom &source) : +TObject(source), +fVersion(source.fVersion), // Transformation version. +fTrans(source.fTrans), // Flag to keep track of which transformation +fNmodules(source.fNmodules),// The total number of modules +fNlayers(source.fNlayers), // The number of layers. +fNlad(source.fNlad), // Array of the number of ladders/layer(layer) +fNdet(source.fNdet), // Array of the number of detector/ladder(layer) +fGm(source.fGm.GetSize(),source.fGm.LowerBound())// Structure of + // translation and rotation. +{ + // The copy constructor for the AliITSgeom class. It calls the + // = operator function. See the = operator function for more details. + // Inputs: + // AliITSgeom &source The AliITSgeom class with which to make this + // a copy of. + // Outputs: + // none. + // Return: + // none. + Int_t i,n; + + n = source.fGm.GetLast()+1; + for(i=source.fGm.LowerBound();ifGm != 0){ - for(i=0;ifNmodules;i++) delete this->fGm[i]; - delete this->fGm; - } // end if fGm != 0 - if(fNlad != 0) delete[] fNlad; - if(fNdet != 0) delete[] fNdet; - - this->fTrans = source.fTrans; - this->fNmodules = source.fNmodules; - this->fNlayers = source.fNlayers; - this->fNlad = new Int_t[fNlayers]; - for(i=0;ifNlayers;i++) this->fNlad[i] = source.fNlad[i]; - this->fNdet = new Int_t[fNlayers]; - for(i=0;ifNlayers;i++) this->fNdet[i] = source.fNdet[i]; - this->fShape = new TObjArray(*(source.fShape));//This does not make a proper copy. - this->fGm = new AliITSgeomMatrix*[this->fNmodules]; - for(i=0;ifNmodules;i++){ - this->fGm[i] = new AliITSgeomMatrix(*(source.fGm[i])); - } // end for i - return; -}//_____________________________________________________________________ -Int_t AliITSgeom::GetModuleIndex(const Int_t lay,const Int_t lad, - const Int_t det){ -//////////////////////////////////////////////////////////////////////// -// This routine computes the module index number from the layer, -// ladder, and detector numbers. The number of ladders and detectors -// per layer is determined when this geometry package is constructed, -// see AliITSgeom(const char *filename) for specifics. -//////////////////////////////////////////////////////////////////////// + if(this == &source) return *this; // don't assign to ones self. + + // if there is an old structure allocated delete it first. + this->fGm.Clear(); + + this->fVersion = source.fVersion; + this->fTrans = source.fTrans; + this->fNmodules = source.fNmodules; + this->fNlayers = source.fNlayers; + this->fNlad = source.fNlad; + this->fNdet = source.fNdet; + this->fGm.Expand(this->fNmodules); + for(i=source.fGm.LowerBound();iGetIndex(id); + if(i>=fNmodules) return -1; + GetGeomMatrix(i)->GetIndex(id); if(id[0]==lay&&id[1]==lad&&id[2]==det) return i; // Array of modules fGm is not in expected order. Search for this index for(i=0;iGetIndex(id); - if(id[0]==lay&&id[1]==lad&&id[2]==det) return i; + GetGeomMatrix(i)->GetIndex(id); + if(id[0]==lay&&id[1]==lad&&id[2]==det) return i; } // end for i // This layer ladder and detector combination does not exist return -1. return -1; } //______________________________________________________________________ -void AliITSgeom::GetModuleId(const Int_t index, - Int_t &lay,Int_t &lad,Int_t &det){ -//////////////////////////////////////////////////////////////////////// -// This routine computes the layer, ladder and detector number -// given the module index number. The number of ladders and detectors -// per layer is determined when this geometry package is constructed, -// see AliITSgeom(const char *filename) for specifics. -//////////////////////////////////////////////////////////////////////// +void AliITSgeom::GetModuleId(Int_t index,Int_t &lay,Int_t &lad,Int_t &det) +const{ + // This routine computes the layer, ladder and detector number + // given the module index number. The number of ladders and detectors + // per layer is determined when this geometry package is constructed, + // see AliITSgeom(const char *filename) for specifics. + // Inputs: + // Int_t index The module index number, starting from zero. + // Outputs: + // Int_t lay The layer number. Starting from 1. + // Int_t lad The ladder number. Starting from 1. + // Int_t det The detector number. Starting from 1. + // Return: + // none. Int_t id[3]; - - fGm[index]->GetIndex(id); - lay = id[0]; lad = id[1]; det = id[2]; + AliITSgeomMatrix *g = GetGeomMatrix(index); + + if (g == 0x0){ + Error("GetModuleId","Can not get GeoMatrix for index = %d",index); + lay = -1; lad = -1; det = -1; + }else{ + g->GetIndex(id); + lay = id[0]; lad = id[1]; det = id[2]; + }// End if return; - // The old way kept for posterity. /* Int_t i,j,k; @@ -443,456 +420,289 @@ void AliITSgeom::GetModuleId(const Int_t index, return; */ } -//___________________________________________________________________________ -Int_t AliITSgeom::GetStartDet(const Int_t dtype){ - ///////////////////////////////////////////////////////////////////////// - // returns the starting module index value for a give type of detector id - ///////////////////////////////////////////////////////////////////////// - - switch(dtype){ - case 0: - return GetModuleIndex(1,1,1); - break; - case 1: - return GetModuleIndex(3,1,1); - break; - case 2: - return GetModuleIndex(5,1,1); - break; - default: - printf(" undefined detector type\n"); - return 0; - } // end switch - - printf(" undefined detector type\n"); - return 0; +//______________________________________________________________________ +Int_t AliITSgeom::GetNDetTypes(Int_t &max)const{ + // Finds and returns the number of detector types used and the + // maximum detector type value. Only counts id >=0 (no undefined + // values. See AliITSgeom.h for list of AliITSDetecor enumerated types. + // Inputs: + // none. + // Outputs: + // The maximum detector type used + // Return: + // The number of detector types used + Int_t i,*n,id; + + max = -1; + for(i=0;imax) max=id; + } // end for i + n = new Int_t[max+1]; + for(i=0;i-1)n[id]++; // note id=-1 => undefined. + } // end for i + id = 0; + for(i=0;i undefined detector type\n"); - return 0; - } // end switch - - printf(" undefined detector type\n"); - return 0; +//______________________________________________________________________ +Int_t AliITSgeom::GetNDetTypes(TArrayI &maxs,AliITSDetector *types)const{ + // Finds and returns the number of detector types used and the + // number of each detector type. Only counts id >=0 (no undefined + // values. See AliITSgeom.h for list of AliITSDetecor enumerated types. + // Inputs: + // none. + // Outputs: + // The maximum detector type used + // Return: + // The number of detector types used + Int_t i,j,*n,id,max; + + max = -1; + for(i=0;imax) max=id; + } // end for i + n = new Int_t[max+1]; + for(i=0;i-1)n[id]++; // note id=-1 => undefined. + } // end for i + id = 0; + for(i=0;i<=max;i++) if(n[i]!=0) id++; + maxs.Set(id); + j = 0; + for(i=0;i<=max;i++) if(n[i]!=0){ + maxs[j] = n[i]; + types[j++] = (AliITSDetector) i; + } // end for i/end if + delete[] n; + return id; } - -//___________________________________________________________________________ -void AliITSgeom::PrintComparison(FILE *fp,AliITSgeom *other){ -//////////////////////////////////////////////////////////////////////// -// This function was primarily created for diagnostic reasons. It -// print to a file pointed to by the file pointer fp the difference -// between two AliITSgeom classes. The format of the file is basicly, -// define d? to be the difference between the same element of the two -// classes. For example dfrx = this->fGm[i][j].frx - other->fGm[i][j].frx. -// if(at least one of dfx0, dfy0, dfz0,dfrx,dfry,dfrz are non zero) then print -// layer ladder detector dfx0 dfy0 dfz0 dfrx dfry dfrz -// if(at least one of the 9 elements of dfr[] are non zero) then print -// layer ladder detector dfr[0] dfr[1] dfr[2] -// dfr[3] dfr[4] dfr[5] -// dfr[6] dfr[7] dfr[8] -// Only non zero values are printed to save space. The differences are -// typical written to a file because there are usually a lot of numbers -// printed out and it is usually easier to read them in some nice editor -// rather than zooming quickly past you on a screen. fprintf is used to -// do the printing. The fShapeIndex difference is not printed at this time. -//////////////////////////////////////////////////////////////////////// - Int_t i,j,idt[3],ido[3]; - Double_t tt[3],to[3]; // translation - Double_t rt[3],ro[3]; // phi in radians - Double_t mt[3][3],mo[3][3]; // matrixes - AliITSgeomMatrix *gt,*go; - Bool_t t; - - for(i=0;ifNmodules;i++){ - gt = this->GetGeomMatrix(i); - go = other->GetGeomMatrix(i); - gt->GetIndex(idt); - go->GetIndex(ido); - t = kFALSE; - for(i=0;i<3;i++) t = t&&idt[i]!=ido[i]; - if(t) fprintf(fp,"%4.4d %1.1d %2.2d %2.2d %1.1d %2.2d %2.2d\n",i, - idt[0],idt[1],idt[2],ido[0],ido[1],ido[2]); - gt->GetTranslation(tt); - go->GetTranslation(to); - gt->GetAngles(rt); - go->GetAngles(ro); - t = kFALSE; - for(i=0;i<3;i++) t = t&&tt[i]!=to[i]; - if(t) fprintf(fp,"%1.1d %2.2d %2.2d dTrans=%f %f %f drot=%f %f %f\n", - idt[0],idt[1],idt[2], - tt[0]-to[0],tt[1]-to[1],tt[2]-to[2], - rt[0]-ro[0],rt[1]-ro[1],rt[2]-ro[2]); - t = kFALSE; - gt->GetMatrix(mt); - go->GetMatrix(mo); - for(i=0;i<3;i++)for(j=0;j<3;j++) t = mt[i][j] != mo[i][j]; - if(t){ - fprintf(fp,"%1.1d %2.2d %2.2d dfr= %e %e %e\n", - idt[0],idt[1],idt[2], - mt[0][0]-mo[0][0],mt[0][1]-mo[0][1],mt[0][2]-mo[0][2]); - fprintf(fp," dfr= %e %e %e\n", - mt[1][0]-mo[1][0],mt[1][1]-mo[1][1],mt[1][2]-mo[1][2]); - fprintf(fp," dfr= %e %e %e\n", - mt[2][0]-mo[2][0],mt[2][1]-mo[2][1],mt[2][2]-mo[2][2]); - } // end if t - } // end for i - return; +//______________________________________________________________________ +Int_t AliITSgeom::GetStartDet(Int_t dtype)const{ + // returns the starting module index value for a give type of detector id. + // This assumes that the detector types are different on different layers + // and that they are not mixed up. + // Inputs: + // Int_t dtype A detector type number. 0 for SPD, 1 for SDD, + // and 2 for SSD. + // Outputs: + // none. + // Return: + // the module index for the first occurrence of that detector type. + + switch(dtype){ + case 0: + return GetModuleIndex(1,1,1); + break; + case 1: + return GetModuleIndex(3,1,1); + break; + case 2: + return GetModuleIndex(5,1,1); + break; + default: + Warning("GetStartDet","undefined detector type %d",dtype); + return 0; + } // end switch + + Warning("GetStartDet","undefined detector type %d",dtype); + return 0; } - -//___________________________________________________________________________ -void AliITSgeom::PrintData(FILE *fp, - const Int_t lay,const Int_t lad,const Int_t det){ -//////////////////////////////////////////////////////////////////////// -// This function prints out the coordinate transformations for -// the particular detector defined by layer, ladder, and detector -// to the file pointed to by the File pointer fp. fprintf statements -// are used to print out the numbers. The format is -// layer ladder detector Trans= fx0 fy0 fz0 rot= frx fry frz Shape=fShapeIndex -// dfr= fr[0] fr[1] fr[2] -// dfr= fr[3] fr[4] fr[5] -// dfr= fr[6] fr[7] fr[8] -// By indicating which detector, some control over the information -// is given to the user. The output it written to the file pointed -// to by the file pointer fp. This can be set to stdout if you want. -//////////////////////////////////////////////////////////////////////// - AliITSgeomMatrix *gt; - Double_t t[3],r[3],m[3][3]; - - gt = this->GetGeomMatrix(GetModuleIndex(lay,lad,det)); - gt->GetTranslation(t); - gt->GetAngles(r); - fprintf(fp,"%1.1d %2.2d %2.2d Trans=%f %f %f rot=%f %f %f Shape=%d\n", - lay,lad,det,t[0],t[1],t[2],r[0],r[1],r[2], - gt->GetDetectorIndex()); - gt->GetMatrix(m); - fprintf(fp," dfr= %e %e %e\n",m[0][0],m[0][1],m[0][2]); - fprintf(fp," dfr= %e %e %e\n",m[1][0],m[1][1],m[1][2]); - fprintf(fp," dfr= %e %e %e\n",m[2][0],m[2][1],m[2][2]); - return; +//______________________________________________________________________ +Int_t AliITSgeom::GetLastDet(Int_t dtype)const{ + // returns the last module index value for a give type of detector id. + // This assumes that the detector types are different on different layers + // and that they are not mixed up. + // Inputs: + // Int_t dtype A detector type number. 0 for SPD, 1 for SDD, + // and 2 for SSD. + // Outputs: + // Return: + // the module index for the last occurrence of that detector type. + + switch((AliITSDetector)dtype){ + case kSPD: + return GetModuleIndex(3,1,1)-1; + break; + case kSDD: + return GetModuleIndex(5,1,1)-1; + break; + case kSSD: + return GetIndexMax()-1; + break; + case kSSDp: case kSDDp: case kND: + default: + Warning("GetLastDet","undefined detector type %d",dtype); + return 0; + } // end switch + + Warning("GetLastDet","undefined detector type %d",dtype); + return 0; } -//___________________________________________________________________________ -ofstream & AliITSgeom::PrintGeom(ofstream &R__b){ -//////////////////////////////////////////////////////////////////////// -// The default Streamer function "written by ROOT" doesn't write out -// the arrays referenced by pointers. Therefore, a specific Streamer function -// has to be written. This function should not be modified but instead added -// on to so that older versions can still be read. The proper handling of -// the version dependent streamer function hasn't been written do to the lack -// of finding an example at the time of writing. -//////////////////////////////////////////////////////////////////////// - // Stream an object of class AliITSgeom. - Int_t i; - R__b.setf(ios::scientific); - R__b << fTrans << " "; - R__b << fNmodules << " "; - R__b << fNlayers << " "; - for(i=0;i> fTrans >> fNmodules >> fNlayers; - fNlad = new Int_t[fNlayers]; - fNdet = new Int_t[fNlayers]; - for(i=0;i> fNlad[i]; - for(i=0;i> fNdet[i]; - fGm = new AliITSgeomMatrix*[fNmodules]; - for(i=0;i> *(fGm[i]); - } // end for i - return R__b; +//______________________________________________________________________ +void AliITSgeom::PrintData(FILE *fp,Int_t lay,Int_t lad,Int_t det)const{ + // This function prints out the coordinate transformations for + // the particular detector defined by layer, ladder, and detector + // to the file pointed to by the File pointer fp. fprintf statements + // are used to print out the numbers. The format is + // layer ladder detector Trans= fx0 fy0 fz0 rot= frx fry frz + // Shape=fShapeIndex + // dfr= fr[0] fr[1] fr[2] + // dfr= fr[3] fr[4] fr[5] + // dfr= fr[6] fr[7] fr[8] + // By indicating which detector, some control over the information + // is given to the user. The output it written to the file pointed + // to by the file pointer fp. This can be set to stdout if you want. + // Inputs: + // FILE *fp A file pointer to an opened file for + // writing in which the results of the + // comparison will be written. + // Int_t lay The layer number. Starting from 1. + // Int_t lad The ladder number. Starting from 1. + // Int_t det The detector number. Starting from 1. + // Outputs: + // none + // Return: + // none. + AliITSgeomMatrix *gt; + Double_t t[3],r[3],m[3][3]; + + gt = this->GetGeomMatrix(GetModuleIndex(lay,lad,det)); + gt->GetTranslation(t); + gt->GetAngles(r); + fprintf(fp,"%1.1d %2.2d %2.2d Trans=%f %f %f rot=%f %f %f Shape=%d\n", + lay,lad,det,t[0],t[1],t[2],r[0],r[1],r[2], + gt->GetDetectorIndex()); + gt->GetMatrix(m); + fprintf(fp," dfr= %e %e %e\n",m[0][0],m[0][1],m[0][2]); + fprintf(fp," dfr= %e %e %e\n",m[1][0],m[1][1],m[1][2]); + fprintf(fp," dfr= %e %e %e\n",m[2][0],m[2][1],m[2][2]); + return; } //______________________________________________________________________ -// The following routines modify the transformation of "this" -// geometry transformations in a number of different ways. -//______________________________________________________________________ -void AliITSgeom::GlobalChange(const Float_t *tran,const Float_t *rot){ -//////////////////////////////////////////////////////////////////////// -// This function performs a Cartesian translation and rotation of -// the full ITS from its default position by an amount determined by -// the three element arrays dtranslation and drotation. If every element -// of dtranslation and drotation are zero then there is no change made -// the geometry. The change is global in that the exact same translation -// and rotation is done to every detector element in the exact same way. -// The units of the translation are those of the Monte Carlo, usually cm, -// and those of the rotation are in radians. The elements of dtranslation -// are dtranslation[0] = x, dtranslation[1] = y, and dtranslation[2] = z. -// The elements of drotation are drotation[0] = rx, drotation[1] = ry, and -// drotation[2] = rz. A change in x will move the hole ITS in the ALICE -// global x direction, the same for a change in y. A change in z will -// result in a translation of the ITS as a hole up or down the beam line. -// A change in the angles will result in the inclination of the ITS with -// respect to the beam line, except for an effective rotation about the -// beam axis which will just rotate the ITS as a hole about the beam axis. -//////////////////////////////////////////////////////////////////////// - Int_t i,j; - Double_t t[3],r[3]; - AliITSgeomMatrix *g; - - fTrans = (fTrans && 0xfffd) + 2; // set bit 1 true. - for(i=0;iGetGeomMatrix(i); - g->GetTranslation(t); - g->GetAngles(r); - for(j=0;j<3;j++){ - t[j] += tran[j]; - r[j] += rot[j]; - } // end for j - g->SetTranslation(t); - g->SetAngles(r); - } // end for i - return; -} -//___________________________________________________________________________ -void AliITSgeom::GlobalCylindericalChange(const Float_t *tran,const Float_t *rot){ -//////////////////////////////////////////////////////////////////////// -// This function performs a cylindrical translation and rotation of -// each ITS element by a fixed about in radius, rphi, and z from its -// default position by an amount determined by the three element arrays -// dtranslation and drotation. If every element of dtranslation and -// drotation are zero then there is no change made the geometry. The -// change is global in that the exact same distance change in translation -// and rotation is done to every detector element in the exact same way. -// The units of the translation are those of the Monte Carlo, usually cm, -// and those of the rotation are in radians. The elements of dtranslation -// are dtranslation[0] = r, dtranslation[1] = rphi, and dtranslation[2] = z. -// The elements of drotation are drotation[0] = rx, drotation[1] = ry, and -// drotation[2] = rz. A change in r will results in the increase of the -// radius of each layer by the same about. A change in rphi will results in -// the rotation of each layer by a different angle but by the same -// circumferential distance. A change in z will result in a translation -// of the ITS as a hole up or down the beam line. A change in the angles -// will result in the inclination of the ITS with respect to the beam -// line, except for an effective rotation about the beam axis which will -// just rotate the ITS as a hole about the beam axis. -//////////////////////////////////////////////////////////////////////// - Int_t i,j; - Double_t t[3],ro[3],r,r0,phi,rphi; - AliITSgeomMatrix *g; - - fTrans = (fTrans && 0xfffd) + 2; // set bit 1 true. - for(i=0;iGetGeomMatrix(i); - g->GetTranslation(t); - g->GetAngles(ro); - r = r0= TMath::Hypot(t[1],t[0]); - phi = TMath::ATan2(t[1],t[0]); - rphi = r0*phi; - r += tran[0]; - rphi += tran[1]; - phi = rphi/r0; - t[0] = r*TMath::Cos(phi); - t[1] = r*TMath::Sin(phi); - t[2] += tran[2]; - for(j=0;j<3;j++){ - ro[j] += rot[j]; - } // end for j - g->SetTranslation(t); - g->SetAngles(ro); - } // end for i - return; -} -//___________________________________________________________________________ -void AliITSgeom::RandomChange(const Float_t *stran,const Float_t *srot){ -//////////////////////////////////////////////////////////////////////// -// This function performs a Gaussian random displacement and/or -// rotation about the present global position of each active -// volume/detector of the ITS. The sigma of the random displacement -// is determined by the three element array stran, for the -// x y and z translations, and the three element array srot, -// for the three rotation about the axis x y and z. -//////////////////////////////////////////////////////////////////////// - Int_t i,j; - Double_t t[3],r[3]; - TRandom ran; - AliITSgeomMatrix *g; - - fTrans = (fTrans && 0xfffd) + 2; // set bit 1 true. - for(i=0;iGetGeomMatrix(i); - g->GetTranslation(t); - g->GetAngles(r); - for(j=0;j<3;j++){ - t[j] += ran.Gaus(0.0,stran[j]); - r[j] += ran.Gaus(0.0, srot[j]); - } // end for j - g->SetTranslation(t); - g->SetAngles(r); - } // end for i - return; -} -//___________________________________________________________________________ -void AliITSgeom::RandomCylindericalChange(const Float_t *stran, - const Float_t *srot){ -//////////////////////////////////////////////////////////////////////// -// This function performs a Gaussian random displacement and/or -// rotation about the present global position of each active -// volume/detector of the ITS. The sigma of the random displacement -// is determined by the three element array stran, for the -// r rphi and z translations, and the three element array srot, -// for the three rotation about the axis x y and z. This random change -// in detector position allow for the simulation of a random uncertainty -// in the detector positions of the ITS. -//////////////////////////////////////////////////////////////////////// - Int_t i,j; - Double_t t[3],ro[3],r,r0,phi,rphi; - TRandom ran; - AliITSgeomMatrix *g; - - fTrans = (fTrans && 0xfffd) + 2; // set bit 1 true. - for(i=0;iGetGeomMatrix(i); - g->GetTranslation(t); - g->GetAngles(ro); - r = r0= TMath::Hypot(t[1],t[0]); - phi = TMath::ATan2(t[1],t[0]); - rphi = r0*phi; - r += ran.Gaus(0.0,stran[0]); - rphi += ran.Gaus(0.0,stran[1]); - phi = rphi/r0; - t[0] = r*TMath::Cos(phi); - t[1] = r*TMath::Sin(phi); - t[2] += ran.Gaus(0.0,stran[2]); - for(j=0;j<3;j++){ - ro[j] += ran.Gaus(0.0, srot[j]); - } // end for j - g->SetTranslation(t); - g->SetAngles(ro); - } // end for i - return; +Int_t AliITSgeom::GetNearest(const Double_t g[3],Int_t lay)const{ + // Finds the Detector (Module) that is nearest the point g [cm] in + // ALICE Global coordinates. If layer !=0 then the search is restricted + // to Detectors (Modules) in that particular layer. + // Inputs: + // Double_t g[3] The ALICE Cartesian global coordinate from which the + // distance is to be calculated with. + // Int_t lay The layer to restrict the search to. If layer=0 then + // all layers are searched. Default is lay=0. + // Output: + // none. + // Return: + // The module number representing the nearest module. + Int_t i,l,a,e,in=0; + Double_t d,dn=1.0e10; + Bool_t t=lay!=0; // skip if lay = 0 default value check all layers. + + for(i=0;iDistance2(g)) -Y -// and Y-> X such that X always points out of the ITS cylinder for every -// layer including layer 1 (where the detectors are mounted upside down). -//Begin_Html -/* - -*/ -//End_Html -//////////////////////////////////////////////////////////////////////// - Int_t i,j,k,l,id[3]; - Double_t R0[3][3],R1[3][3]; - Double_t A0[3][3] = {{0.,+1.,0.},{-1.,0.,0.},{0.,0.,+1.}}; - Double_t A1[3][3] = {{0.,-1.,0.},{+1.,0.,0.},{0.,0.,+1.}}; - - *this = source; // copy everything - for(i=0;iGetIndex(id); - fGm[i]->GetMatrix(R0); - if(id[0]==1){ // Layer 1 is treated different from the others. - for(j=0;j<3;j++) for(k=0;k<3;k++){ - R1[j][k] = 0.; - for(l=0;l<3;l++) R1[j][k] += A0[j][l]*R0[l][k]; - } // end for j,k - }else{ - for(j=0;j<3;j++) for(k=0;k<3;k++){ - R1[j][k] = 0.; - for(l=0;l<3;l++) R1[j][k] += A1[j][l]*R0[l][k]; - } // end for j,k - } // end if - fGm[i]->SetMatrix(R1); - } // end for i - this->fTrans = (this->fTrans && 0xfffe) + 1; // set bit 0 true. - return; +void AliITSgeom::GetNearest27(const Double_t g[3],Int_t n[27],Int_t lay)const{ + // Finds 27 Detectors (Modules) that are nearest the point g [cm] in + // ALICE Global coordinates. If layer !=0 then the search is restricted + // to Detectors (Modules) in that particular layer. The number 27 comes + // from including the nearest detector and all those around it (up, down, + // left, right, forwards, backwards, and the corners). + // Input: + // Double_t g[3] The ALICE Cartesian global coordinate from which the + // distance is to be calculated with. + // Int_t lay The layer to restrict the search to. If layer=0 then + // all layers are searched. Default is lay=0. + // Output: + // Int_t n[27] The module number representing the nearest 27 modules + // in order. + // Return: + // none. + Int_t i,l,a,e,in[27]={0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,}; + Double_t d,dn[27]={1.0e10,1.0e10,1.0e10,1.0e10,1.0e10,1.0e10, + 1.0e10,1.0e10,1.0e10,1.0e10,1.0e10,1.0e10, + 1.0e10,1.0e10,1.0e10,1.0e10,1.0e10,1.0e10, + 1.0e10,1.0e10,1.0e10,1.0e10,1.0e10,1.0e10, + 1.0e10,1.0e10,1.0e10}; + Bool_t t=(lay!=0); // skip if lay = 0 default value check all layers. + + for(i=0;iDistance2(g); + if(da;e--){dn[e] = dn[e-1];in[e] = in[e-1];} + dn[a] = d; in[a] = i; + } // end if dDistance2(g))Distance2(g); - if(da;e--){dn[e] = dn[e-1];in[e] = in[e-1];} - dn[a] = d; in[a] = i; - } // end if d