1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 /// \class AliMUONQAMappingCheck
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).
25 /// This is to easily spot mapping errors and/or region of complete
28 /// \author Laurent Aphecetche, Subatech
31 #include "AliMUONQAMappingCheck.h"
33 #include "AliCDBManager.h"
34 #include "AliCodeTimer.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"
48 #include "AliMpSegmentation.h"
49 #include "AliMpVSegmentation.h"
51 #include "AliMpManuIterator.h"
54 ClassImp(AliMUONQAMappingCheck)
57 //_____________________________________________________________________________
58 AliMUONQAMappingCheck::AliMUONQAMappingCheck(Int_t runNumber)
60 fStore(new AliMUON2DMap(kTRUE)),
61 fGeometryTransformer(new AliMUONGeometryTransformer),
62 fDigitCalibrator(new AliMUONDigitCalibrator(runNumber)),
65 fNumberOfMonoCathodeClusters(0),
66 fNumberOfLegitimateMonoCathodeClusters(0)
70 AliCodeTimerAuto(Form("RUN %d",runNumber),0);
72 fGeometryTransformer->LoadGeometryData();
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...
79 Int_t detElemId, manuId;
81 while (it.Next(detElemId,manuId))
83 fStore->Add(new AliMUONCalibParamND(4,AliMpConstants::ManuNofChannels(),detElemId,manuId,0.0));
87 //_____________________________________________________________________________
88 AliMUONQAMappingCheck::~AliMUONQAMappingCheck()
90 /// Dtor. Report on the global number of clusters encountered
91 AliInfo(Form("Nevents %d Nclusters %d Nmono-cathodes %d Nlegitimate-mono-cathodes %d",
94 fNumberOfMonoCathodeClusters,
95 fNumberOfLegitimateMonoCathodeClusters));
97 delete fGeometryTransformer;
98 delete fDigitCalibrator;
101 //____________________________________________________________________________
102 void AliMUONQAMappingCheck::AddClusterLocation(Int_t detElemId,
103 Int_t manuId, Int_t manuChannel,
105 Bool_t legitimateMonoCathode)
107 /// Add one cluster location to our internal store
110 AliMUONVCalibParam* p = static_cast<AliMUONVCalibParam*>(fStore->FindObject(detElemId,manuId));
113 p = new AliMUONCalibParamND(4,AliMpConstants::ManuNofChannels(),detElemId,manuId,0.0);
118 p->SetValueAsDouble(manuChannel,0,p->ValueAsDouble(manuChannel,0)+1.0);
122 p->SetValueAsDouble(manuChannel,1,p->ValueAsDouble(manuChannel,1)+1.0);
123 if (!legitimateMonoCathode)
125 p->SetValueAsDouble(manuChannel,2,p->ValueAsDouble(manuChannel,2)+1.0);
131 //____________________________________________________________________________
133 AliMUONQAMappingCheck::NewEvent()
135 /// Increment number of events seen
139 //____________________________________________________________________________
141 AliMUONQAMappingCheck::CreateData(const char* name) const
143 /// Make a trackerData from our internal store
145 AliMUONVStore* store = static_cast<AliMUONVStore*>(fStore->Clone());
147 TIter next(store->CreateIterator());
148 AliMUONVCalibParam* param;
150 while ( ( param = static_cast<AliMUONVCalibParam*>(next()) ) )
152 for ( Int_t i = 0; i < param->Size(); ++i )
154 param->SetValueAsDouble(i,3,fNumberOfEvents);
158 AliMUONTrackerData* data = new AliMUONTrackerData(name,name,4,kTRUE);
159 data->SetDimensionName(0,"all"); // all clusters
160 data->SetDimensionName(1,"mono"); // mono-cathode clusters
161 data->SetDimensionName(2,"suspect"); // not legitimate mono-cathode clusters
162 data->SetDimensionName(3,"Nevents"); // number of events
163 data->DisableChannelLevel();
172 //____________________________________________________________________________
174 AliMUONQAMappingCheck::GetClusterLocation(AliMUONVCluster& cluster,
175 Int_t& manuBending, Int_t& manuBendingChannel,
176 Int_t& manuNonBending, Int_t& manuNonBendingChannel,
177 Bool_t& monoCathode, Bool_t& legitimateMonoCathode)
179 /// Get the pad under the center of the cluster, and whether or not this cluster
180 /// has charge on both cathodes
182 Int_t detElemId = cluster.GetDetElemId();
186 fGeometryTransformer->Global2Local(detElemId,cluster.GetX(),cluster.GetY(),cluster.GetZ(),x,y,z);
188 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
190 const AliMpVSegmentation* segB = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,de->GetCathodType(AliMp::kBendingPlane));
191 const AliMpVSegmentation* segNB = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,de->GetCathodType(AliMp::kNonBendingPlane));
193 AliMpPad padB = segB->PadByPosition(x,y);
194 AliMpPad padNB = segNB->PadByPosition(x,y);
196 manuBending = padB.GetManuId();
197 manuBendingChannel = padB.GetManuChannel();
199 manuNonBending = padNB.GetManuId();
200 manuNonBendingChannel = padNB.GetManuChannel();
202 Bool_t bending(kFALSE);
203 Bool_t nonBending(kFALSE);
205 for ( Int_t i = 0; i < cluster.GetNDigits(); ++i )
206 // for ( Int_t i = 0; i < cluster.GetNDigits() && !(bending && nonBending); ++i )
208 UInt_t digitId = cluster.GetDigitId(i);
209 Int_t manuId = AliMUONVDigit::ManuId(digitId);
212 if ( manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane) )
223 monoCathode = ( bending != nonBending );
227 legitimateMonoCathode = kFALSE;
230 if ( IsManuDead(detElemId,manuBending) ) legitimateMonoCathode = kTRUE;
236 if ( IsManuDead(detElemId,manuNonBending) ) legitimateMonoCathode = kTRUE;
240 if (!bending) manuBending *= -1;
241 if (!nonBending) manuNonBending *= -1;
246 ++fNumberOfMonoCathodeClusters;
247 if ( legitimateMonoCathode ) ++fNumberOfLegitimateMonoCathodeClusters;
251 //____________________________________________________________________________
252 Bool_t AliMUONQAMappingCheck::IsManuDead(Int_t detElemId, Int_t manuId) const
254 /// Using the statusmaker, tells if a given manu is to be considered
255 /// as dead (here dead means at least one manas dead)
257 if ( manuId <= 0 ) return kTRUE;
261 for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i)
263 if ( IsChannelDead(detElemId,manuId,i) ) ++n;
268 //____________________________________________________________________________
269 Bool_t AliMUONQAMappingCheck::IsChannelDead(Int_t detElemId, Int_t manuId, Int_t manuChannel) const
271 /// Using the statusmaker, tells if a given channel is dead
273 return ( fDigitCalibrator->StatusMap(detElemId,manuId,manuChannel) & (AliMUONPadStatusMapMaker::SelfDeadMask() != 0) );
276 //____________________________________________________________________________
278 AliMUONQAMappingCheck::Store(AliMUONVCluster& cluster)
280 /// Store information about a single cluster
282 if ( cluster.GetCharge() < 10 ) return;
284 Int_t manuBendingId, manuBendingChannel;
285 Int_t manuNonBendingId, manuNonBendingChannel;
286 Bool_t monoCathode, legitimateMonoCathode;
288 GetClusterLocation(cluster, manuBendingId, manuBendingChannel,manuNonBendingId, manuNonBendingChannel, monoCathode,legitimateMonoCathode);
290 AddClusterLocation(cluster.GetDetElemId(),manuBendingId,manuBendingChannel,monoCathode,legitimateMonoCathode);
291 AddClusterLocation(cluster.GetDetElemId(),manuNonBendingId,manuNonBendingChannel,monoCathode,legitimateMonoCathode);