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.7 2001/02/09 20:06:26 nilsen
19 Fixed bug in distructor. Can't distroy fixxed length arrays. Thanks Peter.
21 Revision 1.6 2001/02/09 00:05:31 nilsen
22 Added fMajor/MinorVersion variables and made other changes to better make
23 use of the new code changes in AliITSgeom related classes.
25 Revision 1.5 2001/01/30 09:23:14 hristov
26 Streamers removed (R.Brun)
28 Revision 1.4 2001/01/18 06:25:09 barbera
29 ITS geometry using test Euclid files
31 Revision 1.1.2.8 2000/10/05 20:28:18 nilsen
32 Now using root generated streamer function.
34 Revision 1.1.2.7 2000/07/31 13:51:22 barbera
35 Updated from the release
37 Revision 1.2 2000/07/10 16:07:19 fca
38 Release version of ITS code
40 Revision 1.1.2.2 2000/03/02 21:53:36 nilsen
41 to make it compatable with the changes in AliRun/AliModule.
43 Revision 1.1.2.1 2000/01/12 20:19:03 nilsen
44 The changes made with this latest inclusion of code is very large.
45 Many of the new files were added just in December when P. Cerello added his
46 SDD simulations to the distrobutions. Also added are some file of P. Skowronski
47 for SSD cluster finding and ghost RecPoints. None of this "new" code has been
48 proporly tested. Other code new to this cvs repository is explained in the
49 ITS Off-line web page. In general the changes are too large to give a resonable
50 discription of them but probably should be taken as the starting point for
51 the developement branch (ITS-working).
54 Revision 1.13 1999/10/16 19:49:00 BSN
60 ///////////////////////////////////////////////////////////////////////////////
62 // Inner Traking System version Test //
63 // This class contains the base procedures for the Inner Tracking System //
65 // Authors: R. Barbera, B. S. Nilsen. //
67 // Created October 16 1999. //
69 ///////////////////////////////////////////////////////////////////////////////
73 #include <TGeometry.h>
76 #include <TFile.h> // only required for Tracking function?
78 #include <TObjArray.h>
79 #include <TObjString.h>
80 #include <TClonesArray.h>
81 #include <TLorentzVector.h>
87 #include "../TGeant3/TGeant3.h"
88 #include "AliITSGeant3Geometry.h"
89 #include "AliITShit.h"
91 #include "AliITSvtest.h"
92 #include "AliITSgeom.h"
93 #include "AliITSgeomSPD.h"
94 #include "AliITSgeomSDD.h"
95 #include "AliITSgeomSSD.h"
99 //_____________________________________________________________________________
100 AliITSvtest::AliITSvtest() {
101 // Standard constructor for the ITS
107 fEuclidOut = kFALSE; // Don't write Euclide file
108 fGeomDetOut = kFALSE; // Don't write .det file
109 fGeomDetIn = kTRUE; // Read .det file
110 fMajorVersion = IsVersion();
112 for(i=0;i<60;i++) fRead[i] = '\0';
113 for(i=0;i<60;i++) fWrite[i] = '\0';
114 for(i=0;i<60;i++) fEuclidGeomDet[i] = '\0';
116 //____________________________________________________________________________
117 AliITSvtest::AliITSvtest(const AliITSvtest &source){
118 ////////////////////////////////////////////////////////////////////////
119 // Copy Constructor for ITS test version.
120 ////////////////////////////////////////////////////////////////////////
121 if(&source == this) return;
122 Warning("Copy Constructor","Not allowed to copy AliITSvtest");
125 //_____________________________________________________________________________
126 AliITSvtest& AliITSvtest::operator=(const AliITSvtest &source){
127 ////////////////////////////////////////////////////////////////////////
128 // Assignment operator for the ITS version 1.
129 ////////////////////////////////////////////////////////////////////////
130 if(&source == this) return *this;
131 Warning("= operator","Not allowed to copy AliITSvtest");
134 //_____________________________________________________________________________
135 AliITSvtest::~AliITSvtest() {
136 // Standard destructor for the ITS
138 //_____________________________________________________________________________
139 AliITSvtest::AliITSvtest(const char *fileeuc,const char *filetme,
140 const char *name, const char *title)
141 : AliITS(name, title){
143 // Standard constructor for the ITS
146 fIdName = new TString[fIdN];
153 fIdSens = new Int_t[fIdN];
154 for (Int_t i=0;i<fIdN;i++) fIdSens[i] = 0;
155 fMajorVersion = IsVersion();
157 fEuclidOut = kFALSE; // Don't write Euclide file
158 fGeomDetOut = kFALSE; // Don't write .det file
159 fGeomDetIn = kTRUE; // Read .det file
161 fEuclidMaterial = filetme;
162 fEuclidGeometry = fileeuc;
163 strncpy(fEuclidGeomDet,"$ALICE_ROOT/ITS/ITSgeometry_PPR.det",60);
164 strncpy(fRead,fEuclidGeomDet,60);
165 strncpy(fWrite,fEuclidGeomDet,60);
166 // The .det file for the geometry must have the same name as fileeuc with
167 // .euc replaced by .det.
171 //_____________________________________________________________________________
172 void AliITSvtest::CreateMaterials(){
174 // Read materials for the ITS
178 filtmp = gSystem->ExpandPathName(fEuclidMaterial.Data());
179 // FILE *file = fopen(fEuclidMaterial.Data(),"r");
180 FILE *file = fopen(filtmp,"r");
183 // ReadEuclidMedia(fEuclidMaterial.Data(),this);
184 ReadEuclidMedia(filtmp);
186 Error("CreateMaterials"," THE MEDIA FILE %s DOES NOT EXIST !",
187 // fEuclidMaterial.Data());
193 //_____________________________________________________________________________
194 void AliITSvtest::CreateGeometry(){
195 //////////////////////////////////////////////////////////////////////
196 ////////////////////////////////////////////////////////////////////////
197 // Read geometry for the ITS
202 filtmp = gSystem->ExpandPathName(fEuclidGeometry.Data());
203 FILE *file = fopen(filtmp,"r");
207 printf("Ready to read Euclid geometry file\n");
208 ReadEuclid(fEuclidGeometry.Data(),topvol);
209 printf("Read in euclid geometries\n");
211 Error("CreateGeometry"," THE GEOM FILE %s DOES NOT EXIST !",
212 fEuclidGeometry.Data());
216 //---Place the ITS ghost volume ITSV in its mother volume (ALIC) and make it
219 gMC->Gspos("ITSV",1,"ALIC",0,0,0,0,"ONLY");
221 //---Outputs the geometry tree in the EUCLID/CAD format
224 gMC->WriteEuclid("ITSgeometry", "ITSV", 1, 5);
225 } // end if (fEuclidOut)
226 cout <<"finished with euclid geometrys"<< endl;
228 //______________________________________________________________________
229 void AliITSvtest::InitAliITSgeom(){
230 // Based on the geometry tree defined in Geant 3.21, this
231 // routine initilizes the Class AliITSgeom from the Geant 3.21 ITS geometry
233 if(!(dynamic_cast<TGeant3*>(gMC))) {
234 Error("InitAliITSgeom",
235 "Wrong Monte Carlo. InitAliITSgeom uses TGeant3 calls");
238 cout << "Reading Geometry transformation directly from Geant 3." << endl;
239 const Int_t nlayers = 6;
240 const Int_t ndeep = 9;
241 Int_t itsGeomTreeNames[nlayers][ndeep],lnam[20],lnum[20];
242 Int_t nlad[nlayers],ndet[nlayers];
244 Float_t par[20],att[20];
245 Int_t npar,natt,idshape,imat,imed;
246 AliITSGeant3Geometry *ig = new AliITSGeant3Geometry();
247 Int_t mod,lay,lad,det,i,j,k;
248 char *names[nlayers][ndeep] = {
249 {"ALIC","ITSV","ITSD","IT12","I12B","I10B","I107","I101","ITS1"}, // lay=1
250 {"ALIC","ITSV","ITSD","IT12","I12B","I20B","I1D7","I1D1","ITS2"}, // lay=2
251 {"ALIC","ITSV","ITSD","IT34","I004","I302","ITS3"," "," "}, // lay=3
252 {"ALIC","ITSV","ITSD","IT34","I005","I402","ITS4"," "," "}, // lay=4
253 {"ALIC","ITSV","ITSD","IT56","I565","I562","ITS5"," "," "}, // lay=5
254 {"ALIC","ITSV","ITSD","IT56","I569","I566","ITS6"," "," "}};// lay=6
255 Int_t itsGeomTreeCopys[nlayers][ndeep] = {{1,1,1,1,10, 2, 4, 1, 1},// lay=1
256 {1,1,1,1,10, 4, 4, 1, 1},// lay=2
257 {1,1,1,1,14, 6, 1, 0, 0},// lay=3
258 {1,1,1,1,22, 8, 1, 0, 0},// lay=4
259 {1,1,1,1,34,22, 1, 0, 0},// lay=5
260 {1,1,1,1,38,25, 1, 0, 0}};//lay=6
262 // Sorry, but this is not very pritty code. It should be replaced
263 // at some point with a version that can search through the geometry
265 cout << "Reading Geometry informaton from Geant3 common blocks" << endl;
266 for(i=0;i<20;i++) lnam[i] = lnum[i] = 0;
267 for(i=0;i<nlayers;i++)for(j=0;j<ndeep;j++)
268 itsGeomTreeNames[i][j] = ig->StringToInt(names[i][j]);
270 for(i=0;i<nlayers;i++){
272 for(j=0;j<ndeep;j++) if(itsGeomTreeCopys[i][j]!=0)
273 k *= TMath::Abs(itsGeomTreeCopys[i][j]);
277 if(fITSgeom!=0) delete fITSgeom;
278 nlad[0]=20;nlad[1]=40;nlad[2]=14;nlad[3]=22;nlad[4]=34;nlad[5]=38;
279 ndet[0]=4;ndet[1]=4;ndet[2]=6;ndet[3]=8;ndet[4]=22;ndet[5]=25;
280 fITSgeom = new AliITSgeom(0,6,nlad,ndet,mod);
282 for(lay=1;lay<=nlayers;lay++){
283 for(j=0;j<ndeep;j++) lnam[j] = itsGeomTreeNames[lay-1][j];
284 for(j=0;j<ndeep;j++) lnum[j] = itsGeomTreeCopys[lay-1][j];
286 case 1: case 2: // layers 1 and 2 are a bit special
288 for(j=1;j<=itsGeomTreeCopys[lay-1][4];j++){
290 for(k=1;k<=itsGeomTreeCopys[lay-1][5];k++){
293 for(det=1;det<=itsGeomTreeCopys[lay-1][6];det++){
296 ig->GetGeometry(ndeep,lnam,lnum,t,r,idshape,npar,natt,
298 fITSgeom->CreatMatrix(mod,lay,lad,det,kSPD,t,r);
299 if(!(fITSgeom->IsShapeDefined((Int_t)kSPD)))
300 if(fMinorVersion==1){
301 fITSgeom->ReSetShape(kSPD,
302 new AliITSgeomSPD425Short());
303 } else if(fMinorVersion==2)
304 fITSgeom->ReSetShape(kSPD,
305 new AliITSgeomSPD425Short());
310 case 3: case 4: case 5: case 6: // layers 3-6
312 for(lad=1;lad<=itsGeomTreeCopys[lay-1][4];lad++){
314 for(det=1;det<=itsGeomTreeCopys[lay-1][5];det++){
317 ig->GetGeometry(7,lnam,lnum,t,r,idshape,npar,natt,
321 fITSgeom->CreatMatrix(mod,lay,lad,det,kSDD,t,r);
322 if(!(fITSgeom->IsShapeDefined(kSDD)))
323 fITSgeom->ReSetShape(kSDD,new AliITSgeomSDD256());
326 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSD,t,r);
327 if(!(fITSgeom->IsShapeDefined(kSSD)))
328 fITSgeom->ReSetShape(kSSD,new AliITSgeomSSD275and75());
331 fITSgeom->CreatMatrix(mod,lay,lad,det,kSSDp,t,r);
332 if(!(fITSgeom->IsShapeDefined(kSSDp)))
333 fITSgeom->ReSetShape(kSSDp,new AliITSgeomSSD75and275());
343 //_____________________________________________________________________________
344 void AliITSvtest::Init(){
345 ////////////////////////////////////////////////////////////////////////
346 // Initialise the ITS after it has been created.
347 ////////////////////////////////////////////////////////////////////////
351 for(i=0;i<29;i++) cout << "*";cout << " ITSvtest_Init ";
352 for(i=0;i<28;i++) cout << "*";cout << endl;
354 if(fRead[0]=='\0') strncpy(fRead,fEuclidGeomDet,60);
355 if(fWrite[0]=='\0') strncpy(fWrite,fEuclidGeomDet,60);
356 if(fITSgeom!=0) delete fITSgeom;
357 fITSgeom = new AliITSgeom();
358 if(fGeomDetIn) fITSgeom->ReadNewFile(fRead);
359 if(!fGeomDetIn) this->InitAliITSgeom();
360 if(fGeomDetOut) fITSgeom->WriteNewFile(fWrite);
363 for(i=0;i<72;i++) cout << "*";
366 //_____________________________________________________________________________
367 void AliITSvtest::StepManager(){
369 // Called for every step in the ITS
375 TLorentzVector position, momentum;
376 TClonesArray &lhits = *fHits;
380 if(gMC->IsTrackInside()) vol[3] += 1;
381 if(gMC->IsTrackEntering()) vol[3] += 2;
382 if(gMC->IsTrackExiting()) vol[3] += 4;
383 if(gMC->IsTrackOut()) vol[3] += 8;
384 if(gMC->IsTrackDisappeared()) vol[3] += 16;
385 if(gMC->IsTrackStop()) vol[3] += 32;
386 if(gMC->IsTrackAlive()) vol[3] += 64;
388 // Fill hit structure.
389 if(!(gMC->TrackCharge())) return;
391 // Only entering charged tracks
392 if((id = gMC->CurrentVolID(copy)) == fIdSens[0]) {
394 id = gMC->CurrentVolOffID(0,copy);
395 //detector copy in the ladder = 1<->4 (ITS1)
397 gMC->CurrentVolOffID(1,copy1);
398 //ladder copy in the module = 1<->2 (I186)
399 gMC->CurrentVolOffID(2,copy2);
400 //module copy in the layer = 1<->10 (I132)
401 vol[2] = copy1+(copy2-1)*2;//# of ladders in one module = 2
402 } else if(id == fIdSens[1]){
404 id = gMC->CurrentVolOffID(0,copy);
405 //detector copy in the ladder = 1<->4 (ITS2)
407 gMC->CurrentVolOffID(1,copy1);
408 //ladder copy in the module = 1<->4 (I131)
409 gMC->CurrentVolOffID(2,copy2);
410 //module copy in the layer = 1<->10 (I132)
411 vol[2] = copy1+(copy2-1)*4;//# of ladders in one module = 4
412 } else if(id == fIdSens[2]){
414 id = gMC->CurrentVolOffID(1,copy);
415 //detector copy in the ladder = 1<->5 (ITS3 is inside I314)
417 id = gMC->CurrentVolOffID(2,copy);
418 //ladder copy in the layer = 1<->12 (I316)
420 } else if(id == fIdSens[3]){
422 id = gMC->CurrentVolOffID(1,copy);
423 //detector copy in the ladder = 1<->8 (ITS4 is inside I414)
425 id = gMC->CurrentVolOffID(2,copy);
426 //ladder copy in the layer = 1<->22 (I417)
428 }else if(id == fIdSens[4]){
430 id = gMC->CurrentVolOffID(1,copy);
431 //detector copy in the ladder = 1<->23 (ITS5 is inside I562)
433 id = gMC->CurrentVolOffID(2,copy);
434 //ladder copy in the layer = 1<->34 (I565)
436 }else if(id == fIdSens[5]){
438 id = gMC->CurrentVolOffID(1,copy);
439 //detector copy in the ladder = 1<->26 (ITS6 is inside I566)
441 id = gMC->CurrentVolOffID(2,copy);
442 //ladder copy in the layer = 1<->38 (I569)
445 return; // not an ITS volume?
446 } // end if/else if (gMC->CurentVolID(copy) == fIdSens[i])
448 gMC->TrackPosition(position);
449 gMC->TrackMomentum(momentum);
457 hits[7]=gMC->TrackTime();
458 // Fill hit structure with this new hit.
459 new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->CurrentTrack(),vol,hits);