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.13.2.1 1999/11/25 06:52:21 fca
21 Revision 1.13 1999/10/27 11:16:26 fca
22 Correction of problem in geometry
24 Revision 1.12 1999/10/22 08:25:25 fca
25 remove double definition of destructors
27 Revision 1.11 1999/10/22 08:16:49 fca
28 Correct destructors, thanks to I.Hrivnacova
30 Revision 1.10 1999/10/06 19:56:50 fca
33 Revision 1.9 1999/10/05 08:05:09 fca
34 Minor corrections for uninitialised variables.
36 Revision 1.8 1999/09/29 09:24:20 fca
37 Introduction of the Copyright and cvs Log
41 ///////////////////////////////////////////////////////////////////////////////
43 // Inner Traking System version 1 //
44 // This class contains the base procedures for the Inner Tracking System //
46 // Authors: R. Barbera, A. Morsch.
50 // NOTE: THIS IS THE COARSE pre.TDR geometry of the ITS. THIS WILL NOT WORK
51 // with the geometry or module classes or any analysis classes. You are
52 // strongly encouraged to uses AliITSv5.
54 ///////////////////////////////////////////////////////////////////////////////
59 #include "AliITShit.h"
68 //_____________________________________________________________________________
69 AliITSv1::AliITSv1() {
71 // Default constructor for the ITS
74 fId1Name = new char*[fId1N];
83 //_____________________________________________________________________________
84 AliITSv1::AliITSv1(const char *name, const char *title) : AliITS(name, title){
86 // Standard constructor for the ITS
89 fId1Name = new char*[fId1N];
98 //_____________________________________________________________________________
99 AliITSv1::~AliITSv1() {
101 // Standard destructor for the ITS
106 //_____________________________________________________________________________
107 void AliITSv1::CreateGeometry()
110 // Create geometry for version 1 of the ITS
113 // Create Geometry for ITS version 0
119 Float_t drcer[6] = { 0.,0.,.08,.08,0.,0. }; //CERAMICS THICKNESS
120 Float_t drepx[6] = { 0.,0.,0.,0.,.5357,.5357 }; //EPOXY THICKNESS
121 Float_t drpla[6] = { 0.,0.,0.,0.,.1786,.1786 }; //PLASTIC THICKNESS
122 Float_t dzb[6] = { 0.,0.,15.,15.,4.,4. }; //LENGTH OF BOXES
123 Float_t dphi[6] = { 72.,72.,72.,72.,50.6,45. }; //COVERED PHI-RANGE FOR LAYERS 1-6
124 Float_t rl[6] = { 3.9,7.6,14.,24.,40.,45. }; //SILICON LAYERS INNER RADIUS
125 Float_t drl[6] = { .755,.755,.809,.809,.7,.7 }; //THICKNESS OF LAYERS (in % radiation length)
126 Float_t dzl[6] = { 12.67,16.91,20.85,29.15,45.11,50.975 };//HALF LENGTH OF LAYERS
127 Float_t drpcb[6] = { 0.,0.,.06,.06,0.,0. }; //PCB THICKNESS
128 Float_t drcu[6] = { 0.,0.,.0504,.0504,.0357,.0357 }; //COPPER THICKNESS
129 Float_t drsi[6] = { 0.,0.,.006,.006,.3571,.3571 }; //SILICON THICKNESS
133 Float_t rend, drca_tpc, dzco, zend, dits[3], rlim, drsu, zmax;
134 Float_t zpos, dzco1, dzco2;
135 Float_t drcac[6], acone, dphii;
136 Float_t pcits[15], xltpc;
137 Float_t rzcone, rstep, r0, z0, acable, fp, dz, zi, ri;
141 Int_t *idtmed = fIdtmed->GetArray()-199;
143 // CONVERT INTO CM (RL(SI)=9.36 CM)
144 for (i = 0; i < 6; ++i) {
145 drl[i] = drl[i] / 100. * 9.36;
148 // SUPPORT ENDPLANE THICKNESS
149 drsu = 2.*0.06+1./20; // 1./20. is 1 cm of honeycomb (1/20 carbon density);
155 // CABLE THICKNESS (CONICAL CABLES CONNECTING THE LAYERS)
164 // CONE RADIUS AT 1ST LAYER
168 // FIELD CAGE HALF LENGTH
176 // PARAMETERS FOR SMALL (1/2) ITS
178 for (i = 0; i < 6; ++i) {
193 // EQUAL DISTRIBUTION INTO THE 6 LAYERS
194 rstep = drca_tpc / 6.;
195 for (i = 0; i < 6; ++i) {
196 drcac[i] = (i+1) * rstep;
199 // NUMBER OF PHI SECTORS
203 // PACK IN PHI AS MUCH AS POSSIBLE
204 // NOW PACK USING THICKNESS
206 for (i = 0; i < 6; ++i) {
211 // PHI-PACKING NOT SUFFICIENT ?
213 if (dphi[i]/45 < fp) {
214 drcac[i] = drcac[i] * fp * 45/dphi[i];
219 // --- Define ghost volume containing the six layers and fill it with air
224 gMC->Gsvolu("ITSV", "TUBE", idtmed[275], dgh, 3);
226 // --- Place the ghost volume in its mother volume (ALIC) and make it
229 gMC->Gspos("ITSV", 1, "ALIC", 0., 0., 0., 0, "ONLY");
230 gMC->Gsatt("ITSV", "SEEN", 0);
232 // ITS LAYERS (SILICON)
235 dits[1] = rl[0] + drl[0];
237 gMC->Gsvolu("ITS1", "TUBE", idtmed[199], dits, 3);
238 gMC->Gspos("ITS1", 1, "ITSV", 0., 0., 0., 0, "ONLY");
241 dits[1] = rl[1] + drl[1];
243 gMC->Gsvolu("ITS2", "TUBE", idtmed[199], dits, 3);
244 gMC->Gspos("ITS2", 1, "ITSV", 0., 0., 0., 0, "ONLY");
247 dits[1] = rl[2] + drl[2];
249 gMC->Gsvolu("ITS3", "TUBE", idtmed[224], dits, 3);
250 gMC->Gspos("ITS3", 1, "ITSV", 0., 0., 0., 0, "ONLY");
253 dits[1] = rl[3] + drl[3];
255 gMC->Gsvolu("ITS4", "TUBE", idtmed[224], dits, 3);
256 gMC->Gspos("ITS4", 1, "ITSV", 0., 0., 0., 0, "ONLY");
259 dits[1] = rl[4] + drl[4];
261 gMC->Gsvolu("ITS5", "TUBE", idtmed[249], dits, 3);
262 gMC->Gspos("ITS5", 1, "ITSV", 0., 0., 0., 0, "ONLY");
265 dits[1] = rl[5] + drl[5];
267 gMC->Gsvolu("ITS6", "TUBE", idtmed[249], dits, 3);
268 gMC->Gspos("ITS6", 1, "ITSV", 0., 0., 0., 0, "ONLY");
272 // PCB (layer #3 and #4)
274 gMC->Gsvolu("IPCB", "TUBE", idtmed[233], dits, 0);
275 for (i = 2; i < 4; ++i) {
277 dits[1] = dits[0] + drpcb[i];
278 dits[2] = dzb[i] / 2.;
279 zpos = dzl[i] + dits[2];
280 gMC->Gsposp("IPCB", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
281 gMC->Gsposp("IPCB", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
284 // COPPER (layer #3 and #4)
286 gMC->Gsvolu("ICO2", "TUBE", idtmed[234], dits, 0);
287 for (i = 2; i < 4; ++i) {
288 dits[0] = rl[i] + drpcb[i];
289 dits[1] = dits[0] + drcu[i];
290 dits[2] = dzb[i] / 2.;
291 zpos = dzl[i] + dits[2];
292 gMC->Gsposp("ICO2", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
293 gMC->Gsposp("ICO2", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
296 // CERAMICS (layer #3 and #4)
298 gMC->Gsvolu("ICER", "TUBE", idtmed[235], dits, 0);
299 for (i = 2; i < 4; ++i) {
300 dits[0] = rl[i] + drpcb[i] + drcu[i];
301 dits[1] = dits[0] + drcer[i];
302 dits[2] = dzb[i] / 2.;
303 zpos = dzl[i] + dits[2];
304 gMC->Gsposp("ICER", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
305 gMC->Gsposp("ICER", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
308 // SILICON (layer #3 and #4)
310 gMC->Gsvolu("ISI2", "TUBE", idtmed[226], dits, 0);
311 for (i = 2; i < 4; ++i) {
312 dits[0] = rl[i] + drpcb[i] + drcu[i] + drcer[i];
313 dits[1] = dits[0] + drsi[i];
314 dits[2] = dzb[i] / 2.;
315 zpos = dzl[i] + dits[2];
316 gMC->Gsposp("ISI2", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
317 gMC->Gsposp("ISI2", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
320 // PLASTIC (G10FR4) (layer #5 and #6)
322 gMC->Gsvolu("IPLA", "TUBE", idtmed[262], dits, 0);
323 for (i = 4; i < 6; ++i) {
325 dits[1] = dits[0] + drpla[i];
326 dits[2] = dzb[i] / 2.;
327 zpos = dzl[i] + dits[2];
328 gMC->Gsposp("IPLA", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
329 gMC->Gsposp("IPLA", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
332 // COPPER (layer #5 and #6)
334 gMC->Gsvolu("ICO3", "TUBE", idtmed[259], dits, 0);
335 for (i = 4; i < 6; ++i) {
336 dits[0] = rl[i] + drpla[i];
337 dits[1] = dits[0] + drcu[i];
338 dits[2] = dzb[i] / 2.;
339 zpos = dzl[i] + dits[2];
340 gMC->Gsposp("ICO3", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
341 gMC->Gsposp("ICO3", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
344 // EPOXY (layer #5 and #6)
346 gMC->Gsvolu("IEPX", "TUBE", idtmed[262], dits, 0);
347 for (i = 4; i < 6; ++i) {
348 dits[0] = rl[i] + drpla[i] + drcu[i];
349 dits[1] = dits[0] + drepx[i];
350 dits[2] = dzb[i] / 2.;
351 zpos = dzl[i] + dits[2];
352 gMC->Gsposp("IEPX", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
353 gMC->Gsposp("IEPX", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
356 // SILICON (layer #5 and #6)
358 gMC->Gsvolu("ISI3", "TUBE", idtmed[251], dits, 0);
359 for (i = 4; i < 6; ++i) {
360 dits[0] = rl[i] + drpla[i] + drcu[i] + drepx[i];
361 dits[1] = dits[0] + drsi[i];
362 dits[2] = dzb[i] / 2.;
363 zpos = dzl[i] + dits[2];
364 gMC->Gsposp("ISI3", i-1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
365 gMC->Gsposp("ISI3", i+1, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
370 gMC->Gsvolu("ISUP", "TUBE", idtmed[274], dits, 0);
371 for (i = 0; i < 6; ++i) {
373 if (i < 5) dits[1] = rl[i+1];
376 zpos = dzl[i] + dzb[i] + dits[2];
377 gMC->Gsposp("ISUP", i+1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
378 gMC->Gsposp("ISUP", i+7, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
381 // CABLES (HORIZONTAL)
383 gMC->Gsvolu("ICHO", "TUBE", idtmed[278], dits, 0);
384 for (i = 0; i < 6; ++i) {
386 dits[1] = dits[0] + drca;
387 dits[2] = (rzcone + TMath::Tan(acone) * (rl[i] - rl[0]) - (dzl[i]+ dzb[i] + drsu)) / 2.;
388 zpos = dzl[i - 1] + dzb[i] + drsu + dits[2];
389 gMC->Gsposp("ICHO", i+1, "ITSV", 0., 0., zpos, 0, "ONLY", dits, 3);
390 gMC->Gsposp("ICHO", i+7, "ITSV", 0., 0.,-zpos, 0, "ONLY", dits, 3);
392 // DEFINE A CONICAL GHOST VOLUME FOR THE PHI SEGMENTATION
399 pcits[6] = pcits[3] + TMath::Tan(acone) * (rlim - rl[0]);
400 pcits[7] = rlim - rl[0] + 3.5;
402 gMC->Gsvolu("ICMO", "PCON", idtmed[275], pcits, 9);
403 AliMatrix(idrotm[200], 90., 0., 90., 90., 180., 0.);
404 gMC->Gspos("ICMO", 1, "ITSV", 0., 0., 0., 0, "ONLY");
405 gMC->Gspos("ICMO", 2, "ITSV", 0., 0., 0., idrotm[200], "ONLY");
407 // DIVIDE INTO NSEC PHI-SECTIONS
409 gMC->Gsdvn("ICMD", "ICMO", nsec, 2);
410 gMC->Gsatt("ICMO", "SEEN", 0);
411 gMC->Gsatt("ICMD", "SEEN", 0);
416 gMC->Gsvolu("ICCO", "PCON", idtmed[278], pcits, 0);
417 for (i = 1; i < 6; ++i) {
418 pcits[0] = -dphi[i] / 2.;
421 dzco = TMath::Tan(acone) * (rl[i+1] - rl[i]);
423 dzco1 = zmax - (rzcone + TMath::Tan(acone) * (rl[5] - rl[0])) -2.;
424 dzco2 = (rlim - rl[5]) * TMath::Tan(acone);
425 if (rl[5] + dzco1 / TMath::Tan(acone) < rlim) {
431 pcits[3] = rzcone + TMath::Tan(acone) * (rl[i] - rl[0]);
432 pcits[4] = rl[i] - drcac[i] / TMath::Sin(acone);
434 pcits[6] = pcits[3] + dzco;
435 pcits[7] = rl[i] + dzco / TMath::Tan(acone) - drcac[i] / TMath::Sin(acone);
436 pcits[8] = rl[i] + dzco / TMath::Tan(acone);
438 gMC->Gsposp("ICCO", i, "ICMD", 0., 0., 0., 0, "ONLY", pcits, 9);
444 // CONICAL CABLES BELOW TPC
446 // DEFINE A CONICAL GHOST VOLUME FOR THE PHI SEGMENTATION
452 pcits[4] = pcits[5] - drca_tpc;
454 pcits[8] = pcits[4] + (pcits[6] - pcits[3]) * TMath::Tan(acable * kDegrad);
455 pcits[7] = pcits[8] - drca_tpc;
456 AliMatrix(idrotm[200], 90., 0., 90., 90., 180., 0.);
457 gMC->Gsvolu("ICCM", "PCON", idtmed[275], pcits, 9);
458 gMC->Gspos("ICCM", 1, "ALIC", 0., 0., 0., 0, "ONLY");
459 gMC->Gspos("ICCM", 2, "ALIC", 0., 0., 0., idrotm[200], "ONLY");
460 gMC->Gsdvn("ITMD", "ICCM", nsec, 2);
461 gMC->Gsatt("ITMD", "SEEN", 0);
462 gMC->Gsatt("ICCM", "SEEN", 0);
464 // NOW PLACE SEGMENTS WITH DECREASING PHI SEGMENTS INTO THE
468 gMC->Gsvolu("ITTT", "PCON", idtmed[278], pcits, 0);
471 dz = (xltpc - zend) / 9.;
472 for (i = 0; i < 9; ++i) {
473 zi = z0 + i*dz + dz / 2.;
474 ri = r0 + (zi - z0) * TMath::Tan(acable * kDegrad);
475 dphii = dphi[5] * r0 / ri;
476 pcits[0] = -dphii / 2.;
478 pcits[3] = zi - dz / 2.;
479 pcits[5] = r0 + (pcits[3] - z0) * TMath::Tan(acable * kDegrad);
480 pcits[4] = pcits[5] - drca_tpc;
481 pcits[6] = zi + dz / 2.;
482 pcits[8] = r0 + (pcits[6] - z0) * TMath::Tan(acable * kDegrad);
483 pcits[7] = pcits[8] - drca_tpc;
485 gMC->Gsposp("ITTT", i+1, "ITMD", 0., 0., 0., 0, "ONLY", pcits, 9);
488 // --- Outputs the geometry tree in the EUCLID/CAD format
491 gMC->WriteEuclid("ITSgeometry", "ITSV", 1, 5);
495 //_____________________________________________________________________________
496 void AliITSv1::CreateMaterials()
499 // Create the materials for ITS
501 AliITS::CreateMaterials();
504 //_____________________________________________________________________________
505 void AliITSv1::Init(){
507 // Initialise the ITS after it has been built
512 fIdName = new char*[fIdN];
513 fIdSens = new Int_t[fIdN];
514 for(i=0;i<fId1N;i++) {
515 l = strlen(fId1Name[i]);
516 fIdName[i] = new char[l+1];
517 for(j=0;j<l;j++) fIdName[i][j] = fId1Name[i][j];
518 fIdName[i][l] = '\0'; // Null terminate this string.
526 //_____________________________________________________________________________
527 void AliITSv1::DrawModule()
530 // Draw a shaded view of the FMD version 1
534 // Set everything unseen
535 gMC->Gsatt("*", "seen", -1);
537 // Set ALIC mother visible
538 gMC->Gsatt("ALIC","SEEN",0);
540 // Set the volumes visible
541 gMC->Gsatt("ITSV","SEEN",0);
542 gMC->Gsatt("ITS1","SEEN",1);
543 gMC->Gsatt("ITS2","SEEN",1);
544 gMC->Gsatt("ITS3","SEEN",1);
545 gMC->Gsatt("ITS4","SEEN",1);
546 gMC->Gsatt("ITS5","SEEN",1);
547 gMC->Gsatt("ITS6","SEEN",1);
549 gMC->Gsatt("IPCB","SEEN",1);
550 gMC->Gsatt("ICO2","SEEN",1);
551 gMC->Gsatt("ICER","SEEN",0);
552 gMC->Gsatt("ISI2","SEEN",0);
553 gMC->Gsatt("IPLA","SEEN",0);
554 gMC->Gsatt("ICO3","SEEN",0);
555 gMC->Gsatt("IEPX","SEEN",0);
556 gMC->Gsatt("ISI3","SEEN",1);
557 gMC->Gsatt("ISUP","SEEN",0);
558 gMC->Gsatt("ICHO","SEEN",0);
559 gMC->Gsatt("ICMO","SEEN",0);
560 gMC->Gsatt("ICMD","SEEN",0);
561 gMC->Gsatt("ICCO","SEEN",1);
562 gMC->Gsatt("ICCM","SEEN",0);
563 gMC->Gsatt("ITMD","SEEN",0);
564 gMC->Gsatt("ITTT","SEEN",1);
567 gMC->Gdopt("hide", "on");
568 gMC->Gdopt("shad", "on");
569 gMC->Gsatt("*", "fill", 7);
570 gMC->SetClipBox(".");
571 gMC->SetClipBox("*", 0, 300, -300, 300, -300, 300);
573 gMC->Gdraw("alic", 40, 30, 0, 11, 10, .07, .07);
574 gMC->Gdhead(1111, "Inner Tracking System Version 1");
575 gMC->Gdman(17, 6, "MAN");
578 //_____________________________________________________________________________
579 void AliITSv1::StepManager()
582 // Called at every step in the ITS
587 TLorentzVector position, momentum;
588 TClonesArray &lhits = *fHits;
592 if(gMC->IsTrackInside()) vol[3] += 1;
593 if(gMC->IsTrackEntering()) vol[3] += 2;
594 if(gMC->IsTrackExiting()) vol[3] += 4;
595 if(gMC->IsTrackOut()) vol[3] += 8;
596 if(gMC->IsTrackDisappeared()) vol[3] += 16;
597 if(gMC->IsTrackStop()) vol[3] += 32;
598 if(gMC->IsTrackAlive()) vol[3] += 64;
600 // Fill hit structure.
601 if(gMC->TrackCharge() && gMC->Edep()) {
603 // Only entering charged tracks
604 if((id=gMC->CurrentVolID(copy))==fIdSens[0]) {
606 id=gMC->CurrentVolOffID(1,copy);
608 id=gMC->CurrentVolOffID(2,copy);
610 } else if(id==fIdSens[1]) {
612 id=gMC->CurrentVolOffID(1,copy);
614 id=gMC->CurrentVolOffID(2,copy);
616 } else if(id==fIdSens[2]) {
619 id=gMC->CurrentVolOffID(1,copy);
621 } else if(id==fIdSens[3]) {
624 id=gMC->CurrentVolOffID(1,copy);
626 } else if(id==fIdSens[4]) {
629 id=gMC->CurrentVolOffID(1,copy);
631 } else if(id==fIdSens[5]) {
634 id=gMC->CurrentVolOffID(1,copy);
637 gMC->TrackPosition(position);
638 gMC->TrackMomentum(momentum);
646 hits[7]=gMC->TrackTime();
647 new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->CurrentTrack(),vol,hits);
651 //____________________________________________________________________________
652 void AliITSv1::Streamer(TBuffer &R__b)
654 // Stream an object of class AliITSv1.
656 if (R__b.IsReading()) {
657 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
658 AliITS::Streamer(R__b);
659 // This information does not need to be read. It is "hard wired"
660 // into this class via its creators.
662 //R__b.ReadArray(fId1Name);
664 R__b.WriteVersion(AliITSv1::IsA());
665 AliITS::Streamer(R__b);
666 // This information does not need to be saved. It is "hard wired"
667 // into this class via its creators.
669 //R__b.WriteArray(fId1Name, __COUNTER__);