]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveDet/AliEveMUONChamberData.cxx
With Rossella. Add more configurability to ITS raw/digit visualization: a) select...
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveMUONChamberData.cxx
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel & Bogdan Vulpescu: 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          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveMUONChamberData.h"
11
12 #include <AliMUONGeometryTransformer.h>
13 #include <mapping/AliMpDEIterator.h>
14 #include <mapping/AliMpSectorSegmentation.h>
15 #include <mapping/AliMpSector.h>
16 #include <mapping/AliMpPad.h>
17 #include <mapping/AliMpSegmentation.h>
18
19 #include <TVector2.h>
20
21 #include <EveBase/AliEveEventManager.h>
22
23 ///////////////////////////////////////////////////////////////////////////////
24 ///
25 /// AliEveMUONChamberData: geometry and digits
26 ///
27 ///////////////////////////////////////////////////////////////////////////////
28
29
30 ClassImp(AliEveMUONChamberData)
31
32 AliMUONGeometryTransformer* AliEveMUONChamberData::fgTransformer = 0;
33
34 //______________________________________________________________________________
35 AliEveMUONChamberData::AliEveMUONChamberData(Int_t chamber) :
36   TObject(),
37   fChamberID(0),
38   fNDetElem(0),
39   fNDigits(0),
40   fNClusters(0),
41   fNHits(0)
42 {
43   //
44   // constructor
45   //
46
47   AliEveEventManager *event = gAliEveEvent;
48
49   TString dataPath = TString(event->GetTitle());
50   dataPath.Append("/geometry.root");
51
52   fChamberID = chamber;
53   fNDetElem  = 0;
54   fNDigits   = 0;
55   fNClusters = 0;
56   fNHits     = 0;
57
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   }
66   for (Int_t i = 0; i < 5*256; i++) {
67     fClusterBuffer[i] = 0.0;
68   }
69   for (Int_t i = 0; i < 3*256; i++) {
70     fHitBuffer[i] = 0.0;
71   }
72
73   for (Int_t i = 0; i < 3; i++) {
74     fChamberBox[i*2  ] = +9999;
75     fChamberBox[i*2+1] = -9999;
76   }
77
78   if (fgTransformer == 0) {
79     fgTransformer = new AliMUONGeometryTransformer();
80     fgTransformer->LoadGeometryData(dataPath.Data());
81   }
82
83   Init(chamber);
84
85 }
86
87 //______________________________________________________________________________
88 AliEveMUONChamberData::~AliEveMUONChamberData()
89 {
90   //
91   // destructor
92   //
93
94 }
95
96 //______________________________________________________________________________
97 void AliEveMUONChamberData::DropData()
98 {
99   //
100   // release the chamber data
101   //
102
103   fNDigits   = 0;
104   fNClusters = 0;
105   fNHits     = 0;
106
107   return;
108
109 }
110
111 //______________________________________________________________________________
112 void AliEveMUONChamberData::Init(Int_t chamber)
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
129     Int_t detElemId = it.CurrentDEId();
130
131     if (chamber < 4) {
132
133       sseg = (AliMpSectorSegmentation*)
134              AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0);
135       sector = sseg->GetSector();
136
137       position  = sector->Position();
138       dimension = sector->Dimensions(); // half length
139
140       locP[0] =  position.Px();
141       locP[1] =  position.Py();
142       locD[0] =  dimension.Px() * 2.;
143       locD[1] =  dimension.Py() * 2.;
144
145       locP[2] = 0.0;
146       locD[2] = 0.0;
147
148       fgTransformer->Local2Global(detElemId,
149                                   locP[0], locP[1], locP[2],
150                                   gloP[0], gloP[1], gloP[2]);
151
152       fgTransformer->Local2Global(detElemId,
153                                   locD[0], locD[1], locD[2],
154                                   gloD[0], gloD[1], gloD[2]);
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];
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]);
168
169     } else {
170
171 //      if (!fgSegmentation->HasDE(detElemId)) {
172 //      printf("Segmentation has no %d detElemId! \n",detElemId);
173 //      continue;
174 //      }
175
176       vseg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0);
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
193       fgTransformer->Local2Global(detElemId,
194                                   locP[0], locP[1], locP[2],
195                                   gloP[0], gloP[1], gloP[2]);
196
197       fgTransformer->Local2Global(detElemId,
198                                   locD[0], locD[1], locD[2],
199                                   gloD[0], gloD[1], gloD[2]);
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];
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]);
217
218     }
219
220     fNDetElem++;
221
222   }  // end detElemId loop
223
224 }
225
226 //______________________________________________________________________________
227 void AliEveMUONChamberData::RegisterDigit(Int_t detElemId, Int_t cathode, Int_t ix, Int_t iy, Int_t charge)
228 {
229   //
230   // add a digit to this chamber
231   //
232
233   if ((fNDigits/7) == (4096-1)) return;
234
235   Float_t locP[3], gloP[3], locD[3], gloD[3];
236
237   const AliMpVSegmentation* vseg = AliMpSegmentation::Instance()
238     ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));
239
240   AliMpPad pad = vseg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
241
242   locP[0] = pad.Position().X();
243   locP[1] = pad.Position().Y();
244   locD[0] = pad.Dimensions().X();
245   locD[1] = pad.Dimensions().Y();
246
247   locP[2] = 0.0;
248   locD[2] = 0.0;
249
250   fgTransformer->Local2Global(detElemId,
251                               locP[0], locP[1], locP[2],
252                               gloP[0], gloP[1], gloP[2]);
253
254   gloD[0] = locD[0];
255   gloD[1] = locD[1];
256   gloD[2] = gloP[2];
257
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;
270
271 }
272
273 //______________________________________________________________________________
274 void AliEveMUONChamberData::RegisterCluster(Int_t /*detElemId*/, Int_t cathode, Float_t clsX, Float_t clsY, Float_t clsZ, Float_t charge)
275 {
276   //
277   // add a reconstructed point (cluster) to this chamber
278   //
279   // identical clusters are registered for both cathode planes ...
280   //
281
282   if ((fNClusters/5) == (256-1)) return;
283
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
292 }
293
294 //______________________________________________________________________________
295 void AliEveMUONChamberData::RegisterHit(Int_t /*detElemId*/, Float_t hitX, Float_t hitY, Float_t hitZ)
296 {
297   //
298   // add a simulation hit to this chamber
299   //
300
301   if ((fNHits/3) == (256-1)) return;
302
303   fHitBuffer[fNHits  ] = hitX;
304   fHitBuffer[fNHits+1] = hitY;
305   fHitBuffer[fNHits+2] = hitZ;
306
307   fNHits += 3;
308
309 }