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