]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONPainterPadStore.cxx
Updates
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterPadStore.cxx
CommitLineData
0145e89a 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16// $Id$
17
18#include "AliMUONPainterPadStore.h"
19
20#include "AliMUONCalibParamND.h"
21#include "AliMUON2DMap.h"
22#include "AliMUONVStore.h"
23#include "AliMUONVDigit.h"
24#include "AliLog.h"
25#include <Riostream.h>
26#include <TArrayI.h>
27#include <TVector2.h>
28
29///\class AliMUONPainterPadStore
30///
31/// Container for pads
32///
33///\author Laurent Aphecetche, Subatech
34
b80faac0 35using std::cout;
36using std::endl;
0145e89a 37///\cond CLASSIMP
38ClassImp(AliMUONPainterPadStore)
39///\endcond
40
ce350193 41//_____________________________________________________________________________
42AliMUONPainterPadStore::AliMUONPainterPadStore(TRootIOCtor* /*dummy*/) : TObject(),
43fPadStore(0x0)
44{
45 /// ctor
46}
47
0145e89a 48//_____________________________________________________________________________
49AliMUONPainterPadStore::AliMUONPainterPadStore() : TObject(),
50 fPadStore(new AliMUON2DMap(kTRUE))
51{
52 /// ctor
53}
54
55//_____________________________________________________________________________
56AliMUONPainterPadStore::~AliMUONPainterPadStore()
57{
58 /// dtor
59 delete fPadStore;
60}
61
62//_____________________________________________________________________________
63Int_t
64AliMUONPainterPadStore::FindPadID(const TArrayI& pads, Double_t x, Double_t y) const
65{
66 /// Find, in array of pads, the one which contains (x,y). Returns -1 if not
67 /// found
68
69 for ( Int_t i = 0; i < pads.GetSize(); ++i )
70 {
71 Int_t id = pads.At(i);
72
73 TVector2 position;
74 TVector2 dimensions;
75
76 GetPadGeometry(id,position,dimensions);
77
78 TVector2 bl(position-dimensions);
79 TVector2 ur(position+dimensions);
80 if ( bl.X() <= x && ur.X() >= x && bl.Y() <= y && ur.Y() >= y )
81 {
82 return id;
83 }
84 }
85 return -1;
86}
87
88
89//_____________________________________________________________________________
90AliMUONVCalibParam*
91AliMUONPainterPadStore::Get(Int_t detElemId, Int_t manuId) const
92{
93 /// Get the pad container for a given manu
94
95 AliMUONVCalibParam* param =
96 static_cast<AliMUONVCalibParam*>(fPadStore->FindObject(detElemId,manuId));
97
98 if (!param)
99 {
100 param = new AliMUONCalibParamND(4,64,detElemId,manuId,-1.0);
101 fPadStore->Add(param);
102 }
103
104 return param;
105}
106
107//_____________________________________________________________________________
108void
109AliMUONPainterPadStore::GetBoundaries(const TArrayI& pads,
110 Double_t& xmin,
111 Double_t& ymin,
112 Double_t& xmax,
113 Double_t& ymax) const
114{
115 /// Get the area covered by an array of pads
116
117 xmin=ymin=1E9;
118 xmax=ymax=-1E9;
119
120 for ( Int_t i = 0; i < pads.GetSize(); ++i )
121 {
122 Int_t id = pads.At(i);
123
124 TVector2 position;
125 TVector2 dimensions;
126
127 GetPadGeometry(id,position,dimensions);
128
129 TVector2 bl(position-dimensions);
130 TVector2 ur(position+dimensions);
131 xmin = TMath::Min(xmin,bl.X());
132 ymin = TMath::Min(ymin,bl.Y());
133 xmax = TMath::Max(xmax,ur.X());
134 ymax = TMath::Max(ymax,ur.Y());
135 }
136}
137
138//_____________________________________________________________________________
139void
140AliMUONPainterPadStore::GetPadGeometry(Int_t padId,
141 TVector2& position,
142 TVector2& dimensions) const
143{
144 /// Get the geomtry of one pad
145
146 if ( padId < 0 )
147 {
148 AliError(Form("padId is < 0 : %d",padId));
149 position.Set(0.0,0.0);
150 dimensions.Set(-1.0,-1.0);
151 return;
152 }
153
154 Int_t detElemId = AliMUONVDigit::DetElemId(padId);
155 Int_t manuId = AliMUONVDigit::ManuId(padId);
156 Int_t manuChannel = AliMUONVDigit::ManuChannel(padId);
157
158 AliMUONVCalibParam* param =
159 static_cast<AliMUONVCalibParam*>(fPadStore->FindObject(detElemId,manuId));
160
161 if (!param)
162 {
163 AliError(Form("Could not find object DE %d manu %d",detElemId,manuId));
164 position.Set(0.0,0.0);
165 dimensions.Set(-1.0,-1.0);
166 return;
167 }
168
169 position.Set(param->ValueAsDouble(manuChannel,0),
170 param->ValueAsDouble(manuChannel,1));
171
172 dimensions.Set(param->ValueAsDouble(manuChannel,2),
173 param->ValueAsDouble(manuChannel,3));
174
175 AliDebug(3,Form("DE %4d Manu %4d Channel %2d Pos %e %e Dim %e %e",
176 detElemId,manuId,manuChannel,
177 position.X(),position.Y(),
178 dimensions.X(),dimensions.Y()));
179}
180
181//_____________________________________________________________________________
182Int_t
183AliMUONPainterPadStore::GetSize() const
184{
185 /// Get the number of pads we handle
186
187 TIter next(fPadStore->CreateIterator());
188 AliMUONVCalibParam* param;
189 Int_t n(0);
190
191 while ( ( param = static_cast<AliMUONVCalibParam*>(next()) ) )
192 {
193 for ( Int_t i = 0; i < param->Size(); ++i )
194 {
195 if ( param->ValueAsDouble(i,2) >= 0 && param->ValueAsDouble(i,3) >= 0 )
196 {
197 ++n;
198 }
199 }
200 }
201
202 return n;
203}
204
205//_____________________________________________________________________________
206void
207AliMUONPainterPadStore::PrintPads(const TArrayI& pads) const
208{
209 /// Printout
210 cout << "n=" << pads.GetSize() << endl;
211
212 for ( Int_t i = 0; i < pads.GetSize(); ++i )
213 {
214 Int_t id = pads.At(i);
215 TVector2 position, dimensions;
216 GetPadGeometry(id,position,dimensions);
217 cout << Form("i %4d DE %4d ManuID %4d ManuChannel %2d (X,Y)=(%7.3f,%7.3f)"
218 " (DX,DY)=(%7.3f,%7.3f)",
219 i,
220 AliMUONVDigit::DetElemId(id),
221 AliMUONVDigit::ManuId(id),
222 AliMUONVDigit::ManuChannel(id),
223 position.X(),position.Y(),
224 dimensions.X(),dimensions.Y()) << endl;
225 }
226}
227