Print removed
[u/mrichter/AliRoot.git] / ITS / AliITSgeomSPD.cxx
CommitLineData
4c039060 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
88cb7938 16/* $Id$ */
8253cd9a 17
85f1e34a 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////////////////////////////////////////////////////////////////////////
24
4ae5bbc4 25#include <Riostream.h>
8253cd9a 26#include <TShape.h>
31b8cd63 27#include <TMath.h>
8253cd9a 28
29#include "AliITSgeomSPD.h"
30
31ClassImp(AliITSgeomSPD)
32
33AliITSgeomSPD::AliITSgeomSPD(){
34// Default Constructor. Set everthing to null.
35
36 fShapeSPD = 0;
37 fNbinx = 0;
38 fNbinz = 0;
39 fLowBinEdgeX = 0;
40 fLowBinEdgeZ = 0;
41}
42//______________________________________________________________________
43AliITSgeomSPD::AliITSgeomSPD(Float_t dy,Int_t nx,Float_t *bx,
44 Int_t nz,Float_t *bz){
45// Standard Constructor. Set everthing to null.
46
47 fShapeSPD = 0;
48 fNbinx = 0;
49 fNbinz = 0;
50 fLowBinEdgeX = 0;
51 fLowBinEdgeZ = 0;
52 ReSetBins(dy,nx,bx,nz,bz);
53 return;
54}
55//______________________________________________________________________
56void AliITSgeomSPD::ReSetBins(Float_t dy,Int_t nx,Float_t *bx,
57 Int_t nz,Float_t *bz){
58// delets the contents of this and replaces it with the given values.
59 Int_t i;
60 Float_t dx = 0.0, dz = 0.0;
61
62 // Compute size in x and z (based on bins).
63 for(i=0;i<nx;i++) dx += bx[i];
64 for(i=0;i<nz;i++) dz += bz[i];
65 dx *= 0.5;
66 dz *= 0.5;
67
68 delete fShapeSPD; // delete existing shape
69 if(this->fLowBinEdgeX) delete[] this->fLowBinEdgeX; // delete existing
70 if(this->fLowBinEdgeZ) delete[] this->fLowBinEdgeZ; // delete existing
71
72 SetNbinX(nx);
73 SetNbinZ(nz);
74 InitLowBinEdgeX();
75 InitLowBinEdgeZ();
76 fLowBinEdgeX[0] = -dx;
77 fLowBinEdgeZ[0] = -dz;
78 for(i=0;i<nx;i++) fLowBinEdgeX[i+1] = fLowBinEdgeX[i] + bx[i];
79 for(i=0;i<nz;i++) fLowBinEdgeZ[i+1] = fLowBinEdgeZ[i] + bz[i];
80 SetShape("ActiveSPD","Active volume of SPD","SPD SI DET",dx,dy,dz);
81 return;
82}
83//______________________________________________________________________
ac74f489 84AliITSgeomSPD::AliITSgeomSPD(AliITSgeomSPD &source) : TObject(source){
8253cd9a 85 // Copy constructor
86
87 *this = source; // just use the = operator for now.
88 return;
89}
90//______________________________________________________________________
91AliITSgeomSPD& AliITSgeomSPD::operator=(AliITSgeomSPD &source){
92 // = operator
93 Int_t i;
94
95 if(&source == this) return *this;
96 this->fShapeSPD = new TBRIK(*(source.fShapeSPD));
97 if(this->fLowBinEdgeX) delete[] this->fLowBinEdgeX;
98 if(this->fLowBinEdgeZ) delete[] this->fLowBinEdgeZ;
99 this->fNbinx = source.fNbinx;
100 this->fNbinz = source.fNbinz;
101 this->InitLowBinEdgeX();
102 this->InitLowBinEdgeZ();
103 for(i=0;i<fNbinx;i++) this->fLowBinEdgeX[i] = source.fLowBinEdgeX[i];
104 for(i=0;i<fNbinz;i++) this->fLowBinEdgeZ[i] = source.fLowBinEdgeZ[i];
105 return *this;
106}
107//______________________________________________________________________
108AliITSgeomSPD::~AliITSgeomSPD(){
109// Destructor
110
111 delete fShapeSPD;
112 if(this->fLowBinEdgeX) delete[] this->fLowBinEdgeX;
113 if(this->fLowBinEdgeZ) delete[] this->fLowBinEdgeZ;
114 fShapeSPD = 0;
115 fNbinx = 0;
116 fNbinz = 0;
117 fLowBinEdgeX = 0;
118 fLowBinEdgeZ = 0;
119}
120//______________________________________________________________________
121void AliITSgeomSPD::LToDet(Float_t xl,Float_t zl,Int_t &row,Int_t &col){
122// Returns the row and column pixel numbers for a given local coordinate
123// system. If they are outside then it will return -1 or fNbinx/z.
124 Int_t i;
125
126 if(xl<fLowBinEdgeX[0]) row = -1;
127 else{
128 for(i=0;i<fNbinx;i++) if(xl<=fLowBinEdgeX[i]) break;
129 row = i;
130 } //end if too low.
131 if(zl<fLowBinEdgeX[0]) col = -1;
132 else{
133 for(i=0;i<fNbinz;i++) if(zl<=fLowBinEdgeZ[i]) break;
134 col = i;
135 } //end if too low.
136 return;
137}
138//______________________________________________________________________
139void AliITSgeomSPD::DetToL(Int_t row,Int_t col,Float_t &xl,Float_t &zl){
140// returns the pixel center local coordinate system location for a given
141// row and column number. It the row or column number is outside of the
142// defined range then it will return the nearest detector edge.
143
144 if(row>=0||row<fNbinx-1) xl = 0.5*(fLowBinEdgeX[row]+fLowBinEdgeX[row+1]);
145 else if(row<0) xl = fLowBinEdgeX[0];else xl = fLowBinEdgeX[fNbinx-1];
146 if(col>=0||col<fNbinz-1) zl = 0.5*(fLowBinEdgeZ[col]+fLowBinEdgeZ[col+1]);
147 else if(col<0) zl = fLowBinEdgeZ[0];else zl = fLowBinEdgeZ[fNbinz-1];
148 return;
149}
150//______________________________________________________________________
31b8cd63 151void AliITSgeomSPD::Print(ostream *os) const {
8253cd9a 152// Standard output format for this class
153 Int_t i;
431a7819 154#if defined __GNUC__
155#if __GNUC__ > 2
156 ios::fmtflags fmt;
157#else
158 Int_t fmt;
159#endif
160#else
9f69211c 161#if defined __ICC || defined __ECC || defined __xlC__
94831058 162 ios::fmtflags fmt;
163#else
31b8cd63 164 Int_t fmt;
b48af428 165#endif
94831058 166#endif
8253cd9a 167
168 fmt = os->setf(ios::scientific); // set scientific floating point output
169 *os << "TBRIK" << " ";
170 *os << setprecision(16) << GetDx() << " ";
171 *os << setprecision(16) << GetDy() << " ";
172 *os << setprecision(16) << GetDz() << " ";
173 *os << fNbinx-1 << " " << fNbinz-1 << " ";
174 for(i=0;i<fNbinx;i++) *os << setprecision(16) << fLowBinEdgeX[i] << " ";
31b8cd63 175 for(i=0;i<fNbinz;i++) *os << setprecision(16) << fLowBinEdgeZ[i] << " ";
8253cd9a 176 *os << endl;
177 os->flags(fmt);
178 return;
179}
180//______________________________________________________________________
181void AliITSgeomSPD::Read(istream *is){
182// Standard input format for this class
183 Int_t i,j;
184 Float_t dx,dy,dz;
185 char shape[20];
186
187 for(i=0;i<20;i++) shape[i]='\0';
188 *is >> shape;
189 if(strcmp(shape,"TBRIK")) Warning("::Read","Shape not a TBRIK");
190 *is >> dx >> dy >> dz;
191 if(fShapeSPD!=0) delete fShapeSPD;
192 SetShape("ActiveSPD","Active volume of SPD","SPD SI DET",dx,dy,dz);
193 *is >> i >> j;
194 SetNbinX(i);
195 SetNbinZ(j);
196 InitLowBinEdgeX();
197 InitLowBinEdgeZ();
198 for(i=0;i<fNbinx;i++) *is >> fLowBinEdgeX[i];
199 for(i=0;i<fNbinz;i++) *is >> fLowBinEdgeZ[i];
200 return;
201}
202//----------------------------------------------------------------------
203ostream &operator<<(ostream &os,AliITSgeomSPD &p){
204////////////////////////////////////////////////////////////////////////
205// Standard output streaming function.
206////////////////////////////////////////////////////////////////////////
207
208 p.Print(&os);
209 return os;
210}
211//----------------------------------------------------------------------
212istream &operator>>(istream &is,AliITSgeomSPD &r){
213////////////////////////////////////////////////////////////////////////
214// Standard input streaming function.
215////////////////////////////////////////////////////////////////////////
216
217 r.Read(&is);
218 return is;
219}
220//=====================================================================
221
8253cd9a 222ClassImp(AliITSgeomSPD300)
223
224AliITSgeomSPD300::AliITSgeomSPD300() : AliITSgeomSPD(){
225////////////////////////////////////////////////////////////////////////
226// default constructor, for ITS TDR geometry. This only consists of
227// a default constructor to construct the defalut TDR SPD detector geometry
228// 256 X 279 300 by 50 micron pixels.
229////////////////////////////////////////////////////////////////////////
230const Float_t kdx=0.6400,kdy=0.0075,kdz=4.1900; // cm; Standard pixel detector
231 // size is 2dx wide, 2dz long,
232 // and 2dy thick. Geant 3.12
233 // units.
234const Float_t kbinx0 = 0.0050; // cm; Standard pixel size in x direction.
235const Int_t knbinx = 256; // number of pixels along x direction.
236const Float_t kbinz0 = 0.0300; // cm; Standard pixel size in z direction.
237const Float_t kbinz1 = 0.0350; // cm; Edge pixel size in z direction.
238const Int_t knbinz = 279; // number of pixels along z direction.
239 Int_t i;
240 Float_t dx=0.0,dz=0.0;
241
242// cout << "AliITSgeomSPD300 default creator called: start" << endl;
243
244 SetNbinX(knbinx); // default number of bins in x.
245 SetNbinZ(knbinz); // default number of bins in z.
246
247 for(i=0;i<knbinx;i++) dx += kbinx0; // Compute size x.
248 dx *= 0.5;
249 for(i=0;i<knbinz;i++) dz += kbinz0; // Compute size z.
250 dz += 2.0*(kbinz1-kbinz0);
251 dz *= 0.5;
252 InitLowBinEdgeX();
253 InitLowBinEdgeZ();
254 SetLowBinEdgeX(0,-dx); // Starting position X
255 for(i=0;i<knbinx;i++) SetLowBinEdgeX(i+1,GetBinLowEdgeX(i)+kbinx0);
256 SetLowBinEdgeZ(0,-dz); // Starting position z
257 SetLowBinEdgeZ(1,GetBinLowEdgeZ(0)+kbinz1);
258 for(i=1;i<knbinz;i++) SetLowBinEdgeZ(i+1,GetBinLowEdgeZ(i)+kbinz0);
259 SetLowBinEdgeZ(knbinz,GetBinLowEdgeZ(knbinz-1)+kbinz1);
260
31b8cd63 261 if(TMath::Abs(dx-kdx)>1.0E-4 || TMath::Abs(dz-kdz)>1.0E-4)
262 Warning("Default Creator","Detector size may not be write.");
8253cd9a 263 SetShape("ActiveSPD","Active volume of SPD","SPD SI DET",dx,kdy,dz);
264// cout << "AliITSgeomSPD300 default creator called: end" << endl;
265}
266//----------------------------------------------------------------------
267ostream &operator<<(ostream &os,AliITSgeomSPD300 &p){
268////////////////////////////////////////////////////////////////////////
269// Standard output streaming function.
270////////////////////////////////////////////////////////////////////////
271
272 p.Print(&os);
273 return os;
274}
275//----------------------------------------------------------------------
276istream &operator>>(istream &is,AliITSgeomSPD300 &r){
277////////////////////////////////////////////////////////////////////////
278// Standard input streaming function.
279////////////////////////////////////////////////////////////////////////
280
281 r.Read(&is);
282 return is;
283}
284//=====================================================================
8253cd9a 285
286ClassImp(AliITSgeomSPD425Short)
287
e99dbc71 288AliITSgeomSPD425Short::AliITSgeomSPD425Short() : AliITSgeomSPD(){
8253cd9a 289////////////////////////////////////////////////////////////////////////
290// default constructor, for ITS post TDR geometry. This only consists of
291// a default constructor to construct the defalut post TDR SPD detector
292// geometry 256 X 197 425 by 50 micron pixels with interleaved 625 by 50
293// micron pixels (large detector).
294////////////////////////////////////////////////////////////////////////
e99dbc71 295}
296//----------------------------------------------------------------------
297AliITSgeomSPD425Short::AliITSgeomSPD425Short(Int_t npar,Float_t *par) :
298 AliITSgeomSPD(){
299////////////////////////////////////////////////////////////////////////
300// Standard constructor, for ITS post TDR geometry. This only consists of
301// a default constructor to construct the defalut post TDR SPD detector
302// geometry 256 X 197 425 by 50 micron pixels with interleaved 625 by 50
303// micron pixels (large detector).
304////////////////////////////////////////////////////////////////////////
8253cd9a 305
85f1e34a 306 const Float_t kdx=0.6400/*,kdy=0.015*/,kdz=3.480; // cm; Standard pixel
307 // detector size is 2dx
308 // wide, 2dz long, and
309 // 2dy thick. Geant 3.12
310 // units.
8253cd9a 311 const Float_t kbinx0 = 0.0050; // cm; Standard pixel size in x direction.
312 const Int_t knbinx = 256; // number of pixels along x direction.
313 const Float_t kbinz0 = 0.0425; // cm; Standard pixel size in z direction.
314 const Float_t kbinz1 = 0.0625; // cm; Special pixel size in z direction.
e99dbc71 315 const Int_t knbinz = 160; // number of pixels along z direction.
8253cd9a 316 Int_t i;
317 Float_t dx,dz,*binSizeX,*binSizeZ;
195d8dfe 318
8253cd9a 319 SetNbinX(knbinx); // default number of bins in x.
320 SetNbinZ(knbinz); // default number of bins in z.
1cea8f13 321
8253cd9a 322 binSizeX = new Float_t[knbinx]; // array of bin sizes along x.
323 for(i=0;i<knbinx;i++) binSizeX[i] = kbinx0; // default x bin size.
324 binSizeZ = new Float_t[knbinz]; // array of bin sizes along z.
325 for(i=0;i<knbinz;i++) binSizeZ[i] = kbinz0; // default z bin size.
326 binSizeZ[ 31] = kbinz1;
327 binSizeZ[ 32] = kbinz1;
328
31b8cd63 329 binSizeZ[ 63] = kbinz1;
8253cd9a 330 binSizeZ[ 64] = kbinz1;
8253cd9a 331
31b8cd63 332 binSizeZ[ 95] = kbinz1;
333 binSizeZ[ 96] = kbinz1;
8253cd9a 334
31b8cd63 335 binSizeZ[127] = kbinz1;
336 binSizeZ[128] = kbinz1;
8253cd9a 337
338 // correct detector size for bin size.
339 dx = 0.0;
340 for(i=0;i<knbinx;i++) dx += binSizeX[i];
341 dx *= 0.5;
342 dz = 0.0;
343 for(i=0;i<knbinz;i++) dz += binSizeZ[i];
344 dz *= 0.5;
345
ac74f489 346 if(npar<3){
347 Error("AliITSgeomSPD425Short",
348 "npar=%d<3 array par must be at least [3] or larger",npar);
349 return;
350 } // end if
e99dbc71 351 SetShape("ActiveSPD","Active volume of SPD","SPD SI DET",
352 par[0],par[1],par[2]);
31b8cd63 353 if(TMath::Abs(dx-kdx)>1.0E-4 || TMath::Abs(dz-kdz)>1.0E-4)
354 Warning("Default Creator","Detector size may not be write.");
8253cd9a 355
356 InitLowBinEdgeX(); // array of bin sizes along x.
357 InitLowBinEdgeZ(); // array of bin sizes along x.
358 SetLowBinEdgeX(0,-dx);
359 SetLowBinEdgeZ(0,-dz);
360 for(i=0;i<knbinx;i++) SetLowBinEdgeX(i+1,GetBinLowEdgeX(i)+binSizeX[i]);
361 for(i=0;i<knbinz;i++) SetLowBinEdgeZ(i+1,GetBinLowEdgeZ(i)+binSizeZ[i]);
362}
363//----------------------------------------------------------------------
364ostream &operator<<(ostream &os,AliITSgeomSPD425Short &p){
365////////////////////////////////////////////////////////////////////////
366// Standard output streaming function.
367////////////////////////////////////////////////////////////////////////
368
369 p.Print(&os);
370 return os;
371}
372//----------------------------------------------------------------------
373istream &operator>>(istream &is,AliITSgeomSPD425Short &r){
374////////////////////////////////////////////////////////////////////////
375// Standard input streaming function.
376////////////////////////////////////////////////////////////////////////
377
378 r.Read(&is);
379 return is;
380}
381//======================================================================
382
8253cd9a 383ClassImp(AliITSgeomSPD425Long)
384
385AliITSgeomSPD425Long::AliITSgeomSPD425Long(){
386////////////////////////////////////////////////////////////////////////
387// default constructor, for ITS post TDR geometry. This only consists of
388// a default constructor to construct the defalut post TDR SPD detector
389// geometry 256 X 197 425 by 50 micron pixels with interleaved 625 by 50
390// micron pixels (large detector).
391////////////////////////////////////////////////////////////////////////
392
393 const Float_t kdx=0.6400,kdy=0.0075,kdz=4.2650; // cm; Standard pixel
394 // detector size is 2dx
395 // wide, 2dz long, and
396 // 2dy thick. Geant 3.12
397 // units.
398 const Float_t kbinx0 = 0.0050; // cm; Standard pixel size in x direction.
399 const Int_t knbinx = 256; // number of pixels along x direction.
400 const Float_t kbinz0 = 0.0425; // cm; Standard pixel size in z direction.
401 const Float_t kbinz1 = 0.0625; // cm; Special pixel size in z direction.
2d408567 402 const Int_t knbinz = 192; // number of pixels along z direction.
8253cd9a 403 Int_t i;
404 Float_t dx,dz,*binSizeX,*binSizeZ;
405
406 SetNbinX(knbinx); // default number of bins in x.
407 SetNbinZ(knbinz); // default number of bins in z.
408
409 binSizeX = new Float_t[knbinx]; // array of bin sizes along x.
410 for(i=0;i<knbinx;i++) binSizeX[i] = kbinx0; // default x bin size.
411 binSizeZ = new Float_t[knbinz]; // array of bin sizes along z.
412 for(i=0;i<knbinz;i++) binSizeZ[i] = kbinz0; // default z bin size.
413 binSizeZ[ 31] = kbinz1;
414 binSizeZ[ 32] = kbinz1;
415
2d408567 416 binSizeZ[ 63] = kbinz1;
8253cd9a 417 binSizeZ[ 64] = kbinz1;
8253cd9a 418
2d408567 419 binSizeZ[ 95] = kbinz1;
420 binSizeZ[ 96] = kbinz1;
195d8dfe 421
2d408567 422 binSizeZ[127] = kbinz1;
423 binSizeZ[128] = kbinz1;
8253cd9a 424
2d408567 425 binSizeZ[159] = kbinz1;
426 binSizeZ[160] = kbinz1;
8253cd9a 427
428 // correct detector size for bin size.
429 dx = 0.0;
430 for(i=0;i<knbinx;i++) dx += binSizeX[i];
431 dx *= 0.5;
432 dz = 0.0;
433 for(i=0;i<knbinz;i++) dz += binSizeZ[i];
434 dz *= 0.5;
435
436 SetShape("ActiveSPD","Active volume of SPD","SPD SI DET",dx,kdy,dz);
31b8cd63 437 if(TMath::Abs(dx-kdx)>1.0E-4 || TMath::Abs(dz-kdz)>1.0E-4)
438 Warning("Default Creator","Detector size may not be write.");
8253cd9a 439
440 InitLowBinEdgeX(); // array of bin sizes along x.
441 InitLowBinEdgeZ(); // array of bin sizes along x.
442 SetLowBinEdgeX(0,-dx);
443 SetLowBinEdgeZ(0,-dz);
444 for(i=0;i<knbinx;i++) SetLowBinEdgeX(i+1,GetBinLowEdgeX(i)+binSizeX[i]);
445 for(i=0;i<knbinz;i++) SetLowBinEdgeZ(i+1,GetBinLowEdgeZ(i)+binSizeZ[i]);
446}
447//----------------------------------------------------------------------
448ostream &operator<<(ostream &os,AliITSgeomSPD425Long &p){
1cea8f13 449////////////////////////////////////////////////////////////////////////
8253cd9a 450// Standard output streaming function.
1cea8f13 451////////////////////////////////////////////////////////////////////////
1cea8f13 452
8253cd9a 453 p.Print(&os);
454 return os;
455}
456//----------------------------------------------------------------------
457istream &operator>>(istream &is,AliITSgeomSPD425Long &r){
458////////////////////////////////////////////////////////////////////////
459// Standard input streaming function.
460////////////////////////////////////////////////////////////////////////
195d8dfe 461
8253cd9a 462 r.Read(&is);
463 return is;
464}
465//======================================================================