]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveDet/AliEveMUONChamberData.cxx
Temporary fix to avoid xrootd thrashing
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveMUONChamberData.cxx
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          *
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 <EveDet/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 {
42   //
43   // constructor
44   //
45
46   AliEveEventManager *event = gEvent;
47
48   TString dataPath = TString(event->GetTitle());
49   dataPath.Append("/geometry.root");
50
51   fChamberID = chamber;
52   fNDetElem  = 0;
53   fNDigits   = 0;
54   fNClusters = 0;
55   fNHits     = 0;
56
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   }
65   for (Int_t i = 0; i < 5*256; i++) {
66     fClusterBuffer[i] = 0.0;
67   }
68   for (Int_t i = 0; i < 3*256; i++) {
69     fHitBuffer[i] = 0.0;
70   }
71
72   for (Int_t i = 0; i < 3; i++) {
73     fChamberBox[i*2  ] = +9999;
74     fChamberBox[i*2+1] = -9999;
75   }
76
77   if (fgTransformer == 0) {
78     fgTransformer = new AliMUONGeometryTransformer();
79     fgTransformer->LoadGeometryData(dataPath.Data());
80   }
81
82   Init(chamber);
83
84 }
85
86 //______________________________________________________________________________
87 AliEveMUONChamberData::~AliEveMUONChamberData()
88 {
89   //
90   // destructor
91   //
92
93 }
94
95 //______________________________________________________________________________
96 void AliEveMUONChamberData::DropData()
97 {
98   //
99   // release the chamber data
100   //
101
102   fNDigits   = 0;
103   fNClusters = 0;
104   fNHits     = 0;
105
106   return;
107
108 }
109
110 //______________________________________________________________________________
111 void AliEveMUONChamberData::Init(Int_t chamber)
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
128     Int_t detElemId = it.CurrentDEId();
129
130     if (chamber < 4) {
131
132       sseg = (AliMpSectorSegmentation*)
133              AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0);
134       sector = sseg->GetSector();
135
136       position  = sector->Position();
137       dimension = sector->Dimensions(); // half length
138
139       locP[0] =  position.Px();
140       locP[1] =  position.Py();
141       locD[0] =  dimension.Px() * 2.;
142       locD[1] =  dimension.Py() * 2.;
143
144       locP[2] = 0.0;
145       locD[2] = 0.0;
146
147       fgTransformer->Local2Global(detElemId,
148                                   locP[0], locP[1], locP[2],
149                                   gloP[0], gloP[1], gloP[2]);
150
151       fgTransformer->Local2Global(detElemId,
152                                   locD[0], locD[1], locD[2],
153                                   gloD[0], gloD[1], gloD[2]);
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];
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]);
167
168     } else {
169
170 //      if (!fgSegmentation->HasDE(detElemId)) {
171 //      printf("Segmentation has no %d detElemId! \n",detElemId);
172 //      continue;
173 //      }
174
175       vseg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0);
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
192       fgTransformer->Local2Global(detElemId,
193                                   locP[0], locP[1], locP[2],
194                                   gloP[0], gloP[1], gloP[2]);
195
196       fgTransformer->Local2Global(detElemId,
197                                   locD[0], locD[1], locD[2],
198                                   gloD[0], gloD[1], gloD[2]);
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];
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]);
216
217     }
218
219     fNDetElem++;
220
221   }  // end detElemId loop
222
223 }
224
225 //______________________________________________________________________________
226 void AliEveMUONChamberData::RegisterDigit(Int_t detElemId, Int_t cathode, Int_t ix, Int_t iy, Int_t charge)
227 {
228   //
229   // add a digit to this chamber
230   //
231
232   if ((fNDigits/7) == (4096-1)) return;
233
234   Float_t locP[3], gloP[3], locD[3], gloD[3];
235
236   const AliMpVSegmentation* vseg = AliMpSegmentation::Instance()
237     ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));
238
239   AliMpPad pad = vseg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
240
241   locP[0] = pad.Position().X();
242   locP[1] = pad.Position().Y();
243   locD[0] = pad.Dimensions().X();
244   locD[1] = pad.Dimensions().Y();
245
246   locP[2] = 0.0;
247   locD[2] = 0.0;
248
249   fgTransformer->Local2Global(detElemId,
250                               locP[0], locP[1], locP[2],
251                               gloP[0], gloP[1], gloP[2]);
252
253   gloD[0] = locD[0];
254   gloD[1] = locD[1];
255   gloD[2] = gloP[2];
256
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;
269
270 }
271
272 //______________________________________________________________________________
273 void AliEveMUONChamberData::RegisterCluster(Int_t /*detElemId*/, Int_t cathode, Float_t clsX, Float_t clsY, Float_t clsZ, Float_t charge)
274 {
275   //
276   // add a reconstructed point (cluster) to this chamber
277   //
278   // identical clusters are registered for both cathode planes ...
279   //
280
281   if ((fNClusters/5) == (256-1)) return;
282
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
291 }
292
293 //______________________________________________________________________________
294 void AliEveMUONChamberData::RegisterHit(Int_t /*detElemId*/, Float_t hitX, Float_t hitY, Float_t hitZ)
295 {
296   //
297   // add a simulation hit to this chamber
298   //
299
300   if ((fNHits/3) == (256-1)) return;
301
302   fHitBuffer[fNHits  ] = hitX;
303   fHitBuffer[fNHits+1] = hitY;
304   fHitBuffer[fNHits+2] = hitZ;
305
306   fNHits += 3;
307
308 }