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.14 2002/10/14 14:57:10 hristov
19 Merging the VirtualMC branch to the main development branch (HEAD)
21 Revision 1.13.8.2 2002/08/30 15:45:56 alibrary
22 Adding geant4vmc support
24 Revision 1.13.8.1 2002/06/10 17:51:17 hristov
27 Revision 1.13 2001/10/01 19:34:09 nilsen
28 Fixed a bug in asigning detector types in SetDefaults under SSD layer 6.
30 Revision 1.12 2001/08/24 21:04:36 nilsen
31 Added some include files. Needed due to new forward declorations in other
34 Revision 1.11 2001/05/30 16:15:47 fca
35 Correct comparison wiht AliGeant3::Class() introduced. Thanks to I.Hrivnacova
37 Revision 1.10 2001/05/30 15:55:35 hristov
38 Strings compared instead of pointers
40 Revision 1.9 2001/05/30 14:04:31 hristov
41 Dynamic cast replaced (F.Carminati)
43 Revision 1.8 2001/02/13 16:53:35 nilsen
44 Fixed a but when trying to use GEANT4. Needed to replace
45 if(!((TGeant3*)gMC)) with if(!(dynamic_casst<TGeant3*>(gMC)))
46 because just casting gMC to be TGeant3* even when it realy is a TGeant3 pointer
47 did not result in a zero value. For AliITSv5asymm and AliITSv5symm, needed
48 to fix a bug in the initilizers and a bug in BuildGeometry. This is now done
49 in the same way as in AliITSv5.cxx.
51 Revision 1.7 2001/02/09 20:06:26 nilsen
52 Fixed bug in distructor. Can't distroy fixxed length arrays. Thanks Peter.
54 Revision 1.6 2001/02/09 00:05:31 nilsen
55 Added fMajor/MinorVersion variables and made other changes to better make
56 use of the new code changes in AliITSgeom related classes.
58 Revision 1.5 2001/01/30 09:23:14 hristov
59 Streamers removed (R.Brun)
61 Revision 1.4 2001/01/18 06:25:09 barbera
62 ITS geometry using test Euclid files
64 Revision 1.1.2.8 2000/10/05 20:28:18 nilsen
65 Now using root generated streamer function.
67 Revision 1.1.2.7 2000/07/31 13:51:22 barbera
68 Updated from the release
70 Revision 1.2 2000/07/10 16:07:19 fca
71 Release version of ITS code
73 Revision 1.1.2.2 2000/03/02 21:53:36 nilsen
74 to make it compatable with the changes in AliRun/AliModule.
76 Revision 1.1.2.1 2000/01/12 20:19:03 nilsen
77 The changes made with this latest inclusion of code is very large.
78 Many of the new files were added just in December when P. Cerello added his
79 SDD simulations to the distrobutions. Also added are some file of P. Skowronski
80 for SSD cluster finding and ghost RecPoints. None of this "new" code has been
81 proporly tested. Other code new to this cvs repository is explained in the
82 ITS Off-line web page. In general the changes are too large to give a resonable
83 discription of them but probably should be taken as the starting point for
84 the developement branch (ITS-working).
87 Revision 1.13 1999/10/16 19:49:00 BSN
93 ///////////////////////////////////////////////////////////////////////////////
95 // Inner Traking System version Test //
96 // This class contains the base procedures for the Inner Tracking System //
98 // Authors: R. Barbera, B. S. Nilsen. //
100 // Created October 16 1999. //
102 ///////////////////////////////////////////////////////////////////////////////
105 #include <Riostream.h>
107 #include <TGeometry.h>
110 #include <TFile.h> // only required for Tracking function?
112 #include <TObjArray.h>
113 #include <TObjString.h>
114 #include <TClonesArray.h>
115 #include <TLorentzVector.h>
121 #include "AliITSGeant3Geometry.h"
122 #include "AliITShit.h"
124 #include "AliITSvtest.h"
125 #include "AliITSgeom.h"
126 #include "AliITSgeomSPD.h"
127 #include "AliITSgeomSDD.h"
128 #include "AliITSgeomSSD.h"
130 ClassImp(AliITSvtest)
132 //_____________________________________________________________________________
133 AliITSvtest::AliITSvtest() {
134 // Standard constructor for the ITS
140 fEuclidOut = kFALSE; // Don't write Euclide file
141 fGeomDetOut = kFALSE; // Don't write .det file
142 fGeomDetIn = kTRUE; // Read .det file
143 fMajorVersion = IsVersion();
145 for(i=0;i<60;i++) fRead[i] = '\0';
146 for(i=0;i<60;i++) fWrite[i] = '\0';
147 for(i=0;i<60;i++) fEuclidGeomDet[i] = '\0';
149 //____________________________________________________________________________
150 AliITSvtest::AliITSvtest(const AliITSvtest &source){
151 ////////////////////////////////////////////////////////////////////////
152 // Copy Constructor for ITS test version.
153 ////////////////////////////////////////////////////////////////////////
154 if(&source == this) return;
155 Warning("Copy Constructor","Not allowed to copy AliITSvtest");
158 //_____________________________________________________________________________
159 AliITSvtest& AliITSvtest::operator=(const AliITSvtest &source){
160 ////////////////////////////////////////////////////////////////////////
161 // Assignment operator for the ITS version 1.
162 ////////////////////////////////////////////////////////////////////////
163 if(&source == this) return *this;
164 Warning("= operator","Not allowed to copy AliITSvtest");
167 //_____________________________________________________________________________
168 AliITSvtest::~AliITSvtest() {
169 // Standard destructor for the ITS
171 //_____________________________________________________________________________
172 AliITSvtest::AliITSvtest(const char *fileeuc,const char *filetme,
173 const char *name, const char *title)
174 : AliITS(name, title){
176 // Standard constructor for the ITS
179 fIdName = new TString[fIdN];
186 fIdSens = new Int_t[fIdN];
187 for (Int_t i=0;i<fIdN;i++) fIdSens[i] = 0;
188 fMajorVersion = IsVersion();
190 fEuclidOut = kFALSE; // Don't write Euclide file
191 fGeomDetOut = kFALSE; // Don't write .det file
192 fGeomDetIn = kTRUE; // Read .det file
194 fEuclidMaterial = filetme;
195 fEuclidGeometry = fileeuc;
196 strncpy(fEuclidGeomDet,"$ALICE_ROOT/ITS/ITSgeometry_PPR.det",60);
197 strncpy(fRead,fEuclidGeomDet,60);
198 strncpy(fWrite,fEuclidGeomDet,60);
199 // The .det file for the geometry must have the same name as fileeuc with
200 // .euc replaced by .det.
204 //_____________________________________________________________________________
205 void AliITSvtest::CreateMaterials(){
207 // Read materials for the ITS
211 filtmp = gSystem->ExpandPathName(fEuclidMaterial.Data());
212 // FILE *file = fopen(fEuclidMaterial.Data(),"r");
213 FILE *file = fopen(filtmp,"r");
216 // ReadEuclidMedia(fEuclidMaterial.Data(),this);
217 ReadEuclidMedia(filtmp);
219 Error("CreateMaterials"," THE MEDIA FILE %s DOES NOT EXIST !",
220 // fEuclidMaterial.Data());
226 //_____________________________________________________________________________
227 void AliITSvtest::CreateGeometry(){
228 //////////////////////////////////////////////////////////////////////
229 ////////////////////////////////////////////////////////////////////////
230 // Read geometry for the ITS
235 filtmp = gSystem->ExpandPathName(fEuclidGeometry.Data());
236 FILE *file = fopen(filtmp,"r");
240 printf("Ready to read Euclid geometry file\n");
241 ReadEuclid(fEuclidGeometry.Data(),topvol);
242 printf("Read in euclid geometries\n");
244 Error("CreateGeometry"," THE GEOM FILE %s DOES NOT EXIST !",
245 fEuclidGeometry.Data());
249 //---Place the ITS ghost volume ITSV in its mother volume (ALIC) and make it
252 gMC->Gspos("ITSV",1,"ALIC",0,0,0,0,"ONLY");
254 //---Outputs the geometry tree in the EUCLID/CAD format
257 gMC->WriteEuclid("ITSgeometry", "ITSV", 1, 5);
258 } // end if (fEuclidOut)
259 cout <<"finished with euclid geometrys"<< endl;
261 //______________________________________________________________________
262 void AliITSvtest::InitAliITSgeom(){
263 // Based on the geometry tree defined in Geant 3.21, this
264 // routine initilizes the Class AliITSgeom from the Geant 3.21 ITS geometry
266 // if(gMC->IsA()!=TGeant3::Class()) {
267 if(strcmp(gMC->GetName(),"TGeant3")) {
268 Error("InitAliITSgeom",
269 "Wrong Monte Carlo. InitAliITSgeom uses TGeant3 calls");
272 cout << "Reading Geometry transformation directly from Geant 3." << endl;
273 const Int_t nlayers = 6;
274 const Int_t ndeep = 9;
275 Int_t itsGeomTreeNames[nlayers][ndeep],lnam[20],lnum[20];
276 Int_t nlad[nlayers],ndet[nlayers];
278 Float_t par[20],att[20];
279 Int_t npar,natt,idshape,imat,imed;
280 AliITSGeant3Geometry *ig = new AliITSGeant3Geometry();
281 Int_t mod,lay,lad,det,i,j,k;
282 char *names[nlayers][ndeep] = {
283 {"ALIC","ITSV","ITSD","IT12","I12B","I10B","I107","I101","ITS1"}, // lay=1
284 {"ALIC","ITSV","ITSD","IT12","I12B","I20B","I1D7","I1D1","ITS2"}, // lay=2
285 {"ALIC","ITSV","ITSD","IT34","I004","I302","ITS3"," "," "}, // lay=3
286 {"ALIC","ITSV","ITSD","IT34","I005","I402","ITS4"," "," "}, // lay=4
287 {"ALIC","ITSV","ITSD","IT56","I565","I562","ITS5"," "," "}, // lay=5
288 {"ALIC","ITSV","ITSD","IT56","I569","I566","ITS6"," "," "}};// lay=6
289 Int_t itsGeomTreeCopys[nlayers][ndeep] = {{1,1,1,1,10, 2, 4, 1, 1},// lay=1
290 {1,1,1,1,10, 4, 4, 1, 1},// lay=2
291 {1,1,1,1,14, 6, 1, 0, 0},// lay=3
292 {1,1,1,1,22, 8, 1, 0, 0},// lay=4
293 {1,1,1,1,34,22, 1, 0, 0},// lay=5
294 {1,1,1,1,38,25, 1, 0, 0}};//lay=6
296 // Sorry, but this is not very pritty code. It should be replaced
297 // at some point with a version that can search through the geometry
299 cout << "Reading Geometry informaton from Geant3 common blocks" << endl;
300 for(i=0;i<20;i++) lnam[i] = lnum[i] = 0;
301 for(i=0;i<nlayers;i++)for(j=0;j<ndeep;j++)
302 itsGeomTreeNames[i][j] = ig->StringToInt(names[i][j]);
304 for(i=0;i<nlayers;i++){
306 for(j=0;j<ndeep;j++) if(itsGeomTreeCopys[i][j]!=0)
307 k *= TMath::Abs(itsGeomTreeCopys[i][j]);
311 if(fITSgeom!=0) delete fITSgeom;
312 nlad[0]=20;nlad[1]=40;nlad[2]=14;nlad[3]=22;nlad[4]=34;nlad[5]=38;
313 ndet[0]=4;ndet[1]=4;ndet[2]=6;ndet[3]=8;ndet[4]=22;ndet[5]=25;
314 fITSgeom = new AliITSgeom(0,6,nlad,ndet,mod);
316 for(lay=1;lay<=nlayers;lay++){
317 for(j=0;j<ndeep;j++) lnam[j] = itsGeomTreeNames[lay-1][j];
318 for(j=0;j<ndeep;j++) lnum[j] = itsGeomTreeCopys[lay-1][j];
320 case 1: case 2: // layers 1 and 2 are a bit special
322 for(j=1;j<=itsGeomTreeCopys[lay-1][4];j++){
324 for(k=1;k<=itsGeomTreeCopys[lay-1][5];k++){
327 for(det=1;det<=itsGeomTreeCopys[lay-1][6];det++){
330 ig->GetGeometry(ndeep,lnam,lnum,t,r,idshape,npar,natt,
332 fITSgeom->CreatMatrix(mod,lay,lad,det,kSPD,t,r);
333 if(!(fITSgeom->IsShapeDefined((Int_t)kSPD)))
334 if(fMinorVersion==1){
335 fITSgeom->ReSetShape(kSPD,
336 new AliITSgeomSPD425Short());
337 } else if(fMinorVersion==2)
338 fITSgeom->ReSetShape(kSPD,
339 new AliITSgeomSPD425Short());
344 case 3: case 4: case 5: case 6: // layers 3-6
346 for(lad=1;lad<=itsGeomTreeCopys[lay-1][4];lad++){
348 for(det=1;det<=itsGeomTreeCopys[lay-1][5];det++){
351 ig->GetGeometry(7,lnam,lnum,t,r,idshape,npar,natt,
355 fITSgeom->CreatMatrix(mod,lay,lad,det,kSDD,t,r);
356 if(!(fITSgeom->IsShapeDefined(kSDD)))
357 fITSgeom->ReSetShape(kSDD,new AliITSgeomSDD256());
360 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSD,t,r);
361 if(!(fITSgeom->IsShapeDefined(kSSD)))
362 fITSgeom->ReSetShape(kSSD,new AliITSgeomSSD275and75());
365 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSD,t,r);
366 if(!(fITSgeom->IsShapeDefined(kSSD)))
367 fITSgeom->ReSetShape(kSSD,new AliITSgeomSSD75and275());
377 //_____________________________________________________________________________
378 void AliITSvtest::Init(){
379 ////////////////////////////////////////////////////////////////////////
380 // Initialise the ITS after it has been created.
381 ////////////////////////////////////////////////////////////////////////
385 for(i=0;i<29;i++) cout << "*";cout << " ITSvtest_Init ";
386 for(i=0;i<28;i++) cout << "*";cout << endl;
388 if(fRead[0]=='\0') strncpy(fRead,fEuclidGeomDet,60);
389 if(fWrite[0]=='\0') strncpy(fWrite,fEuclidGeomDet,60);
390 if(fITSgeom!=0) delete fITSgeom;
391 fITSgeom = new AliITSgeom();
392 if(fGeomDetIn) fITSgeom->ReadNewFile(fRead);
393 if(!fGeomDetIn) this->InitAliITSgeom();
394 if(fGeomDetOut) fITSgeom->WriteNewFile(fWrite);
397 for(i=0;i<72;i++) cout << "*";
400 //_____________________________________________________________________________
401 void AliITSvtest::StepManager(){
403 // Called for every step in the ITS
409 TLorentzVector position, momentum;
410 TClonesArray &lhits = *fHits;
414 if(gMC->IsTrackInside()) vol[3] += 1;
415 if(gMC->IsTrackEntering()) vol[3] += 2;
416 if(gMC->IsTrackExiting()) vol[3] += 4;
417 if(gMC->IsTrackOut()) vol[3] += 8;
418 if(gMC->IsTrackDisappeared()) vol[3] += 16;
419 if(gMC->IsTrackStop()) vol[3] += 32;
420 if(gMC->IsTrackAlive()) vol[3] += 64;
422 // Fill hit structure.
423 if(!(gMC->TrackCharge())) return;
425 // Only entering charged tracks
426 if((id = gMC->CurrentVolID(copy)) == fIdSens[0]) {
428 id = gMC->CurrentVolOffID(0,copy);
429 //detector copy in the ladder = 1<->4 (ITS1)
431 gMC->CurrentVolOffID(1,copy1);
432 //ladder copy in the module = 1<->2 (I186)
433 gMC->CurrentVolOffID(2,copy2);
434 //module copy in the layer = 1<->10 (I132)
435 vol[2] = copy1+(copy2-1)*2;//# of ladders in one module = 2
436 } else if(id == fIdSens[1]){
438 id = gMC->CurrentVolOffID(0,copy);
439 //detector copy in the ladder = 1<->4 (ITS2)
441 gMC->CurrentVolOffID(1,copy1);
442 //ladder copy in the module = 1<->4 (I131)
443 gMC->CurrentVolOffID(2,copy2);
444 //module copy in the layer = 1<->10 (I132)
445 vol[2] = copy1+(copy2-1)*4;//# of ladders in one module = 4
446 } else if(id == fIdSens[2]){
448 id = gMC->CurrentVolOffID(1,copy);
449 //detector copy in the ladder = 1<->5 (ITS3 is inside I314)
451 id = gMC->CurrentVolOffID(2,copy);
452 //ladder copy in the layer = 1<->12 (I316)
454 } else if(id == fIdSens[3]){
456 id = gMC->CurrentVolOffID(1,copy);
457 //detector copy in the ladder = 1<->8 (ITS4 is inside I414)
459 id = gMC->CurrentVolOffID(2,copy);
460 //ladder copy in the layer = 1<->22 (I417)
462 }else if(id == fIdSens[4]){
464 id = gMC->CurrentVolOffID(1,copy);
465 //detector copy in the ladder = 1<->23 (ITS5 is inside I562)
467 id = gMC->CurrentVolOffID(2,copy);
468 //ladder copy in the layer = 1<->34 (I565)
470 }else if(id == fIdSens[5]){
472 id = gMC->CurrentVolOffID(1,copy);
473 //detector copy in the ladder = 1<->26 (ITS6 is inside I566)
475 id = gMC->CurrentVolOffID(2,copy);
476 //ladder copy in the layer = 1<->38 (I569)
479 return; // not an ITS volume?
480 } // end if/else if (gMC->CurentVolID(copy) == fIdSens[i])
482 gMC->TrackPosition(position);
483 gMC->TrackMomentum(momentum);
491 hits[7]=gMC->TrackTime();
492 // Fill hit structure with this new hit.
493 new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->CurrentTrack(),vol,hits);