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