]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONv2.cxx
Improved response simulation for station 1.
[u/mrichter/AliRoot.git] / MUON / AliMUONv2.cxx
CommitLineData
ba030c0e 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*/
19
20// Authors: David Guez, Ivana Hrivnacova, Marion MacCormick; IPN Orsay
21//
22// Class AliMUONv2
23// ---------------
24// Inherits from AliMUONv1 but with a more detailed
25// geometrical description of station 1
26
27#include <algorithm>
28#include <vector>
29
30#include <string.h>
31
32#include <TVector2.h>
33#include <TClonesArray.h>
34#include <TLorentzVector.h>
35
36
37#include "AliMUONv2.h"
38#include "AliMUONConstants.h"
39#include "AliMUONHit.h"
40#include "AliRun.h"
41#include "AliMagF.h"
42#include "AliConst.h"
43
44#include <MReader.h>
45#include <MSector.h>
46#include <MRow.h>
47#include <MVRowSegment.h>
48#include <MVMotif.h>
49#include <MMotifMap.h>
50#include <MMotifPosition.h>
51#include <MMotifType.h>
52#include <MIntPair.h>
53
54
55#include <Riostream.h>
56
57ClassImp(AliMUONv2)
58
59
60
61const GReal_t AliMUONv2::fgkHzPadPlane=0.0148/2.; //Pad plane
62const GReal_t AliMUONv2::fgkHzFoam = 2.083/2.; // Foam of mechanicalplane
63const GReal_t AliMUONv2::fgkHzFR4 = 0.0031/2.; // FR4 of mechanical plane
64const GReal_t AliMUONv2::fgkHzSnPb = 0.0091/2.; //Pad/Kapton connection (66 pt)
65const GReal_t AliMUONv2::fgkHzKapton = 0.0122/2.; //Kapton
66const GReal_t AliMUONv2::fgkHzBergPlastic = 0.3062/2.; //Berg connector
67const GReal_t AliMUONv2::fgkHzBergCopper = 0.1882/2.; //Berg connector
68const GReal_t AliMUONv2::fgkHzDaughter = 0.0156/2.; //Daughter board
69const GReal_t AliMUONv2::fgkHzGas = 0.2/2.; //Gas
70const GReal_t AliMUONv2::fgkHxQuadrant = 94.69/2.; //Box surrounding quadrant
71const GReal_t AliMUONv2::fgkHyQuadrant = 100.31/2.; //Box surrounding quadrant
72const GReal_t AliMUONv2::fgkMotherIR = 18.3;
73const GReal_t AliMUONv2::fgkMotherOR = 104.974;
74const GReal_t AliMUONv2::fgkMotherThick = 6.5/2; //6.5cm between two quadrants
75const GReal_t AliMUONv2::fgkMotherPhiL = 0.;
76const GReal_t AliMUONv2::fgkMotherPhiU = 90.;
77
78
79const GReal_t AliMUONv2::fgkHxHole=1.5/2.;
80const GReal_t AliMUONv2::fgkHyHole=6./2.;
81const GReal_t AliMUONv2::fgkHxBergPlastic=0.74/2.;
82const GReal_t AliMUONv2::fgkHyBergPlastic=5.09/2.;
83const GReal_t AliMUONv2::fgkHxBergCopper=0.25/2.;
84const GReal_t AliMUONv2::fgkHyBergCopper=3.6/2.;
85const GReal_t AliMUONv2::fgkHxKapton=0.8/2.;
86const GReal_t AliMUONv2::fgkHyKapton=5.7/2.;
87const GReal_t AliMUONv2::fgkHxDaughter=2.3/2.;
88const GReal_t AliMUONv2::fgkHyDaughter=6.3/2.;
89const GReal_t AliMUONv2::fgkOffsetX=1.46;
90const GReal_t AliMUONv2::fgkOffsetY=0.71;
91const GReal_t AliMUONv2::fgkDeltaFilleEtamX=0.;
92const GReal_t AliMUONv2::fgkDeltaFilleEtamY=0.5;
93
94const char* AliMUONv2::fgkHoleName="MCHL";
95const char* AliMUONv2::fgkDaughterName="MCDB";
96const char AliMUONv2::fgkFoamLayerSuffix='F';
97const char* AliMUONv2::fgkQuadrantName="QUA";
98
99//___________________________________________
100AliMUONv2::AliMUONv2()
101 : AliMUONv1(),
102 fIdSens(0)
103{
104// Default Constructor
105//
106
107 // keep secondaries
108 SetIshunt(0);
109}
110
111//___________________________________________
112AliMUONv2::AliMUONv2(const char *name, const char *title)
113 : AliMUONv1(name,title),
114 fIdSens(0)
115{
116 // keep secondaries
117 SetIshunt(0);
118
119 // create hits array
120 fHits = new TClonesArray("AliMUONHit",1000);
121 gAlice->AddHitList(fHits);
122}
123
124//___________________________________________
125AliMUONv2::AliMUONv2(const AliMUONv2& rMUON)
126{
127// Dummy copy constructor
128}
129
130//___________________________________________
131AliMUONv2::~AliMUONv2()
132{
133// Destructor
134 if(fDebug) printf("%s: Calling AliMUONv2 destructor !!!\n",ClassName());
135
136 if (fHits) {
137 fHits->Delete();
138 delete fHits;
139 }
140}
141
142//___________________________________________
143void AliMUONv2::CreateGeometry()
144{
145// Create the GEANT geometry for the dimuon arm.
146// Use the parent's method for stations 2, 3, 4 and 5.
147// Use the detailed code for the first station.
148// --
149 cout << "AliMUONv2::CreateGeometry()" << endl;
150 cout << "_________________________________________" << endl;
151
152 // tracking medias
153 Int_t* idtmed = fIdtmed->GetArray()-1099;
154 Int_t idAir = idtmed[1100]; // medium 1
155
156
157
158 //create reflexion matrix
159 Int_t reflXZ,reflYZ,reflXY;
160 AliMatrix(reflXZ, 90., 180., 90., 90., 180., 0.);
161 AliMatrix(reflYZ, 90., 0., 90.,-90., 180., 0.);
162 AliMatrix(reflXY, 90., 180., 90., 270., 0., 0.);
163
164 CreateHole();
165 CreateDaughterBoard();
166
167 //build the quadrant
168 CreateQuadrant(1);
169 CreateQuadrant(2);
170 GReal_t par[5];
171 par[0] = fgkMotherIR;
172 par[1] = fgkMotherOR;
173 par[2] = fgkHzGas;
174 par[3] = fgkMotherPhiL;
175 par[4] = fgkMotherPhiU;
176
177 gMC->Gsvolu("S01G","TUBS",idAir,par,5);
178 gMC->Gspos("S01G",1,QuadrantName(1),0,0,0,0,"ONLY");
179 gMC->Gsvolu("S02G","TUBS",idAir,par,5);
180 gMC->Gspos("S02G",1,QuadrantName(2),0,0,0,0,"ONLY");
181
182 // place the four copies of it
183
184 //parameters
185 TVector3 pos[4];
186 Int_t rotm[4];
187
188 Double_t deltaZ = 6.5/2.;
189 pos[0]=TVector3(-2.6,-2.6,AliMUONConstants::DefaultChamberZ(0)+deltaZ);
190 rotm[0]=0;
191 pos[1]=TVector3(2.6,-2.6,AliMUONConstants::DefaultChamberZ(0)-deltaZ);
192 rotm[1]=reflXZ;
193 pos[2]=TVector3(2.6,2.6,AliMUONConstants::DefaultChamberZ(0)+deltaZ);
194 rotm[2]=reflXY;
195 pos[3]=TVector3(-2.6,2.6,AliMUONConstants::DefaultChamberZ(0)-deltaZ);
196 rotm[3]=reflYZ;
197
198 //placing
199 GReal_t posX,posY,posZ;
200 for (Int_t i=0;i<4;i++){
201 posX=pos[i].X();
202 posY=pos[i].Y();
203 // the 1st chamber
204 posZ=pos[i].Z();
205 gMC->Gspos(QuadrantName(1),i+1,"ALIC",posX,posY,posZ,rotm[i],"ONLY");
206 // the 2nd chamber
207 posZ=pos[i].Z()+AliMUONConstants::DefaultChamberZ(1)
208 -AliMUONConstants::DefaultChamberZ(0);
209 gMC->Gspos(QuadrantName(2),i+5,"ALIC",posX,posY,posZ,rotm[i],"ONLY");
210 }
211 static Int_t stations[5]={0,1,1,1,1};
212 fStations=stations;
213 AliMUONv1::CreateGeometry();
214}
215//___________________________________________
216void AliMUONv2::CreateQuadrant(Int_t chamber)
217{
218// create the quadrant (bending and non-bending planes)
219// for the given chamber
220// --
221 CreateFrame(chamber);
222
223 TSpecialMap specialMap;
224
225 TVector3 where;
226 specialMap[1001] = AliMUONSt1SpecialMotif(TVector2(0.1 ,0.84),90.);
227 specialMap[1002] = AliMUONSt1SpecialMotif(TVector2(0.5 ,0.76));
228 specialMap[1003] = AliMUONSt1SpecialMotif(TVector2(1.01,0.76));
229 MReader reader1(kBendingPlane);
230 MSector* sector1 = reader1.BuildSector();
231 where=TVector3(0.185+2.6,-0.52+2.6,totalHz()+fgkHzGas);
232 PlaceSector(sector1,specialMap,where,chamber);
233
234
235 specialMap.clear();
236 specialMap[4001] = AliMUONSt1SpecialMotif(TVector2(1.01,0.59),90.);
237 specialMap[4002] = AliMUONSt1SpecialMotif(TVector2(1.96, 0.17));
238 specialMap[4003] = AliMUONSt1SpecialMotif(TVector2(1.61,-1.18));
239 specialMap[4004] = AliMUONSt1SpecialMotif(TVector2(0.2 ,-0.08));
240 specialMap[4005] = AliMUONSt1SpecialMotif(TVector2(0.2 , 0.25));
241 specialMap[4006] = AliMUONSt1SpecialMotif(TVector2(0.28, 0.21));
242
243 MReader reader2(kNonBendingPlane);
244 MSector* sector2 = reader2.BuildSector();
245 where=TVector3(-0.13+2.6,-0.1775+2.6,-totalHz()-fgkHzGas);
246 PlaceSector(sector2,specialMap,where,chamber);
247}
248
249//___________________________________________
250void AliMUONv2::CreateMaterials()
251{
252// --- Define the various mixtures for GEANT ---
253
254 // Ar-CO2 gas (80%+20%)
255 Float_t ag1[2] = { 39.95,44.01};
256 Float_t zg1[2] = { 18.,22.};
257 Float_t dg1 = .001821;
258 Float_t wg1[2] = { .8,0.2};
259 // use wg1 weighting factors (6th arg > 0)
260 AliMixture(22, "ArCO2 80%$", ag1, zg1, dg1, 2, wg1);
261
262 // Ar-buthane-freon gas -- trigger chambers
263 Float_t atr1[4] = { 39.95,12.01,1.01,19. };
264 Float_t ztr1[4] = { 18.,6.,1.,9. };
265 Float_t wtr1[4] = { .56,.1262857,.2857143,.028 };
266 Float_t dtr1 = .002599;
267 AliMixture(23, "Ar-freon $", atr1, ztr1, dtr1, 4, wtr1);
268
269 // Rohacell 51 - imide methacrylique
270 Float_t aRohacell51[4] = {12.01,1.01,16.00,14.01};
271 Float_t zRohacell51[4] = {6.,1.,8.,7.};
272 Float_t dRohacell51 = 0.052;
273 Float_t wRohacell51[4] = {9.,13.,2.,1.};
274 // use relative A (molecular) values (6th arg < 0)
275 AliMixture(32, "FOAM$",aRohacell51,zRohacell51,dRohacell51,-4,wRohacell51);
276
277 Float_t aSnPb[2] = {118.69,207.19};
278 Float_t zSnPb[2] = {50,82};
279 Float_t dSnPb = 8.926;
280 Float_t wSnPb[2] = {0.6, 0.4} ;
281 // use wSnPb weighting factors (6th arg > 0)
282 AliMixture(35, "SnPb$", aSnPb,zSnPb,dSnPb,2,wSnPb);
283
284 // plastic definition from K5, Freiburg (found on web)
285 Float_t aPlastic[2]={1.01,12.01};
286 Float_t zPlastic[2]={1,6};
287 Float_t denPlastic=1.107;
288 Float_t wPlastic[2]={1,1};
289 // use relative A (molecular) values (6th arg < 0)...no other info...
290 AliMixture( 33, "Plastic$",aPlastic,zPlastic,denPlastic,-2,wPlastic);
291
292 // from CERN note NUFACT Note023, Oct.2000
293 // Inox/Stainless Steel (18%Cr, 9%Ni)
294 Float_t aInox[3] = {55.847,51.9961,58.6934};
295 Float_t zInox[3] = {26.,24.,28.};
296 Float_t denInox = 7.930;
297 Float_t wInox[3] = {0.73,0.18,0.09};
298 // use wInox weighting factors (6th arg > 0)
299 AliMixture(37, "StainlessSteel$",aInox,zInox,denInox,3,wInox);
300
301 // bakelite
302 Float_t abak[3] = {12.01 , 1.01 , 16.};
303 Float_t zbak[3] = {6. , 1. , 8.};
304 Float_t wbak[3] = {6. , 6. , 1.};
305 Float_t dbak = 1.4;
306 AliMixture(19, "Bakelite$", abak, zbak, dbak, -3, wbak);
307
308 // Ar-Isobutane gas (80%+20%)
309 Float_t ag[3] = { 39.95,12.01,1.01 };
310 Float_t zg[3] = { 18.,6.,1. };
311 Float_t wg[3] = { .8,.057,.143 };
312 Float_t dg = .0019596;
313 AliMixture(20, "ArC4H10 GAS$", ag, zg, dg, 3, wg);
314
315 // Ar-Isobutane-Forane-SF6 gas (49%+7%+40%+4%) -- trigger
316 Float_t atrig[5] = { 39.95,12.01,1.01,19.,32.066 };
317 Float_t ztrig[5] = { 18.,6.,1.,9.,16. };
318 Float_t wtrig[5] = { .49,1.08,1.5,1.84,0.04 };
319 Float_t dtrig = .0031463;
320 AliMixture(21, "TRIG GAS$", atrig, ztrig, dtrig, -5, wtrig);
321
322 // Ar-CO2 gas
323 Float_t agas[3] = { 39.95,12.01,16. };
324 Float_t zgas[3] = { 18.,6.,8. };
325 Float_t wgas[3] = { .74,.086684,.173316 };
326 Float_t dgas = .0018327;
327 AliMixture(24, "ArCO2 GAS$", agas, zgas, dgas, 3, wgas);
328
329// --- Define the various AliMaterials for GEANT ---
330 // from PDG and "The Particle Detector BriefBook", Bock and Vasilescu, P.18
331 AliMaterial( 9, "Aluminium$", 26.98, 13., 2.7, -8.9, 26.1);
332 AliMaterial(10, "Aluminium$", 26.98, 13., 2.7, -8.9, 26.1);
333 AliMaterial(15, "air$", 14.61, 7.3, .001205, -30423.24, 67500);
334 AliMaterial(30, "Copper$", 63.546,29.,8.96,-1.43,9.6);
335 AliMaterial(31, "FR4$", 17.749, 8.875, 1.7, -19.4, 999.); // from DPG
336 AliMaterial(34, "Kapton$", 12.01,6,1.42,-28.6,999); // from DPG
337 // Density of FrameEpoxy only from manufacturer's specifications
338 // Frame composite epoxy , X0 in g/cm**2 (guestimation!)
339 AliMaterial(36, "FrameEpoxy",12.24,6.0,1.85,-19.14,999);
340
341// --- Define the tracking medias (AliMediums) for GEANT ---
342 GReal_t epsil = .001; // Tracking precision,
343 GReal_t stemax = -1.; // Maximum displacement for multiple scat
344 GReal_t tmaxfd = -20.; // Maximum angle due to field deflection
345 GReal_t deemax = -.3; // Maximum fractional energy loss, DLS
346 GReal_t stmin = -.8;
347 GReal_t maxStepAlu = 0.001; // from AliMUON.cxx
348 GReal_t maxDestepAlu = -1.; // from AliMUON.cxx
349 GReal_t maxStepGas=0.01; // from AliMUON.cxx
350
351 Int_t iSXFLD = gAlice->Field()->Integ();
352 Float_t sXMGMX = gAlice->Field()->Max();
353
354 AliMedium(1, "AIR_CH_US$", 15, 1, iSXFLD, sXMGMX, tmaxfd,
355 stemax, deemax, epsil, stmin);
356 AliMedium(4, "ALU_CH_US$", 9, 0, iSXFLD, sXMGMX, tmaxfd,
357 maxStepAlu, maxDestepAlu, epsil, stmin);
358 AliMedium(5, "ALU_CH_US$", 10, 0, iSXFLD, sXMGMX, tmaxfd,
359 maxStepAlu,maxDestepAlu, epsil, stmin);
360 AliMedium(6, "AR_CH_US ", 20, 1, iSXFLD, sXMGMX,
361 tmaxfd, fMaxStepGas,fMaxDestepGas, epsil, stmin);
362
363 // Ar-Isobuthane-Forane-SF6 gas
364 AliMedium(7, "GAS_CH_TRIGGER ", 21, 1, iSXFLD, sXMGMX,
365 tmaxfd, stemax, deemax, epsil, stmin);
366 AliMedium(8, "BAKE_CH_TRIGGER ", 19, 0, iSXFLD, sXMGMX,
367 tmaxfd, fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
368
369 AliMedium(9, "ARG_CO2$", 22, 1, iSXFLD, sXMGMX, tmaxfd, maxStepGas,
370 maxDestepAlu, epsil, stmin);
371 AliMedium(10, "COPPER_CH$", 30, 0, iSXFLD, sXMGMX, tmaxfd,
372 maxStepAlu, maxDestepAlu, epsil, stmin);
373 AliMedium(11, "PCB_COPPER ", 31, 0, iSXFLD, sXMGMX, tmaxfd,
374 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
375 AliMedium(12, "VETRONITE ", 32, 0, iSXFLD, sXMGMX, tmaxfd,
376 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
377 AliMedium(13, "CARBON ", 33, 0, iSXFLD, sXMGMX, tmaxfd,
378 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
379 AliMedium(14, "Rohacell ", 34, 0, iSXFLD, sXMGMX, tmaxfd,
380 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
381 AliMedium(15, "FR4_CH$", 31, 0,iSXFLD, sXMGMX, 10., .01,.1, .003, .003);
382 AliMedium(16, "FOAM_CH$", 32, 0,
383 iSXFLD, sXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
384 AliMedium(17, "Plastic$", 33, 0,iSXFLD, sXMGMX, 10., .01, 1., .003, .003);
385 AliMedium(18, "Kapton$", 34, 0,iSXFLD, sXMGMX, 10., .01, 1., .003, .003);
386 AliMedium(19, "SnPb$", 35, 0,iSXFLD, sXMGMX, 10., .01, 1., .003, .003);
387 AliMedium(20, "FrameCH$", 36, 1,iSXFLD, sXMGMX, 10., .001, 0.001, .001, .001);
388 AliMedium(21, "InoxBolts$", 37,1,iSXFLD, sXMGMX, 10., .01, 1., .003, .003);
389}
390
391void AliMUONv2::CreateFrame(Int_t chamber)
392{
393// Create the non-sensitive elements of the frame for the <chamber>
394
395
396// Matrices
397 Int_t idrotm[1199];
398// To Be Checked....
399// Rotation matrices in the x-y plane
400// phi = -45 deg
401 AliMatrix(idrotm[1101], 90., 315., 90., 45., 0., 0.);
402// phi = -90 deg
403 AliMatrix(idrotm[1102], 90., 90., 90., 180., 0., 0.);
404// theta = +90 deg
405 AliMatrix(idrotm[1103], 180., 0., 90., 90.,90., 0.);
406
407// phi = +45 deg
408 AliMatrix(idrotm[1104], 90., 45., 90., 135., 0., 0.);
409