]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONv0.cxx
All volume names start with "S".
[u/mrichter/AliRoot.git] / MUON / AliMUONv0.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /*
17 $Log$
18 Revision 1.20  2001/10/30 12:18:45  morsch
19 Place station 3 into DDIP only if DDIP is present.
20
21 Revision 1.19  2001/07/17 09:51:38  morsch
22 Place station 3 inside Dipole.
23
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.
27
28 Revision 1.17  2001/03/17 10:07:20  morsch
29 Correct inconsistent variable name / method name / comments.
30
31 Revision 1.16  2001/01/27 08:50:50  morsch
32 Call non default constructors of segmentation classes.
33
34 Revision 1.15  2001/01/17 20:57:45  hristov
35 Unused variable removed
36
37 Revision 1.14  2000/12/21 22:42:55  morsch
38 Constructor contains default set-up for segmentation.
39 Record charged particles only.
40
41 Revision 1.13  2000/10/06 10:03:38  morsch
42 Call to gMC->VolId() moved to Init()
43
44 Revision 1.12  2000/10/02 21:28:09  fca
45 Removal of useless dependecies via forward declarations
46
47 Revision 1.11  2000/06/27 07:31:07  morsch
48 fChambers = 0; deleted from constructor.
49
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.
52
53 Revision 1.9  2000/06/15 07:58:49  morsch
54 Code from MUON-dev joined
55
56 Revision 1.8.4.9  2000/06/12 19:20:49  morsch
57 Constructor sets default geometry, segmentation and response parameters.
58
59 Revision 1.8.4.8  2000/06/09 21:55:28  morsch
60 Most coding rule violations corrected.
61
62 Revision 1.8.4.7  2000/05/02 13:15:18  morsch
63 Coding rule violations RS3, RN13 corected
64
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.
67
68 Revision 1.8.4.5  2000/04/26 19:58:47  morsch
69 Obsolete reference to trig_ removed.
70
71 Revision 1.8.4.4  2000/04/19 19:42:47  morsch
72 change NCH to kNCH
73
74 Revision 1.8.4.3  2000/02/17 08:17:43  morsch
75 Gammas and neutrons are also scored in the stepmanager
76 */
77
78 /////////////////////////////////////////////////////////
79 //  Manager and hits classes for set:MUON version 0    //
80 /////////////////////////////////////////////////////////
81
82 #include <TTUBE.h>
83 #include <TNode.h> 
84 #include <TRandom.h> 
85 #include <TLorentzVector.h> 
86 #include <iostream.h>
87
88 #include "AliMUONv0.h"
89 #include "AliMUONChamber.h"
90 #include "AliRun.h"
91 #include "AliMC.h"
92 #include "AliMagF.h"
93 #include "AliMUONHit.h"
94 #include "AliMUONPadHit.h"
95 #include "AliCallf77.h"
96 #include "AliConst.h" 
97 #include "AliMUONConstants.h"
98 #include "AliMUONFactory.h"
99 ClassImp(AliMUONv0)
100  
101 //___________________________________________
102 AliMUONv0::AliMUONv0() : AliMUON()
103 {
104 // Constructor
105     fChambers = 0;
106 }
107  
108 //___________________________________________
109 AliMUONv0::AliMUONv0(const char *name, const char *title)
110        : AliMUON(name,title)
111 {
112 // Constructor
113     AliMUONFactory::Build(this, "default");
114 }
115
116 void AliMUONv0::CreateGeometry()
117 {
118 // Creates coarse geometry for hit density simulations
119     Int_t *idtmed = fIdtmed->GetArray()-1099;
120 //
121      Float_t zpos, dAlu, tpar[3];
122      Int_t idAir=idtmed[1100];
123      Int_t idAlu=idtmed[1103];     
124
125      AliMUONChamber *iChamber;
126      // Loop over all chambers (tracking and trigger)
127      for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++) {
128          char alu[8];
129          char gas[8];
130      
131          iChamber=(AliMUONChamber*) (*fChambers)[ch];
132          // Z of the chamber
133          zpos=iChamber->Z(); 
134          dAlu=iChamber->DAlu();
135          if (ch < AliMUONConstants::NTrackingCh()) {
136            // tracking chambers
137              sprintf(alu,"SA0%1d",ch);
138              sprintf(gas,"SG0%1d",ch);   
139          } else {
140            // trigger chambers
141              sprintf(alu,"SA%2d",ch);
142              sprintf(gas,"SG%2d",ch);    
143          }
144 //
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);
150              tpar[2] = 0.1;
151              gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
152          } else {
153              gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3);
154              tpar[2] = 0.1;
155              gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
156          }
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");
161              } else {
162                  gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY");
163              }
164          } else {
165              gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY");
166          }
167      }
168 }
169
170 //___________________________________________
171 void AliMUONv0::CreateMaterials()
172 {
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);
176
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 
181     Float_t stmin  = -.8;
182     Int_t isxfld   = gAlice->Field()->Integ();
183     Float_t sxmgmx = gAlice->Field()->Max();
184
185     //
186     //    Air 
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);
190
191 }
192
193 void AliMUONv0::Init()
194 {
195    // 
196    // Initialize Tracking Chambers
197    //
198     char vName[8];
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()) {
205             // tracking chambers
206             sprintf(vName,"SG0%1d",i);   
207         } else {
208             // trigger chambers
209             sprintf(vName,"SG%2d",i);    
210         }
211         ((AliMUONChamber*) (*fChambers)[i])->SetGid(gMC->VolId(vName));
212     }
213 }
214
215 void AliMUONv0::StepManager()
216 {
217 //
218 // Step manager for hit density simulations
219   Int_t          copy, id;
220   static Int_t   idvol;
221   static Int_t   vol[2];
222   Int_t          ipart;
223   TLorentzVector pos;
224   TLorentzVector mom;
225   Float_t        theta,phi;
226   
227   //  modifs perso
228   static Float_t hits[15];
229
230   TClonesArray &lhits = *fHits;
231   //
232   // Only gas gap inside chamber
233   // Tag chambers and record hits when track enters 
234   idvol=-1;
235   id=gMC->CurrentVolID(copy);
236   
237     for (Int_t i=1; i<=AliMUONConstants::NCh(); i++) {
238       if(id==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()){ 
239           vol[0]=i; 
240           idvol=i-1;
241       }
242     }
243     if (idvol == -1) return;
244   //
245   // Get current particle id (ipart), track position (pos)  and momentum (mom) 
246   gMC->TrackPosition(pos);
247   gMC->TrackMomentum(mom);
248
249   ipart  = gMC->TrackPid();
250   //
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] );
255       
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
273       new(lhits[fNhits++]) 
274           AliMUONHit(fIshunt,gAlice->CurrentTrack(),vol,hits);
275
276   }
277 //  if( gMC->IsTrackExiting()) gMC->StopTrack(); 
278 }
279
280
281
282
283
284
285
286
287