]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveDet/AliEveMUONChamberData.cxx
From Ivana: update for cahnges in MUON.
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveMUONChamberData.cxx
CommitLineData
d810d0de 1// $Id$
fafff680 2// Main authors: Matevz Tadel & Alja Mrak-Tadel & Bogdan Vulpescu: 2006, 2007
d810d0de 3
4/**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
51346b82 7 * full copyright notice. *
d810d0de 8 **************************************************************************/
cb4245bb 9
d810d0de 10#include "AliEveMUONChamberData.h"
3626c858 11
3626c858 12#include <AliMUONGeometryTransformer.h>
3626c858 13#include <mapping/AliMpDEIterator.h>
3626c858 14#include <mapping/AliMpSector.h>
15#include <mapping/AliMpPad.h>
3626c858 16#include <mapping/AliMpSegmentation.h>
17
3626c858 18#include <TVector2.h>
19
707b281a 20#include <EveBase/AliEveEventManager.h>
2674c15a 21
3626c858 22///////////////////////////////////////////////////////////////////////////////
23///
d810d0de 24/// AliEveMUONChamberData: geometry and digits
3626c858 25///
26///////////////////////////////////////////////////////////////////////////////
3626c858 27
3626c858 28
d810d0de 29ClassImp(AliEveMUONChamberData)
30
31AliMUONGeometryTransformer* AliEveMUONChamberData::fgTransformer = 0;
3626c858 32
57ffa5fb 33//______________________________________________________________________________
fd31e9de 34AliEveMUONChamberData::AliEveMUONChamberData(Int_t chamber) :
35 TObject(),
c76ea574 36 fChamberID(0),
37 fNDetElem(0),
38 fNDigits(0),
39 fNClusters(0),
fd31e9de 40 fNHits(0)
3626c858 41{
42 //
43 // constructor
44 //
45
46 fChamberID = chamber;
47 fNDetElem = 0;
48 fNDigits = 0;
eadce74d 49 fNClusters = 0;
50 fNHits = 0;
51
3626c858 52 for (Int_t i = 0; i < 26; i++) {
53 for (Int_t j = 0; j < 4; j++) {
54 fFrameCoord[i][j] = 0.0;
55 }
56 }
57 for (Int_t i = 0; i < 7*4096; i++) {
58 fDigitBuffer[i] = 0.0;
59 }
cef26510 60 for (Int_t i = 0; i < 5*256; i++) {
eadce74d 61 fClusterBuffer[i] = 0.0;
62 }
cef26510 63 for (Int_t i = 0; i < 3*256; i++) {
eadce74d 64 fHitBuffer[i] = 0.0;
65 }
3626c858 66
67 for (Int_t i = 0; i < 3; i++) {
68 fChamberBox[i*2 ] = +9999;
69 fChamberBox[i*2+1] = -9999;
70 }
71
8d33d1c2 72 if (fgTransformer == 0) {
b642f9a5 73 AliEveEventManager::AssertGeometry();
66e5f12c 74 fgTransformer = new AliMUONGeometryTransformer();
b642f9a5 75 fgTransformer->LoadGeometryData();
3626c858 76 }
77
78 Init(chamber);
3626c858 79}
80
57ffa5fb 81//______________________________________________________________________________
d810d0de 82AliEveMUONChamberData::~AliEveMUONChamberData()
3626c858 83{
84 //
85 // destructor
86 //
87
88}
89
57ffa5fb 90//______________________________________________________________________________
d810d0de 91void AliEveMUONChamberData::DropData()
3626c858 92{
93 //
94 // release the chamber data
95 //
96
eadce74d 97 fNDigits = 0;
98 fNClusters = 0;
99 fNHits = 0;
100
3626c858 101 return;
102
103}
104
57ffa5fb 105//______________________________________________________________________________
d810d0de 106void AliEveMUONChamberData::Init(Int_t chamber)
3626c858 107{
108 //
109 // initialize the drawing coordinates of the chamber
110 //
111
112 Float_t locP[3], gloP[3], locD[3], gloD[3];
113 Float_t deltax, deltay;
114 AliMpDEIterator it;
115 const AliMpVSegmentation *vseg;
3626c858 116 const AliMpSector *sector;
117 TVector2 position;
118 TVector2 dimension;
119
120 for ( it.First(chamber); ! it.IsDone(); it.Next() ) {
121
361fa326 122 Int_t detElemId = it.CurrentDEId();
3626c858 123
124 if (chamber < 4) {
125
9f147efe 126 sector = AliMpSegmentation::Instance()->GetSector(detElemId,AliMp::kCath0);
51346b82 127
128 position = sector->Position();
3626c858 129 dimension = sector->Dimensions(); // half length
51346b82 130
3626c858 131 locP[0] = position.Px();
132 locP[1] = position.Py();
133 locD[0] = dimension.Px() * 2.;
134 locD[1] = dimension.Py() * 2.;
51346b82 135
3626c858 136 locP[2] = 0.0;
137 locD[2] = 0.0;
138
51346b82 139 fgTransformer->Local2Global(detElemId,
140 locP[0], locP[1], locP[2],
3626c858 141 gloP[0], gloP[1], gloP[2]);
51346b82 142
3626c858 143 fgTransformer->Local2Global(detElemId,
51346b82 144 locD[0], locD[1], locD[2],
3626c858 145 gloD[0], gloD[1], gloD[2]);
51346b82 146
147 fFrameCoord[fNDetElem][0] = gloP[0];
148 fFrameCoord[fNDetElem][1] = gloP[1];
149 fFrameCoord[fNDetElem][2] = gloD[0];
150 fFrameCoord[fNDetElem][3] = gloD[1];
3626c858 151 fFrameCoord[fNDetElem][4] = gloP[2]; // Z position
152
153 fChamberBox[0] = TMath::Min(fChamberBox[0],gloP[0]-gloD[0]);
154 fChamberBox[1] = TMath::Max(fChamberBox[1],gloP[0]+gloD[0]);
155 fChamberBox[2] = TMath::Min(fChamberBox[2],gloP[1]-gloD[1]);
156 fChamberBox[3] = TMath::Max(fChamberBox[3],gloP[1]+gloD[1]);
157 fChamberBox[4] = TMath::Min(fChamberBox[4],gloP[2]);
158 fChamberBox[5] = TMath::Max(fChamberBox[5],gloP[2]);
51346b82 159
3626c858 160 } else {
161
8d33d1c2 162// if (!fgSegmentation->HasDE(detElemId)) {
163// printf("Segmentation has no %d detElemId! \n",detElemId);
164// continue;
165// }
3626c858 166
361fa326 167 vseg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0);
3626c858 168
169 if (vseg == 0) {
170 printf("No MpVSegmentation for %d detElemId! \n",detElemId);
171 continue;
172 }
173
174 deltax = vseg->Dimensions().X();
175 deltay = vseg->Dimensions().Y();
176 locP[0] = -deltax;
177 locP[1] = -deltay;
178 locD[0] = +deltax;
179 locD[1] = +deltay;
180
181 locP[2] = 0.0;
182 locD[2] = 0.0;
183
51346b82 184 fgTransformer->Local2Global(detElemId,
185 locP[0], locP[1], locP[2],
3626c858 186 gloP[0], gloP[1], gloP[2]);
51346b82 187
3626c858 188 fgTransformer->Local2Global(detElemId,
51346b82 189 locD[0], locD[1], locD[2],
3626c858 190 gloD[0], gloD[1], gloD[2]);
51346b82 191
192 fFrameCoord[fNDetElem][0] = gloP[0];
193 fFrameCoord[fNDetElem][1] = gloP[1];
194 fFrameCoord[fNDetElem][2] = gloD[0];
195 fFrameCoord[fNDetElem][3] = gloD[1];
3626c858 196 fFrameCoord[fNDetElem][4] = gloP[2]; // Z position
197
198 fChamberBox[0] = TMath::Min(fChamberBox[0],gloP[0]);
199 fChamberBox[0] = TMath::Min(fChamberBox[0],gloD[0]);
200 fChamberBox[1] = TMath::Max(fChamberBox[1],gloP[0]);
201 fChamberBox[1] = TMath::Max(fChamberBox[1],gloD[0]);
202 fChamberBox[2] = TMath::Min(fChamberBox[0],gloP[1]);
203 fChamberBox[2] = TMath::Min(fChamberBox[0],gloD[1]);
204 fChamberBox[3] = TMath::Max(fChamberBox[1],gloP[1]);
205 fChamberBox[3] = TMath::Max(fChamberBox[1],gloD[1]);
206 fChamberBox[4] = TMath::Min(fChamberBox[4],gloP[2]);
207 fChamberBox[5] = TMath::Max(fChamberBox[5],gloP[2]);
51346b82 208
3626c858 209 }
210
211 fNDetElem++;
212
213 } // end detElemId loop
214
3626c858 215}
216
57ffa5fb 217//______________________________________________________________________________
d810d0de 218void AliEveMUONChamberData::RegisterDigit(Int_t detElemId, Int_t cathode, Int_t ix, Int_t iy, Int_t charge)
3626c858 219{
220 //
221 // add a digit to this chamber
222 //
223
cef26510 224 if ((fNDigits/7) == (4096-1)) return;
225
3626c858 226 Float_t locP[3], gloP[3], locD[3], gloD[3];
227
361fa326 228 const AliMpVSegmentation* vseg = AliMpSegmentation::Instance()
229 ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));
3626c858 230
231 AliMpPad pad = vseg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
51346b82 232
3626c858 233 locP[0] = pad.Position().X();
234 locP[1] = pad.Position().Y();
235 locD[0] = pad.Dimensions().X();
236 locD[1] = pad.Dimensions().Y();
51346b82 237
3626c858 238 locP[2] = 0.0;
239 locD[2] = 0.0;
240
51346b82 241 fgTransformer->Local2Global(detElemId,
242 locP[0], locP[1], locP[2],
3626c858 243 gloP[0], gloP[1], gloP[2]);
51346b82 244
3626c858 245 gloD[0] = locD[0];
246 gloD[1] = locD[1];
247 gloD[2] = gloP[2];
248
3626c858 249 if (cathode == 0) gloP[2] += 0.1;
250 if (cathode == 1) gloP[2] -= 0.1;
251
252 fDigitBuffer[fNDigits ] = gloP[0];
253 fDigitBuffer[fNDigits+1] = gloP[1];
254 fDigitBuffer[fNDigits+2] = gloD[0];
255 fDigitBuffer[fNDigits+3] = gloD[1];
256 fDigitBuffer[fNDigits+4] = gloP[2];
257 fDigitBuffer[fNDigits+5] = charge;
258 fDigitBuffer[fNDigits+6] = cathode;
259
260 fNDigits += 7;
cef26510 261
eadce74d 262}
263
57ffa5fb 264//______________________________________________________________________________
d810d0de 265void AliEveMUONChamberData::RegisterCluster(Int_t /*detElemId*/, Int_t cathode, Float_t clsX, Float_t clsY, Float_t clsZ, Float_t charge)
eadce74d 266{
267 //
268 // add a reconstructed point (cluster) to this chamber
269 //
270 // identical clusters are registered for both cathode planes ...
271 //
272
cef26510 273 if ((fNClusters/5) == (256-1)) return;
274
eadce74d 275 fClusterBuffer[fNClusters ] = clsX;
276 fClusterBuffer[fNClusters+1] = clsY;
277 fClusterBuffer[fNClusters+2] = clsZ;
278 fClusterBuffer[fNClusters+3] = charge;
279 fClusterBuffer[fNClusters+4] = cathode;
280
281 fNClusters += 5;
282
eadce74d 283}
284
57ffa5fb 285//______________________________________________________________________________
d810d0de 286void AliEveMUONChamberData::RegisterHit(Int_t /*detElemId*/, Float_t hitX, Float_t hitY, Float_t hitZ)
eadce74d 287{
288 //
289 // add a simulation hit to this chamber
290 //
291
cef26510 292 if ((fNHits/3) == (256-1)) return;
293
eadce74d 294 fHitBuffer[fNHits ] = hitX;
295 fHitBuffer[fNHits+1] = hitY;
296 fHitBuffer[fNHits+2] = hitZ;
297
eadce74d 298 fNHits += 3;
3626c858 299
300}