AliBCMLoader added.
[u/mrichter/AliRoot.git] / BCM / AliBCM.cxx
CommitLineData
80165cad 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// Beam Condition Monitor BCM //
21// //
22// andreas.morsch@cern.ch //
23///////////////////////////////////////////////////////////////////////////////
24
25#include <TVirtualMC.h>
26#include <TClonesArray.h>
27#include <TGeoMaterial.h>
28#include <TGeoMedium.h>
29#include <TGeoVolume.h>
30#include <TGeoMatrix.h>
31#include <TGeoPgon.h>
32#include <TGeoXtru.h>
33#include <TGeoCompositeShape.h>
34#include <TGeoManager.h>
35
36#include "AliBCM.h"
37#include "AliBCMHit.h"
38#include "AliMagF.h"
39#include "AliRun.h"
40#include "AliMC.h"
41
42ClassImp(AliBCM)
43
44
45//_____________________________________________________________________________
46AliBCM::AliBCM():
47 AliDetector(),
48 fVolId(0)
49{
50 //
51 // Default constructor for BCM
52 //
53}
54
55//_____________________________________________________________________________
56AliBCM::AliBCM(const char *name, const char *title):
57 AliDetector(name,title),
58 fVolId(0)
59{
60//
61// Constructor
62 fHits = new TClonesArray("AliBCMHit");
63 fNhits = 0;
64 gAlice->GetMCApp()->AddHitList(fHits);
65}
66AliBCM::~AliBCM()
67{
68 // Destructor
69 if(fHits) delete fHits;
70}
71
72void AliBCM::StepManager()
73{
74//
75// Step Manager for ALICE Beam Condition Monitor
76//
77
78 static Float_t edepT;
79 static Double_t xh[3] = {0., 0., 0.};
80 Float_t edep = 0.;
81 Int_t copy = -1;
82
83
84 if (gMC->TrackCharge() &&
85 gMC->CurrentVolID(copy) == fVolId) {
86 // Charged particle inside sensitive volume
87 //
88 // Entering
89 if (gMC->IsTrackEntering()) {
90 edepT = 0.;
91 gMC->TrackPosition(xh[0],xh[1],xh[2]);
92 }
93
94 //
95 // Any step
96 if ((edep = gMC->Edep()) > 0.) {
97 Double_t x[3];
98 gMC->TrackPosition(x[0],x[1],x[2]);
99 edepT += edep;
100 }
101 //
102 // Exiting
103 if(gMC->IsTrackExiting()||gMC->IsTrackStop()||gMC->IsTrackDisappeared())
104 {
105 Int_t track = gAlice->GetMCApp()->GetCurrentTrackNumber();
106 TClonesArray &lhits = *fHits;
107 Int_t ic = copy + 10;
108 if (xh[2] < 0.) ic+=10;
109 new(lhits[fNhits++]) AliBCMHit(1, track, xh, ic, edepT);
110 }
111 }
112
113
114}
115
116//_____________________________________________________________________________
117void AliBCM::CreateGeometry()
118{
119 //
120 // Create geometry for BCM
121 //
122
123 //
124 // Top volume
125 TGeoVolume* top = gGeoManager->GetVolume("ALIC");
126 // Media
127 TGeoMedium* medPCD = gGeoManager->GetMedium("BCM_PCD");
128 // Rotations
129 TGeoRotation* rotxz = new TGeoRotation("rotxz" , 270., 0., 90., 90., 180., 0.);
130 TGeoRotation* rot000 = new TGeoRotation("rot000", 90., 0., 90., 90., 0., 0.);
131 TGeoRotation* rot090 = new TGeoRotation("rot090", 90., 90., 90., 180., 0., 0.);
132 TGeoRotation* rot180 = new TGeoRotation("rot180", 90., 180., 90., 270., 0., 0.);
133 TGeoRotation* rot270 = new TGeoRotation("rot270", 90., 270., 90., 0., 0., 0.);
134 //
135 const Float_t kWidth = 1.00;
136 const Float_t kThickness = 0.05;
137 const Float_t rBCM = 7.;
138
139
140 TGeoBBox* shBCMpcd = new TGeoBBox(kWidth/2., kWidth/2., kThickness/2.);
141 TGeoVolume* voBCMpcd = new TGeoVolume("BCMpcd", shBCMpcd, medPCD);
142 TGeoVolumeAssembly* voBCM = new TGeoVolumeAssembly("BCM");
143
144 voBCM->AddNode(voBCMpcd, 1, new TGeoCombiTrans(+rBCM, 0. , 0., rot000));
145 voBCM->AddNode(voBCMpcd, 2, new TGeoCombiTrans(0. , +rBCM , 0., rot090));
146 voBCM->AddNode(voBCMpcd, 3, new TGeoCombiTrans(-rBCM, 0., 0., rot180));
147 voBCM->AddNode(voBCMpcd, 4, new TGeoCombiTrans(0. , -rBCM , 0., rot270));
148
149 top->AddNode(voBCM, 1, new TGeoTranslation(0., 0., 1561.));
150 top->AddNode(voBCM, 2, new TGeoCombiTrans(0., 0., -1908., rotxz));
151
152}
153
154//_____________________________________________________________________________
155void AliBCM::CreateMaterials()
156{
157 //
158 // Create materials for BCM
159 //
160 // Polycristalline Diamond
161 Float_t rho = 3.53;
162 Float_t absl = 86.3 / rho;
163 Float_t radl = 42.7 / rho;
164 //
165 Float_t epsil = .001; // Tracking precision,
166 Float_t stemax = -1.; // Maximum displacement for multiple scat
167 Float_t tmaxfd = -20. ; // Maximum angle due to field deflection
168 Float_t deemax = -.01; // Maximum fractional energy loss, DLS
169 Float_t stmin = -.8;
170 Int_t isxfld = gAlice->Field()->Integ();
171 Float_t sxmgmx = gAlice->Field()->Max();
172
173 AliMaterial(1, "PCD", 12.011, 6., rho, radl, absl);
174 //
175 AliMedium(1, "PCD", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
176}
177
178//_____________________________________________________________________________
179void AliBCM::Init()
180{
181 //
182 // Initialise BCM magnet after it has been built
183 //
184 Int_t i;
185 //
186 if(AliLog::GetGlobalDebugLevel()>0) {
187 printf("\n%s: ",ClassName());
188 for(i=0;i<35;i++) printf("*");
189 printf(" BCM_INIT ");
190 for(i=0;i<35;i++) printf("*");
191 printf("\n%s: ",ClassName());
192 for(i=0;i<80;i++) printf("*");
193 printf("\n");
194 }
195
196 //
197 // Here the BCM initialisation code (if any!)
198 fVolId = gMC->VolId("BCMpcd");
199}
200
201void AliBCM::MakeBranch(Option_t* option)
202{
203//Create Tree branches for the BCM
204
205 const Int_t kBufSize = 4000;
206 const char *cH = strstr(option,"H");
207// const char *cD = strstr(option,"D");
208// const char *cR = strstr(option,"R");
209// const char *cS = strstr(option,"S");
210
211 if(cH && TreeH() && (fHits == 0x0)){
212 fHits = new TClonesArray("AliBCMHit");
213 fNhits = 0;
214 MakeBranchInTree(TreeH(), "BCM" ,&fHits ,kBufSize, 0);
215 }
216 AliDetector::MakeBranch(option);
217}
218
219void AliBCM::SetTreeAddress()
220{
221 // Set branch address
222
223 if (TreeH() && fHits==0x0)
224 fHits = new TClonesArray("AliBCMHit", 4000);
225 AliDetector::SetTreeAddress();
226}