Dependency on implementations of AliSegmentation and AliMUONResponse moved to AliMUON...
[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.17  2001/03/17 10:07:20  morsch
19 Correct inconsistent variable name / method name / comments.
20
21 Revision 1.16  2001/01/27 08:50:50  morsch
22 Call non default constructors of segmentation classes.
23
24 Revision 1.15  2001/01/17 20:57:45  hristov
25 Unused variable removed
26
27 Revision 1.14  2000/12/21 22:42:55  morsch
28 Constructor contains default set-up for segmentation.
29 Record charged particles only.
30
31 Revision 1.13  2000/10/06 10:03:38  morsch
32 Call to gMC->VolId() moved to Init()
33
34 Revision 1.12  2000/10/02 21:28:09  fca
35 Removal of useless dependecies via forward declarations
36
37 Revision 1.11  2000/06/27 07:31:07  morsch
38 fChambers = 0; deleted from constructor.
39
40 Revision 1.10  2000/06/26 14:02:38  morsch
41 Add class AliMUONConstants with MUON specific constants using static memeber data and access methods.
42
43 Revision 1.9  2000/06/15 07:58:49  morsch
44 Code from MUON-dev joined
45
46 Revision 1.8.4.9  2000/06/12 19:20:49  morsch
47 Constructor sets default geometry, segmentation and response parameters.
48
49 Revision 1.8.4.8  2000/06/09 21:55:28  morsch
50 Most coding rule violations corrected.
51
52 Revision 1.8.4.7  2000/05/02 13:15:18  morsch
53 Coding rule violations RS3, RN13 corected
54
55 Revision 1.8.4.6  2000/05/02 10:24:26  morsch
56 Public access to fdGas and fdAlu of AliMUONChamber replaced by getters.
57
58 Revision 1.8.4.5  2000/04/26 19:58:47  morsch
59 Obsolete reference to trig_ removed.
60
61 Revision 1.8.4.4  2000/04/19 19:42:47  morsch
62 change NCH to kNCH
63
64 Revision 1.8.4.3  2000/02/17 08:17:43  morsch
65 Gammas and neutrons are also scored in the stepmanager
66 */
67
68 /////////////////////////////////////////////////////////
69 //  Manager and hits classes for set:MUON version 0    //
70 /////////////////////////////////////////////////////////
71
72 #include <TTUBE.h>
73 #include <TNode.h> 
74 #include <TRandom.h> 
75 #include <TLorentzVector.h> 
76 #include <iostream.h>
77
78 #include "AliMUONv0.h"
79 #include "AliMUONChamber.h"
80 #include "AliRun.h"
81 #include "AliMC.h"
82 #include "AliMagF.h"
83 #include "AliMUONHit.h"
84 #include "AliMUONPadHit.h"
85 #include "AliCallf77.h"
86 #include "AliConst.h" 
87 #include "AliMUONConstants.h"
88 #include "AliMUONFactory.h"
89 ClassImp(AliMUONv0)
90  
91 //___________________________________________
92 AliMUONv0::AliMUONv0() : AliMUON()
93 {
94 // Constructor
95     fChambers = 0;
96 }
97  
98 //___________________________________________
99 AliMUONv0::AliMUONv0(const char *name, const char *title)
100        : AliMUON(name,title)
101 {
102 // Constructor
103     AliMUONFactory::Build(this, "default");
104 }
105
106 void AliMUONv0::CreateGeometry()
107 {
108 // Creates coarse geometry for hit density simulations
109     Int_t *idtmed = fIdtmed->GetArray()-1099;
110 //
111      Float_t zpos, dAlu, tpar[3];
112      Int_t idAir=idtmed[1100];
113      Int_t idAlu=idtmed[1103];     
114
115      AliMUONChamber *iChamber;
116      // Loop over all chambers (tracking and trigger)
117      for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++) {
118          char alu[8];
119          char gas[8];
120      
121          iChamber=(AliMUONChamber*) (*fChambers)[ch];
122          // Z of the chamber
123          zpos=iChamber->Z(); 
124          dAlu=iChamber->DAlu();
125          if (ch < AliMUONConstants::NTrackingCh()) {
126            // tracking chambers
127              sprintf(alu,"CA0%1d",ch);
128              sprintf(gas,"CG0%1d",ch);   
129          } else {
130            // trigger chambers
131              sprintf(alu,"CA%2d",ch);
132              sprintf(gas,"CG%2d",ch);    
133          }
134 //
135          tpar[0] = iChamber->RInner(); 
136          tpar[1] = iChamber->ROuter();
137          tpar[2] = (dAlu+0.2)/2.;
138          if (ch !=4 && ch !=5) {
139              gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3);
140              tpar[2] = 0.1;
141              gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
142          } else {
143              gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3);
144              tpar[2] = 0.1;
145              gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3);
146          }
147          gMC->Gspos(gas, 1, alu,  0., 0., 0., 0, "ONLY");
148          gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY");
149      }
150 }
151
152 //___________________________________________
153 void AliMUONv0::CreateMaterials()
154 {
155 // Creates materials for coarse geometry
156     AliMaterial(15, "AIR$      ", 14.61, 7.3, .001205, 30423.24, 67500);
157     AliMaterial(9, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2);
158
159     Float_t epsil  = .001; // Tracking precision, 
160     Float_t stemax = -1.;  // Maximum displacement for multiple scat 
161     Float_t tmaxfd = -20.; // Maximum angle due to field deflection 
162     Float_t deemax = -.3;  // Maximum fractional energy loss, DLS 
163     Float_t stmin  = -.8;
164     Int_t isxfld   = gAlice->Field()->Integ();
165     Float_t sxmgmx = gAlice->Field()->Max();
166
167     //
168     //    Air 
169     AliMedium(1, "AIR_CH_US         ", 15, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
170     AliMedium(4, "ALU_CH_US          ", 9, 0, isxfld, sxmgmx, tmaxfd, fMaxStepAlu, 
171             fMaxDestepAlu, epsil, stmin);
172
173 }
174
175 void AliMUONv0::Init()
176 {
177    // 
178    // Initialize Tracking Chambers
179    //
180     char vName[8];
181     printf("\n\n\n Start Init for version 0 - CPC chamber type\n\n\n");
182     for (Int_t i=0; i<AliMUONConstants::NCh(); i++) {
183 // Initialise chamber
184         ((AliMUONChamber*) (*fChambers)[i])->Init();
185 // Set sensitive volume Id
186         if (i < AliMUONConstants::NTrackingCh()) {
187             // tracking chambers
188             sprintf(vName,"CG0%1d",i);   
189         } else {
190             // trigger chambers
191             sprintf(vName,"CG%2d",i);    
192         }
193         ((AliMUONChamber*) (*fChambers)[i])->SetGid(gMC->VolId(vName));
194     }
195 }
196
197 void AliMUONv0::StepManager()
198 {
199 //
200 // Step manager for hit density simulations
201   Int_t          copy, id;
202   static Int_t   idvol;
203   static Int_t   vol[2];
204   Int_t          ipart;
205   TLorentzVector pos;
206   TLorentzVector mom;
207   Float_t        theta,phi;
208   
209   //  modifs perso
210   static Float_t hits[15];
211
212   TClonesArray &lhits = *fHits;
213   //
214   // Only gas gap inside chamber
215   // Tag chambers and record hits when track enters 
216   idvol=-1;
217   id=gMC->CurrentVolID(copy);
218   
219     for (Int_t i=1; i<=AliMUONConstants::NCh(); i++) {
220       if(id==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()){ 
221           vol[0]=i; 
222           idvol=i-1;
223       }
224     }
225     if (idvol == -1) return;
226   //
227   // Get current particle id (ipart), track position (pos)  and momentum (mom) 
228   gMC->TrackPosition(pos);
229   gMC->TrackMomentum(mom);
230
231   ipart  = gMC->TrackPid();
232   //
233   // record hits when track enters ...
234   if( !(gMC->TrackCharge()) ) return; 
235   if( gMC->IsTrackEntering()) {
236       Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
237       Double_t rt = TMath::Sqrt(tc);
238       theta   = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
239       phi     = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
240       hits[0] = Float_t(ipart);             // Geant3 particle type
241       hits[1] = pos[0];                     // X-position for hit
242       hits[2] = pos[1];                     // Y-position for hit
243       hits[3] = pos[2];                     // Z-position for hit
244       hits[4] = theta;                      // theta angle of incidence
245       hits[5] = phi;                        // phi angle of incidence 
246       hits[8] = -1;                         // first padhit
247       hits[9] = -1;                         // last pad hit
248       hits[10] = mom[3];                    // hit Energy
249       hits[11] = mom[0];                    // Px
250       hits[12] = mom[1];                    // Py
251       hits[13] = mom[2];                    // Pz
252       hits[14] = gMC->TrackTime();          // time of flight
253       new(lhits[fNhits++]) 
254           AliMUONHit(fIshunt,gAlice->CurrentTrack(),vol,hits);
255
256   }
257 }
258
259
260
261
262
263
264
265
266