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 //-----------------------------------------------------------------------------
19 /// \class AliMUONPadStatusMapMaker
21 /// Convert a pad statuses into pad status maps.
23 /// A pad status is one 32-bits word describing whether this pad pedestal, gains
24 /// hv is correct or not.
26 /// A pad status *map* is one 32-bits (of which 24 only are used)
27 /// word describing whether this pad neighbours are ok or not
28 /// (whether a pad is ok or not is determined by applying a given
29 /// bitmask to the pad status word). Each bit in this word is related to one
30 /// neighbour, assuming the pad itself is at bit 0
40 /// Note that for instance in NonBending plane of slats, at the boundaries
41 /// between two pad densities, the pictures is a bit different, e.g.
42 /// (bits in () are always zero)
44 /// so some care must be taken when designing a mask to be tested ;-) if you
45 /// want to go farther than immediate neighbours...
47 /// If a pad is at a physical boundary, is will for sure have some bits at 1
48 /// (i.e. a non-existing neighbour is considered = bad).
51 /// add something about the reject list/probabilities here... (LA)
53 /// \author Laurent Aphecetche
54 //-----------------------------------------------------------------------------
56 #include "AliMUONPadStatusMapMaker.h"
58 #include "AliCodeTimer.h"
60 #include "AliMpDDLStore.h"
61 #include "AliMpDetElement.h"
62 #include "AliMpManuIterator.h"
63 #include "AliMUON2DMap.h"
64 #include "AliMUONCalibParamNF.h"
65 #include "AliMUONCalibParamNI.h"
66 #include "AliMUONCalibrationData.h"
67 #include "AliMUONPadStatusMaker.h"
68 #include "AliMUONRejectList.h"
69 #include "AliMUONVCalibParam.h"
70 #include "AliMUONVStore.h"
71 #include "AliMpConstants.h"
72 #include <Riostream.h>
78 ClassImp(AliMUONPadStatusMapMaker)
81 Int_t AliMUONPadStatusMapMaker::fgkSelfDead = 1;
83 //_____________________________________________________________________________
84 AliMUONPadStatusMapMaker::AliMUONPadStatusMapMaker(const AliMUONPadStatusMaker& padStatusMaker,
86 Bool_t deferredInitialization)
88 fkStatusMaker(padStatusMaker),
90 fStatusMap(new AliMUON2DMap(true)),
91 fRejectProbabilities(new AliMUON2DMap(true)),
95 if (!deferredInitialization)
97 AliCodeTimerAuto("Computing complete status map at once");
98 AliMUONVStore* neighboursStore = padStatusMaker.NeighboursStore();
99 AliMUONVCalibParam* param;
100 TIter next(neighboursStore->CreateIterator());
101 while ( ( param = static_cast<AliMUONVCalibParam*>(next()) ) )
103 Int_t detElemId = param->ID0();
104 Int_t manuId = param->ID1();
105 ComputeStatusMap(detElemId,manuId);
109 /// Whatever the deferred flag is, we *have* to compute the reject
110 /// probabilities here and now, for *all* channels.
112 AliMUONRejectList* rl = padStatusMaker.CalibrationData().RejectList();
116 AliMpManuIterator it;
120 while ( it.Next(detElemId,manuId) )
122 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
123 Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
125 AliMUONVCalibParam* param = new AliMUONCalibParamNF(1,AliMpConstants::ManuNofChannels(),detElemId,manuId,0);
129 for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i )
133 if ( de->IsConnectedChannel(manuId,i) )
135 proba = TMath::Max(rl->DetectionElementProbability(detElemId),rl->BusPatchProbability(busPatchId));
137 proba = TMath::Max(proba,rl->ManuProbability(detElemId,manuId));
139 proba = TMath::Max(proba,rl->ChannelProbability(detElemId,manuId,i));
144 param->SetValueAsFloat(i,0,proba);
151 fRejectProbabilities->Add(param);
155 // no need to add empty stuff...
162 fRejectList = fRejectProbabilities;
163 fRejectProbabilities = 0x0;
164 AliDebug(1,"RejectList = RejectProbabilities");
165 StdoutToAliDebug(1,fRejectList->Print("","MEAN"));
169 AliWarning("Will run with non trivial survival probabilities for channels, manus, etc... Better check this is a simulation and not real data !");
170 fRejectList = new AliMUON2DMap(true);
175 fRejectList = fRejectProbabilities;
176 fRejectProbabilities = 0x0;
177 AliInfo("No RejectList found, so no RejectList will be used.");
181 //_____________________________________________________________________________
182 AliMUONPadStatusMapMaker::~AliMUONPadStatusMapMaker()
186 delete fRejectProbabilities;
190 //_____________________________________________________________________________
192 AliMUONPadStatusMapMaker::ComputeStatusMap(Int_t detElemId, Int_t manuId) const
194 /// Compute the status map for a given manu, and add it to our internal
195 /// fStatusMap internal storage
197 AliCodeTimerAuto("(Int_t,Int_t)")
199 AliMUONVCalibParam* param = new AliMUONCalibParamNI(1,AliMpConstants::ManuNofChannels(),
200 detElemId,manuId,-1);
202 Bool_t ok = fStatusMap->Add(param);
205 AliFatal(Form("Could not add manu %d of de %d",manuId,detElemId));
208 AliMUONVCalibParam* neighbours = fkStatusMaker.Neighbours(detElemId,manuId);
210 AliMUONVCalibParam* statusParam = fkStatusMaker.PadStatus(detElemId,manuId);
212 Int_t n = neighbours->Dimension();
214 for ( Int_t manuChannel = 0; manuChannel < param->Size(); ++manuChannel )
218 Int_t x = neighbours->ValueAsIntFast(manuChannel,0);
221 // channel is not a valid one (i.e. (manuId,manuChannel) is not an existing pad)
222 statusMap = -1;//fgkSelfDead;
226 for ( Int_t i = 0; i < n; ++i )
228 // Compute the statusmap related to the status of neighbouring
229 // pads. An invalid pad means "outside of edges".
231 Int_t y = neighbours->ValueAsIntFast(manuChannel,i);
233 neighbours->UnpackValue(y,m,c);
234 if ( c < 0 ) continue;
242 status = statusParam->ValueAsIntFast(c); //fkStatusMaker.PadStatus(detElemId,m,c);
244 if ( ( fMask==0 && status !=0 ) || ( (status & fMask) != 0 ) )
249 param->SetValueAsIntFast(manuChannel,0,statusMap);
254 //_____________________________________________________________________________
256 AliMUONPadStatusMapMaker::RefreshRejectProbabilities()
258 /// From the (fixed) fRejectProbabilities, compute
259 /// a fRejectList that will be valid for one event
260 /// If fRejectProbabilities=0x0 it means we're dealing with
261 /// trivial probabilities (0 or 1) and those are assumed to be already
262 /// in fRejectList then.
264 if ( !fRejectProbabilities ) return;
266 AliCodeTimerAuto("");
268 fRejectList->Clear();
270 TIter next(fRejectProbabilities->CreateIterator());
271 AliMUONVCalibParam* paramProba;
272 AliMUONVCalibParam* paramReject;
274 while ( ( paramProba = static_cast<AliMUONVCalibParam*>(next()) ) )
276 paramReject = new AliMUONCalibParamNF(1,paramProba->Size(),paramProba->ID0(),paramProba->ID1(),0.0);
280 for ( Int_t i = 0; i < paramProba->Size(); ++i )
282 Float_t proba = paramProba->ValueAsFloat(i);
285 if ( proba > 0.0 && proba < 1.0 )
288 proba = ( x < proba ) ? 1.0 : 0.0;
294 paramReject->SetValueAsFloat(i,0,proba);
297 if (n) fRejectList->Add(paramReject);
301 //_____________________________________________________________________________
303 AliMUONPadStatusMapMaker::StatusMap(Int_t detElemId, Int_t manuId,
304 Int_t manuChannel) const
307 /// Get the pad status map
309 AliMUONVCalibParam* param = static_cast<AliMUONVCalibParam*>(fStatusMap->FindObject(detElemId,manuId));
312 // not yet computed, so do it now
313 param = ComputeStatusMap(detElemId,manuId);
316 Int_t statusMap = param->ValueAsInt(manuChannel);
318 AliMUONVCalibParam* r = static_cast<AliMUONVCalibParam*>(fRejectList->FindObject(detElemId,manuId));
322 Float_t v= r->ValueAsFloat(manuChannel);
324 assert (v==0.0 || v==1.0 );
328 statusMap |= fgkSelfDead;