]> git.uio.no Git - u/mrichter/AliRoot.git/blame - RICH/AliRICHv3.cxx
Corrections to reconstruction algorithm.
[u/mrichter/AliRoot.git] / RICH / AliRICHv3.cxx
CommitLineData
9123a941 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#include "AliRICHv3.h"
17#include "AliRun.h"
9123a941 18#include "AliMC.h"
19#include "AliMagF.h"
9123a941 20
9d6c0962 21#include "AliConst.h"
22#include "AliPDG.h"
23
7118aef0 24#include <Riostream.h>
9123a941 25#include <TNode.h>
26#include <TGeometry.h>
27#include <TBRIK.h>
28
9d6c0962 29#include <TLorentzVector.h>
30#include <TVector3.h>
31#include <TParticle.h>
32
33
ae714751 34#include "AliRICHGeometry.h"
35#include "AliRICHSegmentationV1.h"
36#include "AliRICHResponseV0.h"
9d6c0962 37#include "AliRICHHit.h"
ae714751 38
9d6c0962 39ClassImp(AliRICHv3)
ae714751 40
9d6c0962 41//______________________________________________________________
42// Implementation of the RICH version 3 with azimuthal rotation
9123a941 43
9123a941 44
9d6c0962 45AliRICHv3::AliRICHv3(const char *sName, const char *sTitle)
46 :AliRICH(sName,sTitle)
9123a941 47{
9d6c0962 48// The named ctor currently creates a single copy of
49// AliRICHGeometry AliRICHSegmentationV1 AliRICHResponseV0
50// and initialises the corresponding models of all 7 chambers with these stuctures.
51// Note: all chambers share the single copy of models. MUST be changed later (???).
52 cout<<ClassName()<<"::named ctor(sName,sTitle)>\n"; // no way to control it as ctor is called before call to SetDebugXXXX()
9123a941 53
ae714751 54 fCkovNumber=fFreonProd=fDebugLevel=0;
55
9d6c0962 56 AliRICHGeometry *pRICHGeometry =new AliRICHGeometry; // ??? to be moved to AlRICHChamber::named ctor
57 AliRICHSegmentationV1 *pRICHSegmentation=new AliRICHSegmentationV1; // ??? to be moved to AlRICHChamber::named ctor
58 AliRICHResponseV0 *pRICHResponse =new AliRICHResponseV0; // ??? to be moved to AlRICHChamber::named ctor
ae714751 59
9123a941 60 fChambers = new TObjArray(kNCH);
61 for (Int_t i=0; i<kNCH; i++){
9d6c0962 62 fChambers->AddAt(new AliRICHChamber,i); // ??? to be changed to named ctor of AliRICHChamber
ae714751 63 SetGeometryModel(i,pRICHGeometry);
64 SetSegmentationModel(i,pRICHSegmentation);
65 SetResponseModel(i,pRICHResponse);
9d6c0962 66 ((AliRICHChamber*)fChambers->At(i))->Init(i); // ??? to be removed
9123a941 67 }
68}//AliRICHv3::ctor(const char *pcName, const char *pcTitle)
69
9d6c0962 70AliRICHv3::~AliRICHv3()
71{
72// Dtor deletes RICH models. In future (???) AliRICHChamber will be responsible for that.
73 if(IsDebugStart()) cout<<ClassName()<<"::dtor()>\n";
74
75 delete GetChamber(0)->GetGeometryModel();
76 delete GetChamber(0)->GetResponseModel();
77 delete GetChamber(0)->GetSegmentationModel();
78}//AliRICHv3::dtor()
79
9123a941 80
81void AliRICHv3::CreateGeometry()
82{
9d6c0962 83// Provides geometry structure for simulation (currently GEANT volumes tree)
84 if(IsDebugStart()) cout<<ClassName()<<"::CreateGeometry()>\n";
9123a941 85
86 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
87 AliRICHSegmentationV0* segmentation;
88 AliRICHGeometry* geometry;
89 AliRICHChamber* iChamber;
90
91 iChamber = &(pRICH->Chamber(0));
92 segmentation=(AliRICHSegmentationV0*) iChamber->GetSegmentationModel(0);
93 geometry=iChamber->GetGeometryModel();
94
95 Float_t distance;
96 distance = geometry->GetFreonThickness()/2 + geometry->GetQuartzThickness() + geometry->GetGapThickness();
97 geometry->SetRadiatorToPads(distance);
98
99 //Opaque quartz thickness
100 Float_t oqua_thickness = .5;
101 //CsI dimensions
102
103
104 Float_t csi_width = segmentation->Npx()*segmentation->Dpx() + segmentation->DeadZone();
105 Float_t csi_length = segmentation->Npy()*segmentation->Dpy() + 2*segmentation->DeadZone();
106
107
108 Int_t *idtmed = fIdtmed->GetArray()-999;
109
110 Int_t i;
111 Float_t zs;
112 Int_t idrotm[1099];
113 Float_t par[3];
114
115 // --- Define the RICH detector
116 // External aluminium box
117 par[0] = 68.8;
118 par[1] = 13; //Original Settings
119 par[2] = 70.86;
120 gMC->Gsvolu("RICH", "BOX ", idtmed[1009], par, 3);
121
122 // Air
123 par[0] = 66.3;
124 par[1] = 13; //Original Settings
125 par[2] = 68.35;
126 gMC->Gsvolu("SRIC", "BOX ", idtmed[1000], par, 3);
127
128 // Air 2 (cutting the lower part of the box)
129
130 par[0] = 1.25;
131 par[1] = 3; //Original Settings
132 par[2] = 70.86;
133 gMC->Gsvolu("AIR2", "BOX ", idtmed[1000], par, 3);
134
135 // Air 3 (cutting the lower part of the box)
136
137 par[0] = 66.3;
138 par[1] = 3; //Original Settings
139 par[2] = 1.2505;
140 gMC->Gsvolu("AIR3", "BOX ", idtmed[1000], par, 3);
141
142 // Honeycomb
143 par[0] = 66.3;
144 par[1] = .188; //Original Settings
145 par[2] = 68.35;
146 gMC->Gsvolu("HONE", "BOX ", idtmed[1001], par, 3);
147
148 // Aluminium sheet
149 par[0] = 66.3;
150 par[1] = .025; //Original Settings
151 par[2] = 68.35;
152 /*par[0] = 66.5;
153 par[1] = .025;
154 par[2] = 63.1;*/
155 gMC->Gsvolu("ALUM", "BOX ", idtmed[1009], par, 3);
156
157 // Quartz
158 par[0] = geometry->GetQuartzWidth()/2;
159 par[1] = geometry->GetQuartzThickness()/2;
160 par[2] = geometry->GetQuartzLength()/2;
161 gMC->Gsvolu("QUAR", "BOX ", idtmed[1002], par, 3);
162
163 // Spacers (cylinders)
164 par[0] = 0.;
165 par[1] = .5;
166 par[2] = geometry->GetFreonThickness()/2;
167 gMC->Gsvolu("SPAC", "TUBE", idtmed[1002], par, 3);
168
169 // Feet (freon slabs supports)
170
171 par[0] = .7;
172 par[1] = .3;
173 par[2] = 1.9;
174 gMC->Gsvolu("FOOT", "BOX", idtmed[1009], par, 3);
175
176 // Opaque quartz
177 par[0] = geometry->GetQuartzWidth()/2;
178 par[1] = .2;
179 par[2] = geometry->GetQuartzLength()/2;
180 gMC->Gsvolu("OQUA", "BOX ", idtmed[1007], par, 3);
181
182 // Frame of opaque quartz
183 par[0] = geometry->GetOuterFreonWidth()/2;
184 par[1] = geometry->GetFreonThickness()/2;
185 par[2] = geometry->GetOuterFreonLength()/2;
186 gMC->Gsvolu("OQF1", "BOX ", idtmed[1007], par, 3);
187
188 par[0] = geometry->GetInnerFreonWidth()/2;
189 par[1] = geometry->GetFreonThickness()/2;
190 par[2] = geometry->GetInnerFreonLength()/2;
191 gMC->Gsvolu("OQF2", "BOX ", idtmed[1007], par, 3);
192
193
194 // Freon
195 par[0] = geometry->GetOuterFreonWidth()/2 - oqua_thickness;
196 par[1] = geometry->GetFreonThickness()/2;
197 par[2] = geometry->GetOuterFreonLength()/2 - 2*oqua_thickness;
198 gMC->Gsvolu("FRE1", "BOX ", idtmed[1003], par, 3);
199
200 par[0] = geometry->GetInnerFreonWidth()/2 - oqua_thickness;
201 par[1] = geometry->GetFreonThickness()/2;
202 par[2] = geometry->GetInnerFreonLength()/2 - 2*oqua_thickness;
203 gMC->Gsvolu("FRE2", "BOX ", idtmed[1003], par, 3);
204
205 // Methane
206 par[0] = csi_width/2;
207 par[1] = geometry->GetGapThickness()/2;
208 par[2] = csi_length/2;
209 gMC->Gsvolu("META", "BOX ", idtmed[1004], par, 3);
210
211 // Methane gap
212 par[0] = csi_width/2;
213 par[1] = geometry->GetProximityGapThickness()/2;
214 par[2] = csi_length/2;
215 gMC->Gsvolu("GAP ", "BOX ", idtmed[1008], par, 3);
216
217 // CsI photocathode
218 par[0] = csi_width/2;
219 par[1] = .25;
220 par[2] = csi_length/2;
221 gMC->Gsvolu("CSI ", "BOX ", idtmed[1005], par, 3);
222
223 // Anode grid
224 par[0] = 0.;
225 par[1] = .001;
226 par[2] = 20.;
227 gMC->Gsvolu("GRID", "TUBE", idtmed[1006], par, 3);
228
229 // Wire supports
230 // Bar of metal
231
232 par[0] = csi_width/2;
233 par[1] = 1.05;
234 par[2] = 1.05;
235 gMC->Gsvolu("WSMe", "BOX ", idtmed[1009], par, 3);
236
237 // Ceramic pick up (base)
238
239 par[0] = csi_width/2;
240 par[1] = .25;
241 par[2] = 1.05;
242 gMC->Gsvolu("WSG1", "BOX ", idtmed[1010], par, 3);
243
244 // Ceramic pick up (head)
245
246 par[0] = csi_width/2;
247 par[1] = .1;
248 par[2] = .1;
249 gMC->Gsvolu("WSG2", "BOX ", idtmed[1010], par, 3);
250
251 // Aluminium supports for methane and CsI
252 // Short bar
253
254 par[0] = csi_width/2;
255 par[1] = geometry->GetGapThickness()/2 + .25;
256 par[2] = (68.35 - csi_length/2)/2;
257 gMC->Gsvolu("SMSH", "BOX", idtmed[1009], par, 3);
258
259 // Long bar
260
261 par[0] = (66.3 - csi_width/2)/2;
262 par[1] = geometry->GetGapThickness()/2 + .25;
263 par[2] = csi_length/2 + 68.35 - csi_length/2;
264 gMC->Gsvolu("SMLG", "BOX", idtmed[1009], par, 3);
265
266 // Aluminium supports for freon
267 // Short bar
268
269 par[0] = geometry->GetQuartzWidth()/2;
270 par[1] = .3;
271 par[2] = (68.35 - geometry->GetQuartzLength()/2)/2;
272 gMC->Gsvolu("SFSH", "BOX", idtmed[1009], par, 3);
273
274 // Long bar
275
276 par[0] = (66.3 - geometry->GetQuartzWidth()/2)/2;
277 par[1] = .3;
278 par[2] = geometry->GetQuartzLength()/2 + 68.35 - geometry->GetQuartzLength()/2;
279 gMC->Gsvolu("SFLG", "BOX", idtmed[1009], par, 3);
280
281 // PCB backplane
282
283 par[0] = csi_width/2;
284 par[1] = .25;
285 par[2] = csi_length/4 -.5025;
286 gMC->Gsvolu("PCB ", "BOX", idtmed[1011], par, 3);
287
288
289 // Backplane supports
290
291 // Aluminium slab
292
293 par[0] = 33.15;
294 par[1] = 2;
295 par[2] = 21.65;
296 gMC->Gsvolu("BACK", "BOX", idtmed[1009], par, 3);
297
298 // Big hole
299
300 par[0] = 9.05;
301 par[1] = 2;
302 par[2] = 4.4625;
303 gMC->Gsvolu("BKHL", "BOX", idtmed[1000], par, 3);
304
305 // Small hole
306
307 par[0] = 5.7;
308 par[1] = 2;
309 par[2] = 4.4625;
310 gMC->Gsvolu("BKHS", "BOX", idtmed[1000], par, 3);
311
312 // Place holes inside backplane support
313
314 gMC->Gspos("BKHS", 1, "BACK", .8 + 5.7,0., .6 + 4.4625, 0, "ONLY");
315 gMC->Gspos("BKHS", 2, "BACK", -.8 - 5.7,0., .6 + 4.4625, 0, "ONLY");
316 gMC->Gspos("BKHS", 3, "BACK", .8 + 5.7,0., -.6 - 4.4625, 0, "ONLY");
317 gMC->Gspos("BKHS", 4, "BACK", -.8 - 5.7,0., -.6 - 4.4625, 0, "ONLY");
318 gMC->Gspos("BKHS", 5, "BACK", .8 + 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
319 gMC->Gspos("BKHS", 6, "BACK", -.8 - 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
320 gMC->Gspos("BKHS", 7, "BACK", .8 + 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
321 gMC->Gspos("BKHS", 8, "BACK", -.8 - 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
322 gMC->Gspos("BKHL", 1, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., .6 + 4.4625, 0, "ONLY");
323 gMC->Gspos("BKHL", 2, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 4.4625, 0, "ONLY");
324 gMC->Gspos("BKHL", 3, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 4.4625, 0, "ONLY");
325 gMC->Gspos("BKHL", 4, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 4.4625, 0, "ONLY");
326 gMC->Gspos("BKHL", 5, "BACK", .8 + 11.4+ 1.6 + 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
327 gMC->Gspos("BKHL", 6, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
328 gMC->Gspos("BKHL", 7, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
329 gMC->Gspos("BKHL", 8, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
330
331
332
333 // --- Places the detectors defined with GSVOLU
334 // Place material inside RICH
335 gMC->Gspos("SRIC", 1, "RICH", 0.,0., 0., 0, "ONLY");
336 gMC->Gspos("AIR2", 1, "RICH", 66.3 + 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, 0., 0, "ONLY");
337 gMC->Gspos("AIR2", 2, "RICH", -66.3 - 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, 0., 0, "ONLY");
338 gMC->Gspos("AIR3", 1, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, -68.35 - 1.25, 0, "ONLY");
339 gMC->Gspos("AIR3", 2, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, 68.35 + 1.25, 0, "ONLY");
340
341
342 gMC->Gspos("ALUM", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.025, 0., 0, "ONLY");
343 gMC->Gspos("HONE", 1, "SRIC", 0., 1.276- geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .188, 0., 0, "ONLY");
344 gMC->Gspos("ALUM", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .025, 0., 0, "ONLY");
345 gMC->Gspos("FOOT", 1, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
346 gMC->Gspos("FOOT", 2, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3 , 36.9, 0, "ONLY");
347 gMC->Gspos("FOOT", 3, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
348 gMC->Gspos("FOOT", 4, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
349 gMC->Gspos("FOOT", 5, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
350 gMC->Gspos("FOOT", 6, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
351 gMC->Gspos("FOOT", 7, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
352 gMC->Gspos("FOOT", 8, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
353 gMC->Gspos("OQUA", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .2, 0., 0, "ONLY");
354
355 // Supports placing
356
357 // Methane supports
358 gMC->Gspos("SMLG", 1, "SRIC", csi_width/2 + (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
359 gMC->Gspos("SMLG", 2, "SRIC", - csi_width/2 - (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
360 gMC->Gspos("SMSH", 1, "SRIC", 0., 1.276 + .25, csi_length/2 + (68.35 - csi_length/2)/2, 0, "ONLY");
361 gMC->Gspos("SMSH", 2, "SRIC", 0., 1.276 + .25, - csi_length/2 - (68.35 - csi_length/2)/2, 0, "ONLY");
362
363 //Freon supports
364
365 Float_t supp_y = 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness() - .2 + .3; //y position of freon supports
366
367 gMC->Gspos("SFLG", 1, "SRIC", geometry->GetQuartzWidth()/2 + (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
368 gMC->Gspos("SFLG", 2, "SRIC", - geometry->GetQuartzWidth()/2 - (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
369 gMC->Gspos("SFSH", 1, "SRIC", 0., supp_y, geometry->GetQuartzLength()/2 + (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
370 gMC->Gspos("SFSH", 2, "SRIC", 0., supp_y, - geometry->GetQuartzLength()/2 - (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
371
372 AliMatrix(idrotm[1019], 0., 0., 90., 0., 90., 90.);
373
374
375 Int_t nspacers = 30;
376
377 for (i = 0; i < nspacers/3; i++) {
378 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
379 gMC->Gspos("SPAC", i, "FRE1", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
380 }
381
382 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
383 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
384 gMC->Gspos("SPAC", i, "FRE1", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
385 }
386
387 for (i = (nspacers*2)/3; i < nspacers; ++i) {
388 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
389 gMC->Gspos("SPAC", i, "FRE1", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
390 }
391
392 for (i = 0; i < nspacers/3; i++) {
393 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
394 gMC->Gspos("SPAC", i, "FRE2", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
395 }
396
397 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
398 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
399 gMC->Gspos("SPAC", i, "FRE2", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
400 }
401
402 for (i = (nspacers*2)/3; i < nspacers; ++i) {
403 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
404 gMC->Gspos("SPAC", i, "FRE2", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
405 }
406
407
408 gMC->Gspos("FRE1", 1, "OQF1", 0., 0., 0., 0, "ONLY");
409 gMC->Gspos("FRE2", 1, "OQF2", 0., 0., 0., 0, "ONLY");
410 gMC->Gspos("OQF1", 1, "SRIC", geometry->GetOuterFreonWidth()/2 + geometry->GetInnerFreonWidth()/2 + 2, 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings (31.3)
411 gMC->Gspos("OQF2", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings
412 gMC->Gspos("OQF1", 3, "SRIC", - (geometry->GetOuterFreonWidth()/2 + geometry->GetInnerFreonWidth()/2) - 2, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings (-31.3)
413 gMC->Gspos("QUAR", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness()/2, 0., 0, "ONLY");
414 gMC->Gspos("GAP ", 1, "META", 0., geometry->GetGapThickness()/2 - geometry->GetProximityGapThickness()/2 - 0.0001, 0., 0, "ONLY");
415 gMC->Gspos("META", 1, "SRIC", 0., 1.276, 0., 0, "ONLY");
416 gMC->Gspos("CSI ", 1, "SRIC", 0., 1.276 + geometry->GetGapThickness()/2 + .25, 0., 0, "ONLY");
417 printf("CSI pos: %f\n",1.276 + geometry->GetGapThickness()/2 + .25);
418
419 // Wire support placing
420
421 gMC->Gspos("WSG2", 1, "GAP ", 0., geometry->GetProximityGapThickness()/2 - .1, 0., 0, "ONLY");
422 gMC->Gspos("WSG1", 1, "CSI ", 0., 0., 0., 0, "ONLY");
423 gMC->Gspos("WSMe", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, 0., 0, "ONLY");
424
425 // Backplane placing
426
427 gMC->Gspos("BACK", 1, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 43.3, 0, "ONLY");
428 gMC->Gspos("BACK", 2, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2 , 43.3, 0, "ONLY");
429 gMC->Gspos("BACK", 3, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
430 gMC->Gspos("BACK", 4, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
431 gMC->Gspos("BACK", 5, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
432 gMC->Gspos("BACK", 6, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
433
434 // PCB placing
435
436 gMC->Gspos("PCB ", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, csi_width/4 + .5025 + 2.5, 0, "ONLY");
437 gMC->Gspos("PCB ", 2, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, -csi_width/4 - .5025 - 2.5, 0, "ONLY");
438
439// Place chambers into mother volume ALIC
440
9d6c0962 441 Double_t dOffset = geometry->GetOffset() - geometry->GetGapThickness()/2; // distance from center of mother volume ALIC to methane
442
443 Double_t dAlpha = geometry->GetAlphaAngle(); // angle between centers of chambers - y-z plane
444 Double_t dAlphaRad = dAlpha*kDegrad;
445
446 Double_t dBeta = geometry->GetBetaAngle(); // angle between center of chambers - y-x plane
447 Double_t dBetaRad = dBeta*kDegrad;
448
449 Double_t dRotAngle = geometry->GetRotationAngle(); // the whole RICH is to be rotated in x-y plane + means clockwise rotation
450 Double_t dRotAngleRad = dRotAngle*kDegrad;
9d6c0962 451
4b7382d1 452
9d6c0962 453 TRotMatrix *pRotMatrix; // tmp pointer
454
455 TVector3 vector(0,dOffset,0); // Position of chamber 2 without rotation
456
9123a941 457// Chamber 0 standalone (no other chambers in this row)
4b7382d1 458 pRotMatrix = new TRotMatrix("rot993","rot993", 0., 0., 0.,0.,0.,0.);
459 const Double_t* r = pRotMatrix->SetAngles(90., 0., 90.-dAlpha , 90., dAlpha, -90.);
460 Double_t* rr = RotateXY(r, -dRotAngleRad);
461 AliMatrix(idrotm[1000], rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
462 pRotMatrix->SetAngles(rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
9123a941 463
9d6c0962 464 vector.SetXYZ(0,dOffset,0); vector.RotateX(dAlphaRad);
465 vector.RotateZ(-dRotAngleRad);
9123a941 466
9d6c0962 467 gMC->Gspos("RICH",1,"ALIC",vector.X(),vector.Y(),vector.Z(),idrotm[1000], "ONLY");
468 Chamber(0).SetChamberTransform(vector.X(),vector.Y(),vector.Z(),pRotMatrix);
9123a941 469// Chamber 1
4b7382d1 470 pRotMatrix = new TRotMatrix("rot994","rot994", 0., 0., 0.,0.,0.,0.);
471 r = pRotMatrix->SetAngles(90., -dBeta, 90., 90.-dBeta, 0., 0.);
472 rr = RotateXY(r, -dRotAngleRad);
473 AliMatrix(idrotm[1001], rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
474 pRotMatrix->SetAngles(rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
9d6c0962 475 vector.SetXYZ(0,dOffset,0); vector.RotateZ(-dBetaRad);
476 vector.RotateZ(-dRotAngleRad);
9123a941 477
9d6c0962 478 gMC->Gspos("RICH",2,"ALIC",vector.X(),vector.Y(),vector.Z(),idrotm[1001], "ONLY");
479 Chamber(1).SetChamberTransform(vector.X(),vector.Y(),vector.Z(),pRotMatrix);
4b7382d1 480
9123a941 481// Chamber 2 the top one with no Alpha-Beta rotation
4b7382d1 482 pRotMatrix = new TRotMatrix("rot995","rot995", 0., 0., 0.,0.,0.,0.);
483 r = pRotMatrix->SetAngles(90., 0., 90., 90., 0., 0.);
484 rr = RotateXY(r, -dRotAngleRad);
485 AliMatrix(idrotm[1002], rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
486 pRotMatrix->SetAngles(rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
9d6c0962 487 vector.SetXYZ(0,dOffset,0);
488 vector.RotateZ(-dRotAngleRad);
9d6c0962 489 gMC->Gspos("RICH",3,"ALIC",vector.X(),vector.Y(),vector.Z(),idrotm[1002], "ONLY");
490 Chamber(2).SetChamberTransform(vector.X(),vector.Y(),vector.Z(),pRotMatrix);
9123a941 491// Chamber 3
4b7382d1 492 pRotMatrix = new TRotMatrix("rot996","rot996", 0., 0., 0.,0.,0.,0.);
493 r = pRotMatrix->SetAngles(90., dBeta, 90., 90.+dBeta, 0., 0.);
494 rr = RotateXY(r, -dRotAngleRad);
495 AliMatrix(idrotm[1003], rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
496 pRotMatrix->SetAngles(rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
9d6c0962 497 vector.SetXYZ(0,dOffset,0); vector.RotateZ(dBetaRad);
498 vector.RotateZ(-dRotAngleRad);
9123a941 499
9d6c0962 500 gMC->Gspos("RICH",4,"ALIC",vector.X(),vector.Y(),vector.Z(),idrotm[1003], "ONLY");
501 Chamber(3).SetChamberTransform(vector.X(),vector.Y(),vector.Z(),pRotMatrix);
4b7382d1 502
9123a941 503// Chamber 4
4b7382d1 504 pRotMatrix = new TRotMatrix("rot997","rot997", 0., 0., 0.,0.,0.,0.);
505 r = pRotMatrix->SetAngles(90., 360.-dBeta, 108.2, 90.-dBeta, 18.2, 90.-dBeta);
506 rr = RotateXY(r, -dRotAngleRad);
507 AliMatrix(idrotm[1004], rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
508 pRotMatrix->SetAngles(rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
9d6c0962 509 vector.SetXYZ(0,dOffset,0); vector.RotateZ(-dBetaRad); vector.RotateX(-dAlphaRad);
510 vector.RotateZ(-dRotAngleRad);
9123a941 511
9d6c0962 512 gMC->Gspos("RICH",5,"ALIC",vector.X(),vector.Y(),vector.Z(),idrotm[1004], "ONLY");
513 Chamber(4).SetChamberTransform(vector.X(),vector.Y(),vector.Z(),pRotMatrix);
9123a941 514// Chamber 5
4b7382d1 515 pRotMatrix = new TRotMatrix("rot998","rot998", 0., 0., 0.,0.,0.,0.);
516 r = pRotMatrix->SetAngles(90., 0., 90.+dAlpha, 90., dAlpha, 90.);
517 rr = RotateXY(r, -dRotAngleRad);
518 AliMatrix(idrotm[1005], rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
519 pRotMatrix->SetAngles(rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
9d6c0962 520 vector.SetXYZ(0,dOffset,0); vector.RotateX(-dAlphaRad);
521 vector.RotateZ(-dRotAngleRad);
522
523 gMC->Gspos("RICH",6,"ALIC",vector.X(),vector.Y(),vector.Z(),idrotm[1005], "ONLY");
524 Chamber(5).SetChamberTransform(vector.X(),vector.Y(),vector.Z(),pRotMatrix);
4b7382d1 525// Chamber 6
526 pRotMatrix = new TRotMatrix("rot999","rot999", 0., 0., 0.,0.,0.,0.);
527 r = pRotMatrix->SetAngles(90., dBeta, 108.2, 90.+dBeta, 18.2, 90.+dBeta);
528 rr = RotateXY(r, -dRotAngleRad);
529 AliMatrix(idrotm[1006], rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
530 pRotMatrix->SetAngles(rr[0], rr[1], rr[2], rr[3], rr[4], rr[5]);
9d6c0962 531 vector.SetXYZ(0,dOffset,0); vector.RotateZ(dBetaRad); vector.RotateX(-dAlphaRad);
532 vector.RotateZ(-dRotAngleRad);
533
534 gMC->Gspos("RICH",7,"ALIC",vector.X(),vector.Y(),vector.Z(),idrotm[1006], "ONLY");
535 Chamber(6).SetChamberTransform(vector.X(),vector.Y(),vector.Z(),pRotMatrix);
9123a941 536
537}//void AliRICHv3::CreateGeometry()
538
539
540
541
542void AliRICHv3::Init()
543{
9d6c0962 544// Makes nothing for a while
545 if(IsDebugStart()) cout<<ClassName()<<"::Init()>\n";
9123a941 546
547}
548
549
601cdd67 550
9123a941 551void AliRICHv3::BuildGeometry()
9d6c0962 552{
553// Provides geometry structure for event display (ROOT TNode tree)
554
555 if(IsDebugStart()) cout<<ClassName()<<"::BuildGeometry()>\n";
9123a941 556
557 TNode *node, *subnode, *top;
558
559 const int kColorRICH = kRed;
560 //
561 top=gAlice->GetGeometry()->GetNode("alice");
562
563 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
9123a941 564 AliRICHChamber* iChamber;
565 AliRICHGeometry* geometry;
566
567 iChamber = &(pRICH->Chamber(0));
9d6c0962 568 AliRICHSegmentationV1* segmentation=(AliRICHSegmentationV1*) iChamber->GetSegmentationModel(0);
9123a941 569 geometry=iChamber->GetGeometryModel();
570
571 new TBRIK("S_RICH","S_RICH","void",71.09999,11.5,73.15);
572
573 Float_t padplane_width = segmentation->GetPadPlaneWidth();
574 Float_t padplane_length = segmentation->GetPadPlaneLength();
575
576
577 new TBRIK("PHOTO","PHOTO","void", padplane_width/2,.1,padplane_length/2);
578
579// Chamber 0
580 top->cd();
581 node = new TNode("RICH1","RICH1","S_RICH",Chamber(0).GetX(),Chamber(0).GetY(),Chamber(0).GetZ(),"rot993");
582 node->SetLineColor(kColorRICH);
583 node->cd();
584 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
585 subnode->SetLineColor(kGreen);
586 fNodes->Add(subnode);
587 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
588 subnode->SetLineColor(kGreen);
589 fNodes->Add(subnode);
590 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
591 subnode->SetLineColor(kGreen);
592 fNodes->Add(subnode);
593 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
594 subnode->SetLineColor(kGreen);
595 fNodes->Add(subnode);
596 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
597 subnode->SetLineColor(kGreen);
598 fNodes->Add(subnode);
599 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
600 subnode->SetLineColor(kGreen);
601 fNodes->Add(subnode);
602 fNodes->Add(node);
603
604// Chamber 1
605 top->cd();
606 node = new TNode("RICH2","RICH2","S_RICH",Chamber(1).GetX(),Chamber(1).GetY(),Chamber(1).GetZ(),"rot994");
607 node->SetLineColor(kColorRICH);
608 node->cd();
609 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
610 subnode->SetLineColor(kGreen);
611 fNodes->Add(subnode);
612 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
613 subnode->SetLineColor(kGreen);
614 fNodes->Add(subnode);
615 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
616 subnode->SetLineColor(kGreen);
617 fNodes->Add(subnode);
618 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
619 subnode->SetLineColor(kGreen);
620 fNodes->Add(subnode);
621 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
622 subnode->SetLineColor(kGreen);
623 fNodes->Add(subnode);
624 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
625 subnode->SetLineColor(kGreen);
626 fNodes->Add(subnode);
627 fNodes->Add(node);
628
629// Chamber 2
630 top->cd();
631 node = new TNode("RICH3","RICH3","S_RICH",Chamber(2).GetX(),Chamber(2).GetY(),Chamber(2).GetZ(),"rot995");
632 node->SetLineColor(kColorRICH);
633 node->cd();
634 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
635 subnode->SetLineColor(kGreen);
636 fNodes->Add(subnode);
637 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
638 subnode->SetLineColor(kGreen);
639 fNodes->Add(subnode);
640 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
641 subnode->SetLineColor(kGreen);
642 fNodes->Add(subnode);
643 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
644 subnode->SetLineColor(kGreen);
645 fNodes->Add(subnode);
646 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
647 subnode->SetLineColor(kGreen);
648 fNodes->Add(subnode);
649 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
650 subnode->SetLineColor(kGreen);
651 fNodes->Add(subnode);
652 fNodes->Add(node);
653
654// Chamber 3
655 top->cd();
656 node = new TNode("RICH4","RICH4","S_RICH",Chamber(3).GetX(),Chamber(3).GetY(),Chamber(3).GetZ(),"rot996");
657 node->SetLineColor(kColorRICH);
658 node->cd();
659 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
660 subnode->SetLineColor(kGreen);
661 fNodes->Add(subnode);
662 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
663 subnode->SetLineColor(kGreen);
664 fNodes->Add(subnode);
665 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
666 subnode->SetLineColor(kGreen);
667 fNodes->Add(subnode);
668 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
669 subnode->SetLineColor(kGreen);
670 fNodes->Add(subnode);
671 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
672 subnode->SetLineColor(kGreen);
673 fNodes->Add(subnode);
674 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
675 subnode->SetLineColor(kGreen);
676 fNodes->Add(subnode);
677 fNodes->Add(node);
678
679// Chamber 4
680 top->cd();
681 node = new TNode("RICH5","RICH5","S_RICH",Chamber(4).GetX(),Chamber(4).GetY(),Chamber(4).GetZ(),"rot997");
682 node->SetLineColor(kColorRICH);
683 node->cd();
684 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
685 subnode->SetLineColor(kGreen);
686 fNodes->Add(subnode);
687 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
688 subnode->SetLineColor(kGreen);
689 fNodes->Add(subnode);
690 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
691 subnode->SetLineColor(kGreen);
692 fNodes->Add(subnode);
693 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
694 subnode->SetLineColor(kGreen);
695 fNodes->Add(subnode);
696 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
697 subnode->SetLineColor(kGreen);
698 fNodes->Add(subnode);
699 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
700 subnode->SetLineColor(kGreen);
701 fNodes->Add(subnode);
702 fNodes->Add(node);
703
704// Chamber 5
705 top->cd();
706 node = new TNode("RICH6","RICH6","S_RICH",Chamber(5).GetX(),Chamber(5).GetY(),Chamber(5).GetZ(),"rot998");
707 node->SetLineColor(kColorRICH);
708 fNodes->Add(node);node->cd();
709 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
710 subnode->SetLineColor(kGreen);
711 fNodes->Add(subnode);
712 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
713 subnode->SetLineColor(kGreen);
714 fNodes->Add(subnode);
715 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
716 subnode->SetLineColor(kGreen);
717 fNodes->Add(subnode);
718 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
719 subnode->SetLineColor(kGreen);
720 fNodes->Add(subnode);
721 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
722 subnode->SetLineColor(kGreen);
723 fNodes->Add(subnode);
724 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
725 subnode->SetLineColor(kGreen);
726 fNodes->Add(subnode);
727
728// Chamber 6
729 top->cd();
730 node = new TNode("RICH7","RICH7","S_RICH",Chamber(6).GetX(),Chamber(6).GetY(),Chamber(6).GetZ(),"rot999");
731 node->SetLineColor(kColorRICH);
732 node->cd();
733 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
734 subnode->SetLineColor(kGreen);
735 fNodes->Add(subnode);
736 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
737 subnode->SetLineColor(kGreen);
738 fNodes->Add(subnode);
739 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
740 subnode->SetLineColor(kGreen);
741 fNodes->Add(subnode);
742 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
743 subnode->SetLineColor(kGreen);
744 fNodes->Add(subnode);
745 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
746 subnode->SetLineColor(kGreen);
747 fNodes->Add(subnode);
748 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
749 subnode->SetLineColor(kGreen);
750 fNodes->Add(subnode);
751 fNodes->Add(node);
752
753}//AliRICHv3::BuildGeometry()
9d6c0962 754
4b7382d1 755
756Double_t* AliRICHv3::RotateXY(const Double_t* r, Double_t a)
757{
758 // Rotatation in xy-plane
759 // by angle a
760 // The resulting rotation matrix is given back in the G3 notation.
761 Double_t* rr = new Double_t[6];
762 Double_t m[9];
763 Int_t i,j,k;
764
765 for (i = 0; i < 3; i++) {
766 j = 3*i;
767 m[j] = r[j] * TMath::Cos(a) - r[j+1] * TMath::Sin(a);
768 m[j+1] = r[j] * TMath::Sin(a) + r[j+1] * TMath::Cos(a);
769 m[j+2] = r[j+2];
770 }
771
772 for (i = 0; i < 3; i++) {
773 j = 3*i;
774 k = 2*i;
775 rr[k] = TMath::ACos(m[j+2]) * kRaddeg;
776 rr[k+1] = TMath::ATan2(m[j+1], m[j]) * kRaddeg;
777 }
778 return rr;
779}