Adding more bins in QA (Alis)
[u/mrichter/AliRoot.git] / MUON / AliMUONBusPatchPainter.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 "AliMUONBusPatchPainter.h"
19
20#include "AliMUONManuPainter.h"
8f0acce4 21#include "AliMUONContour.h"
0145e89a 22#include "AliMUONPainterHelper.h"
23#include "AliMUONVCalibParam.h"
24#include "AliMUONVTrackerData.h"
25#include "AliMpBusPatch.h"
26#include "AliMpConstants.h"
27#include "AliMpDDLStore.h"
28#include "AliMpDEManager.h"
29#include "AliMpPlaneType.h"
30#include "AliLog.h"
31#include <TObjArray.h>
32#include <TString.h>
33#include <float.h>
34
35/// \class AliMUONBusPatchPainter
36///
37/// Painter for one bus patch. Actually possibly for only part of one
38/// buspatch (the part that is on the plane/cathode requested when
39/// creating the painter)
40///
41/// \author Laurent Aphecetche, Subatech
42
43///\cond CLASSIMP
44ClassImp(AliMUONBusPatchPainter)
45///\endcond
46
47//_____________________________________________________________________________
48AliMUONBusPatchPainter::AliMUONBusPatchPainter()
49: AliMUONVPainter(),
50fBusPatchId(-1)
51{
52 /// default ctor
53}
54
55//_____________________________________________________________________________
1ffbeb9d 56AliMUONBusPatchPainter::AliMUONBusPatchPainter(TRootIOCtor* ioCtor)
57: AliMUONVPainter(ioCtor),
58fBusPatchId(-1)
59{
60 /// default streaming ctor
61}
62
63//_____________________________________________________________________________
0145e89a 64AliMUONBusPatchPainter::AliMUONBusPatchPainter(const AliMUONAttPainter& att,
65 Int_t busPatchId)
66: AliMUONVPainter("BUSPATCH"),
67fBusPatchId(busPatchId)
68{
69 /// normal ctor
70 /// WARNING : the construction of this object can fail.
71 /// You MUST check the IsValid() method afterwards (real world would
72 /// be to use exception, but well, whether we should use exceptions
73 /// in aliroot is still unclear to me.
74
75 SetAttributes(Validate(att));
76
77 AliMp::PlaneType planeType = ( Attributes().IsBendingPlane() ? AliMp::kBendingPlane : AliMp::kNonBendingPlane );
78
79 Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(busPatchId);
80
81 AliMUONPainterHelper* h = AliMUONPainterHelper::Instance();
82
83 SetID(busPatchId,-1);
84 SetName(h->BusPatchName(busPatchId));
85 SetPathName(h->BusPatchPathName(busPatchId));
86
87 AliMpBusPatch* busPatch = AliMpDDLStore::Instance()->GetBusPatch(fBusPatchId);
88
89 Int_t mask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane);
90
8f0acce4 91 AliMUONContour* bpContour = h->GetContour(ContourName());
0145e89a 92
93 AliDebug(1,Form("BusPatchId %04d bending %d DE %4d bpContour(%s)=%p nofManus=%d",
94 fBusPatchId,att.IsBendingPlane(),detElemId,ContourName().Data(),bpContour,busPatch->GetNofManus()));
95
96 Double_t xmin(FLT_MAX), ymin(FLT_MAX), xmax(-FLT_MAX), ymax(-FLT_MAX);
97
98 TObjArray contours;
99
100 Int_t nmanus(0);
101
102 for ( Int_t i = 0; i < busPatch->GetNofManus(); ++i )
103 {
104 Int_t manuId = busPatch->GetManuId(i);
105
106 Bool_t correctPlane(kTRUE);
107
108 if ( planeType == AliMp::kNonBendingPlane )
109 {
110 if ( ( manuId & mask ) == 0 ) correctPlane = kFALSE;
111 }
112 else
113 {
114 if ( ( manuId & mask ) == mask ) correctPlane = kFALSE;
115 }
116
117 AliDebug(1,Form("Adding Manu %04d to BusPatch %04d (DE %04d) "
118 "manu & mask = %d correctPlane %d planeType %s",
119 manuId,fBusPatchId,busPatch->GetDEId(),
120 (manuId & mask),correctPlane,AliMp::PlaneTypeName(planeType).Data()));
121
122 if (!correctPlane) continue;
123
124 ++nmanus;
125
126 AliMUONVPainter* painter = new AliMUONManuPainter(Attributes(),
127 busPatch->GetDEId(),
128 manuId);
129
130 Add(painter);
131
132 const AliMpArea& area = painter->Area();
133
134 xmin = TMath::Min(xmin,\varea.LeftBorder());
135 ymin = TMath::Min(ymin,area.DownBorder());
136 xmax = TMath::Max(xmax,area.RightBorder());
137 ymax = TMath::Max(ymax,area.UpBorder());
138
139 if (!bpContour)
140 {
141 contours.Add(painter->Contour());
142 }
143 }
144
145 if ( !nmanus )
146 {
147 Invalidate();
148 return;
149 }
150
151 if (!bpContour)
152 {
153 AliDebug(1,Form("Creating contour %s",ContourName().Data()));
154 bpContour = h->MergeContours(contours,ContourName());
155 if (!bpContour)
156 {
157 AliError("Could not merge those contours");
158 StdoutToAliError(contours.Print(););
159 }
160 }
161
162 SetContour(bpContour);
163}
164
165//_____________________________________________________________________________
166void
167AliMUONBusPatchPainter::ComputeDataRange(const AliMUONVTrackerData& data, Int_t dataIndex,
168 Double_t& dataMin, Double_t& dataMax) const
169{
170 /// Compute the data range spanned by this bus patch (on this cathode or plane)
171 dataMin = dataMax = data.BusPatch(fBusPatchId, dataIndex);
172}
173
174//_____________________________________________________________________________
175AliMUONBusPatchPainter::AliMUONBusPatchPainter(const AliMUONBusPatchPainter& rhs)
176: AliMUONVPainter(rhs), fBusPatchId(-1)
177{
178 /// Copy ctor
179 rhs.Copy(*this);
180}
181
182//_____________________________________________________________________________
183AliMUONBusPatchPainter&
184AliMUONBusPatchPainter::operator=(const AliMUONBusPatchPainter& rhs)
185{
186 /// Assignment operator
187 if ( this != &rhs )
188 {
189 rhs.Copy(*this);
190 }
191 return *this;
192}
193
194//_____________________________________________________________________________
195AliMUONBusPatchPainter::~AliMUONBusPatchPainter()
196{
197 /// dtor
198}
199
200//_____________________________________________________________________________
201void
202AliMUONBusPatchPainter::Copy(TObject& object) const
203{
204 /// Copy this to object
205 AliMUONVPainter::Copy((AliMUONVPainter&)(object));
206 ((AliMUONBusPatchPainter&)(object)).fBusPatchId = fBusPatchId;
207}
208
209//_____________________________________________________________________________
1ffbeb9d 210Bool_t
211AliMUONBusPatchPainter::IsIncluded() const
212{
213 /// whether this bus patch is included in the readout or not
214 return ( InteractiveReadOutConfig()->BusPatch(fBusPatchId) > 0 );
215}
216
217//_____________________________________________________________________________
0145e89a 218TString
219AliMUONBusPatchPainter::Describe(const AliMUONVTrackerData& data, Int_t dataIndex,
220 Double_t, Double_t)
221{
222 /// Text about data
223
224 if (!data.HasBusPatch(fBusPatchId)) return "";
225
226 Double_t value = data.BusPatch(fBusPatchId,dataIndex);
227
228 return AliMUONPainterHelper::Instance()->FormatValue(data.DimensionName(dataIndex).Data(),value);
229}
230
231//_____________________________________________________________________________
232void
233AliMUONBusPatchPainter::PaintArea(const AliMUONVTrackerData& data, Int_t dataIndex,
234 Double_t min, Double_t max)
235{
236 /// Paint area of this buspatch according to the data
237
238 if (!data.HasBusPatch(fBusPatchId)) return;
239
240 Double_t value = data.BusPatch(fBusPatchId,dataIndex);
241
242 if ( value >= AliMUONVCalibParam::InvalidFloatValue() ) return;
243
244 Int_t color = AliMUONPainterHelper::Instance()->ColorFromValue(value,min,max);
245
8f0acce4 246 PaintArea(color);
0145e89a 247}
248
249//_____________________________________________________________________________
250AliMUONAttPainter
251AliMUONBusPatchPainter::Validate(const AliMUONAttPainter& attributes) const
252{
253 /// Normalize attributes
254
255 // we invalidate the attributes, if we have no manu in the requested plane
256 // and we cross-check that both cathode and plane are up-to-date
257
258 AliMUONAttPainter norm(attributes);
259
260 Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(fBusPatchId);
261
262 if (!norm.IsValid()) return norm;
263
264 if ( !norm.IsCathodeDefined() )
265 {
266 AliMp::PlaneType planeType = ( norm.IsBendingPlane() ? AliMp::kBendingPlane : AliMp::kNonBendingPlane );
267
268 AliMp::CathodType cathodeType = AliMpDEManager::GetCathod(detElemId,planeType);
269
270 Bool_t cath0 = ( cathodeType == AliMp::kCath0 );
271
272 norm.SetCathode(cath0,!cath0);
273 }
274 else if ( !norm.IsPlaneDefined() )
275 {
276 AliMp::CathodType cathodeType = ( norm.IsCathode0() ? AliMp::kCath0 : AliMp::kCath1 );
277
278 AliMp::PlaneType planeType = AliMpDEManager::GetPlaneType(detElemId,cathodeType);
279
280 Bool_t bending = ( planeType == AliMp::kBendingPlane );
281
282 norm.SetPlane(bending,!bending);
283 }
284
285 AliMpBusPatch* busPatch = AliMpDDLStore::Instance()->GetBusPatch(fBusPatchId);
286
287 Int_t mask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane);
288
289 Int_t nb(0);
290 Int_t b(0);
291
292 for ( Int_t i = 0; i < busPatch->GetNofManus(); ++i )
293 {
294 Int_t manuId = busPatch->GetManuId(i);
295
296 if ( manuId & mask ) ++nb;
297 else ++b;
298 }
299
300 if ( norm.IsBendingPlane() && !b ) norm.SetValid(kFALSE);
301 if ( norm.IsNonBendingPlane() && !nb ) norm.SetValid(kFALSE);
302
303 return norm;
304}
305