Remove the dollar-id-dollar in the responsible name which interfere with CDB_MD metad...
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterPadStore.cxx
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
35 using std::cout;
36 using std::endl;
37 ///\cond CLASSIMP
38 ClassImp(AliMUONPainterPadStore)
39 ///\endcond
40
41 //_____________________________________________________________________________
42 AliMUONPainterPadStore::AliMUONPainterPadStore(TRootIOCtor* /*dummy*/) : TObject(),
43 fPadStore(0x0)
44 {
45   /// ctor
46 }
47
48 //_____________________________________________________________________________
49 AliMUONPainterPadStore::AliMUONPainterPadStore() : TObject(),
50   fPadStore(new AliMUON2DMap(kTRUE))
51 {
52     /// ctor
53 }
54
55 //_____________________________________________________________________________
56 AliMUONPainterPadStore::~AliMUONPainterPadStore()
57 {
58   /// dtor
59   delete fPadStore;
60 }
61
62 //_____________________________________________________________________________
63 Int_t
64 AliMUONPainterPadStore::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 //_____________________________________________________________________________
90 AliMUONVCalibParam*
91 AliMUONPainterPadStore::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 //_____________________________________________________________________________
108 void
109 AliMUONPainterPadStore::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 //_____________________________________________________________________________
139 void
140 AliMUONPainterPadStore::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 //_____________________________________________________________________________
182 Int_t
183 AliMUONPainterPadStore::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 //_____________________________________________________________________________
206 void
207 AliMUONPainterPadStore::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