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.20.6.2 2002/07/24 10:07:21 alibrary
21 Revision 1.21 2002/07/23 10:02:46 morsch
22 All volume names start with "S".
24 Revision 1.20 2001/10/30 12:18:45 morsch
25 Place station 3 into DDIP only if DDIP is present.
27 Revision 1.19 2001/07/17 09:51:38 morsch
28 Place station 3 inside Dipole.
30 Revision 1.18 2001/04/06 11:24:43 morsch
31 Dependency on implementations of AliSegmentation and AliMUONResponse moved to AliMUONFactory class.
32 Static method Build() builds the MUON system out of chambers, segmentation and response.
34 Revision 1.17 2001/03/17 10:07:20 morsch
35 Correct inconsistent variable name / method name / comments.
37 Revision 1.16 2001/01/27 08:50:50 morsch
38 Call non default constructors of segmentation classes.
40 Revision 1.15 2001/01/17 20:57:45 hristov
41 Unused variable removed
43 Revision 1.14 2000/12/21 22:42:55 morsch
44 Constructor contains default set-up for segmentation.
45 Record charged particles only.
47 Revision 1.13 2000/10/06 10:03:38 morsch
48 Call to gMC->VolId() moved to Init()
50 Revision 1.12 2000/10/02 21:28:09 fca
51 Removal of useless dependecies via forward declarations
53 Revision 1.11 2000/06/27 07:31:07 morsch
54 fChambers = 0; deleted from constructor.
56 Revision 1.10 2000/06/26 14:02:38 morsch
57 Add class AliMUONConstants with MUON specific constants using static memeber data and access methods.
59 Revision 1.9 2000/06/15 07:58:49 morsch
60 Code from MUON-dev joined
62 Revision 1.8.4.9 2000/06/12 19:20:49 morsch
63 Constructor sets default geometry, segmentation and response parameters.
65 Revision 1.8.4.8 2000/06/09 21:55:28 morsch
66 Most coding rule violations corrected.
68 Revision 1.8.4.7 2000/05/02 13:15:18 morsch
69 Coding rule violations RS3, RN13 corected
71 Revision 1.8.4.6 2000/05/02 10:24:26 morsch
72 Public access to fdGas and fdAlu of AliMUONChamber replaced by getters.
74 Revision 1.8.4.5 2000/04/26 19:58:47 morsch
75 Obsolete reference to trig_ removed.
77 Revision 1.8.4.4 2000/04/19 19:42:47 morsch
80 Revision 1.8.4.3 2000/02/17 08:17:43 morsch
81 Gammas and neutrons are also scored in the stepmanager
84 /////////////////////////////////////////////////////////
85 // Manager and hits classes for set:MUON version 0 //
86 /////////////////////////////////////////////////////////
91 #include <TLorentzVector.h>
94 #include "AliMUONv0.h"
95 #include "AliMUONChamber.h"
99 #include "AliMUONHit.h"
100 #include "AliMUONPadHit.h"
101 #include "AliCallf77.h"
102 #include "AliConst.h"
103 #include "AliMUONConstants.h"
104 #include "AliMUONFactory.h"
107 //___________________________________________
108 AliMUONv0::AliMUONv0() : AliMUON()
114 //___________________________________________
115 AliMUONv0::AliMUONv0(const char *name, const char *title)
116 : AliMUON(name,title)
119 AliMUONFactory::Build(this, "default");
122 void AliMUONv0::CreateGeometry()
124 // Creates coarse geometry for hit density simulations
125 Int_t *idtmed = fIdtmed->GetArray()-1099;
127 Float_t zpos, dAlu, tpar[3];
128 Int_t idAir=idtmed[1100];
129 Int_t idAlu=idtmed[1103];
131 AliMUONChamber *iChamber;
132 // Loop over all chambers (tracking and trigger)
133 for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++) {
137 iChamber=(AliMUONChamber*) (*fChambers)[ch];
140 dAlu=iChamber->DAlu();
141 if (ch < AliMUONConstants::NTrackingCh()) {
143 sprintf(alu,"SA0%1d",ch);
144 sprintf(gas,"SG0%1d",ch);
147 sprintf(alu,"SA%2d",ch);
148 sprintf(gas,"SG%2d",ch);
151 tpar[0] = iChamber->RInner();
152 tpar[1] = iChamber->ROuter();
153 tpar[2] = (dAlu+0.2)/2.;
154 if (ch !=4 && ch !=5) {
155 gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3);
157 gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
159 gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3);
161 gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
163 gMC->Gspos(gas, 1, alu, 0., 0., 0., 0, "ONLY");
164 if (ch == 4 || ch ==5) {
165 if (gMC->VolId("DDIP")) {
166 gMC->Gspos(alu, 1, "DDIP", 0., 0., zpos, 0, "ONLY");
168 gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY");
171 gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY");
176 //___________________________________________
177 void AliMUONv0::CreateMaterials()
179 // Creates materials for coarse geometry
180 AliMaterial(15, "AIR$ ", 14.61, 7.3, .001205, 30423.24, 67500);
181 AliMaterial( 9, "ALUMINIUM$", 26.98, 13. , 2.7, 8.9, 37.2);
183 Float_t epsil = .001; // Tracking precision,
184 Float_t stemax = -1.; // Maximum displacement for multiple scat
185 Float_t tmaxfd = -20.; // Maximum angle due to field deflection
186 Float_t deemax = -.3; // Maximum fractional energy loss, DLS
188 Int_t isxfld = gAlice->Field()->Integ();
189 Float_t sxmgmx = gAlice->Field()->Max();
193 AliMedium(1, "AIR_CH_US ", 15, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
194 AliMedium(4, "ALU_CH_US ", 9, 0, isxfld, sxmgmx, tmaxfd, fMaxStepAlu,
195 fMaxDestepAlu, epsil, stmin);
199 void AliMUONv0::Init()
202 // Initialize Tracking Chambers
205 printf("\n\n\n Start Init for version 0 - CPC chamber type\n\n\n");
206 for (Int_t i=0; i<AliMUONConstants::NCh(); i++) {
207 // Initialise chamber
208 ((AliMUONChamber*) (*fChambers)[i])->Init();
209 // Set sensitive volume Id
210 if (i < AliMUONConstants::NTrackingCh()) {
212 sprintf(vName,"SG0%1d",i);
215 sprintf(vName,"SG%2d",i);
217 ((AliMUONChamber*) (*fChambers)[i])->SetGid(gMC->VolId(vName));
221 void AliMUONv0::StepManager()
224 // Step manager for hit density simulations
234 static Float_t hits[15];
236 TClonesArray &lhits = *fHits;
238 // Only gas gap inside chamber
239 // Tag chambers and record hits when track enters
241 id=gMC->CurrentVolID(copy);
243 for (Int_t i=1; i<=AliMUONConstants::NCh(); i++) {
244 if(id==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()){
249 if (idvol == -1) return;
251 // Get current particle id (ipart), track position (pos) and momentum (mom)
252 gMC->TrackPosition(pos);
253 gMC->TrackMomentum(mom);
255 ipart = gMC->TrackPid();
257 // record hits when track enters ...
258 if( !(gMC->TrackCharge()) ) return;
259 if( gMC->IsTrackEntering()) {
260 // printf("\n Particle entering %f %f %f", pos[0], pos[1], pos[2] );
262 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
263 Double_t rt = TMath::Sqrt(tc);
264 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
265 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
266 hits[0] = Float_t(ipart); // Geant3 particle type
267 hits[1] = pos[0]; // X-position for hit
268 hits[2] = pos[1]; // Y-position for hit
269 hits[3] = pos[2]; // Z-position for hit
270 hits[4] = theta; // theta angle of incidence
271 hits[5] = phi; // phi angle of incidence
272 hits[8] = -1; // first padhit
273 hits[9] = -1; // last pad hit
274 hits[10] = mom[3]; // hit Energy
275 hits[11] = mom[0]; // Px
276 hits[12] = mom[1]; // Py
277 hits[13] = mom[2]; // Pz
278 hits[14] = gMC->TrackTime(); // time of flight
280 AliMUONHit(fIshunt,gAlice->CurrentTrack(),vol,hits);
283 // if( gMC->IsTrackExiting()) gMC->StopTrack();