Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / MUON / AliMUONQAMappingCheck.cxx
CommitLineData
45aad778 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/// \class AliMUONQAMappingCheck
19///
20/// Helper class for AliMUONQADataMakerRec, which takes care
21/// of building an AliMUONVTrackerData to store the location of
22/// all the clusters encountered during a run, and all the clusters
23/// that have charge on only one cathode (aka mono-cathode clusters).
24///
25/// This is to easily spot mapping errors and/or region of complete
26/// inefficiencies.
27///
28/// \author Laurent Aphecetche, Subatech
29///
30
31#include "AliMUONQAMappingCheck.h"
32
33#include "AliCDBManager.h"
b3d57767 34#include "AliCodeTimer.h"
45aad778 35#include "AliLog.h"
36#include "AliMUON2DMap.h"
37#include "AliMUONDigitCalibrator.h"
38#include "AliMUONCalibParamND.h"
39#include "AliMUONGeometryTransformer.h"
40#include "AliMUONPadStatusMapMaker.h"
41#include "AliMUONTrackerData.h"
42#include "AliMUONVCluster.h"
43#include "AliMUONVDigit.h"
44#include "AliMpConstants.h"
45#include "AliMpDetElement.h"
46#include "AliMpDDLStore.h"
47#include "AliMpPad.h"
48#include "AliMpSegmentation.h"
49#include "AliMpVSegmentation.h"
50
1bacbb46 51#include "AliMpManuIterator.h"
52
45aad778 53/// \cond CLASSIMP
54ClassImp(AliMUONQAMappingCheck)
55/// \endcond
56
57//_____________________________________________________________________________
58AliMUONQAMappingCheck::AliMUONQAMappingCheck(Int_t runNumber)
59: TObject(),
60fStore(new AliMUON2DMap(kTRUE)),
61fGeometryTransformer(new AliMUONGeometryTransformer),
62fDigitCalibrator(new AliMUONDigitCalibrator(runNumber)),
63fNumberOfEvents(0),
64fNumberOfClusters(0),
65fNumberOfMonoCathodeClusters(0),
66fNumberOfLegitimateMonoCathodeClusters(0)
67{
68 /// Ctor
69
b3d57767 70 AliCodeTimerAuto(Form("RUN %d",runNumber),0);
71
45aad778 72 fGeometryTransformer->LoadGeometryData();
1bacbb46 73
74 // Init the store with all the manus. Note that this is not strictly necessary,
75 // but it helps not to get its growth (that would otherwise happen in
76 // AddClusterLocation each time we get a cluster associated with a manu where
77 // we got no cluster yet) confused with a memory leak...
78 AliMpManuIterator it;
79 Int_t detElemId, manuId;
80
81 while (it.Next(detElemId,manuId))
82 {
83 fStore->Add(new AliMUONCalibParamND(4,AliMpConstants::ManuNofChannels(),detElemId,manuId,0.0));
84 }
45aad778 85}
86
87//_____________________________________________________________________________
88AliMUONQAMappingCheck::~AliMUONQAMappingCheck()
89{
90 /// Dtor. Report on the global number of clusters encountered
91 AliInfo(Form("Nevents %d Nclusters %d Nmono-cathodes %d Nlegitimate-mono-cathodes %d",
92 fNumberOfEvents,
93 fNumberOfClusters,
94 fNumberOfMonoCathodeClusters,
95 fNumberOfLegitimateMonoCathodeClusters));
96 delete fStore;
97 delete fGeometryTransformer;
98 delete fDigitCalibrator;
99}
100
101//____________________________________________________________________________
102void AliMUONQAMappingCheck::AddClusterLocation(Int_t detElemId,
103 Int_t manuId, Int_t manuChannel,
104 Bool_t monoCathode,
105 Bool_t legitimateMonoCathode)
106{
107 /// Add one cluster location to our internal store
108 if ( manuId > 0 )
109 {
110 AliMUONVCalibParam* p = static_cast<AliMUONVCalibParam*>(fStore->FindObject(detElemId,manuId));
111 if (!p)
112 {
113 p = new AliMUONCalibParamND(4,AliMpConstants::ManuNofChannels(),detElemId,manuId,0.0);
114 fStore->Add(p);
115 }
a5c69d36 116
117 p->SetValueAsDouble(manuChannel,0,p->ValueAsDouble(manuChannel,0)+1.0);
118
119 if ( monoCathode )
45aad778 120 {
121 p->SetValueAsDouble(manuChannel,1,p->ValueAsDouble(manuChannel,1)+1.0);
122 if (!legitimateMonoCathode)
123 {
124 p->SetValueAsDouble(manuChannel,2,p->ValueAsDouble(manuChannel,2)+1.0);
125 }
126 }
127 }
128}
129
130//____________________________________________________________________________
131void
132AliMUONQAMappingCheck::NewEvent()
133{
134 /// Increment number of events seen
135 ++fNumberOfEvents;
136}
137
138//____________________________________________________________________________
139AliMUONVTrackerData*
140AliMUONQAMappingCheck::CreateData(const char* name) const
141{
142 /// Make a trackerData from our internal store
143
144 AliMUONVStore* store = static_cast<AliMUONVStore*>(fStore->Clone());
145
146 TIter next(store->CreateIterator());
147 AliMUONVCalibParam* param;
148
149 while ( ( param = static_cast<AliMUONVCalibParam*>(next()) ) )
150 {
151 for ( Int_t i = 0; i < param->Size(); ++i )
152 {
153 param->SetValueAsDouble(i,3,fNumberOfEvents);
154 }
155 }
156
157 AliMUONTrackerData* data = new AliMUONTrackerData(name,name,4,kTRUE);
158 data->SetDimensionName(0,"all"); // all clusters
159 data->SetDimensionName(1,"mono"); // mono-cathode clusters
160 data->SetDimensionName(2,"suspect"); // not legitimate mono-cathode clusters
161 data->SetDimensionName(3,"Nevents"); // number of events
162 data->DisableChannelLevel();
163
164 data->Add(*store);
165
166 delete store;
167
168 return data;
169}
170
171//____________________________________________________________________________
172void
173AliMUONQAMappingCheck::GetClusterLocation(AliMUONVCluster& cluster,
174 Int_t& manuBending, Int_t& manuBendingChannel,
175 Int_t& manuNonBending, Int_t& manuNonBendingChannel,
176 Bool_t& monoCathode, Bool_t& legitimateMonoCathode)
177{
178 /// Get the pad under the center of the cluster, and whether or not this cluster
179 /// has charge on both cathodes
180
181 Int_t detElemId = cluster.GetDetElemId();
182
183 Double_t x,y,z;
184
185 fGeometryTransformer->Global2Local(detElemId,cluster.GetX(),cluster.GetY(),cluster.GetZ(),x,y,z);
186
187 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
188
189 const AliMpVSegmentation* segB = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,de->GetCathodType(AliMp::kBendingPlane));
190 const AliMpVSegmentation* segNB = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,de->GetCathodType(AliMp::kNonBendingPlane));
191
192 AliMpPad padB = segB->PadByPosition(x,y);
193 AliMpPad padNB = segNB->PadByPosition(x,y);
194
195 manuBending = padB.GetManuId();
196 manuBendingChannel = padB.GetManuChannel();
197
198 manuNonBending = padNB.GetManuId();
199 manuNonBendingChannel = padNB.GetManuChannel();
200
201 Bool_t bending(kFALSE);
202 Bool_t nonBending(kFALSE);
203
204 for ( Int_t i = 0; i < cluster.GetNDigits(); ++i )
205// for ( Int_t i = 0; i < cluster.GetNDigits() && !(bending && nonBending); ++i )
206 {
207 UInt_t digitId = cluster.GetDigitId(i);
208 Int_t manuId = AliMUONVDigit::ManuId(digitId);
209 if ( manuId > 0 )
210 {
211 if ( manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane) )
212 {
213 nonBending = kTRUE;
214 }
215 else
216 {
217 bending = kTRUE;
218 }
219 }
220 }
221
222 monoCathode = ( bending != nonBending );
223
224 if ( monoCathode )
225 {
226 legitimateMonoCathode = kFALSE;
227 if (!bending)
228 {
229 if ( IsManuDead(detElemId,manuBending) ) legitimateMonoCathode = kTRUE;
230 }
231
232 if (!nonBending)
233 {
234
235 if ( IsManuDead(detElemId,manuNonBending) ) legitimateMonoCathode = kTRUE;
236 }
237 }
238
239 if (!bending) manuBending *= -1;
240 if (!nonBending) manuNonBending *= -1;
241
242 ++fNumberOfClusters;
243 if ( monoCathode )
244 {
245 ++fNumberOfMonoCathodeClusters;
246 if ( legitimateMonoCathode ) ++fNumberOfLegitimateMonoCathodeClusters;
247 }
248}
249
250//____________________________________________________________________________
251Bool_t AliMUONQAMappingCheck::IsManuDead(Int_t detElemId, Int_t manuId) const
252{
253 /// Using the statusmaker, tells if a given manu is to be considered
254 /// as dead (here dead means at least one manas dead)
255
256 if ( manuId <= 0 ) return kTRUE;
257
258 Int_t n(0);
259
260 for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i)
261 {
262 if ( IsChannelDead(detElemId,manuId,i) ) ++n;
263 }
264 return n > 16;
265}
266
267//____________________________________________________________________________
268Bool_t AliMUONQAMappingCheck::IsChannelDead(Int_t detElemId, Int_t manuId, Int_t manuChannel) const
269{
270 /// Using the statusmaker, tells if a given channel is dead
271
dd0be8a7 272 return ( fDigitCalibrator->StatusMap(detElemId,manuId,manuChannel) & (AliMUONPadStatusMapMaker::SelfDeadMask() != 0) );
45aad778 273}
274
275//____________________________________________________________________________
276void
277AliMUONQAMappingCheck::Store(AliMUONVCluster& cluster)
278{
279 /// Store information about a single cluster
280
281 if ( cluster.GetCharge() < 10 ) return;
282
283 Int_t manuBendingId, manuBendingChannel;
284 Int_t manuNonBendingId, manuNonBendingChannel;
285 Bool_t monoCathode, legitimateMonoCathode;
286
287 GetClusterLocation(cluster, manuBendingId, manuBendingChannel,manuNonBendingId, manuNonBendingChannel, monoCathode,legitimateMonoCathode);
288
289 AddClusterLocation(cluster.GetDetElemId(),manuBendingId,manuBendingChannel,monoCathode,legitimateMonoCathode);
290 AddClusterLocation(cluster.GetDetElemId(),manuNonBendingId,manuNonBendingChannel,monoCathode,legitimateMonoCathode);
291}