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