bugfix
[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
80165cad 25#include <TClonesArray.h>
f7a1cc68 26#include <TGeoCompositeShape.h>
27#include <TGeoGlobalMagField.h>
28#include <TGeoManager.h>
80165cad 29#include <TGeoMaterial.h>
80165cad 30#include <TGeoMatrix.h>
f7a1cc68 31#include <TGeoMedium.h>
80165cad 32#include <TGeoPgon.h>
f7a1cc68 33#include <TGeoVolume.h>
80165cad 34#include <TGeoXtru.h>
f7a1cc68 35#include <TVirtualMC.h>
80165cad 36
37#include "AliBCM.h"
38#include "AliBCMHit.h"
45e280ce 39#include "AliBCMLoader.h"
80165cad 40#include "AliMagF.h"
41#include "AliRun.h"
42#include "AliMC.h"
43
44ClassImp(AliBCM)
45
46
47//_____________________________________________________________________________
48AliBCM::AliBCM():
49 AliDetector(),
50 fVolId(0)
51{
52 //
53 // Default constructor for BCM
54 //
55}
56
57//_____________________________________________________________________________
58AliBCM::AliBCM(const char *name, const char *title):
59 AliDetector(name,title),
60 fVolId(0)
61{
62//
63// Constructor
64 fHits = new TClonesArray("AliBCMHit");
65 fNhits = 0;
66 gAlice->GetMCApp()->AddHitList(fHits);
67}
68AliBCM::~AliBCM()
69{
70 // Destructor
71 if(fHits) delete fHits;
72}
73
74void AliBCM::StepManager()
75{
76//
77// Step Manager for ALICE Beam Condition Monitor
78//
79
80 static Float_t edepT;
45e280ce 81 static Double_t xh[4] = {0., 0., 0., 0.};
80165cad 82 Float_t edep = 0.;
83 Int_t copy = -1;
84
85
86 if (gMC->TrackCharge() &&
87 gMC->CurrentVolID(copy) == fVolId) {
88 // Charged particle inside sensitive volume
89 //
90 // Entering
91 if (gMC->IsTrackEntering()) {
92 edepT = 0.;
45e280ce 93 gMC->TrackPosition(xh[0],xh[1],xh[2]);
94 xh[3] = gMC->TrackTime();
80165cad 95 }
96
97 //
98 // Any step
99 if ((edep = gMC->Edep()) > 0.) {
100 Double_t x[3];
101 gMC->TrackPosition(x[0],x[1],x[2]);
102 edepT += edep;
103 }
104 //
105 // Exiting
106 if(gMC->IsTrackExiting()||gMC->IsTrackStop()||gMC->IsTrackDisappeared())
107 {
108 Int_t track = gAlice->GetMCApp()->GetCurrentTrackNumber();
109 TClonesArray &lhits = *fHits;
110 Int_t ic = copy + 10;
111 if (xh[2] < 0.) ic+=10;
112 new(lhits[fNhits++]) AliBCMHit(1, track, xh, ic, edepT);
113 }
114 }
115
116
117}
118
119//_____________________________________________________________________________
120void AliBCM::CreateGeometry()
121{
122 //
123 // Create geometry for BCM
124 //
125
126 //
127 // Top volume
128 TGeoVolume* top = gGeoManager->GetVolume("ALIC");
129 // Media
130 TGeoMedium* medPCD = gGeoManager->GetMedium("BCM_PCD");
131 // Rotations
132 TGeoRotation* rotxz = new TGeoRotation("rotxz" , 270., 0., 90., 90., 180., 0.);
133 TGeoRotation* rot000 = new TGeoRotation("rot000", 90., 0., 90., 90., 0., 0.);
134 TGeoRotation* rot090 = new TGeoRotation("rot090", 90., 90., 90., 180., 0., 0.);
135 TGeoRotation* rot180 = new TGeoRotation("rot180", 90., 180., 90., 270., 0., 0.);
136 TGeoRotation* rot270 = new TGeoRotation("rot270", 90., 270., 90., 0., 0., 0.);
137 //
138 const Float_t kWidth = 1.00;
139 const Float_t kThickness = 0.05;
140 const Float_t rBCM = 7.;
141
142
143 TGeoBBox* shBCMpcd = new TGeoBBox(kWidth/2., kWidth/2., kThickness/2.);
144 TGeoVolume* voBCMpcd = new TGeoVolume("BCMpcd", shBCMpcd, medPCD);
145 TGeoVolumeAssembly* voBCM = new TGeoVolumeAssembly("BCM");
146
147 voBCM->AddNode(voBCMpcd, 1, new TGeoCombiTrans(+rBCM, 0. , 0., rot000));
148 voBCM->AddNode(voBCMpcd, 2, new TGeoCombiTrans(0. , +rBCM , 0., rot090));
149 voBCM->AddNode(voBCMpcd, 3, new TGeoCombiTrans(-rBCM, 0., 0., rot180));
150 voBCM->AddNode(voBCMpcd, 4, new TGeoCombiTrans(0. , -rBCM , 0., rot270));
151
152 top->AddNode(voBCM, 1, new TGeoTranslation(0., 0., 1561.));
153 top->AddNode(voBCM, 2, new TGeoCombiTrans(0., 0., -1908., rotxz));
154
155}
156
157//_____________________________________________________________________________
158void AliBCM::CreateMaterials()
159{
160 //
161 // Create materials for BCM
162 //
163 // Polycristalline Diamond
164 Float_t rho = 3.53;
165 Float_t absl = 86.3 / rho;
166 Float_t radl = 42.7 / rho;
167 //
168 Float_t epsil = .001; // Tracking precision,
169 Float_t stemax = -1.; // Maximum displacement for multiple scat
170 Float_t tmaxfd = -20. ; // Maximum angle due to field deflection
171 Float_t deemax = -.01; // Maximum fractional energy loss, DLS
172 Float_t stmin = -.8;
f7a1cc68 173 Int_t isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
174 Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
80165cad 175
176 AliMaterial(1, "PCD", 12.011, 6., rho, radl, absl);
177 //
178 AliMedium(1, "PCD", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
179}
180
181//_____________________________________________________________________________
182void AliBCM::Init()
183{
184 //
185 // Initialise BCM magnet after it has been built
186 //
187 Int_t i;
188 //
189 if(AliLog::GetGlobalDebugLevel()>0) {
190 printf("\n%s: ",ClassName());
191 for(i=0;i<35;i++) printf("*");
192 printf(" BCM_INIT ");
193 for(i=0;i<35;i++) printf("*");
194 printf("\n%s: ",ClassName());
195 for(i=0;i<80;i++) printf("*");
196 printf("\n");
197 }
198
199 //
200 // Here the BCM initialisation code (if any!)
201 fVolId = gMC->VolId("BCMpcd");
202}
203
204void AliBCM::MakeBranch(Option_t* option)
205{
206//Create Tree branches for the BCM
207
208 const Int_t kBufSize = 4000;
209 const char *cH = strstr(option,"H");
210// const char *cD = strstr(option,"D");
211// const char *cR = strstr(option,"R");
212// const char *cS = strstr(option,"S");
213
cb5b8b21 214 if(cH && fLoader->TreeH() && (fHits == 0x0)){
80165cad 215 fHits = new TClonesArray("AliBCMHit");
216 fNhits = 0;
cb5b8b21 217 MakeBranchInTree(fLoader->TreeH(), "BCM" ,&fHits ,kBufSize, 0);
80165cad 218 }
219 AliDetector::MakeBranch(option);
220}
221
222void AliBCM::SetTreeAddress()
223{
224 // Set branch address
225
cb5b8b21 226 if (fLoader->TreeH() && fHits==0x0)
80165cad 227 fHits = new TClonesArray("AliBCMHit", 4000);
228 AliDetector::SetTreeAddress();
229}
45e280ce 230
231//_____________________________________________________________________________
232AliLoader* AliBCM::MakeLoader(const char* topfoldername)
233{
234 //
235 // Builds BCM getter (AliLoader type)
236 AliDebug(1,Form("Creating AliBCMLoader, Top folder is %s ",topfoldername));
237 fLoader = new AliBCMLoader(GetName(),topfoldername);
238 return fLoader;
239}