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