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 2001/10/30 12:18:45 morsch
19 Place station 3 into DDIP only if DDIP is present.
21 Revision 1.19 2001/07/17 09:51:38 morsch
22 Place station 3 inside Dipole.
24 Revision 1.18 2001/04/06 11:24:43 morsch
25 Dependency on implementations of AliSegmentation and AliMUONResponse moved to AliMUONFactory class.
26 Static method Build() builds the MUON system out of chambers, segmentation and response.
28 Revision 1.17 2001/03/17 10:07:20 morsch
29 Correct inconsistent variable name / method name / comments.
31 Revision 1.16 2001/01/27 08:50:50 morsch
32 Call non default constructors of segmentation classes.
34 Revision 1.15 2001/01/17 20:57:45 hristov
35 Unused variable removed
37 Revision 1.14 2000/12/21 22:42:55 morsch
38 Constructor contains default set-up for segmentation.
39 Record charged particles only.
41 Revision 1.13 2000/10/06 10:03:38 morsch
42 Call to gMC->VolId() moved to Init()
44 Revision 1.12 2000/10/02 21:28:09 fca
45 Removal of useless dependecies via forward declarations
47 Revision 1.11 2000/06/27 07:31:07 morsch
48 fChambers = 0; deleted from constructor.
50 Revision 1.10 2000/06/26 14:02:38 morsch
51 Add class AliMUONConstants with MUON specific constants using static memeber data and access methods.
53 Revision 1.9 2000/06/15 07:58:49 morsch
54 Code from MUON-dev joined
56 Revision 1.8.4.9 2000/06/12 19:20:49 morsch
57 Constructor sets default geometry, segmentation and response parameters.
59 Revision 1.8.4.8 2000/06/09 21:55:28 morsch
60 Most coding rule violations corrected.
62 Revision 1.8.4.7 2000/05/02 13:15:18 morsch
63 Coding rule violations RS3, RN13 corected
65 Revision 1.8.4.6 2000/05/02 10:24:26 morsch
66 Public access to fdGas and fdAlu of AliMUONChamber replaced by getters.
68 Revision 1.8.4.5 2000/04/26 19:58:47 morsch
69 Obsolete reference to trig_ removed.
71 Revision 1.8.4.4 2000/04/19 19:42:47 morsch
74 Revision 1.8.4.3 2000/02/17 08:17:43 morsch
75 Gammas and neutrons are also scored in the stepmanager
78 /////////////////////////////////////////////////////////
79 // Manager and hits classes for set:MUON version 0 //
80 /////////////////////////////////////////////////////////
85 #include <TLorentzVector.h>
88 #include "AliMUONv0.h"
89 #include "AliMUONChamber.h"
93 #include "AliMUONHit.h"
94 #include "AliMUONPadHit.h"
95 #include "AliCallf77.h"
97 #include "AliMUONConstants.h"
98 #include "AliMUONFactory.h"
101 //___________________________________________
102 AliMUONv0::AliMUONv0() : AliMUON()
108 //___________________________________________
109 AliMUONv0::AliMUONv0(const char *name, const char *title)
110 : AliMUON(name,title)
113 AliMUONFactory::Build(this, "default");
116 void AliMUONv0::CreateGeometry()
118 // Creates coarse geometry for hit density simulations
119 Int_t *idtmed = fIdtmed->GetArray()-1099;
121 Float_t zpos, dAlu, tpar[3];
122 Int_t idAir=idtmed[1100];
123 Int_t idAlu=idtmed[1103];
125 AliMUONChamber *iChamber;
126 // Loop over all chambers (tracking and trigger)
127 for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++) {
131 iChamber=(AliMUONChamber*) (*fChambers)[ch];
134 dAlu=iChamber->DAlu();
135 if (ch < AliMUONConstants::NTrackingCh()) {
137 sprintf(alu,"SA0%1d",ch);
138 sprintf(gas,"SG0%1d",ch);
141 sprintf(alu,"SA%2d",ch);
142 sprintf(gas,"SG%2d",ch);
145 tpar[0] = iChamber->RInner();
146 tpar[1] = iChamber->ROuter();
147 tpar[2] = (dAlu+0.2)/2.;
148 if (ch !=4 && ch !=5) {
149 gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3);
151 gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
153 gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3);
155 gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
157 gMC->Gspos(gas, 1, alu, 0., 0., 0., 0, "ONLY");
158 if (ch == 4 || ch ==5) {
159 if (gMC->VolId("DDIP")) {
160 gMC->Gspos(alu, 1, "DDIP", 0., 0., zpos, 0, "ONLY");
162 gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY");
165 gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY");
170 //___________________________________________
171 void AliMUONv0::CreateMaterials()
173 // Creates materials for coarse geometry
174 AliMaterial(15, "AIR$ ", 14.61, 7.3, .001205, 30423.24, 67500);
175 AliMaterial( 9, "ALUMINIUM$", 26.98, 13. , 2.7, 8.9, 37.2);
177 Float_t epsil = .001; // Tracking precision,
178 Float_t stemax = -1.; // Maximum displacement for multiple scat
179 Float_t tmaxfd = -20.; // Maximum angle due to field deflection
180 Float_t deemax = -.3; // Maximum fractional energy loss, DLS
182 Int_t isxfld = gAlice->Field()->Integ();
183 Float_t sxmgmx = gAlice->Field()->Max();
187 AliMedium(1, "AIR_CH_US ", 15, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
188 AliMedium(4, "ALU_CH_US ", 9, 0, isxfld, sxmgmx, tmaxfd, fMaxStepAlu,
189 fMaxDestepAlu, epsil, stmin);
193 void AliMUONv0::Init()
196 // Initialize Tracking Chambers
199 printf("\n\n\n Start Init for version 0 - CPC chamber type\n\n\n");
200 for (Int_t i=0; i<AliMUONConstants::NCh(); i++) {
201 // Initialise chamber
202 ((AliMUONChamber*) (*fChambers)[i])->Init();
203 // Set sensitive volume Id
204 if (i < AliMUONConstants::NTrackingCh()) {
206 sprintf(vName,"SG0%1d",i);
209 sprintf(vName,"SG%2d",i);
211 ((AliMUONChamber*) (*fChambers)[i])->SetGid(gMC->VolId(vName));
215 void AliMUONv0::StepManager()
218 // Step manager for hit density simulations
228 static Float_t hits[15];
230 TClonesArray &lhits = *fHits;
232 // Only gas gap inside chamber
233 // Tag chambers and record hits when track enters
235 id=gMC->CurrentVolID(copy);
237 for (Int_t i=1; i<=AliMUONConstants::NCh(); i++) {
238 if(id==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()){
243 if (idvol == -1) return;
245 // Get current particle id (ipart), track position (pos) and momentum (mom)
246 gMC->TrackPosition(pos);
247 gMC->TrackMomentum(mom);
249 ipart = gMC->TrackPid();
251 // record hits when track enters ...
252 if( !(gMC->TrackCharge()) ) return;
253 if( gMC->IsTrackEntering()) {
254 // printf("\n Particle entering %f %f %f", pos[0], pos[1], pos[2] );
256 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
257 Double_t rt = TMath::Sqrt(tc);
258 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
259 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
260 hits[0] = Float_t(ipart); // Geant3 particle type
261 hits[1] = pos[0]; // X-position for hit
262 hits[2] = pos[1]; // Y-position for hit
263 hits[3] = pos[2]; // Z-position for hit
264 hits[4] = theta; // theta angle of incidence
265 hits[5] = phi; // phi angle of incidence
266 hits[8] = -1; // first padhit
267 hits[9] = -1; // last pad hit
268 hits[10] = mom[3]; // hit Energy
269 hits[11] = mom[0]; // Px
270 hits[12] = mom[1]; // Py
271 hits[13] = mom[2]; // Pz
272 hits[14] = gMC->TrackTime(); // time of flight
274 AliMUONHit(fIshunt,gAlice->CurrentTrack(),vol,hits);
277 // if( gMC->IsTrackExiting()) gMC->StopTrack();