Project
Loading...
Searching...
No Matches
Detector.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13#include "HMPIDBase/Param.h"
14#include "TGeoManager.h"
15#include "TGeoShapeAssembly.h"
16#include "TGeoNode.h"
17#include "TGeoBBox.h"
18#include "TGeoXtru.h"
19#include "TGeoCompositeShape.h"
20#include "TVirtualMC.h"
21#include "TF1.h"
22#include "TF2.h"
23#include "TMath.h"
24#include <TPDGCode.h> //StepHistory()
25#include <TGeoGlobalMagField.h>
26#include <TGeoPhysicalNode.h> //AddAlignableVolumes()
27#include <TGeoXtru.h> //CradleBaseVolume()
28#include <TLorentzVector.h> //IsLostByFresnel()
29#include <TString.h> //StepManager()
30#include <TTree.h>
31#include "DetectorsBase/Stack.h"
34
35#include "Framework/Logger.h"
37
38namespace o2
39{
40namespace hmpid
41{
42
43Detector::Detector(Bool_t active) : o2::base::DetImpl<Detector>("HMP", active), mHits(new std::vector<o2::hmpid::HitType>) {}
44
45Detector::Detector(const Detector& other) : o2::base::DetImpl<Detector>(other),
46 mSensitiveVolumes(other.mSensitiveVolumes),
47 mHits(new std::vector<o2::hmpid::HitType>) {}
48
50{
51 TVirtualMC* fMC = TVirtualMC::GetMC();
52 for (auto sensitiveHpad : mSensitiveVolumes) {
53 LOG(debug) << "HMPID: registering sensitive " << sensitiveHpad->GetName();
54 AddSensitiveVolume(sensitiveHpad);
55 mHpad0VolID = fMC->VolId("Hpad0");
56 mHpad1VolID = fMC->VolId("Hpad1");
57 mHpad2VolID = fMC->VolId("Hpad2");
58 mHpad3VolID = fMC->VolId("Hpad3");
59 mHpad4VolID = fMC->VolId("Hpad4");
60 mHpad5VolID = fMC->VolId("Hpad5");
61 mHpad6VolID = fMC->VolId("Hpad6");
62 mHcel0VolID = fMC->VolId("Hcel0");
63 mHcel1VolID = fMC->VolId("Hcel1");
64 mHcel2VolID = fMC->VolId("Hcel2");
65 mHcel3VolID = fMC->VolId("Hcel3");
66 mHcel4VolID = fMC->VolId("Hcel4");
67 mHcel5VolID = fMC->VolId("Hcel5");
68 mHcel6VolID = fMC->VolId("Hcel6");
69 }
70}
71//*********************************************************************************************************
73{
74 Int_t copy;
75 Int_t volID = fMC->CurrentVolID(copy);
76 auto stack = (o2::data::Stack*)fMC->GetStack();
77
78 // Treat photons
79 // photon (Ckov or feedback) hits on module PC (Hpad)
80 if ((fMC->TrackPid() == 50000050 || fMC->TrackPid() == 50000051) && (volID == mHpad0VolID || volID == mHpad1VolID || volID == mHpad2VolID || volID == mHpad3VolID || volID == mHpad4VolID || volID == mHpad5VolID || volID == mHpad6VolID)) {
81 if (fMC->Edep() > 0) { // photon survided QE test i.e. produces electron
82 if (IsLostByFresnel()) {
83 fMC->StopTrack();
84 return false;
85 } // photon lost due to fersnel reflection on PC
86 Int_t tid = fMC->GetStack()->GetCurrentTrackNumber(); // take TID
87 Int_t pid = fMC->TrackPid(); // take PID
88 Float_t etot = fMC->Etot(); // total hpoton energy, [GeV]
89 Double_t x[3];
90 fMC->TrackPosition(x[0], x[1], x[2]); // take MARS position at entrance to PC
91 Float_t hitTime = (Float_t)fMC->TrackTime(); // hit formation time
92 Int_t idch; // chamber number
93 if (volID == mHpad0VolID) {
94 idch = 0;
95 } else if (volID == mHpad1VolID) {
96 idch = 1;
97 } else if (volID == mHpad2VolID) {
98 idch = 2;
99 } else if (volID == mHpad3VolID) {
100 idch = 3;
101 } else if (volID == mHpad4VolID) {
102 idch = 4;
103 } else if (volID == mHpad5VolID) {
104 idch = 5;
105 } else if (volID == mHpad6VolID) {
106 idch = 6;
107 }
108 Double_t xl, yl;
109 o2::hmpid::Param::instance()->mars2Lors(idch, x, xl, yl); // take LORS position
110 AddHit(x[0], x[1], x[2], hitTime, etot, tid, idch); // HIT for photon, position at P, etot will be set to Q
111 GenFee(etot); // generate feedback photons etot is modified in hit ctor to Q of hit
112 stack->addHit(GetDetId());
113 } // photon hit PC and DE >0
114 return kTRUE;
115 } // photon hit PC
116
117 // Treat charged particles
118
119 if (fMC->IsTrackEntering() && fMC->TrackCharge() && (volID == mHpad0VolID || volID == mHpad1VolID || volID == mHpad2VolID || volID == mHpad3VolID || volID == mHpad4VolID || volID == mHpad5VolID || volID == mHpad6VolID)) {
120 // Trackref stored when entering in the pad volume
122 tr.setTrackID(stack->GetCurrentTrackNumber());
123 // tr.setUserId(lay);
124 stack->addTrackReference(tr);
125 }
126
127 if (fMC->TrackCharge() && (volID == mHcel0VolID || volID == mHcel1VolID || volID == mHcel2VolID || volID == mHcel3VolID || volID == mHcel4VolID || volID == mHcel5VolID || volID == mHcel6VolID)) {
128 // charged particle in amplification gap (Hcel)
129 if (fMC->IsTrackEntering() || fMC->IsNewTrack()) { // entering or newly created
130 mMipEloss = 0; // reset Eloss collector
131 fMC->TrackPosition(mMipEntry[0], mMipEntry[1], mMipEntry[2]); // take position at the entrance
132 } else if (fMC->IsTrackExiting() || fMC->IsTrackStop() || fMC->IsTrackDisappeared()) { // exiting or disappeared
133 mMipEloss += fMC->Edep(); // take into account last step Eloss
134 Int_t tid = fMC->GetStack()->GetCurrentTrackNumber(); // take TID
135 Int_t pid = fMC->TrackPid(); // take PID
136 Double_t out[3];
137 fMC->TrackPosition(out[0], out[1], out[2]); // take MARS position at exit
138 Float_t hitTime = (Float_t)fMC->TrackTime(); // hit formation time
139 out[0] = 0.5 * (out[0] + mMipEntry[0]); //
140 out[1] = 0.5 * (out[1] + mMipEntry[1]); // take hit position at the anod plane
141 out[2] = 0.5 * (out[2] + mMipEntry[2]);
142 Int_t idch; // chamber number
143 if (volID == mHcel0VolID) {
144 idch = 0;
145 } else if (volID == mHcel1VolID) {
146 idch = 1;
147 } else if (volID == mHcel2VolID) {
148 idch = 2;
149 } else if (volID == mHcel3VolID) {
150 idch = 3;
151 } else if (volID == mHcel4VolID) {
152 idch = 4;
153 } else if (volID == mHcel5VolID) {
154 idch = 5;
155 } else if (volID == mHcel6VolID) {
156 idch = 6;
157 }
158 Double_t xl, yl;
159 o2::hmpid::Param::instance()->mars2Lors(idch, out, xl, yl); // take LORS position
160 if (mMipEloss > 0) {
161 // HIT for MIP, position near anod plane, eloss will be set to Q
162 AddHit(out[0], out[1], out[2], hitTime, mMipEloss, tid, idch);
163 GenFee(mMipEloss); // generate feedback photons
164 stack->addHit(GetDetId());
165 mMipEloss = 0;
166 }
167 } else {
168 // just going inside
169 mMipEloss += fMC->Edep(); // collect this step eloss
170 }
171 return kTRUE;
172 } // MIP in GAP
173
174 // later on return true if there was a hit!
175 return false;
176}
177//*********************************************************************************************************
178o2::hmpid::HitType* Detector::AddHit(float x, float y, float z, float time, float energy, Int_t trackId, Int_t detId)
179{
180 mHits->emplace_back(x, y, z, time, energy, trackId, detId);
181 return &(mHits->back());
182}
183//*********************************************************************************************************
185{
186 // Generate FeedBack photons for the current particle. To be invoked from StepManager().
187 // eloss=0 means photon so only pulse height distribution is to be analysed.
188 TLorentzVector x4;
189 fMC->TrackPosition(x4);
190 Int_t iNphotons = o2::base::simRandom()->Poisson(0.02 * qtot); // # of feedback photons is proportional to the charge of hit
191 // AliDebug(1,Form("N photons=%i",iNphotons));
192 Int_t j;
193 Float_t cthf, phif, enfp = 0, sthf, e1[3], e2[3], e3[3], vmod, uswop, dir[3], phi, pol[3], mom[4];
194 // Generate photons
195 for (Int_t i = 0; i < iNphotons; i++) { // feedbacks loop
196 Double_t ranf[2];
197 o2::base::simRandom()->RndmArray(2, ranf); // Sample direction
198 cthf = ranf[0] * 2 - 1.0;
199 if (cthf < 0) {
200 continue;
201 }
202 sthf = TMath::Sqrt((1. - cthf) * (1. + cthf));
203 phif = ranf[1] * 2 * TMath::Pi();
204
205 if (Double_t randomNumber = o2::base::simRandom()->Rndm() <= 0.57) {
206 enfp = 7.5e-9;
207 } else if (randomNumber <= 0.7) {
208 enfp = 6.4e-9;
209 } else {
210 enfp = 7.9e-9;
211 }
212
213 dir[0] = sthf * TMath::Sin(phif);
214 dir[1] = cthf;
215 dir[2] = sthf * TMath::Cos(phif);
216 fMC->Gdtom(dir, mom, 2);
217 mom[0] *= enfp;
218 mom[1] *= enfp;
219 mom[2] *= enfp;
220 mom[3] = TMath::Sqrt(mom[0] * mom[0] + mom[1] * mom[1] + mom[2] * mom[2]);
221
222 // Polarisation
223 e1[0] = 0;
224 e1[1] = -dir[2];
225 e1[2] = dir[1];
226 e2[0] = -dir[1];
227 e2[1] = dir[0];
228 e2[2] = 0;
229 e3[0] = dir[1];
230 e3[1] = 0;
231 e3[2] = -dir[0];
232
233 vmod = 0;
234 for (j = 0; j < 3; j++) {
235 vmod += e1[j] * e1[j];
236 }
237 if (!vmod) {
238 for (j = 0; j < 3; j++) {
239 uswop = e1[j];
240 e1[j] = e3[j];
241 e3[j] = uswop;
242 }
243 }
244 vmod = 0;
245 for (j = 0; j < 3; j++) {
246 vmod += e2[j] * e2[j];
247 }
248 if (!vmod) {
249 for (j = 0; j < 3; j++) {
250 uswop = e2[j];
251 e2[j] = e3[j];
252 e3[j] = uswop;
253 }
254 }
255
256 vmod = 0;
257 for (j = 0; j < 3; j++) {
258 vmod += e1[j] * e1[j];
259 }
260 vmod = TMath::Sqrt(1 / vmod);
261 for (j = 0; j < 3; j++) {
262 e1[j] *= vmod;
263 }
264 vmod = 0;
265 for (j = 0; j < 3; j++) {
266 vmod += e2[j] * e2[j];
267 }
268 vmod = TMath::Sqrt(1 / vmod);
269 for (j = 0; j < 3; j++) {
270 e2[j] *= vmod;
271 }
272
273 phi = o2::base::simRandom()->Rndm() * 2 * TMath::Pi();
274 for (j = 0; j < 3; j++) {
275 pol[j] = e1[j] * TMath::Sin(phi) + e2[j] * TMath::Cos(phi);
276 }
277 fMC->Gdtom(pol, pol, 2);
278 Int_t outputNtracksStored;
279 } // feedbacks loop
280} // GenerateFeedbacks()
281//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
283{
284 // Calculate probability for the photon to be lost by Fresnel reflection.
285 TLorentzVector p4;
286 Double_t mom[3], localMom[3];
287 fMC->TrackMomentum(p4);
288 mom[0] = p4(1);
289 mom[1] = p4(2);
290 mom[2] = p4(3);
291 localMom[0] = 0;
292 localMom[1] = 0;
293 localMom[2] = 0;
294 fMC->Gmtod(mom, localMom, 2);
295 Double_t localTc = localMom[0] * localMom[0] + localMom[2] * localMom[2];
296 Double_t localTheta = TMath::ATan2(TMath::Sqrt(localTc), localMom[1]);
297 Double_t cotheta = TMath::Abs(TMath::Cos(localTheta));
298 if (o2::base::simRandom()->Rndm() < Fresnel(p4.E() * 1e9, cotheta, 1)) {
299 // AliDebug(1,"Photon lost");
300 return kTRUE;
301 } else {
302 return kFALSE;
303 }
304} // IsLostByFresnel()
305//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
306Float_t Detector::Fresnel(Float_t ene, Float_t pdoti, Bool_t pola)
307{
308 // Correction for Fresnel ???????????
309 // Arguments: ene - photon energy [GeV],
310 // PDOTI=COS(INC.ANG.), PDOTR=COS(POL.PLANE ROT.ANG.)
311 // Returns:
312 Float_t en[36] = {5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2,
313 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7,
314 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5};
315 Float_t csin[36] = {2.14, 2.21, 2.33, 2.48, 2.76, 2.97, 2.99, 2.59, 2.81, 3.05,
316 2.86, 2.53, 2.55, 2.66, 2.79, 2.96, 3.18, 3.05, 2.84, 2.81, 2.38, 2.11,
317 2.01, 2.13, 2.39, 2.73, 3.08, 3.15, 2.95, 2.73, 2.56, 2.41, 2.12, 1.95,
318 1.72, 1.53};
319 Float_t csik[36] = {0., 0., 0., 0., 0., 0.196, 0.408, 0.208, 0.118, 0.49, 0.784, 0.543,
320 0.424, 0.404, 0.371, 0.514, 0.922, 1.102, 1.139, 1.376, 1.461, 1.253, 0.878,
321 0.69, 0.612, 0.649, 0.824, 1.347, 1.571, 1.678, 1.763, 1.857, 1.824, 1.824,
322 1.714, 1.498};
323 Float_t xe = ene;
324 Int_t j = Int_t(xe * 10) - 49;
325 Float_t cn = csin[j] + ((csin[j + 1] - csin[j]) / 0.1) * (xe - en[j]);
326 Float_t ck = csik[j] + ((csik[j + 1] - csik[j]) / 0.1) * (xe - en[j]);
327
328 // FORMULAE FROM HANDBOOK OF OPTICS, 33.23 OR
329 // W.R. HUNTER, J.O.S.A. 54 (1964),15 , J.O.S.A. 55(1965),1197
330
331 Float_t sinin = TMath::Sqrt((1. - pdoti) * (1. + pdoti));
332 Float_t tanin = sinin / pdoti;
333
334 Float_t c1 = cn * cn - ck * ck - sinin * sinin;
335 Float_t c2 = 4 * cn * cn * ck * ck;
336 Float_t aO = TMath::Sqrt(0.5 * (TMath::Sqrt(c1 * c1 + c2) + c1));
337 Float_t b2 = 0.5 * (TMath::Sqrt(c1 * c1 + c2) - c1);
338
339 Float_t rs = ((aO - pdoti) * (aO - pdoti) + b2) / ((aO + pdoti) * (aO + pdoti) + b2);
340 Float_t rp = rs * ((aO - sinin * tanin) * (aO - sinin * tanin) + b2) /
341 ((aO + sinin * tanin) * (aO + sinin * tanin) + b2);
342
343 // CORRECTION FACTOR FOR SURFACE ROUGHNESS
344 // B.J. STAGG APPLIED OPTICS, 30(1991),4113
345
346 Float_t sigraf = 18.;
347 Float_t lamb = 1240 / ene;
348 Float_t fresn;
349
350 Float_t rO = TMath::Exp(-(4 * TMath::Pi() * pdoti * sigraf / lamb) *
351 (4 * TMath::Pi() * pdoti * sigraf / lamb));
352
353 if (pola) {
354 Float_t pdotr = 0.8; // DEGREE OF POLARIZATION : 1->P , -1->S
355 fresn = 0.5 * (rp * (1 + pdotr) + rs * (1 - pdotr));
356 } else {
357 fresn = 0.5 * (rp + rs);
358 }
359
360 fresn = fresn * rO;
361 return fresn;
362} // Fresnel()
363//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
365
367{
368 if (!o2::utils::ShmManager::Instance().isOperational()) {
369 mHits->clear();
370 }
371}
372
373void Detector::IdealPosition(Int_t iCh, TGeoHMatrix* pMatrix) // ideal position of given chamber
374{
375 // Construct ideal position matrix for a given chamber
376 // Arguments: iCh- chamber ID; pMatrix- pointer to precreated unity matrix where to store the results
377 // Returns: none
378 const double kAngHor = 19.5; // horizontal angle between chambers 19.5 grad
379 const double kAngVer = 20; // vertical angle between chambers 20 grad
380 const double kAngCom = 30; // common HMPID rotation with respect to x axis 30 grad
381 const double kTrans[3] = {490, 0, 0}; // center of the chamber is on window-gap surface
382 pMatrix->RotateY(90); // rotate around y since initial position is in XY plane -> now in YZ plane
383 pMatrix->SetTranslation(kTrans); // now plane in YZ is shifted along x
384 switch (iCh) {
385 case 0:
386 pMatrix->RotateY(kAngHor);
387 pMatrix->RotateZ(-kAngVer);
388 break; // right and down
389 case 1:
390 pMatrix->RotateZ(-kAngVer);
391 break; // down
392 case 2:
393 pMatrix->RotateY(kAngHor);
394 break; // right
395 case 3:
396 break; // no rotation
397 case 4:
398 pMatrix->RotateY(-kAngHor);
399 break; // left
400 case 5:
401 pMatrix->RotateZ(kAngVer);
402 break; // up
403 case 6:
404 pMatrix->RotateY(-kAngHor);
405 pMatrix->RotateZ(kAngVer);
406 break; // left and up
407 }
408 pMatrix->RotateZ(kAngCom); // apply common rotation in XY plane
409 Double_t* t = pMatrix->GetTranslation();
410 t[1] += 30.;
411 pMatrix->SetTranslation(t);
412}
413
414void Detector::IdealPositionCradle(Int_t iCh, TGeoHMatrix* pMatrix) // ideal position of given one module of the cradle
415{
416 // Construct ideal position matrix for a given module cradle
417 // Arguments: iCh- chamber ID; pMatrix- pointer to precreated unity matrix where to store the results
418 // Returns: none
419 const double kAngHor = 19.5; // horizontal angle between chambers 19.5 grad
420 const double kAngVer = 20; // vertical angle between chambers 20 grad
421 const double kAngCom = 30; // common HMPID rotation with respect to x axis 30 grad
422 const double kTrans[3] = {423. + 29, 0, 67}; // z-center of the cradle module
423 pMatrix->RotateY(90); // rotate around y since initial position is in XY plane -> now in YZ plane
424 pMatrix->SetTranslation(kTrans); // now plane in YZ is shifted along x
425 switch (iCh) {
426 case 0:
427 pMatrix->RotateY(kAngHor);
428 pMatrix->RotateZ(-kAngVer);
429 break; // right and down
430 case 1:
431 pMatrix->RotateZ(-kAngVer);
432 break; // down
433 case 2:
434 pMatrix->RotateY(kAngHor);
435 break; // right
436 case 3:
437 break; // no rotation
438 case 4:
439 pMatrix->RotateY(-kAngHor);
440 break; // left
441 case 5:
442 pMatrix->RotateZ(kAngVer);
443 break; // up
444 case 6:
445 pMatrix->RotateY(-kAngHor);
446 pMatrix->RotateZ(kAngVer);
447 break; // left and up
448 }
449 pMatrix->RotateZ(kAngCom); // apply common rotation in XY plane
450 Double_t* t = pMatrix->GetTranslation();
451 t[1] += 30.;
452 pMatrix->SetTranslation(t);
453}
454
455//*********************************************************************************************************
456
458{
459 // implement materials here
460 // Definition of available HMPID materials
461 // Arguments: none
462 // Returns: none
463
464 // clm update material definition later on from Antonello
465 // Ported to O2 (24.4.2018) -- taken from AliRoot AliHMPIDv3
466
467 // data from PDG booklet 2002 density [gr/cm^3] rad len [cm] abs len [cm]
468 float aAir[4] = {12, 14, 16, 36}, zAir[4] = {6, 7, 8, 18}, wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827},
469 dAir = 0.00120479;
470 int nAir = 4; // mixture 0.9999999
471 float aC6F14[2] = {12.01, 18.99}, zC6F14[2] = {6, 9}, wC6F14[2] = {6, 14}, dC6F14 = 1.68;
472 int nC6F14 = -2;
473 float aSiO2[2] = {28.09, 15.99}, zSiO2[2] = {14, 8}, wSiO2[2] = {1, 2}, dSiO2 = 2.64;
474 int nSiO2 = -2;
475 float aCH4[2] = {12.01, 1.01}, zCH4[2] = {6, 1}, wCH4[2] = {1, 4}, dCH4 = 7.17e-4;
476 int nCH4 = -2;
477
478 float aRoha = 12.01, zRoha = 6, dRoha = 0.10, radRoha = 18.80,
479 absRoha = 86.3 / dRoha; // special material- quasi quartz
480 float aCu = 63.55, zCu = 29, dCu = 8.96, radCu = 1.43, absCu = 134.9 / dCu;
481 float aW = 183.84, zW = 74, dW = 19.30, radW = 0.35, absW = 185.0 / dW;
482 float aAl = 26.98, zAl = 13, dAl = 2.70, radAl = 8.90, absAl = 106.4 / dAl;
483 float aAr = 39.94, zAr = 18, dAr = 1.396e-3, radAr = 14.0, absAr = 117.2 / dAr;
484
485 int matId = 0; // tmp material id number
486 int unsens = 0, sens = 1; // sensitive or unsensitive medium
487 int itgfld;
488 float maxfld;
490
491 float tmaxfd = -10.0; // max deflection angle due to magnetic field in one step
492 float deemax = -0.2; // max fractional energy loss in one step
493 float stemax = -0.1; // max step allowed [cm]
494 float epsil = 0.001; // abs tracking precision [cm]
495 float stmin = -0.001; // min step size [cm] in continius process transport, negative value: choose it automatically
496
497 // PCB copmposed mainly by G10 (Si,C,H,O) -> CsI is negligible (<500nm thick)
498 // So what is called CsI has the optical properties of CsI, but the composition of G-10 (for delta elec, etc
499 // production...)
500
501 float aG10[4] = {28.09, 12.01, 1.01, 16.00};
502 float zG10[4] = {14., 6., 1., 8.};
503 float wG10[4] = {0.129060, 0.515016, 0.061873, 0.294050};
504 float dG10 = 1.7;
505 int nG10 = 4;
506
507 Mixture(++matId, "Air", aAir, zAir, dAir, nAir, wAir);
508 Medium(kAir, "Air", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
509
510 Mixture(++matId, "C6F14", aC6F14, zC6F14, dC6F14, nC6F14, wC6F14);
511 Medium(kC6F14, "C6F14", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
512
513 Mixture(++matId, "SiO2", aSiO2, zSiO2, dSiO2, nSiO2, wSiO2);
514 Medium(kSiO2, "SiO2", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
515
516 Mixture(++matId, "CH4", aCH4, zCH4, dCH4, nCH4, wCH4);
517 Medium(kCH4, "CH4", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
518
519 Mixture(++matId, "CsI+PCB", aG10, zG10, dG10, nG10, wG10);
520 Medium(kCsI, "CsI", matId, sens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin); // sensitive
521
522 Mixture(++matId, "Neo", aSiO2, zSiO2, dSiO2, nSiO2, wSiO2);
523 Medium(kNeo, "Neo", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin); // clm neoceram
524
525 Material(++matId, "Roha", aRoha, zRoha, dRoha, radRoha, absRoha);
526 Medium(kRoha, "Roha", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin); // Roha->honeycomb
527
528 Material(++matId, "Cu", aCu, zCu, dCu, radCu, absCu);
529 Medium(kCu, "Cu", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
530
531 Material(++matId, "W", aW, zW, dW, radW, absW);
532 Medium(kW, "W", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
533
534 Material(++matId, "Al", aAl, zAl, dAl, radAl, absAl);
535 Medium(kAl, "Al", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
536
537 Material(++matId, "Ar", aAr, zAr, dAr, radAr, absAr);
538 Medium(kAr, "Ar", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
539}
540//**************************************************************************************************
541TGeoVolume* Detector::createAbsorber(int chamber, float tickness)
542{
543 double cm = 1, mm = 0.1 * cm, um = 0.001 * mm; // default is cm
545 TGeoMedium* al = matmgr.getTGeoMedium("HMP_Al");
546 // one volume per chamber: the two plates differ in thickness, so a shared name
547 // would leave two different volumes answering to "Habs" and two placements whose
548 // node paths are both /cave_1/barrel_1/Habs_0
549 TGeoVolume* abs = gGeoManager->MakeBox(Form("Habs%d", chamber), al, tickness * mm / 2, 1300.00 * mm / 2, 1300 * mm / 2);
550 return abs;
551}
552//**************************************************************************************************
553
554TGeoVolume* Detector::createChamber(int number)
555{
556 // Single module geometry building
557
558 double cm = 1, mm = 0.1 * cm, um = 0.001 * mm; // default is cm
559
560 TGeoVolume* hmp = new TGeoVolumeAssembly(Form("Hmp%i", number));
561
563
564 TGeoMedium* al = matmgr.getTGeoMedium("HMP_Al");
565 TGeoMedium* ch4 = matmgr.getTGeoMedium("HMP_CH4");
566 TGeoMedium* roha = matmgr.getTGeoMedium("HMP_Roha");
567 TGeoMedium* neoc = matmgr.getTGeoMedium("HMP_Neo");
568 TGeoMedium* c6f14 = matmgr.getTGeoMedium("HMP_C6F14");
569 TGeoMedium* sio2 = matmgr.getTGeoMedium("HMP_SiO2");
570 TGeoMedium* cu = matmgr.getTGeoMedium("HMP_Cu");
571 TGeoMedium* w = matmgr.getTGeoMedium("HMP_W");
572 TGeoMedium* csi = matmgr.getTGeoMedium("HMP_CsI");
573 TGeoMedium* ar = matmgr.getTGeoMedium("HMP_Ar");
574
575 TGeoRotation* rot = new TGeoRotation("HwireRot");
576 rot->RotateY(90); // rotate wires around Y to be along X (initially along Z)
577 TGeoVolume* sbo = gGeoManager->MakeBox("Hsbo", ch4, 1419 * mm / 2, 1378.00 * mm / 2, 50.5 * mm / 2); // 2072P1
578 TGeoVolume* cov = gGeoManager->MakeBox("Hcov", al, 1419 * mm / 2, 1378.00 * mm / 2, 0.5 * mm / 2);
579 TGeoVolume* hon = gGeoManager->MakeBox("Hhon", roha, 1359 * mm / 2, 1318.00 * mm / 2, 49.5 * mm / 2);
580 TGeoVolume* rad = gGeoManager->MakeBox("Hrad", c6f14, 1330 * mm / 2, 413.00 * mm / 2, 24.0 * mm / 2); // 2011P1
581 TGeoVolume* neo = gGeoManager->MakeBox("Hneo", neoc, 1330 * mm / 2, 413.00 * mm / 2, 4.0 * mm / 2);
582 TGeoVolume* win = gGeoManager->MakeBox("Hwin", sio2, 1330 * mm / 2, 413.00 * mm / 2, 5.0 * mm / 2);
583 TGeoVolume* si1 = gGeoManager->MakeBox("Hsi1", sio2, 1330 * mm / 2, 5.00 * mm / 2, 15.0 * mm / 2);
584 TGeoVolume* si2 = gGeoManager->MakeBox("Hsi2", neoc, 10 * mm / 2, 403.00 * mm / 2, 15.0 * mm / 2);
585 TGeoVolume* spa = gGeoManager->MakeTube("Hspa", sio2, 0 * mm, 5.00 * mm, 15.0 * mm / 2);
586 TGeoVolume* fr4 = gGeoManager->MakeBox("Hfr4", ch4, 1407 * mm / 2, 1366.00 * mm / 2, 15.0 * mm / 2); // 2043P1
587 TGeoVolume* f4a = gGeoManager->MakeBox("Hf4a", al, 1407 * mm / 2, 1366.00 * mm / 2, 10.0 * mm / 2);
588 TGeoVolume* f4i = gGeoManager->MakeBox("Hf4i", ch4, 1323 * mm / 2, 1296.00 * mm / 2, 10.0 * mm / 2);
589 TGeoVolume* col = gGeoManager->MakeTube("Hcol", cu, 0 * mm, 100.00 * um, 1323.0 * mm / 2);
590 TGeoVolume* sec = gGeoManager->MakeBox("Hsec", ch4, 648 * mm / 2, 411.00 * mm / 2,
591 6.2 * mm / 2); // sec=gap 2099P1 (6.2 = 4.45 + 0.05 (1/2 diameter wire)+1.7)
592
593 double cellx = 8.04 * mm, celly = 8.4 * mm;
594 int nPadX = 80, nPadY = 48;
595 TGeoVolume* gap = gGeoManager->MakeBox("Hgap", ch4, cellx * nPadX / 2, celly * nPadY / 2,
596 6.2 * mm / 2); // x=8.04*80 y=8.4*48 z=pad+pad-ano+marign 2006p1
597 TGeoVolume* row = gap->Divide("Hrow", 2, nPadY, 0, 0); // along Y->48 rows
598 TGeoVolume* cel = row->Divide(Form("Hcel%i", number), 1, nPadX, 0, 0); // along X->80 cells
599 mSensitiveVolumes.emplace_back(cel);
600
601 TGeoVolume* cat = gGeoManager->MakeTube("Hcat", cu, 0.00 * mm, 50.00 * um, cellx / 2);
602 TGeoVolume* ano = gGeoManager->MakeTube("Hano", w, 0.00 * mm, 20.00 * um, cellx / 2);
603 TGeoVolume* pad = gGeoManager->MakeBox(Form("Hpad%i", number), csi, 7.54 * mm / 2, 7.90 * mm / 2,
604 1.7 * mm / 2); // 2006P1 PCB material...
605 mSensitiveVolumes.emplace_back(pad);
606
607 TGeoVolume* fr1 = gGeoManager->MakeBox("Hfr1", al, 1463 * mm / 2, 1422.00 * mm / 2,
608 58.3 * mm / 2); // 2040P1 and pad plane is excluded (62 - 2 - 17)
609 TGeoVolume* fr1up = gGeoManager->MakeBox("Hfr1up", ch4, (1426.00 - 37.00) * mm / 2, (1385.00 - 37.00) * mm / 2,
610 20.0 * mm / 2); // 2040P1
611
612 TGeoVolume* fr1upcard = gGeoManager->MakeBox("Hfr1upcard", ch4, 662. * mm / 2., 425. * mm / 2.,
613 19.0 * mm / 2); // needed to set the gassiplex
614
615 TGeoVolume* fr1perUpBig = gGeoManager->MakeBox("Hfr1perUpBig", ch4, 1389 * mm / 2, 35 * mm / 2, 10 * mm / 2);
616 TGeoVolume* fr1perUpSma =
617 gGeoManager->MakeBox("Hfr1perUpSma", ch4, 35 * mm / 2, (1385 - 37 - 2 * 35) * mm / 2, 10 * mm / 2);
618 TGeoVolume* fr1perDowBig = gGeoManager->MakeBox("Hfr1perDowBig", ch4, 1389 * mm / 2, 46 * mm / 2, 2.3 * mm / 2);
619 TGeoVolume* fr1perDowSma =
620 gGeoManager->MakeBox("Hfr1perDowSma", ch4, 46 * mm / 2, (1385 - 37 - 2 * 46) * mm / 2, 2.3 * mm / 2);
621
622 TGeoVolume* ppf = gGeoManager->MakeBox("Hppf", al, 648 * mm / 2, 411.00 * mm / 2, 38.3 * mm / 2); // 2001P2
623 TGeoVolume* lar = gGeoManager->MakeBox("Hlar", ar, 181 * mm / 2, 89.25 * mm / 2, 38.3 * mm / 2); // 2001P2
624 TGeoVolume* smo = gGeoManager->MakeBox("Hsmo", ar, 114 * mm / 2, 89.25 * mm / 2, 38.3 * mm / 2); // 2001P2
625
626 TGeoVolume* cufoil = gGeoManager->MakeBox("Hcufoil", csi, 662. * mm / 2., 425. * mm / 2.,
627 1. * mm / 2.); // PCB foil at the back of the ppf with holes for GASSIPLEX
628 TGeoVolume* rect = gGeoManager->MakeBox("Hrect", ch4, 48 * mm / 2, 19 * mm / 2., 1 * mm / 2.);
629
630 TGeoVolume* fr3 = gGeoManager->MakeBox("Hfr3", al, 1463 * mm / 2, 1422 * mm / 2, 34 * mm / 2); // 2041P1
631 TGeoVolume* fr3up = gGeoManager->MakeBox("Hfr3up", ch4, 1323 * mm / 2, 1282 * mm / 2, 20 * mm / 2); // 2041P1
632 TGeoVolume* fr3down = gGeoManager->MakeBox("Hfr3down", ch4, 1437 * mm / 2, 1370 * mm / 2, 14 * mm / 2); // 2041P1
633
634 TGeoVolume* proxgap1 = gGeoManager->MakeBox("Hproxgap1", ch4, 1407 * mm / 2, 1366.00 * mm / 2,
635 (9. - 7.5) * mm / 2.); // methane volume between quartz and fr4
636 TGeoVolume* proxgap2 = gGeoManager->MakeBox("Hproxgap2", ch4, 1407 * mm / 2, 1366.00 * mm / 2,
637 (81.7 - 6.2 - 34. - 9. - 7.5) * mm / 2.); // methane volume between fr4
638 // and Hgap(tot height(81.7) -
639 // Hsec (6.2) - proxygap2 (34)
640 // -upper bound of fr4 (9+7.5))
641
642 // ^ Y z= z=-12mm z=98.25mm ALIC->7xHmp (virtual)-->1xHsbo (virtual) --->2xHcov (real)
643 // 2072P1
644 // | ____________________________________ | |-->1xHhon (real)
645 // 2072P1
646 // | | ______ ____ ______ | |
647 // | | | | | * | | | |->3xHrad (virtual) --->1xHneo (real)
648 // 2011P1
649 // | |50.5mm| |24mm| * |45.5mm| | | |-->1xHwin (real)
650 // 2011P1
651 // | | | | | * | | | | |-->2xHsi1 (real)
652 // 2011P1
653 // | | | |____| * |______| | | |-->2xHsi2 (real)
654 // 2011P1
655 // | | | ____ * ______ | | |->30xHspa (real)
656 // 2011P1
657 // | | | | | * | | | |
658 // | | | | | * | | | |->1xHfr4 (vitual) --->1xHf4a
659 // (real)---->1xHf4i(virtual) 2043P1
660 // | | sb | | rad| * | | | | |-->322xHcol (real)
661 // 2043P1
662 // | | | |____| * |______| | |
663 // | | | ____ * ______ | |->1xHfr1 (real) --> 6xHppf(real)
664 // ---->8xHlar (virtual) 2001P1
665 // | | | | | * | | | | |--->8xHsmo (virtual) 2001P1
666 // | | | | | * | | | |
667 // | | | | | * | | | |-> 6xHgap (virtual) --->48xHrow
668 // (virtual) -->80xHcel (virtual) -->4xHcat (real) from p84 TDR
669 // | |______| |____| * |______| | |-->2xHano (real) from p84 TDR
670 // |____________________________________| |-->1xHpad (real) from p84 TDR
671 // --->Z
672 hmp->AddNode(sbo, 1, new TGeoTranslation(0 * mm, 0 * mm, -73.75 * mm)); // p.84 TDR
673 sbo->AddNode(hon, 1, new TGeoTranslation(0 * mm, 0 * mm, 0 * mm)); // 2072P1
674 sbo->AddNode(cov, 1, new TGeoTranslation(0 * mm, 0 * mm, +25 * mm));
675 sbo->AddNode(cov, 2, new TGeoTranslation(0 * mm, 0 * mm, -25 * mm));
676 hmp->AddNode(rad, 2, new TGeoTranslation(0 * mm, +434 * mm, -12.00 * mm));
677 hmp->AddNode(rad, 1, new TGeoTranslation(0 * mm, 0 * mm, -12.00 * mm));
678 hmp->AddNode(rad, 0, new TGeoTranslation(0 * mm, -434 * mm, -12.00 * mm));
679 rad->AddNode(neo, 1, new TGeoTranslation(0 * mm, 0 * mm, -10.0 * mm));
680 rad->AddNode(win, 1, new TGeoTranslation(0 * mm, 0 * mm, 9.5 * mm));
681 rad->AddNode(si1, 1, new TGeoTranslation(0 * mm, -204 * mm, -0.5 * mm));
682 rad->AddNode(si1, 2, new TGeoTranslation(0 * mm, +204 * mm, -0.5 * mm));
683 rad->AddNode(si2, 1, new TGeoTranslation(-660 * mm, 0 * mm, -0.5 * mm));
684 rad->AddNode(si2, 2, new TGeoTranslation(+660 * mm, 0 * mm, -0.5 * mm));
685 for (Int_t i = 0; i < 3; i++) {
686 for (Int_t j = 0; j < 10; j++) {
687 rad->AddNode(spa, 10 * i + j,
688 new TGeoTranslation(-1330 * mm / 2 + 116 * mm + j * 122 * mm, (i - 1) * 105 * mm, -0.5 * mm));
689 }
690 }
691 hmp->AddNode(fr4, 1, new TGeoTranslation(0 * mm, 0 * mm, 9.00 * mm)); // p.84 TDR
692 for (int i = 1; i <= 322; i++) {
693 fr4->AddNode(col, i, new TGeoCombiTrans(0 * mm, -1296 / 2 * mm + i * 4 * mm, -5 * mm, rot)); // F4 2043P1
694 }
695 fr4->AddNode(f4a, 1, new TGeoTranslation(0 * mm, 0 * mm, 2.5 * mm));
696 f4a->AddNode(f4i, 1, new TGeoTranslation(0 * mm, 0 * mm, 0 * mm));
697 hmp->AddNode(sec, 4, new TGeoTranslation(-335 * mm, +433 * mm, 78.6 * mm));
698 hmp->AddNode(sec, 5, new TGeoTranslation(+335 * mm, +433 * mm, 78.6 * mm));
699 hmp->AddNode(sec, 2, new TGeoTranslation(-335 * mm, 0 * mm, 78.6 * mm));
700 hmp->AddNode(sec, 3, new TGeoTranslation(+335 * mm, 0 * mm, 78.6 * mm));
701 hmp->AddNode(sec, 0, new TGeoTranslation(-335 * mm, -433 * mm, 78.6 * mm));
702 hmp->AddNode(sec, 1, new TGeoTranslation(+335 * mm, -433 * mm, 78.6 * mm));
703 sec->AddNode(gap, 1, new TGeoTranslation(0, 0, 0. * mm));
704 cel->AddNode(cat, 1, new TGeoCombiTrans(0, 3.15 * mm, -2.70 * mm, rot)); // 4 cathode wires
705 cel->AddNode(ano, 1, new TGeoCombiTrans(0, 2.00 * mm, -0.29 * mm, rot)); // 2 anod wires
706 cel->AddNode(cat, 2, new TGeoCombiTrans(0, 1.05 * mm, -2.70 * mm, rot));
707 cel->AddNode(cat, 3, new TGeoCombiTrans(0, -1.05 * mm, -2.70 * mm, rot));
708 cel->AddNode(ano, 2, new TGeoCombiTrans(0, -2.00 * mm, -0.29 * mm, rot));
709 cel->AddNode(cat, 4, new TGeoCombiTrans(0, -3.15 * mm, -2.70 * mm, rot));
710 cel->AddNode(pad, 1, new TGeoTranslation(0, 0.00 * mm, 2.25 * mm)); // 1 pad
711
712 hmp->AddNode(fr1, 1, new TGeoTranslation(0., 0., (80. + 1.7) * mm + 58.3 * mm / 2.));
713 fr1->AddNode(fr1up, 1, new TGeoTranslation(0., 0., (58.3 * mm - 20.00 * mm) / 2.));
714
715 fr1->AddNode(fr1perUpBig, 0,
716 new TGeoTranslation(0., (1385 - 37 - 35) * mm / 2., (58.3 * mm - 20.00 * 2 * mm - 10.0 * mm) / 2.));
717 fr1->AddNode(fr1perUpSma, 0,
718 new TGeoTranslation((1426 - 37 - 35) * mm / 2., 0., (58.3 * mm - 20.00 * 2 * mm - 10.0 * mm) / 2.));
719 fr1->AddNode(fr1perUpBig, 1,
720 new TGeoTranslation(0., -(1385 - 37 - 35) * mm / 2., (58.3 * mm - 20.00 * 2 * mm - 10.0 * mm) / 2.));
721 fr1->AddNode(fr1perUpSma, 1,
722 new TGeoTranslation(-(1426 - 37 - 35) * mm / 2., 0., (58.3 * mm - 20.00 * 2 * mm - 10.0 * mm) / 2.));
723
724 fr1->AddNode(fr1perDowBig, 0, new TGeoTranslation(0., (1385 - 37) * mm / 2., (-58.3 * mm + 2.3 * mm) / 2.));
725 fr1->AddNode(fr1perDowSma, 0, new TGeoTranslation((1426 - 37) * mm / 2., 0., (-58.3 * mm + 2.3 * mm) / 2.));
726 fr1->AddNode(fr1perDowBig, 1, new TGeoTranslation(0., -(1385 - 37) * mm / 2., (-58.3 * mm + 2.3 * mm) / 2.));
727 fr1->AddNode(fr1perDowSma, 1, new TGeoTranslation(-(1426 - 37) * mm / 2., 0., (-58.3 * mm + 2.3 * mm) / 2.));
728
729 fr1->AddNode(ppf, 4, new TGeoTranslation(-335 * mm, 433 * mm, (-58.3 + 38.3) * mm / 2.));
730 fr1->AddNode(ppf, 5, new TGeoTranslation(335 * mm, 433 * mm, (-58.3 + 38.3) * mm / 2.));
731 fr1->AddNode(ppf, 2, new TGeoTranslation(-335 * mm, 0., (-58.3 + 38.3) * mm / 2.));
732 fr1->AddNode(ppf, 3, new TGeoTranslation(335 * mm, 0., (-58.3 + 38.3) * mm / 2.));
733 fr1->AddNode(ppf, 0, new TGeoTranslation(-335 * mm, -433 * mm, (-58.3 + 38.3) * mm / 2.));
734 fr1->AddNode(ppf, 1, new TGeoTranslation(335 * mm, -433 * mm, (-58.3 + 38.3) * mm / 2.));
735
736 Double_t offsetx = 16. * mm, offsety = 34. * mm / 2., interdistx = 48 * mm + offsetx + 0.6666 * mm,
737 interdisty = 19. * mm + 2. * offsety;
738
739 // gassiplex implementation
740 // it is in 3 different volumes: Hrec (in Hcufoil)+Hext
741
742 TGeoVolume* gassipl2 = gGeoManager->MakeBox("Hgassipl2", csi, 32. * mm / 2, 3. * mm / 2., 1. * mm / 2.); // in Hrect
743 TGeoVolume* gassipl3 =
744 gGeoManager->MakeBox("Hgassipl3", csi, 60. * mm / 2, 3. * mm / 2., 19. * mm / 2.); // in Hfr1upcard
745 TGeoVolume* gassipl4 = gGeoManager->MakeBox(
746 "Hgassipl4", csi, 60. * mm / 2, 3. * mm / 2.,
747 91. * mm / 2.); // in Hext (the big rectangle of the card is 110 mm long, 62 mm wide and 1.5 mm high)
748 TGeoVolume* busext = gGeoManager->MakeTubs("Hbusext", csi, 29 * mm, 30 * mm, 40 * mm / 2., 0., 180); // in Hext
749 TGeoVolume* ext = new TGeoVolumeAssembly("Hext");
750
751 rect->AddNode(gassipl2, 1, new TGeoTranslation(0., 0., 0));
752
753 for (Int_t hor = 0; hor < 10; hor++) {
754 for (Int_t vert = 0; vert < 8; vert++) {
755 cufoil->AddNode(rect, hor + vert * 10,
756 new TGeoTranslation(offsetx + 48. * mm / 2 + hor * interdistx - 662. * mm / 2,
757 offsety + 19. * mm / 2 + vert * interdisty - 425. * mm / 2., 0.));
758 fr1upcard->AddNode(gassipl3, hor + vert * 10,
759 new TGeoTranslation(offsetx + 48. * mm / 2 + hor * interdistx - 662. * mm / 2,
760 offsety + 19. * mm / 2 + vert * interdisty - 425. * mm / 2., 0.));
761 ext->AddNode(gassipl4, hor + vert * 10,
762 new TGeoTranslation(offsetx + 48. * mm / 2 + hor * interdistx - 662. * mm / 2,
763 offsety + 19. * mm / 2 + vert * interdisty - 425. * mm / 2., 0));
764 ext->AddNode(busext, hor + vert * 10,
765 new TGeoTranslation(offsetx + 48. * mm / 2 + hor * interdistx - 662. * mm / 2,
766 offsety + 19. * mm / 2 + vert * interdisty - 425. * mm / 2 + 3. * mm / 2., 0));
767 }
768 }
769
770 fr1up->AddNode(cufoil, 4, new TGeoTranslation(-335 * mm, 433 * mm, -20.0 * mm / 2 + 1. * mm / 2));
771 fr1up->AddNode(cufoil, 5, new TGeoTranslation(335 * mm, 433 * mm, -20.0 * mm / 2 + 1. * mm / 2));
772 fr1up->AddNode(cufoil, 2, new TGeoTranslation(-335 * mm, 0, -20.0 * mm / 2 + 1. * mm / 2));
773 fr1up->AddNode(cufoil, 3, new TGeoTranslation(335 * mm, 0, -20.0 * mm / 2 + 1. * mm / 2));
774 fr1up->AddNode(cufoil, 0, new TGeoTranslation(-335 * mm, -433 * mm, -20.0 * mm / 2 + 1. * mm / 2));
775 fr1up->AddNode(cufoil, 1, new TGeoTranslation(335 * mm, -433 * mm, -20.0 * mm / 2 + 1. * mm / 2));
776
777 fr1up->AddNode(fr1upcard, 4, new TGeoTranslation(-335 * mm, 433 * mm, 1. * mm / 2.));
778 fr1up->AddNode(fr1upcard, 5, new TGeoTranslation(335 * mm, 433 * mm, 1. * mm / 2.));
779 fr1up->AddNode(fr1upcard, 2, new TGeoTranslation(-335 * mm, 0, 1. * mm / 2.));
780 fr1up->AddNode(fr1upcard, 3, new TGeoTranslation(335 * mm, 0, 1. * mm / 2.));
781 fr1up->AddNode(fr1upcard, 0, new TGeoTranslation(-335 * mm, -433 * mm, 1. * mm / 2));
782 fr1up->AddNode(fr1upcard, 1, new TGeoTranslation(335 * mm, -433 * mm, 1. * mm / 2.));
783
784 hmp->AddNode(ext, 4, new TGeoTranslation(-335 * mm, +433 * mm, (80. + 1.7) * mm + 58.3 * mm + 91 * mm / 2.));
785 hmp->AddNode(ext, 5, new TGeoTranslation(+335 * mm, +433 * mm, (80. + 1.7) * mm + 58.3 * mm + 91 * mm / 2.));
786 hmp->AddNode(ext, 2, new TGeoTranslation(-335 * mm, 0 * mm, (80. + 1.7) * mm + 58.3 * mm + 91 * mm / 2.));
787 hmp->AddNode(ext, 3, new TGeoTranslation(+335 * mm, 0 * mm, (80. + 1.7) * mm + 58.3 * mm + 91 * mm / 2.));
788 hmp->AddNode(ext, 0, new TGeoTranslation(-335 * mm, -433 * mm, (80. + 1.7) * mm + 58.3 * mm + 91 * mm / 2.));
789 hmp->AddNode(ext, 1, new TGeoTranslation(+335 * mm, -433 * mm, (80. + 1.7) * mm + 58.3 * mm + 91 * mm / 2.));
790
791 hmp->AddNode(proxgap1, 0, new TGeoTranslation(0., 0., (9. - 7.5) * mm / 2.)); // due to the TGeoVolumeAssembly
792 // definition the ch4 volume must be
793 // inserted around the collecting wires
794 hmp->AddNode(proxgap2, 0,
795 new TGeoTranslation(0., 0., (9 + 7.5 + 34) * mm + (81.7 - 6.2 - 34. - 9. - 7.5) * mm / 2.)); // tot height(81.7) - Hsec - proxygap2 - top edge fr4 at(9+7.5) mm
796
797 // ^ Y single cell 5.5mm CH4 = 1*mm CsI + 4.45*mm CsI x cath +0.05*mm
798 // safety margin
799 // | ______________________________
800 // | | | ^ ||
801 // | | 1.05mm ||
802 // 2.2*mm| xxxxxxxxxxxxxxxxxxxxxxxxxxxx |-- 50um x || cat shift x=0mm , y= 3.15mm ,
803 // z=-2.70mm
804 // | | ||
805 // | | ||
806 // __ | .......................... | 2.1mm 20un . || ano shift x=0mm , y= 2.00mm ,
807 // z=-0.29mm
808 // | | ||
809 // | | ||
810 // | xxxxxxxxxxxxxxxxxxxxxxxxxxxx |-- x || cat shift x=0mm , y= 1.05mm ,
811 // z=-2.70mm
812 // | | ||
813 // | | 8.4mm ||
814 // 4*mm | | 2.1mm || pad shift x=0mm , y= 0.00mm ,
815 // z=2.25*mm
816 // | | ||
817 // | | ||
818 // | xxxxxxxxxxxxxxxxxxxxxxxxxxxx |-- x || cat shift x=0mm , y=-1.05mm ,
819 // z=-2.70mm
820 // | | ||
821 // | | ||
822 // __ | .......................... | 2.1mm . 2.04mm|| ano shift x=0mm , y=-2.00mm ,
823 // z=-0.29mm
824 // | | ||
825 // | | ||
826 // | xxxxxxxxxxxxxxxxxxxxxxxxxxxx |-- x 4.45mm || cat shift x=0mm , y=-3.15mm ,
827 // z=-2.70mm
828 // 2.2*mm| | ||
829 // | | 1.05mm ||
830 // |______________________________| v ||
831 // < 8 mm >
832 // ----->X ----->Z
833
834 ppf->AddNode(lar, 0, new TGeoTranslation(-224.5 * mm, -151.875 * mm, 0. * mm));
835 ppf->AddNode(lar, 1, new TGeoTranslation(-224.5 * mm, -50.625 * mm, 0. * mm));
836 ppf->AddNode(lar, 2, new TGeoTranslation(-224.5 * mm, +50.625 * mm, 0. * mm));
837 ppf->AddNode(lar, 3, new TGeoTranslation(-224.5 * mm, +151.875 * mm, 0. * mm));
838 ppf->AddNode(lar, 4, new TGeoTranslation(+224.5 * mm, -151.875 * mm, 0. * mm));
839 ppf->AddNode(lar, 5, new TGeoTranslation(+224.5 * mm, -50.625 * mm, 0. * mm));
840 ppf->AddNode(lar, 6, new TGeoTranslation(+224.5 * mm, +50.625 * mm, 0. * mm));
841 ppf->AddNode(lar, 7, new TGeoTranslation(+224.5 * mm, +151.875 * mm, 0. * mm));
842 ppf->AddNode(smo, 0, new TGeoTranslation(-65.0 * mm, -151.875 * mm, 0. * mm));
843 ppf->AddNode(smo, 1, new TGeoTranslation(-65.0 * mm, -50.625 * mm, 0. * mm));
844 ppf->AddNode(smo, 2, new TGeoTranslation(-65.0 * mm, +50.625 * mm, 0. * mm));
845 ppf->AddNode(smo, 3, new TGeoTranslation(-65.0 * mm, +151.875 * mm, 0. * mm));
846 ppf->AddNode(smo, 4, new TGeoTranslation(+65.0 * mm, -151.875 * mm, 0. * mm));
847 ppf->AddNode(smo, 5, new TGeoTranslation(+65.0 * mm, -50.625 * mm, 0. * mm));
848 ppf->AddNode(smo, 6, new TGeoTranslation(+65.0 * mm, +50.625 * mm, 0. * mm));
849 ppf->AddNode(smo, 7, new TGeoTranslation(+65.0 * mm, +151.875 * mm, 0. * mm));
850
851 // hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(81.7-29.)*mm-34.*mm/2));
852 hmp->AddNode(fr3, 1, new TGeoTranslation(0., 0., (9. + 7.5) * mm + 34. * mm / 2));
853 fr3->AddNode(fr3up, 1, new TGeoTranslation(0., 0., 7 * mm));
854 fr3->AddNode(fr3down, 1, new TGeoTranslation(0., 0., -10 * mm));
855
856 return hmp;
857}
858
859//*************************************************************************************************************
860
862{
863
864 // Method that builds the Cradle geometry
865 // according to the base topology created
866 // in CradleBaseVolume(...)
867
868 Double_t mm = 0.1;
869
870 Double_t params[10] = {0.5, 10., 24., -1, 5.2, 1.5, 3.5, 8.5, 3.8, 0.};
871 TGeoMedium* med = gGeoManager->GetMedium("HMP_Al");
872 TGeoVolume* cradle = new TGeoVolumeAssembly("Hcradle");
873
874 // Double_t baselong[7]={6037*mm-2*60*mm, 6037*mm-2*60*mm,60*mm,0.,100*mm,10*mm,10*mm};//2CRE2112P3
875 Double_t baselong[7] = {
876 6037 * mm - 2 * 100 * mm, 6037 * mm - 2 * 100 * mm, 60 * mm, 0., 100 * mm, 10 * mm, 10 * mm}; // 2CRE2112P3
877 TGeoVolume* lbase = CradleBaseVolume(med, baselong, "cradleLbase");
878 lbase->SetLineColor(kGray);
879
880 Double_t baseshort[7] = {
881 1288. * mm + 2 * 100 * mm, 1288. * mm + 2 * 100 * mm, 60 * mm, 0., 100 * mm, 10 * mm, 10 * mm}; // 2CRE2112P3
882 TGeoVolume* sbase = CradleBaseVolume(med, baseshort, "cradleSbase");
883 sbase->SetLineColor(kGray);
884
885 // one side
886
887 Double_t height = 30. * mm; // 30 = 2*(1488/2-729) (2CRE2112P3)
888 Double_t tubeh = 50. * mm; // tube height
889 Double_t heightred = 5. * mm;
890 Double_t zred = 5. * mm;
891 Double_t oneshift = tubeh / TMath::Tan(TMath::DegToRad() * 20.) + (1458. - 35) * mm / 2 - (1607 - 35) * mm / 2;
892 Double_t linclined[7] = {
893 1458. * mm - params[6] - 0.5, 1607. * mm - params[6] - 0.5, tubeh, oneshift, height, heightred, zred}; // 3.5 is for not correct measurements in 2CRE2112P3<=> 597!=inclined*sin(20)
894 TGeoVolume* inclin = CradleBaseVolume(med, linclined, "inclinedbar");
895 inclin->SetLineColor(kGray);
896 Double_t lhorizontal[7] = {
897 1641.36 * mm + params[7], 1659. * mm + params[7], tubeh, 0, height, heightred, zred};
898 TGeoVolume* horiz = CradleBaseVolume(med, lhorizontal, "horizontalbar");
899 horiz->SetLineColor(kGray);
900
901 // inner bars, they are named as the numbering in 2CRE2112P3
902 Double_t fourshift = tubeh / TMath::Tan(TMath::DegToRad() * 55.);
903 Double_t lfour[7] = {592 * mm, 592 * mm, tubeh, fourshift, height, heightred, zred};
904 TGeoVolume* four = CradleBaseVolume(med, lfour, "bar4");
905 four->SetLineColor(kGray);
906
907 Double_t fiveshift = tubeh / TMath::Tan(TMath::DegToRad() * 75);
908 Double_t lfive[7] = {500. * mm, 500. * mm, tubeh, fiveshift, height, heightred, zred};
909 TGeoVolume* five = CradleBaseVolume(med, lfive, "bar5");
910 five->SetLineColor(kGray);
911
912 Double_t sixshift = tubeh / TMath::Tan(TMath::DegToRad() * 55) + 459 * mm / 2 - 480 * mm / 2;
913 Double_t lsix[7] = {456 * mm, 477 * mm, tubeh, sixshift, height, heightred, zred};
914 TGeoVolume* six = CradleBaseVolume(med, lsix, "bar6");
915 six->SetLineColor(kGray);
916
917 Double_t sevenshift = tubeh / TMath::Tan(TMath::DegToRad() * 50) + 472 * mm / 2 - 429. * mm / 2;
918 Double_t lseven[7] = {429 * mm, 472 * mm, tubeh, sevenshift, height, heightred, zred};
919 TGeoVolume* seven = CradleBaseVolume(med, lseven, "bar7");
920 seven->SetLineColor(kGray);
921
922 Double_t eightshift = tubeh / TMath::Tan(TMath::DegToRad() * 30) + 244. * mm / 2 - 200. * mm / 2 - 3;
923 Double_t leight[7] = {200. * mm, 244. * mm, tubeh, eightshift, height, heightred, zred};
924 TGeoVolume* eight = CradleBaseVolume(med, leight, "bar8");
925 eight->SetLineColor(kGray);
926
927 Double_t nineshift = -tubeh / TMath::Tan(TMath::DegToRad() * 71) + 83. * mm / 2 - 66. * mm / 2;
928 Double_t lnine[7] = {59.5 * mm, 76.5 * mm, tubeh, nineshift, height, heightred, zred};
929 TGeoVolume* nine = CradleBaseVolume(med, lnine, "bar9");
930 nine->SetLineColor(kGray);
931
932 Double_t tenshift = (-tubeh / TMath::Tan(TMath::DegToRad() * 60) - 221. * mm / 2 + 195. * mm / 2);
933 Double_t lten[7] = {195. * mm, 221. * mm, tubeh, tenshift, height, heightred, zred};
934 TGeoVolume* ten = CradleBaseVolume(med, lten, "bar10");
935 ten->SetLineColor(kGray);
936
937 Double_t elevenshift = (-tubeh / TMath::Tan(TMath::DegToRad() * 70) - 338. * mm / 2 + 315. * mm / 2);
938 Double_t leleven[7] = {308. * mm, 331. * mm, tubeh, elevenshift, height, heightred, zred};
939 TGeoVolume* eleven = CradleBaseVolume(med, leleven, "bar11");
940 eleven->SetLineColor(kGray);
941
942 Double_t twelveshift = (-tubeh / TMath::Tan(TMath::DegToRad() * 60) - 538. * mm / 2 + 508. * mm / 2);
943 Double_t ltwelve[7] = {507. * mm, 537. * mm, tubeh, twelveshift, height, heightred, zred};
944 TGeoVolume* twelve = CradleBaseVolume(med, ltwelve, "bar12");
945 twelve->SetLineColor(kGray);
946
947 Double_t thirteenshift = tubeh / TMath::Tan(TMath::DegToRad() * 43);
948 Double_t lthirteen[7] = {708. * mm, 708. * mm, tubeh, thirteenshift, height, heightred, zred};
949 TGeoVolume* thirteen = CradleBaseVolume(med, lthirteen, "bar13");
950 thirteen->SetLineColor(kGray);
951
952 // vertical rectangles
953 TGeoVolume* vbox = new TGeoVolumeAssembly("Hvbox");
954 vbox->SetLineColor(kViolet);
955 Double_t width = 50. * mm;
956
957 TGeoVolume* vboxlast = new TGeoVolumeAssembly("Hvboxlast"); // vertical structure on the short base
958 vboxlast->SetLineColor(kViolet);
959
960 Double_t barheight = 100. * mm;
961 Double_t lAfourteen[7] = {1488. * mm, 1488. * mm, barheight, 0, width, heightred, zred};
962 TGeoVolume* afourteen = CradleBaseVolume(med, lAfourteen, "bar14top");
963 afourteen->SetLineColor(kGray);
964
965 Double_t lBfourteen[7] = {387 * mm, 387. * mm, barheight, 0, width, heightred, zred};
966 TGeoVolume* bfourteen = CradleBaseVolume(med, lBfourteen, "bar14vert");
967 bfourteen->SetLineColor(kGray);
968
969 Double_t lCfourteen[7] = {1288. * mm, 1288. * mm, barheight, 0, width, heightred, zred};
970 TGeoVolume* cfourteen = CradleBaseVolume(med, lCfourteen, "bar14bot");
971 cfourteen->SetLineColor(kGray);
972
973 Double_t oblshift = 50. * mm / TMath::Tan(TMath::DegToRad() * 35);
974 Double_t lDfourteen[7] = {603. * mm, 603. * mm, 50. * mm, oblshift, width, heightred, zred};
975 TGeoVolume* dfourteen = CradleBaseVolume(med, lDfourteen, "bar14incl");
976 dfourteen->SetLineColor(kGray);
977
978 Double_t lDfourteenlast[7] = {667. * mm, 667. * mm, 50. * mm, oblshift, width, heightred, zred};
979 TGeoVolume* dfourteenlast = CradleBaseVolume(med, lDfourteenlast, "bar14incllast");
980 dfourteenlast->SetLineColor(kGray);
981
982 vbox->AddNode(afourteen, 1, new TGeoTranslation(0., 487. * mm / 2 - 100. * mm / 2, 0.));
983 TGeoRotation* vinrot = new TGeoRotation("vertbar");
984 vinrot->RotateZ(90);
985 vbox->AddNode(bfourteen, 1, new TGeoCombiTrans(1488 * mm / 2 - 100. * mm / 2, -100. * mm / 2, 0., vinrot));
986 vbox->AddNode(bfourteen, 2, new TGeoCombiTrans(-1488 * mm / 2 + 100. * mm / 2, -100. * mm / 2, 0., vinrot));
987 TGeoRotation* rotboxbar = new TGeoRotation("rotboxbar");
988 rotboxbar->RotateZ(-35);
989 TGeoRotation* arotboxbar = new TGeoRotation("arotboxbar");
990 arotboxbar->RotateZ(-35);
991 arotboxbar->RotateY(180);
992 vbox->AddNode(dfourteen, 1, new TGeoCombiTrans(-1488 * mm / 4, -1, 0.4, rotboxbar));
993 vbox->AddNode(dfourteen, 2, new TGeoCombiTrans(+1488 * mm / 4, -1, 0.4, arotboxbar));
994 // vertical box on the short base of the cradle
995 vboxlast->AddNode(afourteen, 1, new TGeoTranslation(0., 487. * mm / 2 - 100. * mm / 2, 0.));
996 vboxlast->AddNode(bfourteen, 1, new TGeoCombiTrans(1488 * mm / 2 - 100. * mm / 2, -100. * mm / 2, 0., vinrot));
997 vboxlast->AddNode(bfourteen, 2, new TGeoCombiTrans(-1488 * mm / 2 + 100. * mm / 2, -100. * mm / 2, 0., vinrot));
998 vboxlast->AddNode(dfourteenlast, 1, new TGeoCombiTrans(-1488 * mm / 4 + 1.7, -3., 0., rotboxbar));
999 vboxlast->AddNode(dfourteenlast, 2, new TGeoCombiTrans(+1488 * mm / 4 - 1.7, -3., 0., arotboxbar));
1000
1001 // POSITIONING IN THE VIRTUAL VOLUME "cradle"
1002
1003 // long base
1004 TGeoRotation* rotl = new TGeoRotation("Clongbase");
1005 rotl->RotateX(90);
1006 cradle->AddNode(lbase, 0, new TGeoCombiTrans(0 * mm, (1488 - 100) * mm / 2, -(597 - 60) * mm / 2, rotl));
1007 cradle->AddNode(lbase, 1, new TGeoCombiTrans(0 * mm, -(1488 - 100) * mm / 2, -(597 - 60) * mm / 2, rotl));
1008 // short base
1009 TGeoRotation* rots = new TGeoRotation("Cshortbase");
1010 rots->RotateX(90);
1011 rots->RotateZ(90);
1012 cradle->AddNode(sbase, 1, new TGeoCombiTrans((6037 - 100) * mm / 2, 0., -(597 - 60) * mm / 2, rots));
1013 cradle->AddNode(sbase, 2, new TGeoCombiTrans(-(6037 - 100) * mm / 2, 0., -(597 - 60) * mm / 2, rots));
1014
1015 // trapezoidal structure
1016 Double_t origtrastruct = (6037 - 2 * 60) * mm / 2 - 2288 * mm;
1017
1018 TGeoRotation* rot1 = new TGeoRotation("inclrot");
1019 rot1->RotateX(90);
1020 rot1->RotateY(200);
1021 TGeoRotation* rot2 = new TGeoRotation("horizrot");
1022 rot2->RotateX(-90);
1023 Double_t dx = (1607 - 35) * mm * TMath::Cos(TMath::DegToRad() * 20) / 2 -
1024 tubeh / 2 * TMath::Sin(TMath::DegToRad() * 20) + params[5];
1025
1026 cradle->AddNode(inclin, 1, new TGeoCombiTrans(origtrastruct + (2288 + 60) * mm - dx, 729 * mm, params[0] + 0.4,
1027 rot1)); //+0.7 added
1028 cradle->AddNode(horiz, 1, new TGeoCombiTrans(origtrastruct, 729 * mm, 597 * mm / 2 - tubeh / 2,
1029 rot2)); // correctly positioned
1030 TGeoRotation* rot1mirror = new TGeoRotation("inclmirrot");
1031 rot1mirror->RotateX(90);
1032 rot1mirror->RotateY(200);
1033 rot1mirror->RotateZ(180);
1034 cradle->AddNode(inclin, 2, new TGeoCombiTrans(origtrastruct - 2345 * mm + dx, 729 * mm, params[0] + 0.4,
1035 rot1mirror)); //+0.7 added
1036 cradle->AddNode(inclin, 3, new TGeoCombiTrans(origtrastruct + (2288 + 60) * mm - dx, -729 * mm, params[0] + 0.4,
1037 rot1)); // 0.7 added
1038 cradle->AddNode(horiz, 2, new TGeoCombiTrans(origtrastruct, -729 * mm, 597 * mm / 2 - tubeh / 2,
1039 rot2)); // correctly positioned
1040 cradle->AddNode(inclin, 4, new TGeoCombiTrans(origtrastruct - 2345 * mm + dx, -729 * mm, params[0] + 0.4,
1041 rot1mirror)); // 0.7 added
1042
1043 Double_t tan1 = (2 * TMath::Tan(TMath::DegToRad() * 55));
1044
1045 // inner pieces on one side
1046 TGeoRotation* rot4 = new TGeoRotation("4rot");
1047 rot4->RotateX(-90);
1048 rot4->RotateY(-55);
1049 rot4->RotateZ(180);
1050 TGeoRotation* rot4a = new TGeoRotation("4arot");
1051 rot4a->RotateX(-90);
1052 rot4a->RotateY(-55);
1053 cradle->AddNode(four, 1, new TGeoCombiTrans(origtrastruct - (39 + (597 - 50 - 60) / tan1) * mm - tubeh / (2 * TMath::Sin(TMath::DegToRad() * 55)), -729 * mm, params[3], rot4));
1054
1055 cradle->AddNode(four, 2, new TGeoCombiTrans(origtrastruct + (39 + (597 - 50 - 60) / tan1) * mm + tubeh / (2 * TMath::Sin(TMath::DegToRad() * 55)), -729 * mm, params[3], rot4a));
1056
1057 TGeoRotation* rot5 = new TGeoRotation("5rot");
1058 rot5->RotateX(-90);
1059 rot5->RotateY(-75);
1060 rot5->RotateZ(180);
1061 TGeoRotation* rot5a = new TGeoRotation("5arot");
1062 rot5a->RotateX(-90);
1063 rot5a->RotateY(-75);
1064 cradle->AddNode(
1065 five, 1,
1066 new TGeoCombiTrans(origtrastruct + (486 + (597 - 50 - 60) / (2 * TMath::Tan(TMath::DegToRad() * 75))) * mm +
1067 tubeh / (2 * TMath::Sin(TMath::DegToRad() * 75)),
1068 -729 * mm, 0, rot5));
1069 cradle->AddNode(
1070 five, 2,
1071 new TGeoCombiTrans(origtrastruct - (486 + (597 - 50 - 60) / (2 * TMath::Tan(TMath::DegToRad() * 75))) * mm -
1072 tubeh / (2 * TMath::Sin(TMath::DegToRad() * 75)),
1073 -729 * mm, 0, rot5a));
1074 cradle->AddNode(six, 1,
1075 new TGeoCombiTrans(origtrastruct + 808 * mm + (480 * mm / 2) * TMath::Cos(TMath::DegToRad() * 55) +
1076 tubeh / (2 * TMath::Sin(TMath::DegToRad() * 55)) + 2.,
1077 -729 * mm, -params[4] - 0.5, rot4a));
1078 cradle->AddNode(six, 2,
1079 new TGeoCombiTrans(origtrastruct - 808 * mm - (480 * mm / 2) * TMath::Cos(TMath::DegToRad() * 55) -
1080 tubeh / (2 * TMath::Sin(TMath::DegToRad() * 55)) - 2.,
1081 -729 * mm, -params[4] - 0.5, rot4));
1082
1083 TGeoRotation* rot7 = new TGeoRotation("7rot");
1084 rot7->RotateX(-90);
1085 rot7->RotateY(130);
1086 rot7->RotateZ(180);
1087 TGeoRotation* rot7a = new TGeoRotation("7arot");
1088 rot7a->RotateX(-90);
1089 rot7a->RotateY(130);
1090
1091 cradle->AddNode(
1092 seven, 1, new TGeoCombiTrans(origtrastruct + 1478 * mm - (472 * mm / 2) * TMath::Cos(TMath::DegToRad() * 50) + tubeh / (2 * TMath::Sin(TMath::DegToRad() * 50)), -729 * mm, -params[8], rot7));
1093 cradle->AddNode(
1094 seven, 2, new TGeoCombiTrans(origtrastruct - 1478 * mm + (472 * mm / 2) * TMath::Cos(TMath::DegToRad() * 50) - tubeh / (2 * TMath::Sin(TMath::DegToRad() * 50)), -729 * mm, -params[8], rot7a));
1095 TGeoRotation* rot8 = new TGeoRotation("8rot");
1096 rot8->RotateX(-90);
1097 rot8->RotateY(-25);
1098 TGeoRotation* rot8a = new TGeoRotation("8arot");
1099 rot8a->RotateX(-90);
1100 rot8a->RotateY(-25);
1101 rot8a->RotateZ(180);
1102 cradle->AddNode(
1103 eight, 1, new TGeoCombiTrans(origtrastruct + 1640 * mm + (244 * mm / 2) * TMath::Cos(TMath::DegToRad() * 30) + tubeh / (2 * TMath::Sin(TMath::DegToRad() * 30)), -729 * mm, -20.5, rot8));
1104 cradle->AddNode(
1105 eight, 2, new TGeoCombiTrans(origtrastruct - 1640 * mm - (244 * mm / 2) * TMath::Cos(TMath::DegToRad() * 30) - tubeh / (2 * TMath::Sin(TMath::DegToRad() * 30)), -729 * mm, -20.5, rot8a));
1106 TGeoRotation* rot9 = new TGeoRotation("9rot");
1107 rot9->RotateX(-90);
1108 rot9->RotateY(-90);
1109 TGeoRotation* rot9a = new TGeoRotation("9arot");
1110 rot9a->RotateX(-90);
1111 rot9a->RotateY(-90);
1112 rot9a->RotateZ(180);
1113 cradle->AddNode(nine, 1, new TGeoCombiTrans(origtrastruct + 1960 * mm + 2.5 + 3., -729. * mm, -20., rot9));
1114 cradle->AddNode(nine, 2, new TGeoCombiTrans(origtrastruct - 1960 * mm - 2.5 - 3., -729. * mm, -20., rot9a));
1115 // inner pieces on the other side
1116 TGeoRotation* rot10 = new TGeoRotation("10rot");
1117 rot10->RotateX(-90);
1118 rot10->RotateY(-120);
1119 TGeoRotation* rot10a = new TGeoRotation("10arot");
1120 rot10a->RotateX(-90);
1121 rot10a->RotateY(-120);
1122 rot10a->RotateZ(180);
1123
1124 cradle->AddNode(
1125 ten, 1, new TGeoCombiTrans(origtrastruct + 1738 * mm + tubeh / (2 * TMath::Sin(TMath::DegToRad() * 60)) - 2, +729. * mm, -13., rot10));
1126 cradle->AddNode(
1127 ten, 2, new TGeoCombiTrans(origtrastruct - 1738 * mm - tubeh / (2 * TMath::Sin(TMath::DegToRad() * 60)) + 2, +729. * mm, -13., rot10a));
1128
1129 TGeoRotation* rot11 = new TGeoRotation("11rot");
1130 rot11->RotateX(-90);
1131 rot11->RotateY(50);
1132 TGeoRotation* rot11a = new TGeoRotation("11arot");
1133 rot11a->RotateX(-90);
1134 rot11a->RotateY(50);
1135 rot11a->RotateZ(180);
1136 cradle->AddNode(eleven, 1, new TGeoCombiTrans(origtrastruct - 1738 * mm - tubeh / (2 * TMath::Sin(TMath::DegToRad() * 60)) + 352. * mm, +729. * mm, -12.7, rot11));
1137 cradle->AddNode(eleven, 2, new TGeoCombiTrans(origtrastruct + 1738 * mm + tubeh / (2 * TMath::Sin(TMath::DegToRad() * 60)) - 352. * mm, +729. * mm, -12.7, rot11a));
1138
1139 TGeoRotation* rot12 = new TGeoRotation("12rot");
1140 rot12->RotateX(-90);
1141 rot12->RotateY(-120);
1142 TGeoRotation* rot12a = new TGeoRotation("12arot");
1143 rot12a->RotateX(-90);
1144 rot12a->RotateY(-120);
1145 rot12a->RotateZ(180);
1146 cradle->AddNode(twelve, 1, new TGeoCombiTrans(origtrastruct + 1065 * mm, +729. * mm, 1., rot12));
1147 cradle->AddNode(twelve, 2, new TGeoCombiTrans(origtrastruct - 1065 * mm, +729. * mm, 1., rot12a));
1148
1149 TGeoRotation* rot13 = new TGeoRotation("13rot");
1150 rot13->RotateX(-90);
1151 rot13->RotateY(-43);
1152 rot13->RotateZ(180);
1153 TGeoRotation* rot13a = new TGeoRotation("13arot");
1154 rot13a->RotateX(-90);
1155 rot13a->RotateY(-43);
1156 cradle->AddNode(thirteen, 1, new TGeoCombiTrans(origtrastruct + 572 * mm - 18., +729. * mm, -1.5, rot13));
1157 cradle->AddNode(thirteen, 2, new TGeoCombiTrans(origtrastruct - 572 * mm + 18., +729. * mm, -1.5, rot13a));
1158
1159 // vertical structures
1160 TGeoRotation* vrot = new TGeoRotation("vertbox");
1161 vrot->RotateX(90);
1162 vrot->RotateZ(90);
1163 cradle->AddNode(vboxlast, 1, new TGeoCombiTrans(-6037 * mm / 2 + 50. * mm / 2, 0., 0.5,
1164 vrot)); // vertial box on the short cradle base
1165
1166 cradle->AddNode(vbox, 2, new TGeoCombiTrans(-6037 * mm / 2 + 50. * mm / 2 + 990. * mm, 0., 0.5, vrot));
1167 cradle->AddNode(cfourteen, 2, new TGeoCombiTrans(-6037 * mm / 2 + 50. * mm / 2 + 990. * mm, 0., -477. * mm / 2 - 20. * mm / 2, vrot));
1168
1169 cradle->AddNode(
1170 vbox, 3, new TGeoCombiTrans(origtrastruct - (1641.36 * mm + params[7]) / 2. + 50. * mm / 2. + 3, 0., 0.5, vrot));
1171 cradle->AddNode(cfourteen, 3,
1172 new TGeoCombiTrans(origtrastruct - (1641.36 * mm + params[7]) / 2. + 50. * mm / 2. + 3, 0.,
1173 -477. * mm / 2 - 20. * mm / 2, vrot));
1174
1175 cradle->AddNode(
1176 vbox, 4, new TGeoCombiTrans(origtrastruct + (1641.36 * mm + params[7]) / 2. - 50. * mm / 2. - 3, 0., 0.5, vrot));
1177 cradle->AddNode(cfourteen, 4,
1178 new TGeoCombiTrans(origtrastruct + (1641.36 * mm + params[7]) / 2. - 50. * mm / 2. - 3, 0.,
1179 -477. * mm / 2 - 20. * mm / 2, vrot));
1180
1181 return cradle;
1182} // CreateCradle()
1183
1184//*****************************************************************************************************************
1185
1186TGeoVolume* Detector::CradleBaseVolume(TGeoMedium* med, Double_t l[7], const char* name)
1187{
1188 /*
1189 The trapezoid is build in the xy plane
1190 0 ________________ 1
1191 / | \
1192 / | \
1193 / (0,0) \
1194 / | \
1195 3 /___________|____________\ 2
1196 01 is right shifted => shift is positive
1197 //1: small base (0-1); 2: long base (3-2);
1198 //3: trapezoid height; 4: shift between the two bases;
1199 //5: height 6: height reduction; 7: z-reduction;
1200 */
1201
1202 TGeoXtru* xtruIn = new TGeoXtru(2);
1203 TGeoXtru* xtruOut = new TGeoXtru(2);
1204 xtruIn->SetName(Form("%sIN", name));
1205 xtruOut->SetName(Form("%sOUT", name));
1206
1207 Double_t xv[4], yv[4];
1208
1209 xv[0] = -(l[0] / 2 - l[3]);
1210 yv[0] = l[2] / 2;
1211 xv[1] = l[0] / 2 + l[3];
1212 yv[1] = l[2] / 2;
1213 xv[2] = l[1] / 2;
1214 yv[2] = -l[2] / 2;
1215 xv[3] = -l[1] / 2;
1216 yv[3] = -l[2] / 2;
1217
1218 xtruOut->DefinePolygon(4, xv, yv);
1219 xtruOut->DefineSection(0, -l[4] / 2., 0., 0.,
1220 1.0); // 0= I plane z; (0.,0.) = shift wrt centre; 1.= shape scale factor
1221 xtruOut->DefineSection(1, +l[4] / 2., 0., 0., 1.0); // 1= II plane z;
1222
1223 Double_t tgalpha = 0;
1224 if (xv[3] - xv[0] == 0) {
1225 tgalpha = 999999;
1226 } else {
1227 tgalpha = l[2] / TMath::Abs(xv[3] - xv[0]);
1228 }
1229 Double_t tgbeta = 0;
1230 if (xv[2] - xv[1] == 0) {
1231 tgbeta = 999999;
1232 } else {
1233 tgbeta = l[2] / TMath::Abs(xv[2] - xv[1]);
1234 }
1235
1236 xv[0] = xv[0] - l[5] / tgalpha;
1237 yv[0] = l[2] / 2 - l[5];
1238 xv[1] = xv[1] + l[5] / tgbeta;
1239 yv[1] = l[2] / 2 - l[5];
1240 xv[2] = xv[2] + l[5] / tgbeta;
1241 yv[2] = -l[2] / 2 + l[5];
1242 xv[3] = xv[3] - l[5] / tgalpha;
1243 yv[3] = -l[2] / 2 + l[5];
1244
1245 xtruIn->DefinePolygon(4, xv, yv);
1246 xtruIn->DefineSection(0, (-l[4] + l[6]) / 2, 0., 0., 1.0);
1247 xtruIn->DefineSection(1, (+l[4] - l[6]) / 2, 0., 0., 1.0);
1248
1249 TGeoCompositeShape* shape = new TGeoCompositeShape(name, Form("%sOUT-%sIN", name, name));
1250
1251 TGeoVolume* vol = new TGeoVolume(name, shape, med);
1252
1253 return vol;
1254} // CradleBaseVolume()
1255//****************************************************************************************************************
1256
1258{
1259 // Creates detailed geometry simulation (currently GEANT volumes tree)
1260 // includind the HMPID cradle
1261
1263
1264 TGeoVolume* hmpcradle = CreateCradle();
1265
1266 TGeoVolume* hmpidabs_cham2 = createAbsorber(2, 40.0);
1267 TGeoVolume* hmpidabs_cham4 = createAbsorber(4, 80.0);
1268
1269 double theta = 33.5;
1270
1271 TGeoHMatrix* pMatrixAbs2 = new TGeoHMatrix;
1272 const double trans2[] = {435.5, 0., -155.};
1273 pMatrixAbs2->SetTranslation(trans2);
1274 pMatrixAbs2->RotateZ(theta);
1275
1276 gGeoManager->GetVolume("barrel")->AddNode(hmpidabs_cham2, 2, pMatrixAbs2);
1277
1278 TGeoHMatrix* pMatrixAbs4 = new TGeoHMatrix;
1279 const double trans4[] = {435., 0., 155.};
1280 pMatrixAbs4->SetTranslation(trans4);
1281 pMatrixAbs4->RotateZ(theta);
1282
1283 gGeoManager->GetVolume("barrel")->AddNode(hmpidabs_cham4, 4, pMatrixAbs4);
1284
1285 for (Int_t iCh = 0; iCh <= 6; iCh++) { // place 7 chambers
1286 TGeoVolume* hmpid = createChamber(iCh);
1287 TGeoHMatrix* pMatrix = new TGeoHMatrix;
1288 IdealPosition(iCh, pMatrix);
1289 gGeoManager->GetVolume("barrel")->AddNode(hmpid, 0, pMatrix);
1290 if (iCh == 1 || iCh == 3 || iCh == 5) {
1291 TGeoHMatrix* pCradleMatrix = new TGeoHMatrix;
1292 IdealPositionCradle(iCh, pCradleMatrix);
1293 gGeoManager->GetVolume("barrel")->AddNode(hmpcradle, iCh, pCradleMatrix);
1294 }
1295 }
1296 // }
1297 // AliDebug(1,"Stop v3. HMPID option");
1298}
1299
1301{
1302 defineOpticalProperties(); // needs to be called within this hook
1303}
1304
1305//*****************************************************************************************************************
1307{
1308 // AliDebug(1,"");
1309
1310 // Optical properties definition.
1311 const Int_t kNbins = 30; // number of photon energy points
1312 Float_t emin = 5.5, emax = 8.5; // Photon energy range,[eV]
1313 Float_t deltaE = (emax - emin) / kNbins;
1314 Float_t aEckov[kNbins];
1315 Double_t dEckov[kNbins];
1316 Float_t aAbsRad[kNbins], aAbsWin[kNbins], aAbsGap[kNbins], aAbsMet[kNbins];
1317 Float_t aIdxRad[kNbins], aIdxWin[kNbins], aIdxGap[kNbins], aIdxMet[kNbins], aIdxPc[kNbins];
1318 Float_t aQeAll[kNbins], aQePc[kNbins];
1319 Double_t dReflMet[kNbins], dQePc[kNbins];
1320
1321 TF2 pRaIF("HidxRad", "sqrt(1+0.554*(1239.84/x)^2/((1239.84/x)^2-5769)-0.0005*(y-20))", emin, emax, 0,
1322 50); // DiMauro mail temp 0-50 degrees C
1323 TF1 pWiIF("HidxWin", "sqrt(1+46.411/(10.666*10.666-x*x)+228.71/(18.125*18.125-x*x))", emin,
1324 emax); // SiO2 idx TDR p.35
1325 TF1 pGaIF("HidxGap", "1+0.12489e-6/(2.62e-4 - x*x/1239.84/1239.84)", emin, emax); //?????? from where
1326
1327 TF1 pRaAF("HabsRad", "(x<7.8)*(gaus+gaus(3))+(x>=7.8)*0.0001", emin, emax); // fit from DiMauro data 28.10.03
1328 pRaAF.SetParameters(3.20491e16, -0.00917890, 0.742402, 3035.37, 4.81171, 0.626309);
1329 TF1 pWiAF("HabsWin", "(x<8.2)*(818.8638-301.0436*x+36.89642*x*x-1.507555*x*x*x)+(x>=8.2)*0.0001", emin,
1330 emax); // fit from DiMauro data 28.10.03
1331 TF1 pGaAF(
1332 "HabsGap", "(x<7.75)*6512.399+(x>=7.75)*3.90743e-2/(-1.655279e-1+6.307392e-2*x-8.011441e-3*x*x+3.392126e-4*x*x*x)",
1333 emin, emax); //????? from where
1334
1335 TF1 pQeF("Hqe", "0+(x>6.07267)*0.344811*(1-exp(-1.29730*(x-6.07267)))", emin,
1336 emax); // fit from DiMauro data 28.10.03
1337
1338 TString title = GetTitle();
1339 Bool_t isFlatIdx = title.Contains("FlatIdx");
1340
1341 for (Int_t i = 0; i < kNbins; i++) {
1342 Float_t eV = emin + deltaE * i; // Ckov energy in eV
1343 aEckov[i] = 1e-9 * eV; // Ckov energy in GeV
1344 dEckov[i] = aEckov[i];
1345 aAbsRad[i] = pRaAF.Eval(eV);
1346 (isFlatIdx) ? aIdxRad[i] = 1.292 : aIdxRad[i] = pRaIF.Eval(eV, 20);
1347 aAbsWin[i] = pWiAF.Eval(eV);
1348 aIdxWin[i] = pWiIF.Eval(eV);
1349 aAbsGap[i] = pGaAF.Eval(eV);
1350 aIdxGap[i] = pGaIF.Eval(eV);
1351 aQeAll[i] = 1; // QE for all other materials except for PC must be 1.
1352 aAbsMet[i] = 0.0001;
1353 aIdxMet[i] = 0; // metal ref idx must be 0 in order to reflect photon
1354 aIdxPc[i] = 1;
1355 aQePc[i] = pQeF.Eval(eV); // PC ref idx must be 1 in order to apply photon to QE conversion
1356 dQePc[i] = pQeF.Eval(eV);
1357 dReflMet[i] = 0.; // no reflection on the surface of the pc (?)
1358 }
1359 // at this moment, the fMC member doesn't seem to be initialized
1360 // so we fetch from the singleton
1361 auto vmc = TVirtualMC::GetMC();
1362 vmc->SetCerenkov(getMediumID(kC6F14), kNbins, aEckov, aAbsRad, aQeAll, aIdxRad);
1363 vmc->SetCerenkov(getMediumID(kSiO2), kNbins, aEckov, aAbsWin, aQeAll, aIdxWin);
1364 vmc->SetCerenkov(getMediumID(kCH4), kNbins, aEckov, aAbsGap, aQeAll, aIdxGap);
1365 vmc->SetCerenkov(getMediumID(kCu), kNbins, aEckov, aAbsMet, aQeAll, aIdxMet);
1366 vmc->SetCerenkov(getMediumID(kW), kNbins, aEckov, aAbsMet, aQeAll,
1367 aIdxMet); // n=0 means reflect photons
1368 vmc->SetCerenkov(getMediumID(kCsI), kNbins, aEckov, aAbsMet, aQePc,
1369 aIdxPc); // n=1 means convert photons
1370 vmc->SetCerenkov(getMediumID(kAl), kNbins, aEckov, aAbsMet, aQeAll, aIdxMet);
1371
1372 // Define a skin surface for the photocatode to enable 'detection' in G4
1373 for (Int_t i = 0; i < 7; i++) {
1374 vmc->DefineOpSurface(Form("surfPc%i", i), kGlisur /*kUnified*/, kDielectric_metal, kPolished, 0.);
1375 vmc->SetMaterialProperty(Form("surfPc%i", i), "EFFICIENCY", kNbins, dEckov, dQePc);
1376 vmc->SetMaterialProperty(Form("surfPc%i", i), "REFLECTIVITY", kNbins, dEckov, dReflMet);
1377 vmc->SetSkinSurface(Form("skinPc%i", i), Form("Hpad%i", i), Form("surfPc%i", i));
1378 }
1379}
1380
1381} // end namespace hmpid
1382} // end namespace o2
1383
Definition of the Stack class.
std::ostringstream debug
int16_t time
Definition RawEventData.h:4
int32_t i
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char e
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h configStandalone Reconstruction rec_trd Max chi2 for TRD tracklets to be matched to a track Chi2 cut for strict matching mode Number of sigmas for ITS TPC track time error estimate Addition to search road around track prolongation along Y in cm Optimal tracklet rphi resolution in cm(in case phi of track=lorentz angle)") AddOptionRTC(trkltResVsTanPhiMisalign
ClassImp(o2::hmpid::Detector)
uint32_t j
Definition RawData.h:0
uint16_t pid
Definition RawData.h:2
uint32_t col
Definition RawData.h:4
uint32_t stack
Definition RawData.h:1
Int_t GetDetId()
void AddSensitiveVolume(TGeoVolume *v)
TVirtualMC * fMC
flag for initialisation
Definition FairModule.h:160
void RegisterAny(const char *name, T *&obj, Bool_t toFile)
static FairRootManager * Instance()
void setTrackID(Int_t track)
Detector()
Default Constructor.
Definition Detector.cxx:36
void Mixture(Int_t imat, const char *name, Float_t *a, Float_t *z, Float_t dens, Int_t nlmat, Float_t *wmat)
Definition Detector.cxx:66
void Medium(Int_t numed, const char *name, Int_t nmat, Int_t isvol, Int_t ifield, Float_t fieldm, Float_t tmaxfd, Float_t stemax, Float_t deemax, Float_t epsil, Float_t stmin, Float_t *ubuf=nullptr, Int_t nbuf=0)
Definition Detector.cxx:72
int getMediumID(int imed) const
Definition Detector.h:136
static void initFieldTrackingParams(int &mode, float &maxfield)
Definition Detector.cxx:143
void Material(Int_t imat, const char *name, Float_t a, Float_t z, Float_t dens, Float_t radl, Float_t absl, Float_t *buf=nullptr, Int_t nwbuf=0)
Definition Detector.cxx:59
std::string addNameTo(const char *ext) const
Definition Detector.h:151
static MaterialManager & Instance()
float Fresnel(float ene, float pdoti, Bool_t pola)
Definition Detector.cxx:306
TGeoVolume * createAbsorber(int chamber, float tickness)
Definition Detector.cxx:541
void Register() override
Definition Detector.cxx:364
o2::hmpid::HitType * AddHit(float x, float y, float z, float time, float energy, Int_t trackId, Int_t detId)
Definition Detector.cxx:178
void InitializeO2Detector() override
Definition Detector.cxx:49
Bool_t IsLostByFresnel()
Definition Detector.cxx:282
bool ProcessHits(FairVolume *v) override
Definition Detector.cxx:72
TGeoVolume * createChamber(int number)
Definition Detector.cxx:554
void ConstructOpGeometry() override
TGeoVolume * CreateCradle()
Definition Detector.cxx:861
void GenFee(float qtot)
Definition Detector.cxx:184
void IdealPositionCradle(int iCh, TGeoHMatrix *pMatrix)
Definition Detector.cxx:414
TGeoVolume * CradleBaseVolume(TGeoMedium *med, double l[7], const char *name)
void ConstructGeometry() override
void Reset() override
Definition Detector.cxx:366
void IdealPosition(int iCh, TGeoHMatrix *pMatrix)
Definition Detector.cxx:373
void defineOpticalProperties()
void mars2Lors(Int_t c, double *m, double &x, double &y) const
Definition Param.h:199
static Param * instance()
Definition Param.cxx:438
static ShmManager & Instance()
Definition ShmManager.h:62
GLint GLenum GLint x
Definition glcorearb.h:403
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLint GLsizei GLsizei height
Definition glcorearb.h:270
GLint GLsizei width
Definition glcorearb.h:270
GLint y
Definition glcorearb.h:270
GLenum const GLfloat * params
Definition glcorearb.h:272
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
TRandom * simRandom()
Definition SimRandom.cxx:22
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< int > row