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 Revision 1.10 2001/05/30 15:55:35 hristov
19 Strings compared instead of pointers
21 Revision 1.9 2001/05/30 14:04:31 hristov
22 Dynamic cast replaced (F.Carminati)
24 Revision 1.8 2001/02/13 16:53:35 nilsen
25 Fixed a but when trying to use GEANT4. Needed to replace
26 if(!((TGeant3*)gMC)) with if(!(dynamic_casst<TGeant3*>(gMC)))
27 because just casting gMC to be TGeant3* even when it realy is a TGeant3 pointer
28 did not result in a zero value. For AliITSv5asymm and AliITSv5symm, needed
29 to fix a bug in the initilizers and a bug in BuildGeometry. This is now done
30 in the same way as in AliITSv5.cxx.
32 Revision 1.7 2001/02/09 20:06:26 nilsen
33 Fixed bug in distructor. Can't distroy fixxed length arrays. Thanks Peter.
35 Revision 1.6 2001/02/09 00:05:31 nilsen
36 Added fMajor/MinorVersion variables and made other changes to better make
37 use of the new code changes in AliITSgeom related classes.
39 Revision 1.5 2001/01/30 09:23:14 hristov
40 Streamers removed (R.Brun)
42 Revision 1.4 2001/01/18 06:25:09 barbera
43 ITS geometry using test Euclid files
45 Revision 1.1.2.8 2000/10/05 20:28:18 nilsen
46 Now using root generated streamer function.
48 Revision 1.1.2.7 2000/07/31 13:51:22 barbera
49 Updated from the release
51 Revision 1.2 2000/07/10 16:07:19 fca
52 Release version of ITS code
54 Revision 1.1.2.2 2000/03/02 21:53:36 nilsen
55 to make it compatable with the changes in AliRun/AliModule.
57 Revision 1.1.2.1 2000/01/12 20:19:03 nilsen
58 The changes made with this latest inclusion of code is very large.
59 Many of the new files were added just in December when P. Cerello added his
60 SDD simulations to the distrobutions. Also added are some file of P. Skowronski
61 for SSD cluster finding and ghost RecPoints. None of this "new" code has been
62 proporly tested. Other code new to this cvs repository is explained in the
63 ITS Off-line web page. In general the changes are too large to give a resonable
64 discription of them but probably should be taken as the starting point for
65 the developement branch (ITS-working).
68 Revision 1.13 1999/10/16 19:49:00 BSN
74 ///////////////////////////////////////////////////////////////////////////////
76 // Inner Traking System version Test //
77 // This class contains the base procedures for the Inner Tracking System //
79 // Authors: R. Barbera, B. S. Nilsen. //
81 // Created October 16 1999. //
83 ///////////////////////////////////////////////////////////////////////////////
87 #include <TGeometry.h>
90 #include <TFile.h> // only required for Tracking function?
92 #include <TObjArray.h>
93 #include <TObjString.h>
94 #include <TClonesArray.h>
95 #include <TLorentzVector.h>
101 #include "AliGeant3.h"
102 #include "AliITSGeant3Geometry.h"
103 #include "AliITShit.h"
105 #include "AliITSvtest.h"
106 #include "AliITSgeom.h"
107 #include "AliITSgeomSPD.h"
108 #include "AliITSgeomSDD.h"
109 #include "AliITSgeomSSD.h"
111 ClassImp(AliITSvtest)
113 //_____________________________________________________________________________
114 AliITSvtest::AliITSvtest() {
115 // Standard constructor for the ITS
121 fEuclidOut = kFALSE; // Don't write Euclide file
122 fGeomDetOut = kFALSE; // Don't write .det file
123 fGeomDetIn = kTRUE; // Read .det file
124 fMajorVersion = IsVersion();
126 for(i=0;i<60;i++) fRead[i] = '\0';
127 for(i=0;i<60;i++) fWrite[i] = '\0';
128 for(i=0;i<60;i++) fEuclidGeomDet[i] = '\0';
130 //____________________________________________________________________________
131 AliITSvtest::AliITSvtest(const AliITSvtest &source){
132 ////////////////////////////////////////////////////////////////////////
133 // Copy Constructor for ITS test version.
134 ////////////////////////////////////////////////////////////////////////
135 if(&source == this) return;
136 Warning("Copy Constructor","Not allowed to copy AliITSvtest");
139 //_____________________________________________________________________________
140 AliITSvtest& AliITSvtest::operator=(const AliITSvtest &source){
141 ////////////////////////////////////////////////////////////////////////
142 // Assignment operator for the ITS version 1.
143 ////////////////////////////////////////////////////////////////////////
144 if(&source == this) return *this;
145 Warning("= operator","Not allowed to copy AliITSvtest");
148 //_____________________________________________________________________________
149 AliITSvtest::~AliITSvtest() {
150 // Standard destructor for the ITS
152 //_____________________________________________________________________________
153 AliITSvtest::AliITSvtest(const char *fileeuc,const char *filetme,
154 const char *name, const char *title)
155 : AliITS(name, title){
157 // Standard constructor for the ITS
160 fIdName = new TString[fIdN];
167 fIdSens = new Int_t[fIdN];
168 for (Int_t i=0;i<fIdN;i++) fIdSens[i] = 0;
169 fMajorVersion = IsVersion();
171 fEuclidOut = kFALSE; // Don't write Euclide file
172 fGeomDetOut = kFALSE; // Don't write .det file
173 fGeomDetIn = kTRUE; // Read .det file
175 fEuclidMaterial = filetme;
176 fEuclidGeometry = fileeuc;
177 strncpy(fEuclidGeomDet,"$ALICE_ROOT/ITS/ITSgeometry_PPR.det",60);
178 strncpy(fRead,fEuclidGeomDet,60);
179 strncpy(fWrite,fEuclidGeomDet,60);
180 // The .det file for the geometry must have the same name as fileeuc with
181 // .euc replaced by .det.
185 //_____________________________________________________________________________
186 void AliITSvtest::CreateMaterials(){
188 // Read materials for the ITS
192 filtmp = gSystem->ExpandPathName(fEuclidMaterial.Data());
193 // FILE *file = fopen(fEuclidMaterial.Data(),"r");
194 FILE *file = fopen(filtmp,"r");
197 // ReadEuclidMedia(fEuclidMaterial.Data(),this);
198 ReadEuclidMedia(filtmp);
200 Error("CreateMaterials"," THE MEDIA FILE %s DOES NOT EXIST !",
201 // fEuclidMaterial.Data());
207 //_____________________________________________________________________________
208 void AliITSvtest::CreateGeometry(){
209 //////////////////////////////////////////////////////////////////////
210 ////////////////////////////////////////////////////////////////////////
211 // Read geometry for the ITS
216 filtmp = gSystem->ExpandPathName(fEuclidGeometry.Data());
217 FILE *file = fopen(filtmp,"r");
221 printf("Ready to read Euclid geometry file\n");
222 ReadEuclid(fEuclidGeometry.Data(),topvol);
223 printf("Read in euclid geometries\n");
225 Error("CreateGeometry"," THE GEOM FILE %s DOES NOT EXIST !",
226 fEuclidGeometry.Data());
230 //---Place the ITS ghost volume ITSV in its mother volume (ALIC) and make it
233 gMC->Gspos("ITSV",1,"ALIC",0,0,0,0,"ONLY");
235 //---Outputs the geometry tree in the EUCLID/CAD format
238 gMC->WriteEuclid("ITSgeometry", "ITSV", 1, 5);
239 } // end if (fEuclidOut)
240 cout <<"finished with euclid geometrys"<< endl;
242 //______________________________________________________________________
243 void AliITSvtest::InitAliITSgeom(){
244 // Based on the geometry tree defined in Geant 3.21, this
245 // routine initilizes the Class AliITSgeom from the Geant 3.21 ITS geometry
247 if(gMC->IsA()!=AliGeant3::Class()) {
248 Error("InitAliITSgeom",
249 "Wrong Monte Carlo. InitAliITSgeom uses TGeant3 calls");
252 cout << "Reading Geometry transformation directly from Geant 3." << endl;
253 const Int_t nlayers = 6;
254 const Int_t ndeep = 9;
255 Int_t itsGeomTreeNames[nlayers][ndeep],lnam[20],lnum[20];
256 Int_t nlad[nlayers],ndet[nlayers];
258 Float_t par[20],att[20];
259 Int_t npar,natt,idshape,imat,imed;
260 AliITSGeant3Geometry *ig = new AliITSGeant3Geometry();
261 Int_t mod,lay,lad,det,i,j,k;
262 char *names[nlayers][ndeep] = {
263 {"ALIC","ITSV","ITSD","IT12","I12B","I10B","I107","I101","ITS1"}, // lay=1
264 {"ALIC","ITSV","ITSD","IT12","I12B","I20B","I1D7","I1D1","ITS2"}, // lay=2
265 {"ALIC","ITSV","ITSD","IT34","I004","I302","ITS3"," "," "}, // lay=3
266 {"ALIC","ITSV","ITSD","IT34","I005","I402","ITS4"," "," "}, // lay=4
267 {"ALIC","ITSV","ITSD","IT56","I565","I562","ITS5"," "," "}, // lay=5
268 {"ALIC","ITSV","ITSD","IT56","I569","I566","ITS6"," "," "}};// lay=6
269 Int_t itsGeomTreeCopys[nlayers][ndeep] = {{1,1,1,1,10, 2, 4, 1, 1},// lay=1
270 {1,1,1,1,10, 4, 4, 1, 1},// lay=2
271 {1,1,1,1,14, 6, 1, 0, 0},// lay=3
272 {1,1,1,1,22, 8, 1, 0, 0},// lay=4
273 {1,1,1,1,34,22, 1, 0, 0},// lay=5
274 {1,1,1,1,38,25, 1, 0, 0}};//lay=6
276 // Sorry, but this is not very pritty code. It should be replaced
277 // at some point with a version that can search through the geometry
279 cout << "Reading Geometry informaton from Geant3 common blocks" << endl;
280 for(i=0;i<20;i++) lnam[i] = lnum[i] = 0;
281 for(i=0;i<nlayers;i++)for(j=0;j<ndeep;j++)
282 itsGeomTreeNames[i][j] = ig->StringToInt(names[i][j]);
284 for(i=0;i<nlayers;i++){
286 for(j=0;j<ndeep;j++) if(itsGeomTreeCopys[i][j]!=0)
287 k *= TMath::Abs(itsGeomTreeCopys[i][j]);
291 if(fITSgeom!=0) delete fITSgeom;
292 nlad[0]=20;nlad[1]=40;nlad[2]=14;nlad[3]=22;nlad[4]=34;nlad[5]=38;
293 ndet[0]=4;ndet[1]=4;ndet[2]=6;ndet[3]=8;ndet[4]=22;ndet[5]=25;
294 fITSgeom = new AliITSgeom(0,6,nlad,ndet,mod);
296 for(lay=1;lay<=nlayers;lay++){
297 for(j=0;j<ndeep;j++) lnam[j] = itsGeomTreeNames[lay-1][j];
298 for(j=0;j<ndeep;j++) lnum[j] = itsGeomTreeCopys[lay-1][j];
300 case 1: case 2: // layers 1 and 2 are a bit special
302 for(j=1;j<=itsGeomTreeCopys[lay-1][4];j++){
304 for(k=1;k<=itsGeomTreeCopys[lay-1][5];k++){
307 for(det=1;det<=itsGeomTreeCopys[lay-1][6];det++){
310 ig->GetGeometry(ndeep,lnam,lnum,t,r,idshape,npar,natt,
312 fITSgeom->CreatMatrix(mod,lay,lad,det,kSPD,t,r);
313 if(!(fITSgeom->IsShapeDefined((Int_t)kSPD)))
314 if(fMinorVersion==1){
315 fITSgeom->ReSetShape(kSPD,
316 new AliITSgeomSPD425Short());
317 } else if(fMinorVersion==2)
318 fITSgeom->ReSetShape(kSPD,
319 new AliITSgeomSPD425Short());
324 case 3: case 4: case 5: case 6: // layers 3-6
326 for(lad=1;lad<=itsGeomTreeCopys[lay-1][4];lad++){
328 for(det=1;det<=itsGeomTreeCopys[lay-1][5];det++){
331 ig->GetGeometry(7,lnam,lnum,t,r,idshape,npar,natt,
335 fITSgeom->CreatMatrix(mod,lay,lad,det,kSDD,t,r);
336 if(!(fITSgeom->IsShapeDefined(kSDD)))
337 fITSgeom->ReSetShape(kSDD,new AliITSgeomSDD256());
340 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSD,t,r);
341 if(!(fITSgeom->IsShapeDefined(kSSD)))
342 fITSgeom->ReSetShape(kSSD,new AliITSgeomSSD275and75());
345 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSDp,t,r);
346 if(!(fITSgeom->IsShapeDefined(kSSDp)))
347 fITSgeom->ReSetShape(kSSDp,new AliITSgeomSSD75and275());
357 //_____________________________________________________________________________
358 void AliITSvtest::Init(){
359 ////////////////////////////////////////////////////////////////////////
360 // Initialise the ITS after it has been created.
361 ////////////////////////////////////////////////////////////////////////
365 for(i=0;i<29;i++) cout << "*";cout << " ITSvtest_Init ";
366 for(i=0;i<28;i++) cout << "*";cout << endl;
368 if(fRead[0]=='\0') strncpy(fRead,fEuclidGeomDet,60);
369 if(fWrite[0]=='\0') strncpy(fWrite,fEuclidGeomDet,60);
370 if(fITSgeom!=0) delete fITSgeom;
371 fITSgeom = new AliITSgeom();
372 if(fGeomDetIn) fITSgeom->ReadNewFile(fRead);
373 if(!fGeomDetIn) this->InitAliITSgeom();
374 if(fGeomDetOut) fITSgeom->WriteNewFile(fWrite);
377 for(i=0;i<72;i++) cout << "*";
380 //_____________________________________________________________________________
381 void AliITSvtest::StepManager(){
383 // Called for every step in the ITS
389 TLorentzVector position, momentum;
390 TClonesArray &lhits = *fHits;
394 if(gMC->IsTrackInside()) vol[3] += 1;
395 if(gMC->IsTrackEntering()) vol[3] += 2;
396 if(gMC->IsTrackExiting()) vol[3] += 4;
397 if(gMC->IsTrackOut()) vol[3] += 8;
398 if(gMC->IsTrackDisappeared()) vol[3] += 16;
399 if(gMC->IsTrackStop()) vol[3] += 32;
400 if(gMC->IsTrackAlive()) vol[3] += 64;
402 // Fill hit structure.
403 if(!(gMC->TrackCharge())) return;
405 // Only entering charged tracks
406 if((id = gMC->CurrentVolID(copy)) == fIdSens[0]) {
408 id = gMC->CurrentVolOffID(0,copy);
409 //detector copy in the ladder = 1<->4 (ITS1)
411 gMC->CurrentVolOffID(1,copy1);
412 //ladder copy in the module = 1<->2 (I186)
413 gMC->CurrentVolOffID(2,copy2);
414 //module copy in the layer = 1<->10 (I132)
415 vol[2] = copy1+(copy2-1)*2;//# of ladders in one module = 2
416 } else if(id == fIdSens[1]){
418 id = gMC->CurrentVolOffID(0,copy);
419 //detector copy in the ladder = 1<->4 (ITS2)
421 gMC->CurrentVolOffID(1,copy1);
422 //ladder copy in the module = 1<->4 (I131)
423 gMC->CurrentVolOffID(2,copy2);
424 //module copy in the layer = 1<->10 (I132)
425 vol[2] = copy1+(copy2-1)*4;//# of ladders in one module = 4
426 } else if(id == fIdSens[2]){
428 id = gMC->CurrentVolOffID(1,copy);
429 //detector copy in the ladder = 1<->5 (ITS3 is inside I314)
431 id = gMC->CurrentVolOffID(2,copy);
432 //ladder copy in the layer = 1<->12 (I316)
434 } else if(id == fIdSens[3]){
436 id = gMC->CurrentVolOffID(1,copy);
437 //detector copy in the ladder = 1<->8 (ITS4 is inside I414)
439 id = gMC->CurrentVolOffID(2,copy);
440 //ladder copy in the layer = 1<->22 (I417)
442 }else if(id == fIdSens[4]){
444 id = gMC->CurrentVolOffID(1,copy);
445 //detector copy in the ladder = 1<->23 (ITS5 is inside I562)
447 id = gMC->CurrentVolOffID(2,copy);
448 //ladder copy in the layer = 1<->34 (I565)
450 }else if(id == fIdSens[5]){
452 id = gMC->CurrentVolOffID(1,copy);
453 //detector copy in the ladder = 1<->26 (ITS6 is inside I566)
455 id = gMC->CurrentVolOffID(2,copy);
456 //ladder copy in the layer = 1<->38 (I569)
459 return; // not an ITS volume?
460 } // end if/else if (gMC->CurentVolID(copy) == fIdSens[i])
462 gMC->TrackPosition(position);
463 gMC->TrackMomentum(momentum);
471 hits[7]=gMC->TrackTime();
472 // Fill hit structure with this new hit.
473 new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->CurrentTrack(),vol,hits);