]>
Commit | Line | Data |
---|---|---|
b86e74f5 | 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 | /* $Id$ */ | |
17 | ||
18 | /////////////////////////////////////////////////////////////////////////////// | |
19 | // // | |
20 | // ALICE Cosmic Ray Trigger // | |
21 | // // | |
22 | // This class contains the functions for version 0 of the ALICE Cosmic Ray // | |
23 | // Trigger. This version will be used to simulation comic rays in alice // | |
24 | // with all the detectors. // | |
25 | // | |
26 | // Authors: | |
27 | // | |
28 | // Arturo Fernandez <afernand@fcfm.buap.mx> | |
29 | // Enrique Gamez <egamez@fcfm.buap.mx> | |
30 | // | |
31 | // Universidad Autonoma de Puebla | |
32 | // | |
33 | // | |
34 | //Begin_Html | |
35 | /* | |
36 | <img src="picts/AliACORDEv0Class.gif"> | |
37 | </pre> | |
38 | <br clear=left> | |
39 | <p>The responsible person for this module is | |
40 | <a href="mailto:egamez@fcfm.buap.mx">Enrique Gamez</a>. | |
41 | </font> | |
42 | <pre> | |
43 | */ | |
44 | //End_Html | |
45 | // // | |
46 | /////////////////////////////////////////////////////////////////////////////// | |
47 | ||
48 | #include "AliACORDEv0.h" | |
49 | ||
50 | #include <TGeometry.h> | |
51 | #include <TBRIK.h> | |
52 | #include <TNode.h> | |
53 | #include <TVirtualMC.h> | |
54 | ||
55 | #include "AliRun.h" | |
56 | #include "AliConst.h" | |
57 | ||
58 | #include "AliACORDEConstants.h" | |
59 | #include "AliACORDEModule.h" | |
60 | ||
61 | ClassImp(AliACORDEv0) | |
62 | ||
63 | //_____________________________________________________________________________ | |
64 | AliACORDEv0::AliACORDEv0() | |
65 | : AliACORDE() | |
66 | { | |
67 | // | |
68 | // Default constructor | |
69 | // | |
70 | } | |
71 | ||
72 | //_____________________________________________________________________________ | |
73 | AliACORDEv0::AliACORDEv0(const char *name, const char *title) | |
74 | : AliACORDE(name, title) | |
75 | { | |
76 | // | |
77 | // Standard constructor | |
78 | // | |
79 | //Begin_Html | |
80 | /* | |
81 | <img src="picts/AliACORDEv0.gif"> | |
82 | */ | |
83 | //End_Html | |
84 | //PH SetMarkerColor(kRed); | |
85 | //PH SetMarkerStyle(kRed); | |
86 | //PH SetMarkerSize(0.4); | |
87 | } | |
88 | ||
89 | //_____________________________________________________________________________ | |
90 | AliACORDEv0::~AliACORDEv0() | |
91 | { | |
92 | // | |
93 | // Default destructor | |
94 | // | |
95 | } | |
96 | ||
97 | //_____________________________________________________________________________ | |
98 | void AliACORDEv0::BuildGeometry() | |
99 | { | |
100 | // | |
101 | // Create the ROOT TNode geometry for the ACORDE | |
102 | // | |
103 | ||
104 | TNode *node, *top; | |
105 | ||
106 | const Int_t kColorACORDE = kRed; | |
107 | ||
108 | // Find the top node alice. | |
109 | top = gAlice->GetGeometry()->GetNode("alice"); | |
110 | ||
111 | AliACORDEConstants* crtConstants = AliACORDEConstants::Instance(); | |
112 | ||
113 | new TBRIK("S_ACORDE_A", "ACORDE box", "void", | |
114 | crtConstants->ActiveAreaLenght()/2., | |
115 | crtConstants->ActiveAreaHeight()/2., | |
116 | crtConstants->ActiveAreaWidth()/2.); | |
117 | ||
118 | ||
119 | new TRotMatrix("Left", "Left", 90., 315., 90., 45., 0., 337.5); | |
120 | new TRotMatrix("Right", "Right", 90., 45., 90., 315., 180., 202.5); | |
121 | new TRotMatrix("Up", "Up", 90., 0., 90., 90., 0., 90.); | |
122 | top->cd(); | |
123 | ||
124 | // | |
125 | // Put 4 modules on the top of the magnet | |
126 | Float_t box = crtConstants->CageWidth()/2.; | |
127 | top->cd(); | |
128 | node = new TNode("upper1", "upper1", "S_ACORDE_A", 0., 790., 3.*box, "Up"); | |
129 | node->SetLineColor(kColorACORDE); | |
130 | fNodes->Add(node); | |
131 | ||
132 | top->cd(); | |
133 | node = new TNode("upper2", "upper2", "S_ACORDE_A", 0., 790., box, "Up"); | |
134 | node->SetLineColor(kColorACORDE); | |
135 | fNodes->Add(node); | |
136 | ||
137 | top->cd(); | |
138 | node = new TNode("upper3", "upper3", "S_ACORDE_A", 0., 790., -1.*box, "Up"); | |
139 | node->SetLineColor(kColorACORDE); | |
140 | fNodes->Add(node); | |
141 | ||
142 | top->cd(); | |
143 | node = new TNode("upper4", "upper4", "S_ACORDE_A", 0., 790., -3.*box, "Up"); | |
144 | node->SetLineColor(kColorACORDE); | |
145 | fNodes->Add(node); | |
146 | ||
147 | ||
148 | // Modules on the left side. | |
149 | Float_t xtragap = 10.; | |
150 | Float_t initXside = (790.+xtragap)*TMath::Sin(2*22.5*kDegrad); //rigth side | |
151 | Float_t initYside = (790.+xtragap)*TMath::Cos(2*22.5*kDegrad); | |
152 | top->cd(); | |
153 | node = new TNode("upper5", "upper5", "S_ACORDE_A", initXside, initYside, 3.*box, "Left"); | |
154 | node->SetLineColor(kColorACORDE); | |
155 | fNodes->Add(node); | |
156 | ||
157 | top->cd(); | |
158 | node = new TNode("upper6", "upper6", "S_ACORDE_A", initXside, initYside, box, "Left"); | |
159 | node->SetLineColor(kColorACORDE); | |
160 | fNodes->Add(node); | |
161 | ||
162 | top->cd(); | |
163 | node = new TNode("upper7", "upper7", "S_ACORDE_A", initXside, initYside, -1.*box, "Left"); | |
164 | node->SetLineColor(kColorACORDE); | |
165 | fNodes->Add(node); | |
166 | ||
167 | top->cd(); | |
168 | node = new TNode("upper8", "upper8", "S_ACORDE_A", initXside, initYside, -3.*box, "Left"); | |
169 | node->SetLineColor(kColorACORDE); | |
170 | fNodes->Add(node); | |
171 | ||
172 | ||
173 | // Modules on the right side. | |
174 | top->cd(); | |
175 | node = new TNode("upper9", "upper9", "S_ACORDE_A", -initXside, initYside, 3.*box, "Right"); | |
176 | node->SetLineColor(kColorACORDE); | |
177 | fNodes->Add(node); | |
178 | ||
179 | top->cd(); | |
180 | node = new TNode("upper10", "upper10", "S_ACORDE_A", -initXside, initYside, box, "Right"); | |
181 | node->SetLineColor(kColorACORDE); | |
182 | fNodes->Add(node); | |
183 | ||
184 | top->cd(); | |
185 | node = new TNode("upper11","upper11", "S_ACORDE_A", -initXside, initYside, -1.*box, "Right"); | |
186 | node->SetLineColor(kColorACORDE); | |
187 | fNodes->Add(node); | |
188 | ||
189 | top->cd(); | |
190 | node = new TNode("upper12","upper12", "S_ACORDE_A", -initXside, initYside, -3.*box, "Right"); | |
191 | node->SetLineColor(kColorACORDE); | |
192 | fNodes->Add(node); | |
193 | ||
194 | } | |
195 | ||
196 | //_____________________________________________________________________________ | |
197 | void AliACORDEv0::CreateGeometry() | |
198 | { | |
199 | // | |
200 | // Create geometry for the ACORDE array | |
201 | // | |
202 | ||
203 | Int_t idrotm[2499]; // The rotation matrix. | |
204 | Int_t* idtmed = fIdtmed->GetArray() - 1099; | |
205 | AliACORDEConstants* crtConstants = AliACORDEConstants::Instance(); | |
206 | ||
207 | // Create the mother volume. | |
208 | // This volume can be seen as the volume which ACORDE will ocupate | |
209 | // above the upper face of the L3 magnet. Inside this volume the detectors | |
210 | // aboce the magnet will be, then there will be two copies of this volume, | |
211 | // one for each side. | |
212 | Float_t box[3]; | |
213 | //box[0] = 2*crtConstants->MagMinRadius()*TMath::Sin(kDegrad*22.5); | |
214 | box[0] = crtConstants->MagMinRadius()*TMath::Sin(kDegrad*22.5); | |
215 | box[1] = crtConstants->MagMaxRadius() - crtConstants->MagMinRadius(); | |
216 | box[2] = crtConstants->MagnetLenght()/2; | |
217 | gMC->Gsvolu("ACORDE1", "BOX", idtmed[1112], box, 3); | |
218 | ||
219 | // Check if the AliACORDEModule instance have been set, otherwise | |
220 | // use the default values | |
221 | if ( !fModule ) { | |
222 | Info("CreateGeometry", "Using default dimensions"); | |
223 | fModule = new AliACORDEModule("ACORDEmod", "Default module dimensions"); | |
224 | } | |
225 | ||
226 | // The full module volume. | |
227 | // This volume will be ocupied by all the material of the module | |
228 | // the scintillators, the aluminium frame, etc. | |
229 | box[0] = fModule->FrameLength()/2; | |
230 | box[1] = fModule->FrameThickness()/2; | |
231 | box[2] = fModule->FrameWidth()/2; | |
232 | gMC->Gsvolu("ACORDE2", "BOX", idtmed[1114], box, 3); | |
233 | ||
234 | // The scintillators | |
235 | box[0] = crtConstants->SinglePaletteLenght()/4; | |
236 | box[1] = crtConstants->SinglePaletteHeight(); | |
237 | box[2] = crtConstants->SinglePaletteWidth()/2; | |
238 | gMC->Gsvolu("ACORDE3", "BOX", idtmed[1112], box, 3); | |
239 | gMC->Gspos("ACORDE3", 1, "ACORDE2", 0, 2, 0, 0, "ONLY"); | |
240 | ||
241 | // The metallic frame | |
242 | box[0] = fModule->FrameLength()/2; | |
243 | box[1] = fModule->FrameThickness()/2; | |
244 | box[2] = 2; | |
245 | gMC->Gsvolu("ACORDE4", "BOX", idtmed[1108], box, 3); | |
246 | gMC->Gspos("ACORDE4", 1, "ACORDE2", 0, 0, 13 - box[2], 0, "MANY"); | |
247 | gMC->Gspos("ACORDE4", 2, "ACORDE2", 0, 0, -13 + box[2], 0, "MANY"); | |
248 | ||
249 | box[0] = 2; | |
250 | box[1] = fModule->FrameThickness()/2; | |
251 | box[2] = fModule->FrameWidth()/2; | |
252 | gMC->Gsvolu("ACORDE5", "BOX", idtmed[1108], box, 3); | |
253 | gMC->Gspos("ACORDE5", 1, "ACORDE2", 140 - box[0], 0, 0, 0, "MANY"); | |
254 | gMC->Gspos("ACORDE5", 2, "ACORDE2", -140 + box[0], 0, 0, 0, "MANY"); | |
255 | ||
256 | // The support bars | |
257 | box[0] = 2; | |
258 | box[1] = fModule->FrameThickness()/2; | |
259 | box[2] = 500; | |
260 | gMC->Gsvolu("ACORDE6", "BOX", idtmed[1108], box, 3); | |
261 | ||
262 | // Now put into the volume CR11 all the above volumes. | |
263 | // 20 scintillation modules | |
264 | // 4 support bars | |
265 | Int_t copyNumber = 0; | |
266 | for ( Int_t k = 0; k < fModule->NumberOfRows(); k++ ) { | |
267 | Float_t zCoordinate = k*fModule->ZGap() - 450; | |
268 | gMC->Gspos("ACORDE2",++copyNumber,"ACORDE1",-150, 15, zCoordinate, 0, "MANY"); | |
269 | gMC->Gspos("ACORDE2",++copyNumber,"ACORDE1",150, 15, zCoordinate, 0, "MANY"); | |
270 | ||
271 | } | |
272 | ||
273 | // Put the support bars | |
274 | gMC->Gspos("ACORDE6", 1, "ACORDE1", -75, 5, 0, 0, "ONLY"); | |
275 | gMC->Gspos("ACORDE6", 2, "ACORDE1", -225, 5, 0, 0, "ONLY"); | |
276 | gMC->Gspos("ACORDE6", 3, "ACORDE1", 75, 5, 0, 0, "ONLY"); | |
277 | gMC->Gspos("ACORDE6", 4, "ACORDE1", 225, 5, 0, 0, "ONLY"); | |
278 | ||
279 | // Now put a copy of CR11 on the 3 upper faces of the magnet | |
280 | // In the right side side of the magnet | |
281 | AliMatrix(idrotm[231], 90, 45, 90, 135, 0, 0); | |
282 | // In the left side side of the magnet | |
283 | AliMatrix(idrotm[232], 90, 315, 90, 45, 0, 0); | |
284 | ||
285 | Float_t x = crtConstants->MagMinRadius()+10; | |
286 | gMC->Gspos("ACORDE1", 1, "ALIC", 0, x, 0, 0, "MANY"); | |
287 | gMC->Gspos("ACORDE1", 2, "ALIC", -x*TMath::Sin(kDegrad*45), x*TMath::Cos(kDegrad*45), 0, idrotm[231], "MANY"); | |
288 | gMC->Gspos("ACORDE1", 3, "ALIC", x*TMath::Sin(kDegrad*45), x*TMath::Cos(kDegrad*45), 0, idrotm[232], "MANY"); | |
289 | ||
290 | } | |
291 | ||
292 | //_____________________________________________________________________________ | |
293 | void AliACORDEv0::DrawDetector() const | |
294 | { | |
295 | // | |
296 | // Draw a shaded view of the L3 magnet | |
297 | // | |
298 | ||
299 | Info("DrawDetector", "Drawing the module"); | |
300 | ||
301 | gMC->Gsatt("*", "seen", -1); | |
302 | ||
303 | gMC->Gsatt("ALIC","seen",0); | |
304 | ||
305 | gMC->Gsatt("L3MO","seen",0); // L3 Magnet, Mother | |
306 | gMC->Gsatt("L3CO","seen",1); // Coils | |
307 | gMC->Gsatt("L3C1","seen",1); // Coils | |
308 | gMC->Gsatt("L3YO","seen",1); // Yoke | |
309 | gMC->Gsatt("L3DO","seen",0); // return Yoke (DOOR) | |
310 | gMC->Gsatt("L3FR","seen",1); // DOOR | |
311 | gMC->Gsatt("L3IR","seen",0); // Inner layer | |
312 | gMC->Gsatt("L3O1","seen",1); // Door opening | |
313 | gMC->Gsatt("L3O2","seen",1); // Door opening | |
314 | ||
315 | gMC->Gsatt("ACORDE1", "seen", 0); // ACORDE Mother | |
316 | gMC->Gsatt("ACORDE2", "seen", 0); // Module air box | |
317 | gMC->Gsatt("ACORDE3", "seen", 1); // Scintillators | |
318 | gMC->Gsatt("ACORDE3", "colo", 2); // Scintillators | |
319 | gMC->Gsatt("ACORDE4", "seen", 1); // Aluminium frame (long bars) | |
320 | gMC->Gsatt("ACORDE4", "colo", 3); // | |
321 | gMC->Gsatt("ACORDE5", "seen", 1); // Aluminium frame (short bars) | |
322 | gMC->Gsatt("ACORDE5", "colo", 3); // | |
323 | gMC->Gsatt("ACORDE6", "seen", 1); // Module support | |
324 | gMC->Gsatt("ACORDE6", "colo", 3); // | |
325 | ||
326 | gMC->Gdopt("hide", "on"); | |
327 | gMC->Gdopt("edge","off"); | |
328 | gMC->Gdopt("shad", "on"); | |
329 | gMC->Gsatt("*", "fill", 7); | |
330 | gMC->SetClipBox("ALIC", 0, 3000, -3000, 3000, -6000, 6000); | |
331 | gMC->DefaultRange(); | |
332 | //gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .009, .009); | |
333 | gMC->Gdraw("alic", 30, 40, 0, -30, -60, .09, .09); | |
334 | gMC->Gdhead(1111, "View of ACORDE(ACORDE)"); | |
335 | gMC->Gdman(18, 4, "MAN"); | |
336 | } |