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