1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ////////////////////////////////////////////////////////////////////////
19 // This class is for the Silicon Pixel Detector, SPD, specific geometry.
20 // It is being replaced by AliITSsegmentationSPD class. This file also
21 // constains classes derived from AliITSgeomSPD which do nothing but
22 // initilize this one with predefined values.
23 ////////////////////////////////////////////////////////////////////////
25 #include <Riostream.h>
26 #include <TGeometry.h>
30 #include "AliITSgeomSPD.h"
32 ClassImp(AliITSgeomSPD)
34 AliITSgeomSPD::AliITSgeomSPD():
46 // Default Constructor. Set everthing to null.
48 //______________________________________________________________________
49 AliITSgeomSPD::AliITSgeomSPD(Float_t dy,Int_t nx,Float_t *bx,
50 Int_t nz,Float_t *bz):
62 // Standard Constructor. Set everthing to null.
64 ReSetBins(dy,nx,bx,nz,bz);
67 //______________________________________________________________________
68 void AliITSgeomSPD::ReSetBins(Float_t dy,Int_t nx,Float_t *bx,
69 Int_t nz,Float_t *bz){
70 // delets the contents of this and replaces it with the given values.
72 Float_t dx = 0.0, dz = 0.0;
74 // Compute size in x and z (based on bins).
75 for(i=0;i<nx;i++) dx += bx[i];
76 for(i=0;i<nz;i++) dz += bz[i];
80 if(fLowBinEdgeX) delete[] fLowBinEdgeX; // delete existing
81 if(fLowBinEdgeZ) delete[] fLowBinEdgeZ; // delete existing
89 fLowBinEdgeX[0] = -dx;
90 fLowBinEdgeZ[0] = -dz;
91 for(i=0;i<nx;i++) fLowBinEdgeX[i+1] = fLowBinEdgeX[i] + bx[i];
92 for(i=0;i<nz;i++) fLowBinEdgeZ[i+1] = fLowBinEdgeZ[i] + bz[i];
93 SetShape("ActiveSPD","Active volume of SPD","",dx,dy,dz);
96 //______________________________________________________________________
97 AliITSgeomSPD::AliITSgeomSPD(AliITSgeomSPD &source) : TObject(source){
100 *this = source; // just use the = operator for now.
103 //______________________________________________________________________
104 AliITSgeomSPD& AliITSgeomSPD::operator=(AliITSgeomSPD &source){
108 if(&source == this) return *this;
110 fTitle=source.fTitle;
115 if(this->fLowBinEdgeX) delete[] (this->fLowBinEdgeX);
116 if(this->fLowBinEdgeZ) delete[] (this->fLowBinEdgeZ);
117 this->fNbinx = source.fNbinx;
118 this->fNbinz = source.fNbinz;
119 this->InitLowBinEdgeX();
120 this->InitLowBinEdgeZ();
121 for(i=0;i<fNbinx;i++) this->fLowBinEdgeX[i] = source.fLowBinEdgeX[i];
122 for(i=0;i<fNbinz;i++) this->fLowBinEdgeZ[i] = source.fLowBinEdgeZ[i];
125 //______________________________________________________________________
126 AliITSgeomSPD::~AliITSgeomSPD(){
129 if(fLowBinEdgeX) delete[] fLowBinEdgeX;
130 if(fLowBinEdgeZ) delete[] fLowBinEdgeZ;
136 //______________________________________________________________________
137 void AliITSgeomSPD::SetShape(const char *name,const char *title,
138 const char * /*mat*/,Float_t dx,Float_t dy,Float_t dz){
139 // Delete any existing shape info and replace it with a new
140 // shape information.
142 // char * name Name of the shape
143 // char * title Title of the shape
144 // char * mat Material name for the shape
145 // Float_t dx half width of the shape [cm]
146 // Float_t dy half thickness of the shape [cm]
147 // Float_t dz half length of the shape [cm]
160 //______________________________________________________________________
161 void AliITSgeomSPD::LToDet(Float_t xl,Float_t zl,Int_t &row,Int_t &col){
162 // Returns the row and column pixel numbers for a given local coordinate
163 // system. If they are outside then it will return -1 or fNbinx/z.
166 if(xl<fLowBinEdgeX[0]) row = -1;
168 for(i=0;i<fNbinx;i++) if(xl<=fLowBinEdgeX[i]) break;
171 if(zl<fLowBinEdgeX[0]) col = -1;
173 for(i=0;i<fNbinz;i++) if(zl<=fLowBinEdgeZ[i]) break;
178 //______________________________________________________________________
179 void AliITSgeomSPD::DetToL(Int_t row,Int_t col,Float_t &xl,Float_t &zl){
180 // returns the pixel center local coordinate system location for a given
181 // row and column number. It the row or column number is outside of the
182 // defined range then it will return the nearest detector edge.
184 if(row>=0||row<fNbinx-1) xl = 0.5*(fLowBinEdgeX[row]+fLowBinEdgeX[row+1]);
185 else if(row<0) xl = fLowBinEdgeX[0];else xl = fLowBinEdgeX[fNbinx-1];
186 if(col>=0||col<fNbinz-1) zl = 0.5*(fLowBinEdgeZ[col]+fLowBinEdgeZ[col+1]);
187 else if(col<0) zl = fLowBinEdgeZ[0];else zl = fLowBinEdgeZ[fNbinz-1];
190 //______________________________________________________________________
191 void AliITSgeomSPD::Print(ostream *os) const {
192 // Standard output format for this class
201 #if defined __ICC || defined __ECC || defined __xlC__
208 fmt = os->setf(ios::scientific); // set scientific floating point output
209 *os << "TBRIK" << " ";
210 *os << setprecision(16) << GetDx() << " ";
211 *os << setprecision(16) << GetDy() << " ";
212 *os << setprecision(16) << GetDz() << " ";
213 *os << fNbinx-1 << " " << fNbinz-1 << " ";
214 for(i=0;i<fNbinx;i++) *os << setprecision(16) << fLowBinEdgeX[i] << " ";
215 for(i=0;i<fNbinz;i++) *os << setprecision(16) << fLowBinEdgeZ[i] << " ";
220 //______________________________________________________________________
221 void AliITSgeomSPD::Read(istream *is){
222 // Standard input format for this class
227 for(i=0;i<20;i++) shape[i]='\0';
229 if(strcmp(shape,"TBRIK")) Warning("::Read","Shape not a TBRIK");
230 *is >> dx >> dy >> dz;
231 SetShape("ActiveSPD","Active volume of SPD","",dx,dy,dz);
237 for(i=0;i<fNbinx;i++) *is >> fLowBinEdgeX[i];
238 for(i=0;i<fNbinz;i++) *is >> fLowBinEdgeZ[i];
241 //----------------------------------------------------------------------
242 ostream &operator<<(ostream &os,AliITSgeomSPD &p){
243 ////////////////////////////////////////////////////////////////////////
244 // Standard output streaming function.
245 ////////////////////////////////////////////////////////////////////////
250 //----------------------------------------------------------------------
251 istream &operator>>(istream &is,AliITSgeomSPD &r){
252 ////////////////////////////////////////////////////////////////////////
253 // Standard input streaming function.
254 ////////////////////////////////////////////////////////////////////////
259 //=====================================================================
261 ClassImp(AliITSgeomSPD300)
263 AliITSgeomSPD300::AliITSgeomSPD300() : AliITSgeomSPD(){
264 ////////////////////////////////////////////////////////////////////////
265 // default constructor, for ITS TDR geometry. This only consists of
266 // a default constructor to construct the defalut TDR SPD detector geometry
267 // 256 X 279 300 by 50 micron pixels.
268 ////////////////////////////////////////////////////////////////////////
269 const Float_t kdx=0.6400,kdy=0.0075,kdz=4.1900; // cm; Standard pixel detector
270 // size is 2dx wide, 2dz long,
271 // and 2dy thick. Geant 3.12
273 const Float_t kbinx0 = 0.0050; // cm; Standard pixel size in x direction.
274 const Int_t knbinx = 256; // number of pixels along x direction.
275 const Float_t kbinz0 = 0.0300; // cm; Standard pixel size in z direction.
276 const Float_t kbinz1 = 0.0350; // cm; Edge pixel size in z direction.
277 const Int_t knbinz = 279; // number of pixels along z direction.
279 Float_t dx=0.0,dz=0.0;
281 SetNbinX(knbinx); // default number of bins in x.
282 SetNbinZ(knbinz); // default number of bins in z.
284 for(i=0;i<knbinx;i++) dx += kbinx0; // Compute size x.
286 for(i=0;i<knbinz;i++) dz += kbinz0; // Compute size z.
287 dz += 2.0*(kbinz1-kbinz0);
291 SetLowBinEdgeX(0,-dx); // Starting position X
292 for(i=0;i<knbinx;i++) SetLowBinEdgeX(i+1,GetBinLowEdgeX(i)+kbinx0);
293 SetLowBinEdgeZ(0,-dz); // Starting position z
294 SetLowBinEdgeZ(1,GetBinLowEdgeZ(0)+kbinz1);
295 for(i=1;i<knbinz;i++) SetLowBinEdgeZ(i+1,GetBinLowEdgeZ(i)+kbinz0);
296 SetLowBinEdgeZ(knbinz,GetBinLowEdgeZ(knbinz-1)+kbinz1);
298 if(TMath::Abs(dx-kdx)>1.0E-4 || TMath::Abs(dz-kdz)>1.0E-4)
299 Warning("Default Creator","Detector size may not be write.");
300 SetShape("ActiveSPD","Active volume of SPD","",dx,kdy,dz);
302 //----------------------------------------------------------------------
303 ostream &operator<<(ostream &os,AliITSgeomSPD300 &p){
304 ////////////////////////////////////////////////////////////////////////
305 // Standard output streaming function.
306 ////////////////////////////////////////////////////////////////////////
311 //----------------------------------------------------------------------
312 istream &operator>>(istream &is,AliITSgeomSPD300 &r){
313 ////////////////////////////////////////////////////////////////////////
314 // Standard input streaming function.
315 ////////////////////////////////////////////////////////////////////////
320 //=====================================================================
322 ClassImp(AliITSgeomSPD425Short)
324 AliITSgeomSPD425Short::AliITSgeomSPD425Short() : AliITSgeomSPD(){
325 ////////////////////////////////////////////////////////////////////////
326 // default constructor, for ITS post TDR geometry. This only consists of
327 // a default constructor to construct the defalut post TDR SPD detector
328 // geometry 256 X 197 425 by 50 micron pixels with interleaved 625 by 50
329 // micron pixels (large detector).
330 ////////////////////////////////////////////////////////////////////////
332 //----------------------------------------------------------------------
333 AliITSgeomSPD425Short::AliITSgeomSPD425Short(Int_t npar,Float_t *par) :
335 ////////////////////////////////////////////////////////////////////////
336 // Standard constructor, for ITS post TDR geometry. This only consists of
337 // a default constructor to construct the defalut post TDR SPD detector
338 // geometry 256 X 197 425 by 50 micron pixels with interleaved 625 by 50
339 // micron pixels (large detector).
340 ////////////////////////////////////////////////////////////////////////
342 const Float_t kdx=0.6400/*,kdy=0.015*/,kdz=3.480; // cm; Standard pixel
343 // detector size is 2dx
344 // wide, 2dz long, and
345 // 2dy thick. Geant 3.12
347 const Float_t kbinx0 = 0.0050; // cm; Standard pixel size in x direction.
348 const Int_t knbinx = 256; // number of pixels along x direction.
349 const Float_t kbinz0 = 0.0425; // cm; Standard pixel size in z direction.
350 const Float_t kbinz1 = 0.0625; // cm; Special pixel size in z direction.
351 const Int_t knbinz = 160; // number of pixels along z direction.
353 Float_t dx,dz,*binSizeX,*binSizeZ;
355 SetNbinX(knbinx); // default number of bins in x.
356 SetNbinZ(knbinz); // default number of bins in z.
358 binSizeX = new Float_t[knbinx]; // array of bin sizes along x.
359 for(i=0;i<knbinx;i++) binSizeX[i] = kbinx0; // default x bin size.
360 binSizeZ = new Float_t[knbinz]; // array of bin sizes along z.
361 for(i=0;i<knbinz;i++) binSizeZ[i] = kbinz0; // default z bin size.
362 binSizeZ[ 31] = kbinz1;
363 binSizeZ[ 32] = kbinz1;
365 binSizeZ[ 63] = kbinz1;
366 binSizeZ[ 64] = kbinz1;
368 binSizeZ[ 95] = kbinz1;
369 binSizeZ[ 96] = kbinz1;
371 binSizeZ[127] = kbinz1;
372 binSizeZ[128] = kbinz1;
374 // correct detector size for bin size.
376 for(i=0;i<knbinx;i++) dx += binSizeX[i];
379 for(i=0;i<knbinz;i++) dz += binSizeZ[i];
383 Error("AliITSgeomSPD425Short",
384 "npar=%d<3 array par must be at least [3] or larger",npar);
387 SetShape("ActiveSPD","Active volume of SPD","",
388 par[0],par[1],par[2]);
389 if(TMath::Abs(dx-kdx)>1.0E-4 || TMath::Abs(dz-kdz)>1.0E-4)
390 Warning("Default Creator","Detector size may not be write.");
392 InitLowBinEdgeX(); // array of bin sizes along x.
393 InitLowBinEdgeZ(); // array of bin sizes along x.
394 SetLowBinEdgeX(0,-dx);
395 SetLowBinEdgeZ(0,-dz);
396 for(i=0;i<knbinx;i++) SetLowBinEdgeX(i+1,GetBinLowEdgeX(i)+binSizeX[i]);
397 for(i=0;i<knbinz;i++) SetLowBinEdgeZ(i+1,GetBinLowEdgeZ(i)+binSizeZ[i]);
399 //----------------------------------------------------------------------
400 ostream &operator<<(ostream &os,AliITSgeomSPD425Short &p){
401 ////////////////////////////////////////////////////////////////////////
402 // Standard output streaming function.
403 ////////////////////////////////////////////////////////////////////////
408 //----------------------------------------------------------------------
409 istream &operator>>(istream &is,AliITSgeomSPD425Short &r){
410 ////////////////////////////////////////////////////////////////////////
411 // Standard input streaming function.
412 ////////////////////////////////////////////////////////////////////////
417 //======================================================================
419 ClassImp(AliITSgeomSPD425Long)
421 AliITSgeomSPD425Long::AliITSgeomSPD425Long(){
422 ////////////////////////////////////////////////////////////////////////
423 // default constructor, for ITS post TDR geometry. This only consists of
424 // a default constructor to construct the defalut post TDR SPD detector
425 // geometry 256 X 197 425 by 50 micron pixels with interleaved 625 by 50
426 // micron pixels (large detector).
427 ////////////////////////////////////////////////////////////////////////
429 const Float_t kdx=0.6400,kdy=0.0075,kdz=4.2650; // cm; Standard pixel
430 // detector size is 2dx
431 // wide, 2dz long, and
432 // 2dy thick. Geant 3.12
434 const Float_t kbinx0 = 0.0050; // cm; Standard pixel size in x direction.
435 const Int_t knbinx = 256; // number of pixels along x direction.
436 const Float_t kbinz0 = 0.0425; // cm; Standard pixel size in z direction.
437 const Float_t kbinz1 = 0.0625; // cm; Special pixel size in z direction.
438 const Int_t knbinz = 192; // number of pixels along z direction.
440 Float_t dx,dz,*binSizeX,*binSizeZ;
442 SetNbinX(knbinx); // default number of bins in x.
443 SetNbinZ(knbinz); // default number of bins in z.
445 binSizeX = new Float_t[knbinx]; // array of bin sizes along x.
446 for(i=0;i<knbinx;i++) binSizeX[i] = kbinx0; // default x bin size.
447 binSizeZ = new Float_t[knbinz]; // array of bin sizes along z.
448 for(i=0;i<knbinz;i++) binSizeZ[i] = kbinz0; // default z bin size.
449 binSizeZ[ 31] = kbinz1;
450 binSizeZ[ 32] = kbinz1;
452 binSizeZ[ 63] = kbinz1;
453 binSizeZ[ 64] = kbinz1;
455 binSizeZ[ 95] = kbinz1;
456 binSizeZ[ 96] = kbinz1;
458 binSizeZ[127] = kbinz1;
459 binSizeZ[128] = kbinz1;
461 binSizeZ[159] = kbinz1;
462 binSizeZ[160] = kbinz1;
464 // correct detector size for bin size.
466 for(i=0;i<knbinx;i++) dx += binSizeX[i];
469 for(i=0;i<knbinz;i++) dz += binSizeZ[i];
472 SetShape("ActiveSPD","Active volume of SPD","",dx,kdy,dz);
473 if(TMath::Abs(dx-kdx)>1.0E-4 || TMath::Abs(dz-kdz)>1.0E-4)
474 Warning("Default Creator","Detector size may not be write.");
476 InitLowBinEdgeX(); // array of bin sizes along x.
477 InitLowBinEdgeZ(); // array of bin sizes along x.
478 SetLowBinEdgeX(0,-dx);
479 SetLowBinEdgeZ(0,-dz);
480 for(i=0;i<knbinx;i++) SetLowBinEdgeX(i+1,GetBinLowEdgeX(i)+binSizeX[i]);
481 for(i=0;i<knbinz;i++) SetLowBinEdgeZ(i+1,GetBinLowEdgeZ(i)+binSizeZ[i]);
483 //----------------------------------------------------------------------
484 ostream &operator<<(ostream &os,AliITSgeomSPD425Long &p){
485 ////////////////////////////////////////////////////////////////////////
486 // Standard output streaming function.
487 ////////////////////////////////////////////////////////////////////////
492 //----------------------------------------------------------------------
493 istream &operator>>(istream &is,AliITSgeomSPD425Long &r){
494 ////////////////////////////////////////////////////////////////////////
495 // Standard input streaming function.
496 ////////////////////////////////////////////////////////////////////////
501 //======================================================================