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.12 2001/08/24 21:04:36 nilsen
19 Added some include files. Needed due to new forward declorations in other
22 Revision 1.11 2001/05/30 16:15:47 fca
23 Correct comparison wiht AliGeant3::Class() introduced. Thanks to I.Hrivnacova
25 Revision 1.10 2001/05/30 15:55:35 hristov
26 Strings compared instead of pointers
28 Revision 1.9 2001/05/30 14:04:31 hristov
29 Dynamic cast replaced (F.Carminati)
31 Revision 1.8 2001/02/13 16:53:35 nilsen
32 Fixed a but when trying to use GEANT4. Needed to replace
33 if(!((TGeant3*)gMC)) with if(!(dynamic_casst<TGeant3*>(gMC)))
34 because just casting gMC to be TGeant3* even when it realy is a TGeant3 pointer
35 did not result in a zero value. For AliITSv5asymm and AliITSv5symm, needed
36 to fix a bug in the initilizers and a bug in BuildGeometry. This is now done
37 in the same way as in AliITSv5.cxx.
39 Revision 1.7 2001/02/09 20:06:26 nilsen
40 Fixed bug in distructor. Can't distroy fixxed length arrays. Thanks Peter.
42 Revision 1.6 2001/02/09 00:05:31 nilsen
43 Added fMajor/MinorVersion variables and made other changes to better make
44 use of the new code changes in AliITSgeom related classes.
46 Revision 1.5 2001/01/30 09:23:14 hristov
47 Streamers removed (R.Brun)
49 Revision 1.4 2001/01/18 06:25:09 barbera
50 ITS geometry using test Euclid files
52 Revision 1.1.2.8 2000/10/05 20:28:18 nilsen
53 Now using root generated streamer function.
55 Revision 1.1.2.7 2000/07/31 13:51:22 barbera
56 Updated from the release
58 Revision 1.2 2000/07/10 16:07:19 fca
59 Release version of ITS code
61 Revision 1.1.2.2 2000/03/02 21:53:36 nilsen
62 to make it compatable with the changes in AliRun/AliModule.
64 Revision 1.1.2.1 2000/01/12 20:19:03 nilsen
65 The changes made with this latest inclusion of code is very large.
66 Many of the new files were added just in December when P. Cerello added his
67 SDD simulations to the distrobutions. Also added are some file of P. Skowronski
68 for SSD cluster finding and ghost RecPoints. None of this "new" code has been
69 proporly tested. Other code new to this cvs repository is explained in the
70 ITS Off-line web page. In general the changes are too large to give a resonable
71 discription of them but probably should be taken as the starting point for
72 the developement branch (ITS-working).
75 Revision 1.13 1999/10/16 19:49:00 BSN
81 ///////////////////////////////////////////////////////////////////////////////
83 // Inner Traking System version Test //
84 // This class contains the base procedures for the Inner Tracking System //
86 // Authors: R. Barbera, B. S. Nilsen. //
88 // Created October 16 1999. //
90 ///////////////////////////////////////////////////////////////////////////////
96 #include <TGeometry.h>
99 #include <TFile.h> // only required for Tracking function?
101 #include <TObjArray.h>
102 #include <TObjString.h>
103 #include <TClonesArray.h>
104 #include <TLorentzVector.h>
110 #include "AliGeant3.h"
111 #include "AliITSGeant3Geometry.h"
112 #include "AliITShit.h"
114 #include "AliITSvtest.h"
115 #include "AliITSgeom.h"
116 #include "AliITSgeomSPD.h"
117 #include "AliITSgeomSDD.h"
118 #include "AliITSgeomSSD.h"
120 ClassImp(AliITSvtest)
122 //_____________________________________________________________________________
123 AliITSvtest::AliITSvtest() {
124 // Standard constructor for the ITS
130 fEuclidOut = kFALSE; // Don't write Euclide file
131 fGeomDetOut = kFALSE; // Don't write .det file
132 fGeomDetIn = kTRUE; // Read .det file
133 fMajorVersion = IsVersion();
135 for(i=0;i<60;i++) fRead[i] = '\0';
136 for(i=0;i<60;i++) fWrite[i] = '\0';
137 for(i=0;i<60;i++) fEuclidGeomDet[i] = '\0';
139 //____________________________________________________________________________
140 AliITSvtest::AliITSvtest(const AliITSvtest &source){
141 ////////////////////////////////////////////////////////////////////////
142 // Copy Constructor for ITS test version.
143 ////////////////////////////////////////////////////////////////////////
144 if(&source == this) return;
145 Warning("Copy Constructor","Not allowed to copy AliITSvtest");
148 //_____________________________________________________________________________
149 AliITSvtest& AliITSvtest::operator=(const AliITSvtest &source){
150 ////////////////////////////////////////////////////////////////////////
151 // Assignment operator for the ITS version 1.
152 ////////////////////////////////////////////////////////////////////////
153 if(&source == this) return *this;
154 Warning("= operator","Not allowed to copy AliITSvtest");
157 //_____________________________________________________________________________
158 AliITSvtest::~AliITSvtest() {
159 // Standard destructor for the ITS
161 //_____________________________________________________________________________
162 AliITSvtest::AliITSvtest(const char *fileeuc,const char *filetme,
163 const char *name, const char *title)
164 : AliITS(name, title){
166 // Standard constructor for the ITS
169 fIdName = new TString[fIdN];
176 fIdSens = new Int_t[fIdN];
177 for (Int_t i=0;i<fIdN;i++) fIdSens[i] = 0;
178 fMajorVersion = IsVersion();
180 fEuclidOut = kFALSE; // Don't write Euclide file
181 fGeomDetOut = kFALSE; // Don't write .det file
182 fGeomDetIn = kTRUE; // Read .det file
184 fEuclidMaterial = filetme;
185 fEuclidGeometry = fileeuc;
186 strncpy(fEuclidGeomDet,"$ALICE_ROOT/ITS/ITSgeometry_PPR.det",60);
187 strncpy(fRead,fEuclidGeomDet,60);
188 strncpy(fWrite,fEuclidGeomDet,60);
189 // The .det file for the geometry must have the same name as fileeuc with
190 // .euc replaced by .det.
194 //_____________________________________________________________________________
195 void AliITSvtest::CreateMaterials(){
197 // Read materials for the ITS
201 filtmp = gSystem->ExpandPathName(fEuclidMaterial.Data());
202 // FILE *file = fopen(fEuclidMaterial.Data(),"r");
203 FILE *file = fopen(filtmp,"r");
206 // ReadEuclidMedia(fEuclidMaterial.Data(),this);
207 ReadEuclidMedia(filtmp);
209 Error("CreateMaterials"," THE MEDIA FILE %s DOES NOT EXIST !",
210 // fEuclidMaterial.Data());
216 //_____________________________________________________________________________
217 void AliITSvtest::CreateGeometry(){
218 //////////////////////////////////////////////////////////////////////
219 ////////////////////////////////////////////////////////////////////////
220 // Read geometry for the ITS
225 filtmp = gSystem->ExpandPathName(fEuclidGeometry.Data());
226 FILE *file = fopen(filtmp,"r");
230 printf("Ready to read Euclid geometry file\n");
231 ReadEuclid(fEuclidGeometry.Data(),topvol);
232 printf("Read in euclid geometries\n");
234 Error("CreateGeometry"," THE GEOM FILE %s DOES NOT EXIST !",
235 fEuclidGeometry.Data());
239 //---Place the ITS ghost volume ITSV in its mother volume (ALIC) and make it
242 gMC->Gspos("ITSV",1,"ALIC",0,0,0,0,"ONLY");
244 //---Outputs the geometry tree in the EUCLID/CAD format
247 gMC->WriteEuclid("ITSgeometry", "ITSV", 1, 5);
248 } // end if (fEuclidOut)
249 cout <<"finished with euclid geometrys"<< endl;
251 //______________________________________________________________________
252 void AliITSvtest::InitAliITSgeom(){
253 // Based on the geometry tree defined in Geant 3.21, this
254 // routine initilizes the Class AliITSgeom from the Geant 3.21 ITS geometry
256 if(gMC->IsA()!=AliGeant3::Class()) {
257 Error("InitAliITSgeom",
258 "Wrong Monte Carlo. InitAliITSgeom uses TGeant3 calls");
261 cout << "Reading Geometry transformation directly from Geant 3." << endl;
262 const Int_t nlayers = 6;
263 const Int_t ndeep = 9;
264 Int_t itsGeomTreeNames[nlayers][ndeep],lnam[20],lnum[20];
265 Int_t nlad[nlayers],ndet[nlayers];
267 Float_t par[20],att[20];
268 Int_t npar,natt,idshape,imat,imed;
269 AliITSGeant3Geometry *ig = new AliITSGeant3Geometry();
270 Int_t mod,lay,lad,det,i,j,k;
271 char *names[nlayers][ndeep] = {
272 {"ALIC","ITSV","ITSD","IT12","I12B","I10B","I107","I101","ITS1"}, // lay=1
273 {"ALIC","ITSV","ITSD","IT12","I12B","I20B","I1D7","I1D1","ITS2"}, // lay=2
274 {"ALIC","ITSV","ITSD","IT34","I004","I302","ITS3"," "," "}, // lay=3
275 {"ALIC","ITSV","ITSD","IT34","I005","I402","ITS4"," "," "}, // lay=4
276 {"ALIC","ITSV","ITSD","IT56","I565","I562","ITS5"," "," "}, // lay=5
277 {"ALIC","ITSV","ITSD","IT56","I569","I566","ITS6"," "," "}};// lay=6
278 Int_t itsGeomTreeCopys[nlayers][ndeep] = {{1,1,1,1,10, 2, 4, 1, 1},// lay=1
279 {1,1,1,1,10, 4, 4, 1, 1},// lay=2
280 {1,1,1,1,14, 6, 1, 0, 0},// lay=3
281 {1,1,1,1,22, 8, 1, 0, 0},// lay=4
282 {1,1,1,1,34,22, 1, 0, 0},// lay=5
283 {1,1,1,1,38,25, 1, 0, 0}};//lay=6
285 // Sorry, but this is not very pritty code. It should be replaced
286 // at some point with a version that can search through the geometry
288 cout << "Reading Geometry informaton from Geant3 common blocks" << endl;
289 for(i=0;i<20;i++) lnam[i] = lnum[i] = 0;
290 for(i=0;i<nlayers;i++)for(j=0;j<ndeep;j++)
291 itsGeomTreeNames[i][j] = ig->StringToInt(names[i][j]);
293 for(i=0;i<nlayers;i++){
295 for(j=0;j<ndeep;j++) if(itsGeomTreeCopys[i][j]!=0)
296 k *= TMath::Abs(itsGeomTreeCopys[i][j]);
300 if(fITSgeom!=0) delete fITSgeom;
301 nlad[0]=20;nlad[1]=40;nlad[2]=14;nlad[3]=22;nlad[4]=34;nlad[5]=38;
302 ndet[0]=4;ndet[1]=4;ndet[2]=6;ndet[3]=8;ndet[4]=22;ndet[5]=25;
303 fITSgeom = new AliITSgeom(0,6,nlad,ndet,mod);
305 for(lay=1;lay<=nlayers;lay++){
306 for(j=0;j<ndeep;j++) lnam[j] = itsGeomTreeNames[lay-1][j];
307 for(j=0;j<ndeep;j++) lnum[j] = itsGeomTreeCopys[lay-1][j];
309 case 1: case 2: // layers 1 and 2 are a bit special
311 for(j=1;j<=itsGeomTreeCopys[lay-1][4];j++){
313 for(k=1;k<=itsGeomTreeCopys[lay-1][5];k++){
316 for(det=1;det<=itsGeomTreeCopys[lay-1][6];det++){
319 ig->GetGeometry(ndeep,lnam,lnum,t,r,idshape,npar,natt,
321 fITSgeom->CreatMatrix(mod,lay,lad,det,kSPD,t,r);
322 if(!(fITSgeom->IsShapeDefined((Int_t)kSPD)))
323 if(fMinorVersion==1){
324 fITSgeom->ReSetShape(kSPD,
325 new AliITSgeomSPD425Short());
326 } else if(fMinorVersion==2)
327 fITSgeom->ReSetShape(kSPD,
328 new AliITSgeomSPD425Short());
333 case 3: case 4: case 5: case 6: // layers 3-6
335 for(lad=1;lad<=itsGeomTreeCopys[lay-1][4];lad++){
337 for(det=1;det<=itsGeomTreeCopys[lay-1][5];det++){
340 ig->GetGeometry(7,lnam,lnum,t,r,idshape,npar,natt,
344 fITSgeom->CreatMatrix(mod,lay,lad,det,kSDD,t,r);
345 if(!(fITSgeom->IsShapeDefined(kSDD)))
346 fITSgeom->ReSetShape(kSDD,new AliITSgeomSDD256());
349 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSD,t,r);
350 if(!(fITSgeom->IsShapeDefined(kSSD)))
351 fITSgeom->ReSetShape(kSSD,new AliITSgeomSSD275and75());
354 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSD,t,r);
355 if(!(fITSgeom->IsShapeDefined(kSSD)))
356 fITSgeom->ReSetShape(kSSD,new AliITSgeomSSD75and275());
366 //_____________________________________________________________________________
367 void AliITSvtest::Init(){
368 ////////////////////////////////////////////////////////////////////////
369 // Initialise the ITS after it has been created.
370 ////////////////////////////////////////////////////////////////////////
374 for(i=0;i<29;i++) cout << "*";cout << " ITSvtest_Init ";
375 for(i=0;i<28;i++) cout << "*";cout << endl;
377 if(fRead[0]=='\0') strncpy(fRead,fEuclidGeomDet,60);
378 if(fWrite[0]=='\0') strncpy(fWrite,fEuclidGeomDet,60);
379 if(fITSgeom!=0) delete fITSgeom;
380 fITSgeom = new AliITSgeom();
381 if(fGeomDetIn) fITSgeom->ReadNewFile(fRead);
382 if(!fGeomDetIn) this->InitAliITSgeom();
383 if(fGeomDetOut) fITSgeom->WriteNewFile(fWrite);
386 for(i=0;i<72;i++) cout << "*";
389 //_____________________________________________________________________________
390 void AliITSvtest::StepManager(){
392 // Called for every step in the ITS
398 TLorentzVector position, momentum;
399 TClonesArray &lhits = *fHits;
403 if(gMC->IsTrackInside()) vol[3] += 1;
404 if(gMC->IsTrackEntering()) vol[3] += 2;
405 if(gMC->IsTrackExiting()) vol[3] += 4;
406 if(gMC->IsTrackOut()) vol[3] += 8;
407 if(gMC->IsTrackDisappeared()) vol[3] += 16;
408 if(gMC->IsTrackStop()) vol[3] += 32;
409 if(gMC->IsTrackAlive()) vol[3] += 64;
411 // Fill hit structure.
412 if(!(gMC->TrackCharge())) return;
414 // Only entering charged tracks
415 if((id = gMC->CurrentVolID(copy)) == fIdSens[0]) {
417 id = gMC->CurrentVolOffID(0,copy);
418 //detector copy in the ladder = 1<->4 (ITS1)
420 gMC->CurrentVolOffID(1,copy1);
421 //ladder copy in the module = 1<->2 (I186)
422 gMC->CurrentVolOffID(2,copy2);
423 //module copy in the layer = 1<->10 (I132)
424 vol[2] = copy1+(copy2-1)*2;//# of ladders in one module = 2
425 } else if(id == fIdSens[1]){
427 id = gMC->CurrentVolOffID(0,copy);
428 //detector copy in the ladder = 1<->4 (ITS2)
430 gMC->CurrentVolOffID(1,copy1);
431 //ladder copy in the module = 1<->4 (I131)
432 gMC->CurrentVolOffID(2,copy2);
433 //module copy in the layer = 1<->10 (I132)
434 vol[2] = copy1+(copy2-1)*4;//# of ladders in one module = 4
435 } else if(id == fIdSens[2]){
437 id = gMC->CurrentVolOffID(1,copy);
438 //detector copy in the ladder = 1<->5 (ITS3 is inside I314)
440 id = gMC->CurrentVolOffID(2,copy);
441 //ladder copy in the layer = 1<->12 (I316)
443 } else if(id == fIdSens[3]){
445 id = gMC->CurrentVolOffID(1,copy);
446 //detector copy in the ladder = 1<->8 (ITS4 is inside I414)
448 id = gMC->CurrentVolOffID(2,copy);
449 //ladder copy in the layer = 1<->22 (I417)
451 }else if(id == fIdSens[4]){
453 id = gMC->CurrentVolOffID(1,copy);
454 //detector copy in the ladder = 1<->23 (ITS5 is inside I562)
456 id = gMC->CurrentVolOffID(2,copy);
457 //ladder copy in the layer = 1<->34 (I565)
459 }else if(id == fIdSens[5]){
461 id = gMC->CurrentVolOffID(1,copy);
462 //detector copy in the ladder = 1<->26 (ITS6 is inside I566)
464 id = gMC->CurrentVolOffID(2,copy);
465 //ladder copy in the layer = 1<->38 (I569)
468 return; // not an ITS volume?
469 } // end if/else if (gMC->CurentVolID(copy) == fIdSens[i])
471 gMC->TrackPosition(position);
472 gMC->TrackMomentum(momentum);
480 hits[7]=gMC->TrackTime();
481 // Fill hit structure with this new hit.
482 new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->CurrentTrack(),vol,hits);