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