]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSHandleDaSSD.cxx
Fixes for SSD detector algorithms and preprocessor (Panos)
[u/mrichter/AliRoot.git] / ITS / AliITSHandleDaSSD.cxx
CommitLineData
223dda26 1/**************************************************************************
2 * Copyright(c) 2007-2009, 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
8bcdc40d 16/* $Id$ */
223dda26 17
18///////////////////////////////////////////////////////////////////////////////
19///
20/// This class provides ITS SSD data handling
21/// used by DA.
2e2c6def 22// Author: Oleksandr Borysov
61a57d07 23// Date: 18/07/2008
223dda26 24///////////////////////////////////////////////////////////////////////////////
25
be4f467e 26#include <string>
27#include <fstream>
61a57d07 28#include <new>
223dda26 29#include <Riostream.h>
f67db810 30#include "AliITSHandleDaSSD.h"
223dda26 31#include <math.h>
c4d90345 32#include <limits.h>
223dda26 33#include "event.h"
34#include "TFile.h"
c4d90345 35#include "TString.h"
c4d90345 36#include "AliLog.h"
223dda26 37#include "AliITSNoiseSSD.h"
2e2c6def 38#include "AliITSPedestalSSD.h"
39#include "AliITSBadChannelsSSD.h"
c4d90345 40#include "AliITSRawStreamSSD.h"
223dda26 41#include "AliRawReaderDate.h"
371588bb 42#include "AliITSRawStreamSSD.h"
223dda26 43#include "AliITSChannelDaSSD.h"
f67db810 44
45
46ClassImp(AliITSHandleDaSSD)
47
48using namespace std;
49
50
c4d90345 51const Int_t AliITSHandleDaSSD::fgkNumberOfSSDModules = 1698; // Number of SSD modules in ITS
2e2c6def 52const Int_t AliITSHandleDaSSD::fgkNumberOfSSDModulesPerDdl = 108; // Number of SSD modules in DDL
53const Int_t AliITSHandleDaSSD::fgkNumberOfSSDModulesPerSlot = 12; // Number of SSD modules in Slot
61a57d07 54const Short_t AliITSHandleDaSSD::fgkMinSSDModuleId = 500; // Initial SSD modules number
be4f467e 55const Int_t AliITSHandleDaSSD::fgkNumberOfSSDSlotsPerDDL = 9; // Number of SSD slots per DDL
6e7691a5 56const Int_t AliITSHandleDaSSD::fgkNumberOfSSDDDLs = 16; // Number of SSD modules in Slot
c4d90345 57const Float_t AliITSHandleDaSSD::fgkPedestalThresholdFactor = 3.0; // Defalt value for fPedestalThresholdFactor
58const Float_t AliITSHandleDaSSD::fgkCmThresholdFactor = 3.0; // Defalt value for fCmThresholdFactor
59
be4f467e 60const UInt_t AliITSHandleDaSSD::fgkZsBitMask = 0x0000003F; // Bit mask for FEROM ZS
61const UInt_t AliITSHandleDaSSD::fgkOffSetBitMask = 0x000003FF; // Bit mask for FEROM Offset correction
62const UInt_t AliITSHandleDaSSD::fgkBadChannelMask = 0x00000001; // Mask to suppress the channel from the bad channel list
63const Int_t AliITSHandleDaSSD::fgkAdcPerDBlock = 6; // FEROM configuration file constant
64
c4d90345 65//______________________________________________________________________________
f67db810 66AliITSHandleDaSSD::AliITSHandleDaSSD() :
c4d90345 67 fRawDataFileName(NULL),
f67db810 68 fNumberOfModules(0),
69 fModules(NULL),
c4d90345 70 fModIndProcessed(0),
71 fModIndRead(0),
2e2c6def 72 fModIndex(NULL),
61a57d07 73 fEqIndex(0),
c4d90345 74 fNumberOfEvents(0),
61a57d07 75 fBadChannelsList(NULL),
6e7691a5 76 fDDLModuleMap(NULL),
61a57d07 77 fALaddersOff(0),
78 fCLaddersOff(0),
f67db810 79 fLdcId(0),
c4d90345 80 fRunId(0),
81 fPedestalThresholdFactor(fgkPedestalThresholdFactor),
be4f467e 82 fCmThresholdFactor(fgkCmThresholdFactor),
83 fZsDefault(-1),
84 fOffsetDefault(INT_MAX),
61a57d07 85 fZsMinimum(2),
86 fMergeBCLists(1),
be4f467e 87 fZsFactor(3.0)
f67db810 88{
223dda26 89// Default constructor
f67db810 90}
91
92
c4d90345 93//______________________________________________________________________________
94AliITSHandleDaSSD::AliITSHandleDaSSD(Char_t *rdfname) :
95 fRawDataFileName(NULL),
f67db810 96 fNumberOfModules(0),
97 fModules(NULL),
c4d90345 98 fModIndProcessed(0),
99 fModIndRead(0),
2e2c6def 100 fModIndex(NULL),
61a57d07 101 fEqIndex(0),
c4d90345 102 fNumberOfEvents(0),
61a57d07 103 fBadChannelsList(NULL),
6e7691a5 104 fDDLModuleMap(NULL),
61a57d07 105 fALaddersOff(0),
106 fCLaddersOff(0),
f67db810 107 fLdcId(0),
c4d90345 108 fRunId(0),
109 fPedestalThresholdFactor(fgkPedestalThresholdFactor) ,
be4f467e 110 fCmThresholdFactor(fgkCmThresholdFactor),
111 fZsDefault(-1),
112 fOffsetDefault(INT_MAX),
61a57d07 113 fZsMinimum(2),
114 fMergeBCLists(1),
be4f467e 115 fZsFactor(3.0)
f67db810 116{
c4d90345 117 if (!Init(rdfname)) AliError("AliITSHandleDaSSD::AliITSHandleDaSSD() initialization error!");
f67db810 118}
119
120
c4d90345 121//______________________________________________________________________________
f67db810 122AliITSHandleDaSSD::AliITSHandleDaSSD(const AliITSHandleDaSSD& ssdadldc) :
123 TObject(ssdadldc),
c4d90345 124 fRawDataFileName(ssdadldc.fRawDataFileName),
f67db810 125 fNumberOfModules(ssdadldc.fNumberOfModules),
a69c8ba0 126 fModules(NULL),
c4d90345 127 fModIndProcessed(ssdadldc.fModIndProcessed),
128 fModIndRead(ssdadldc.fModIndRead),
2e2c6def 129 fModIndex(NULL),
61a57d07 130 fEqIndex(0),
c4d90345 131 fNumberOfEvents(ssdadldc.fNumberOfEvents),
61a57d07 132 fBadChannelsList(NULL),
133 fDDLModuleMap(NULL),
134 fALaddersOff(ssdadldc.fALaddersOff),
135 fCLaddersOff(ssdadldc.fCLaddersOff),
f67db810 136 fLdcId(ssdadldc.fLdcId),
c4d90345 137 fRunId(ssdadldc.fRunId),
138 fPedestalThresholdFactor(ssdadldc.fPedestalThresholdFactor),
be4f467e 139 fCmThresholdFactor(ssdadldc.fCmThresholdFactor),
140 fZsDefault(ssdadldc.fZsDefault),
141 fOffsetDefault(ssdadldc.fOffsetDefault),
61a57d07 142 fZsMinimum(ssdadldc.fZsMinimum),
143 fMergeBCLists(ssdadldc.fMergeBCLists),
be4f467e 144 fZsFactor(ssdadldc.fZsFactor)
f67db810 145{
146 // copy constructor
a69c8ba0 147 if ((ssdadldc.fNumberOfModules > 0) && (ssdadldc.fModules)) {
148 fModules = new (nothrow) AliITSModuleDaSSD* [ssdadldc.fNumberOfModules];
149 if (fModules) {
150 for (Int_t modind = 0; modind < ssdadldc.fNumberOfModules; modind++) {
151 if (ssdadldc.fModules[modind]) {
152 fModules[modind] = new AliITSModuleDaSSD(*(ssdadldc.fModules[modind]));
153 if (!fModules[modind]) {
154 AliError("AliITSHandleDaSSD: Error copy constructor");
155 for (Int_t i = (modind - 1); i >= 0; i--) delete fModules[modind];
156 delete [] fModules;
157 fModules = NULL;
158 break;
159 }
160 } else fModules[modind] = NULL;
161 }
162 } else {
163 AliError(Form("AliITSHandleDaSSD: Error allocating memory for %i AliITSModulesDaSSD* objects!", ssdadldc.fNumberOfModules));
164 fNumberOfModules = 0;
165 fModules = NULL;
166 }
167 }
61a57d07 168 if (ssdadldc.fBadChannelsList) AliWarning("fBadChannelsList is not copied by copy constructor, use other methods to init it!");
169 if (ssdadldc.fDDLModuleMap) AliWarning("fDDLModuleMap is not copied by copy constructor, use other methods to init it!");
f67db810 170}
171
172
c4d90345 173//______________________________________________________________________________
f67db810 174AliITSHandleDaSSD& AliITSHandleDaSSD::operator = (const AliITSHandleDaSSD& ssdadldc)
175{
176// assignment operator
a69c8ba0 177 if (this == &ssdadldc) return *this;
61a57d07 178 TObject::operator=(ssdadldc);
a69c8ba0 179 if (fModules) {
180 for (Int_t i = 0; i < fNumberOfModules; i++) if (fModules[i]) delete fModules[i];
181 delete [] fModules;
182 fModules = NULL;
183 }
2e2c6def 184 if (fModIndex) { delete [] fModIndex; fModIndex = NULL; }
a69c8ba0 185 if ((ssdadldc.fNumberOfModules > 0) && (ssdadldc.fModules)) {
186 fModules = new (nothrow) AliITSModuleDaSSD* [ssdadldc.fNumberOfModules];
187 if (fModules) {
188 for (Int_t modind = 0; modind < ssdadldc.fNumberOfModules; modind++) {
189 if (ssdadldc.fModules[modind]) {
61a57d07 190 fModules[modind] = new AliITSModuleDaSSD(*(ssdadldc.fModules[modind]));
191 if (!fModules[modind]) {
192 AliError("AliITSHandleDaSSD: Error assignment operator");
a69c8ba0 193 for (Int_t i = (modind - 1); i >= 0; i--) delete fModules[modind];
61a57d07 194 delete [] fModules;
195 fModules = NULL;
196 break;
197 }
198 } else fModules[modind] = NULL;
a69c8ba0 199 }
200 } else {
201 AliError(Form("AliITSHandleDaSSD: Error allocating memory for %i AliITSModulesDaSSD* objects!", ssdadldc.fNumberOfModules));
202 fNumberOfModules = 0;
203 fModules = NULL;
204 }
205 }
61a57d07 206 fRawDataFileName = NULL;
207 fModIndProcessed = 0;
208 fModIndRead = 0;
209 fModIndex = NULL;
210 fEqIndex = ssdadldc.fEqIndex;
211 fNumberOfEvents = ssdadldc.fNumberOfEvents;
212 fLdcId = ssdadldc.fLdcId;
213 fRunId = ssdadldc.fRunId;
214 fPedestalThresholdFactor = ssdadldc.fPedestalThresholdFactor;
215 fCmThresholdFactor = ssdadldc.fCmThresholdFactor;
216 fZsDefault = ssdadldc.fZsDefault;
217 fOffsetDefault = ssdadldc.fOffsetDefault;
218 fZsMinimum = ssdadldc.fZsMinimum;
219 fMergeBCLists = ssdadldc.fMergeBCLists;
220 fZsFactor = ssdadldc.fZsFactor;
221 fALaddersOff = ssdadldc.fALaddersOff;
222 fCLaddersOff = ssdadldc.fCLaddersOff;
223 fBadChannelsList = NULL;
224 fDDLModuleMap = NULL;
225 fModIndex = NULL;
226 if (ssdadldc.fBadChannelsList) AliWarning("fBadChannelsList is not copied by assignment operator, use other methods to init it!");
227 if (ssdadldc.fDDLModuleMap) AliWarning("fDDLModuleMap is not copied by assignment operator, use other methods to init it!");
f67db810 228 return *this;
229}
230
231
c4d90345 232//______________________________________________________________________________
f67db810 233AliITSHandleDaSSD::~AliITSHandleDaSSD()
223dda26 234{
235// Default destructor
f67db810 236 if (fModules)
237 {
238 for (Int_t i = 0; i < fNumberOfModules; i++)
239 {
240 if (fModules[i]) delete fModules[i];
241 }
242 delete [] fModules;
243 }
2e2c6def 244 if (fModIndex) delete [] fModIndex;
61a57d07 245 if (fBadChannelsList) delete fBadChannelsList;
6e7691a5 246 if (fDDLModuleMap) delete [] fDDLModuleMap;
f67db810 247}
248
249
250
c4d90345 251//______________________________________________________________________________
252void AliITSHandleDaSSD::Reset()
253{
254// Delete array of AliITSModuleDaSSD* objects.
255 if (fModules) {
256 for (Int_t i = 0; i < fNumberOfModules; i++) if (fModules[i]) delete fModules[i];
257 delete [] fModules;
258 fModules = NULL;
2e2c6def 259 }
260 if (fModIndex) { delete [] fModIndex; fModIndex = NULL; }
6e7691a5 261/*
61a57d07 262 if (fBadChannelsList) {
263 delete fBadChannelsList;
264 fBadChannelsList = NULL;
6e7691a5 265 }
266 if (fDDLModuleMap) { delete [] fDDLModuleMap; fDDLModuleMap = NULL; }
267*/
61a57d07 268 fALaddersOff.Set(0);
269 fCLaddersOff.Set(0);
c4d90345 270 fRawDataFileName = NULL;
271 fModIndProcessed = fModIndRead = 0;
272 fNumberOfEvents = 0;
273 fLdcId = fRunId = 0;
274 fPedestalThresholdFactor = fgkPedestalThresholdFactor;
275 fCmThresholdFactor = fgkCmThresholdFactor;
276}
277
278
279
280//______________________________________________________________________________
be4f467e 281Bool_t AliITSHandleDaSSD::Init(Char_t *rdfname)
c4d90345 282{
283// Read raw data file and set initial and configuration parameters
284 Long_t physeventind = 0, strn = 0, nofstripsev, nofstrips = 0;
285 Int_t nofeqipmentev, nofeqipment = 0, eqn = 0;
286 AliRawReaderDate *rawreaderdate = NULL;
287 UChar_t *data = NULL;
288 Long_t datasize = 0, eqbelsize = 1;
289
c4d90345 290 rawreaderdate = new AliRawReaderDate(rdfname, 0);
291 if (!(rawreaderdate->GetAttributes() || rawreaderdate->GetEventId())) {
292 AliError(Form("AliITSHandleDaSSD: Error reading raw data file %s by RawReaderDate", rdfname));
293 MakeZombie();
294 return kFALSE;
371588bb 295 }
c4d90345 296 if (rawreaderdate->NextEvent()) {
c4d90345 297 fRunId = rawreaderdate->GetRunNumber();
298 rawreaderdate->RewindEvents();
299 } else { MakeZombie(); return kFALSE; }
300 if (fModules) Reset();
61a57d07 301 //rawreaderdate->SelectEvents(-1);
371588bb 302 rawreaderdate->Select("ITSSSD");
c4d90345 303 nofstrips = 0;
304 while (rawreaderdate->NextEvent()) {
305 if ((rawreaderdate->GetType() != PHYSICS_EVENT) && (rawreaderdate->GetType() != CALIBRATION_EVENT)) continue;
306 nofstripsev = 0;
307 nofeqipmentev = 0;
308 while (rawreaderdate->ReadNextData(data)) {
2e2c6def 309 fLdcId = rawreaderdate->GetLDCId();
c4d90345 310 nofeqipmentev += 1;
311 datasize = rawreaderdate->GetDataSize();
312 eqbelsize = rawreaderdate->GetEquipmentElementSize();
371588bb 313 if ( datasize % eqbelsize ) {
c4d90345 314 AliError(Form("AliITSHandleDaSSD: Error Init(%s): event data size %i is not an integer of equipment data size %i",
315 rdfname, datasize, eqbelsize));
316 MakeZombie();
be4f467e 317 return kFALSE;
c4d90345 318 }
371588bb 319 nofstripsev += (Int_t) (datasize / eqbelsize);
c4d90345 320 }
321 if (physeventind++) {
371588bb 322 if (nofstrips != nofstripsev) AliWarning(Form("AliITSHandleDaSSD: number of strips varies from event to event, ev = %i, %i",
323 physeventind, nofstripsev));
324 if (nofeqipment != nofeqipmentev) AliWarning("AliITSHandleDaSSD: number of DDLs varies from event to event");
c4d90345 325 }
326 nofstrips = nofstripsev;
327 nofeqipment = nofeqipmentev;
371588bb 328 if (strn < nofstrips) strn = nofstrips;
c4d90345 329 if (eqn < nofeqipment) eqn = nofeqipment;
330 }
331 delete rawreaderdate;
332 if ((physeventind > 0) && (strn > 0))
333 {
334 fNumberOfEvents = physeventind;
335 fRawDataFileName = rdfname;
61a57d07 336 fEqIndex.Set(eqn);
337 fEqIndex.Reset(-1);
2e2c6def 338 fModIndex = new (nothrow) Int_t [fgkNumberOfSSDModulesPerDdl * eqn];
339 if (fModIndex)
340 for (Int_t i = 0; i < fgkNumberOfSSDModulesPerDdl * eqn; i++) fModIndex[i] = -1;
341 else AliWarning(Form("AliITSHandleDaSSD: Error Init(%s): Index array for %i modules was not created",
342 rdfname, fgkNumberOfSSDModulesPerDdl * eqn));
371588bb 343 if (SetNumberOfModules(fgkNumberOfSSDModulesPerDdl * eqn)) {
a69c8ba0 344 TString str = TString::Format("Max number of equipment: %i, max number of channels: %i\n", eqn, strn);
c4d90345 345 DumpInitData(str.Data());
346 return kTRUE;
347 }
348 }
349 MakeZombie();
350 return kFALSE;
351}
352
353
c4d90345 354
355//______________________________________________________________________________
f67db810 356AliITSModuleDaSSD* AliITSHandleDaSSD::GetModule (const UChar_t ddlID, const UChar_t ad, const UChar_t adc) const
357{
223dda26 358// Retrieve AliITSModuleDaSSD object from the array
f67db810 359 if (!fModules) return NULL;
360 for (Int_t i = 0; i < fNumberOfModules; i++) {
361 if (fModules[i]) {
362 if ( (fModules[i]->GetDdlId() == ddlID)
363 && (fModules[i]->GetAD() == ad)
364 && (fModules[i]->GetADC() == adc))
365 return fModules[i];
366 }
367 }
368 return NULL;
369}
370
371
c4d90345 372Int_t AliITSHandleDaSSD::GetModuleIndex (const UChar_t ddlID, const UChar_t ad, const UChar_t adc) const
373{
374// Retrieve the position of AliITSModuleDaSSD object in the array
375 if (!fModules) return -1;
376 for (Int_t i = 0; i < fNumberOfModules; i++) {
377 if (fModules[i]) {
378 if ( (fModules[i]->GetDdlId() == ddlID)
379 && (fModules[i]->GetAD() == ad)
380 && (fModules[i]->GetADC() == adc))
381 return i;
382 }
383 }
384 return -1;
385}
386
387
f67db810 388
c4d90345 389//______________________________________________________________________________
f67db810 390AliITSChannelDaSSD* AliITSHandleDaSSD::GetStrip (const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const UShort_t stripID) const
391{
223dda26 392// Retrieve AliITSChannalDaSSD object from the array
f67db810 393 for (Int_t modind = 0; modind < fNumberOfModules; modind++) {
394 if ( (fModules[modind]->GetDdlId() == ddlID)
395 && (fModules[modind]->GetAD() == ad)
396 && (fModules[modind]->GetADC() == adc) )
397 {
398 return fModules[modind]->GetStrip(stripID);
399 }
400 }
c4d90345 401 AliError(Form("AliITSHandleDaSSD: Error GetStrip (%i, %i, %i, %i), strip not found, returns NULL!",
402 ddlID, ad, adc, stripID));
f67db810 403 return NULL;
404}
405
406
407
c4d90345 408//______________________________________________________________________________
f67db810 409Bool_t AliITSHandleDaSSD::SetModule(AliITSModuleDaSSD *const module, const Int_t index)
410{
223dda26 411// Assign array element with AliITSModuleDaSSD object
f67db810 412 if ((index < fNumberOfModules) && (index >= 0))
413 {
414 if (fModules[index]) delete fModules[index];
415 fModules[index] = module;
416 return kTRUE;
417 }
418 else return kFALSE;
419}
420
421
c4d90345 422
423//______________________________________________________________________________
f67db810 424Bool_t AliITSHandleDaSSD::SetNumberOfModules (const Int_t numberofmodules)
425{
223dda26 426// Allocates memory for AliITSModuleDaSSD objects
427 if (numberofmodules > fgkNumberOfSSDModules)
c4d90345 428 AliWarning(Form("AliITSHandleDaSSD: the number of modules %i you use exceeds the maximum %i for ALICE ITS SSD",
429 numberofmodules, fgkNumberOfSSDModules));
430 if (fModules) {
431 for (Int_t i = 0; i < fNumberOfModules; i++) if (fModules[i]) delete fModules[i];
432 delete [] fModules;
433 fModules = NULL;
434 }
223dda26 435 fModules = new (nothrow) AliITSModuleDaSSD* [numberofmodules];
436 if (fModules) {
437 fNumberOfModules = numberofmodules;
438 memset(fModules, 0, sizeof(AliITSModuleDaSSD*) * numberofmodules);
439 return kTRUE;
440 } else {
c4d90345 441 AliError(Form("AliITSHandleDaSSD: Error allocating memory for %i AliITSModulesDaSSD* objects!", numberofmodules));
f67db810 442 fNumberOfModules = 0;
443 fModules = NULL;
223dda26 444 }
f67db810 445 return kFALSE;
446}
447
448
c4d90345 449
6e7691a5 450//______________________________________________________________________________
451Bool_t AliITSHandleDaSSD::ReadStaticBadChannelsMap(const Char_t *filename)
452{
453// Reads Static Bad Channels Map from the file
454 TFile *bcfile;
455 if (!filename) {
456 AliWarning("No file name is specified for Static Bad Channels Map!");
457 return kFALSE;
458 }
459 bcfile = new TFile(filename, "READ");
460 if (bcfile->IsZombie()) {
461 AliWarning(Form("Error reading file %s with Static Bad Channels Map!", filename));
462 return kFALSE;
463 }
61a57d07 464 bcfile->GetObject("AliITSBadChannelsSSD;1", fBadChannelsList);
465 if (!fBadChannelsList) {
466 AliWarning("Error fBadChannelsList == NULL!");
6e7691a5 467 bcfile->Close();
468 delete bcfile;
469 return kFALSE;
470 }
471 bcfile->Close();
472 delete bcfile;
473 return kTRUE;
474}
475
476
477
478Bool_t AliITSHandleDaSSD::ReadDDLModuleMap(const Char_t *filename)
479{
480// Reads the SSD DDL Map from the file
481 ifstream ddlmfile;
482 AliRawReaderDate *rwr = NULL;
483 AliITSRawStreamSSD *rsm = NULL;
484 void *event = NULL;
485 if (fDDLModuleMap) { delete [] fDDLModuleMap; fDDLModuleMap = NULL;}
486 fDDLModuleMap = new (nothrow) Int_t [fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl];
487 if (!fDDLModuleMap) {
488 AliWarning("Error allocation memory for DDL Map!");
489 return kFALSE;
490 }
491 if (!filename) {
492 AliWarning("No file name is specified for SSD DDL Map, using the one from AliITSRawStreamSSD!");
493 rwr = new AliRawReaderDate(event);
494 rsm = new AliITSRawStreamSSD(rwr);
495 rsm->Setv11HybridDDLMapping();
496 for (Int_t ddli = 0; ddli < fgkNumberOfSSDDDLs; ddli++)
497 for (Int_t mi = 0; mi < fgkNumberOfSSDModulesPerDdl; mi++)
498 fDDLModuleMap[(ddli * fgkNumberOfSSDModulesPerDdl + mi)] = rsm->GetModuleNumber(ddli, mi);
499 if (rsm) delete rsm;
500 if (rwr) delete rwr;
501 return kTRUE;
502 }
503 ddlmfile.open(filename, ios::in);
504 if (!ddlmfile.is_open()) {
505 AliWarning(Form("Error reading file %s with SSD DDL Map!", filename));
506 if (fDDLModuleMap) { delete [] fDDLModuleMap; fDDLModuleMap = NULL;}
507 return kFALSE;
508 }
509 Int_t ind = 0;
510 while((!ddlmfile.eof()) && (ind < (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl))) {
511 ddlmfile >> fDDLModuleMap[ind++];
be4f467e 512 if (ddlmfile.fail()) AliError(Form("Error extracting number from the DDL map file %s, ind: ", filename, ind));
6e7691a5 513 }
514 if (ind != (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl))
515 AliWarning(Form("Only %i (< %i) entries were read from DDL Map!", ind, (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl)));
516 ddlmfile.close();
517 return kTRUE;
518}
519
520
521
c4d90345 522//______________________________________________________________________________
371588bb 523Int_t AliITSHandleDaSSD::ReadCalibrationDataFile (char* fileName, const Long_t eventsnumber)
f67db810 524{
223dda26 525// Reads raw data from file
c4d90345 526 if (!Init(fileName)){
527 AliError("AliITSHandleDaSSD: Error ReadCalibrationDataFile");
f67db810 528 return kFALSE;
529 }
371588bb 530 fNumberOfEvents = eventsnumber;
531 return ReadModuleRawData (fNumberOfModules);
f67db810 532}
533
534
c4d90345 535
536//______________________________________________________________________________
537Int_t AliITSHandleDaSSD::ReadModuleRawData (const Int_t modulesnumber)
538{
539// Reads raw data from file
371588bb 540 AliRawReader *rawreaderdate = NULL;
541 AliITSRawStreamSSD *stream = NULL;
c4d90345 542 AliITSModuleDaSSD *module;
543 AliITSChannelDaSSD *strip;
371588bb 544 Long_t eventind = 0;
61a57d07 545 Int_t nofeqipment, eqind;
546 Short_t equipid, prequipid;
547 Short_t modind;
c4d90345 548 if (!(rawreaderdate = new AliRawReaderDate(fRawDataFileName, 0))) return 0;
549 if (!fModules) {
550 AliError("AliITSHandleDaSSD: Error ReadModuleRawData: no structure was allocated for data");
551 return 0;
552 }
6e7691a5 553 if (!fDDLModuleMap) if (!ReadDDLModuleMap()) AliWarning("DDL map is not defined, ModuleID will be set to 0!");
371588bb 554 stream = new AliITSRawStreamSSD(rawreaderdate);
555 stream->Setv11HybridDDLMapping();
61a57d07 556 //rawreaderdate->SelectEvents(-1);
557 rawreaderdate->Select("ITSSSD");
c4d90345 558 modind = 0;
61a57d07 559 nofeqipment = 0;
c4d90345 560 while (rawreaderdate->NextEvent()) {
561 if ((rawreaderdate->GetType() != PHYSICS_EVENT) && (rawreaderdate->GetType() != CALIBRATION_EVENT)) continue;
371588bb 562 prequipid = -1;
61a57d07 563 eqind = -1;
371588bb 564 while (stream->Next()) {
61a57d07 565 equipid = rawreaderdate->GetEquipmentId();
566 if ((equipid != prequipid)) {
567 if ((eqind = GetEqIndex(equipid)) < 0) { fEqIndex.AddAt(equipid, nofeqipment); eqind = nofeqipment++; }
568 prequipid = equipid;
569 }
371588bb 570 Int_t equiptype = rawreaderdate->GetEquipmentType();
571 UChar_t ddlID = (UChar_t)rawreaderdate->GetDDLID();
572 UChar_t ad = stream->GetAD();
573 UChar_t adc = stream->GetADC();
574 UShort_t stripID = stream->GetSideFlag() ? AliITSChannelDaSSD::GetMaxStripIdConst() - stream->GetStrip() : stream->GetStrip();
575 Short_t signal = stream->GetSignal();
576
61a57d07 577 Int_t indpos = (eqind * fgkNumberOfSSDModulesPerDdl)
371588bb 578 + ((ad - 1) * fgkNumberOfSSDModulesPerSlot) + (adc < 6 ? adc : (adc - 2));
579 Int_t modpos = fModIndex[indpos];
580 if (((modpos > 0) && (modpos < fModIndRead)) || ((modpos < 0) && (modind == modulesnumber))) continue;
581 if ((modpos < 0) && (modind < modulesnumber)) {
582 module = new AliITSModuleDaSSD(AliITSModuleDaSSD::GetStripsPerModuleConst());
6e7691a5 583 Int_t mddli;
584 if (fDDLModuleMap) mddli = RetrieveModuleId(ddlID, ad, adc);
585 else mddli = 0;
61a57d07 586 if (!module->SetModuleIdData (ddlID, ad, adc, mddli)) return 0;
587 module->SetModuleRorcId (equipid, equiptype);
588 module->SetCMFeromEventsNumber(fNumberOfEvents);
589 modpos = fModIndRead + modind;
590 modind += 1;
591 fModules[modpos] = module;
592 fModIndex[indpos] = modpos;
371588bb 593 }
594 if (stripID < AliITSModuleDaSSD::GetStripsPerModuleConst()) {
c4d90345 595 if (!(strip = fModules[modpos]->GetStrip(stripID))) {
596 strip = new AliITSChannelDaSSD(stripID, fNumberOfEvents);
597 fModules[modpos]->SetStrip(strip, stripID);
598 }
599 strip->SetSignal(eventind, signal);
371588bb 600 } else fModules[modpos]->SetCMFerom(signal, (stripID - AliITSModuleDaSSD::GetStripsPerModuleConst()), eventind);
c4d90345 601 }
602 if (++eventind > fNumberOfEvents) break;
603 }
371588bb 604 delete stream;
c4d90345 605 delete rawreaderdate;
606 if (modind) cout << "The memory was allocated for " << modind << " modules." << endl;
607 fModIndRead += modind;
608 if (modind < modulesnumber) RelocateModules();
609 return modind;
610}
611
612
613
614//______________________________________________________________________________
f67db810 615Bool_t AliITSHandleDaSSD::RelocateModules()
223dda26 616{
617// Relocate memory for AliITSModuleDaSSD object array
f67db810 618 Int_t nm = 0;
223dda26 619 AliITSModuleDaSSD **marray = NULL;
f67db810 620 for (Int_t modind = 0; modind < fNumberOfModules; modind++)
621 if (fModules[modind]) nm += 1;
622 if (nm == fNumberOfModules) return kTRUE;
223dda26 623 marray = new (nothrow) AliITSModuleDaSSD* [nm];
624 if (!marray) {
c4d90345 625 AliError(Form("AliITSHandleDaSSD: Error relocating memory for %i AliITSModuleDaSSD* objects!", nm));
f67db810 626 return kFALSE;
627 }
628 nm = 0;
629 for (Int_t modind = 0; modind < fNumberOfModules; modind++)
630 if (fModules[modind]) marray[nm++] = fModules[modind];
631 delete [] fModules;
632 fModules = marray;
c4d90345 633 fNumberOfModules = fModIndRead = nm;
f67db810 634 return kTRUE;
635}
636
637
c4d90345 638
371588bb 639//______________________________________________________________________________
640Bool_t AliITSHandleDaSSD::AddFeromCm(AliITSModuleDaSSD *const module)
641// Restore the original signal value adding CM calculated and subtracted in ferom
642{
643 AliITSChannelDaSSD *strip;
644 Short_t *signal, *cmferom;
645
646 if (!module) return kFALSE;
647 for (Int_t chipind = 0; chipind < AliITSModuleDaSSD::GetChipsPerModuleConst(); chipind++) {
648 if (!(cmferom = module->GetCMFerom(chipind))) {
649 AliWarning(Form("AliITSHandleDaSSD: There is no Ferom CM values for chip %i, module %i!", chipind, module->GetModuleId()));
650 continue;
651 }
652 for (Int_t strind = (chipind * AliITSModuleDaSSD::GetStripsPerChip());
653 strind < ((chipind + 1) * AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
654 if (!(strip = module->GetStrip(strind))) continue;
655 if (!(signal = strip->GetSignal())) continue;
656// if (strip->GetEventsNumber() != module->GetEventsNumber()) return kFALSE;
657 Long_t ovev = 0;
658 for (Long_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
659 if (SignalOutOfRange(signal[ev]) || SignalOutOfRange(cmferom[ev])) ovev += 1;
660 else {
661 Short_t signal1 = signal[ev] + cmferom[ev];
662 strip->SetSignal(ev, signal1);
61a57d07 663 }
371588bb 664 }
665 }
666 }
667 return kTRUE;
668}
669
670
671
c4d90345 672//______________________________________________________________________________
673Bool_t AliITSHandleDaSSD::CalculatePedestal(AliITSModuleDaSSD *const module)
f67db810 674{
223dda26 675// Calculates Pedestal
f67db810 676 AliITSChannelDaSSD *strip;
c4d90345 677 Float_t pedestal, noise;
678 Short_t *signal;
679 Long_t ovev, ev, n;
680 if (!module) return kFALSE;
681 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
682 if (!(strip = module->GetStrip(strind))) continue;
683 if (!(signal = strip->GetSignal())) {
684 AliError(Form("AliITSHandleDaSSD: Error CalculatePedestal(): there are no events data for module[%i] strip[%i]->GetSignal()",
685 module->GetModuleId(), strind));
686 continue;
f67db810 687 }
c4d90345 688//************* pedestal first pass ****************
689 pedestal = 0.0f;
690 ovev = 0l;
691 for (ev = 0; ev < strip->GetEventsNumber(); ev++)
692 if (SignalOutOfRange(signal[ev])) ovev += 1;
693 else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Float_t>(ev - ovev + 1) : signal[ev];
694 if (ev == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
695 strip->SetPedestal(pedestal);
696//************* noise *******************************
697 Double_t nsum = 0.0L;
698 ovev = 0l;
699 for (ev = 0; ev < strip->GetEventsNumber(); ev++) {
700 if (SignalOutOfRange(signal[ev])) ovev += 1;
701 else nsum += pow((signal[ev] - strip->GetPedestal()), 2);
702 }
703 if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
704 else noise = AliITSChannelDaSSD::GetUndefinedValue();
705 strip->SetNoise(noise);
706//************* pedestal second pass ****************
707 pedestal = 0.0f;
708 ovev = 0l;
709 for (ev = 0; ev < strip->GetEventsNumber(); ev++)
710 if ( SignalOutOfRange(signal[ev])
711 || TMath::Abs(signal[ev] - strip->GetPedestal()) > (fPedestalThresholdFactor * strip->GetNoise())) ovev += 1;
712 else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Float_t>(ev - ovev + 1) : signal[ev];
713 if (ev == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
714 strip->SetPedestal(pedestal);
715 strip->SetOverflowNumber(ovev);
f67db810 716 }
717 return kTRUE;
718}
719
720
c4d90345 721//______________________________________________________________________________
a69c8ba0 722Bool_t AliITSHandleDaSSD::CalculateNoise(AliITSModuleDaSSD *const module)
f67db810 723{
223dda26 724// Calculates Noise
f67db810 725 AliITSChannelDaSSD *strip;
726 Short_t *signal;
727 Float_t noise;
728 Long_t ovev, n;
c4d90345 729 if (!module) return kFALSE;
730 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
731 if (!(strip = module->GetStrip(strind))) continue;
732 if (!(signal = strip->GetSignal())) {
733 strip->SetNoise(AliITSChannelDaSSD::GetUndefinedValue());
734 AliError(Form("AliITSHandleDaSSD: Error CalculateNoise(): there are no events data for module[%i] strip[%i]->GetSignal()",
735 module->GetModuleId(), strind));
736 continue;
f67db810 737 }
c4d90345 738 Double_t nsum = 0.0L;
739 ovev = 0l;
740 for (Long_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
741 if (SignalOutOfRange(signal[ev])) ovev += 1;
742 else nsum += pow((signal[ev] - strip->GetPedestal()), 2);
743 }
744 if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
745 else noise = AliITSChannelDaSSD::GetUndefinedValue();
746 strip->SetNoise(noise);
f67db810 747 }
748 return kTRUE;
749}
750
751
752
c4d90345 753//______________________________________________________________________________
754Bool_t AliITSHandleDaSSD::CalculateNoiseCM(AliITSModuleDaSSD *const module)
f67db810 755{
c4d90345 756// Calculates Noise with CM correction
757 AliITSChannelDaSSD *strip = NULL;
758 Short_t *signal;
759 Float_t noise;
760 Long_t ovev, n;
761 if (!CalculateCM(module)) {
762 AliError("Error: AliITSHandleDaSSD::CalculateCM() returned kFALSE");
763 return kFALSE;
764 }
765 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
766 if (!(strip = module->GetStrip(strind))) continue; //return kFALSE;
767 if (!(signal = strip->GetSignal())) {
768 strip->SetNoiseCM(AliITSChannelDaSSD::GetUndefinedValue());
769 AliError(Form("SSDDAModule: Error CalculateNoiseWithoutCM(): there are no events data for module[%i] strip[%i]->GetSignal()",
770 module->GetModuleId(), strind));
2e2c6def 771 continue; //return kFALSE;
f67db810 772 }
c4d90345 773 Int_t chipind = strind / AliITSModuleDaSSD::GetStripsPerChip();
774 Double_t nsum = 0.0L;
775 ovev = 0l;
776 for (Long_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
777 if (SignalOutOfRange(signal[ev])) ovev += 1;
778 else nsum += pow((signal[ev] - strip->GetPedestal() - module->GetCM(chipind, ev)), 2);
779 }
780 if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
781 else noise = AliITSChannelDaSSD::GetUndefinedValue();
782 strip->SetNoiseCM(noise);
783 }
2e2c6def 784 return kTRUE;
f67db810 785}
786
787
788
c4d90345 789//______________________________________________________________________________
790Bool_t AliITSHandleDaSSD::CalculateCM(AliITSModuleDaSSD *const module)
f67db810 791{
c4d90345 792// Calculates CM
f67db810 793 AliITSChannelDaSSD *strip = NULL;
c4d90345 794 Short_t *signal;
795 Long_t ovstr, n;
796 Int_t stripind;
797 module->SetNumberOfChips(AliITSModuleDaSSD::GetChipsPerModuleConst());
798 for (Int_t chipind = 0; chipind < module->GetNumberOfChips(); chipind++) {
799 stripind = chipind * module->GetStripsPerChip();
371588bb 800 module->GetCM()[chipind].Set(fNumberOfEvents);
801 module->GetCM()[chipind].Reset(0.0f);
c4d90345 802 for (Long_t ev = 0; ev < fNumberOfEvents; ev++) {
803 // calculate firs approximation of CM.
804 Double_t cm0 = 0.0L;
805 ovstr = 0l;
806 for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
807 if (!(strip = module->GetStrip(strind))) continue; //return kFALSE;
808 if (!(signal = strip->GetSignal())) {
809 AliError(Form("AliITSHandleDaSSD: Error CalculateCM: there are no events data for module[%i] strip[%i]->GetSignal()",
810 module->GetModuleId(), strind));
811 return kFALSE;
812 }
61a57d07 813 if ((SignalOutOfRange(signal[ev])) || (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())) ovstr += 1;
c4d90345 814 else cm0 += (signal[ev] - strip->GetPedestal());
f67db810 815 }
c4d90345 816 if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cm0 /= (Float_t)(n);
817 else { module->SetCM(0.0f, chipind, ev); continue; }
818 // calculate avarage (cm - (signal - pedestal)) over the chip
819 Double_t cmsigma = 0.0L;
820 ovstr = 0l;
821 for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
822 if (!(strip = module->GetStrip(strind))) continue;
823 if (!(signal = strip->GetSignal())) {
824 AliError(Form("AliITSHandleDaSSD: Error CalculateCM: there are no events data for module[%i] strip[%i]->GetSignal()\n",
825 module->GetModuleId(), strind));
826 return kFALSE;
f67db810 827 }
61a57d07 828 if ((SignalOutOfRange(signal[ev])) || (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())) ovstr += 1;
c4d90345 829 else cmsigma += pow((cm0 - (signal[ev] - strip->GetPedestal())), 2);
f67db810 830 }
c4d90345 831 if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsigma = sqrt(cmsigma / (Float_t)(n));
832 else { module->SetCM(0.0f, chipind, ev); continue; }
833 // calculate cm with threshold
834 Double_t cmsum = 0.0L;
835 ovstr = 0l;
836 for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
837 if (!(strip = module->GetStrip(strind))) continue;
838 signal = strip->GetSignal();
61a57d07 839 if ( (SignalOutOfRange(signal[ev])) || (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())
840 || (TMath::Abs(cm0 - (signal[ev] - strip->GetPedestal())) > (fCmThresholdFactor * cmsigma)) ) ovstr += 1;
c4d90345 841 else cmsum += (signal[ev] - strip->GetPedestal());
842 }
843 if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsum /= (Float_t)(n);
844 else cmsum = 0.0L;
845 if (!module->SetCM(cmsum, chipind, ev));
846 }
847 }
848 return kTRUE;
849}
850
851
852//______________________________________________________________________________
853Bool_t AliITSHandleDaSSD::ProcessRawData(const Int_t nmread)
854{
855// Performs calculation of calibration parameters (pedestal, noise, ...)
856 Int_t nm = 0;
857 if (nmread <= 0) return kFALSE;
858 if (!fModules) return kFALSE;
859 while ((nm = ReadModuleRawData(nmread)) > 0) {
860 cout << "Processing next " << nm << " modules;" << endl;
861 for (Int_t modind = fModIndProcessed; modind < fModIndRead; modind++) {
862 if (!fModules[modind]) {
863 AliError(Form("AliITSHandleDaSSD: Error ProcessRawData(): No AliITSModuleDaSSD object with index %i is allocated in AliITSHandleDaSSD\n",
864 modind));
865 return kFALSE;
f67db810 866 }
371588bb 867 AddFeromCm(fModules[modind]);
c4d90345 868 CalculatePedestal(fModules[modind]);
869 CalculateNoise(fModules[modind]);
870 CalculateNoiseCM(fModules[modind]);
f67db810 871 }
c4d90345 872 DeleteSignal();
371588bb 873 DeleteCM();
874 DeleteCMFerom();
c4d90345 875 fModIndProcessed = fModIndRead;
876 cout << fModIndProcessed << " - done" << endl;
877 }
878 return kTRUE;
f67db810 879}
880
881
c4d90345 882//______________________________________________________________________________
883Short_t AliITSHandleDaSSD::RetrieveModuleId(const UChar_t ddlID, const UChar_t ad, const UChar_t adc) const
884{
885// Retrieve ModuleId from the DDL map which is defined in AliITSRawStreamSSD class
61a57d07 886 if (!fDDLModuleMap) {
887 AliError("Error DDLMap is not initialized, return 0!");
888 return 0;
889 }
6e7691a5 890 Int_t mddli = ((ad - 1) * fgkNumberOfSSDModulesPerSlot) + (adc < 6 ? adc : (adc - 2));
891 if ((ddlID < fgkNumberOfSSDDDLs) && (mddli < fgkNumberOfSSDModulesPerDdl)) {
892 mddli = fDDLModuleMap[ddlID * fgkNumberOfSSDModulesPerDdl + mddli];
893 }
c4d90345 894 else {
6e7691a5 895 AliWarning(Form("Module index = %d or ddlID = %d is out of range 0 is rturned", ddlID, mddli));
896 mddli = 0;
c4d90345 897 }
6e7691a5 898 if (mddli > SHRT_MAX) return SHRT_MAX;
899 else return (Short_t)mddli;
c4d90345 900}
901
f67db810 902
c4d90345 903
904//______________________________________________________________________________
61a57d07 905AliITSNoiseSSD* AliITSHandleDaSSD::GetCalibrationOCDBNoise() const
223dda26 906{
907// Fill in the array for OCDB
61a57d07 908 AliITSNoiseSSD *ldcn = NULL;
909 AliITSModuleDaSSD *module = NULL;
910 AliITSChannelDaSSD *strip = NULL;
911 if (!fModules) return NULL;
912 ldcn = new AliITSNoiseSSD;
913 if (!ldcn) {
914 AliError("Error allocation mamory for AliITSBadChannelsSSD object, return NULL!");
915 return NULL;
916 }
917 for (Int_t i = 0; i < fNumberOfModules; i++) {
918 if (!(module = fModules[i])) continue;
919 if (module->GetModuleId() < fgkMinSSDModuleId) continue;
920 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
921 if (!(strip = module->GetStrip(strind))) continue;
922 Short_t modid = module->GetModuleId() - fgkMinSSDModuleId;
923 if (strip->GetStripId() < AliITSModuleDaSSD::GetPNStripsPerModule() )
924 ldcn->AddNoiseP(modid, strip->GetStripId(), strip->GetNoiseCM());
925 else
926 ldcn->AddNoiseN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()), strip->GetNoiseCM());
927 }
928 }
929 return ldcn;
930}
931
932
933//______________________________________________________________________________
934AliITSBadChannelsSSD* AliITSHandleDaSSD::GetCalibrationBadChannels() const
935{
936// Fill in the TObjArray with the list of bad channels
937 AliITSBadChannelsSSD *ldcbc = NULL;
938 AliITSModuleDaSSD *module = NULL;
939 AliITSChannelDaSSD *strip = NULL;
f67db810 940 if (!fModules) return NULL;
61a57d07 941 ldcbc = new AliITSBadChannelsSSD;
942 if (!ldcbc) {
943 AliError("Error allocation mamory for AliITSBadChannelsSSD object, return NULL!");
944 return NULL;
945 }
f67db810 946 for (Int_t i = 0; i < fNumberOfModules; i++) {
61a57d07 947 if (!(module = fModules[i])) continue;
948 if (module->GetModuleId() < fgkMinSSDModuleId) continue;
949 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
950 if (!(strip = module->GetStrip(strind))) continue;
951 Short_t modid = module->GetModuleId() - fgkMinSSDModuleId;
952 if (strip->GetStripId() < AliITSModuleDaSSD::GetPNStripsPerModule() )
953 ldcbc->AddBadChannelP(modid, strip->GetStripId(), module->CheckIfBad(strip->GetStripId()));
954 else
955 ldcbc->AddBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()),
956 module->CheckIfBad(strip->GetStripId()));
f67db810 957 }
f67db810 958 }
61a57d07 959 return ldcbc;
f67db810 960}
961
962
61a57d07 963
c4d90345 964//______________________________________________________________________________
61a57d07 965Bool_t AliITSHandleDaSSD::SaveCalibrationSSDLDC(Char_t*& dafname)
f67db810 966{
223dda26 967// Save Calibration data locally
61a57d07 968 AliITSBadChannelsSSD *ldcbc = NULL;
969 AliITSPedestalSSD *ldcp = NULL;
970 AliITSNoiseSSD *ldcn = NULL;
971 AliITSModuleDaSSD *module = NULL;
972 AliITSChannelDaSSD *strip = NULL;
c4d90345 973 Char_t *tmpfname;
974 TString dadatafilename("");
f67db810 975 if (!fModules) return kFALSE;
61a57d07 976 ldcn = new AliITSNoiseSSD;
977 ldcp = new AliITSPedestalSSD;
978 ldcbc = new AliITSBadChannelsSSD;
979 if ((!ldcn) || (!ldcp) || (!ldcp)) {
980 AliError("Error allocation mamory for calibration objects, return kFALSE!");
981 return kFALSE;
982 }
f67db810 983 for (Int_t i = 0; i < fNumberOfModules; i++) {
61a57d07 984 if (!(module = fModules[i])) continue;
985 if (module->GetModuleId() < fgkMinSSDModuleId) continue;
986 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
987 if (!(strip = module->GetStrip(strind))) continue;
988 Short_t modid = module->GetModuleId() - fgkMinSSDModuleId;
989 if (strip->GetStripId() < AliITSModuleDaSSD::GetPNStripsPerModule() ) {
990 ldcn->AddNoiseP(modid, strip->GetStripId(), strip->GetNoiseCM());
991 ldcp->AddPedestalP(modid, strip->GetStripId(), strip->GetPedestal());
992 ldcbc->AddBadChannelP(modid, strip->GetStripId(), module->CheckIfBad(strip->GetStripId()));
993 } else {
994 ldcn->AddNoiseN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()), strip->GetNoiseCM());
995 ldcp->AddPedestalN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()), strip->GetPedestal());
996 ldcbc->AddBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()),
997 module->CheckIfBad(strip->GetStripId()));
998 }
f67db810 999 }
f67db810 1000 }
a69c8ba0 1001 if (dafname) dadatafilename.Form("%s/", dafname);
371588bb 1002 dadatafilename += TString::Format("ITSSSDda_%i.root", fLdcId);
a69c8ba0 1003 tmpfname = new Char_t[dadatafilename.Length()+1];
c4d90345 1004 dafname = strcpy(tmpfname, dadatafilename.Data());
1005 TFile *fileRun = new TFile (dadatafilename.Data(),"RECREATE");
f67db810 1006 if (fileRun->IsZombie()) {
c4d90345 1007 AliError(Form("AliITSHandleDaSSD: SaveCalibrationSSDLDC() error open file %s", dadatafilename.Data()));
2e2c6def 1008 ldcn->Delete();
f67db810 1009 delete fileRun;
2e2c6def 1010 delete ldcn;
1011 delete ldcp;
1012 delete ldcbc;
f67db810 1013 return kFALSE;
1014 }
2e2c6def 1015 fileRun->WriteTObject(ldcn);
1016 fileRun->WriteTObject(ldcp);
61a57d07 1017 if (fBadChannelsList)
1018 if (fMergeBCLists) {
1019 MergeBadChannels(ldcbc);
1020 fileRun->WriteTObject(ldcbc);
1021 } else fileRun->WriteTObject(fBadChannelsList);
6e7691a5 1022 else fileRun->WriteTObject(ldcbc);
f67db810 1023 fileRun->Close();
f67db810 1024 delete fileRun;
2e2c6def 1025 delete ldcn;
1026 delete ldcp;
1027 delete ldcbc;
c4d90345 1028 return kTRUE;
1029}
1030
1031
61a57d07 1032//______________________________________________________________________________
1033Int_t AliITSHandleDaSSD::MergeBadChannels(AliITSBadChannelsSSD*& bcl) const
1034{
1035// Merges the statick bad channels list with bad channels got upon calibration
1036 AliITSModuleDaSSD *module = 0;
1037 Int_t nmpch = 0, nmnch = 0, ngpch = 0, ngnch = 0;
1038 if (!fBadChannelsList || !bcl) {
1039 AliWarning("Either fBadChannelsList == NULL or bad_channels_list == NULL, there is nothing to merge!");
1040 return -1;
1041 }
1042 for (Int_t modind = 0; modind < GetNumberOfModules(); modind++) {
1043 if (!(module = fModules[modind])) continue;
1044 if (module->GetModuleId() < fgkMinSSDModuleId) continue;
1045 Short_t modid = module->GetModuleId() - fgkMinSSDModuleId;
1046 for (Int_t strind = 0; strind < AliITSModuleDaSSD::GetPNStripsPerModule(); strind++) {
1047 if ( (!(fBadChannelsList->GetBadChannelP(modid, strind) & fgkBadChannelMask))
1048 && (bcl->GetBadChannelP(modid, strind) & fgkBadChannelMask) )
1049 ngpch++;
1050 if ( (!(fBadChannelsList->GetBadChannelN(modid, strind) & fgkBadChannelMask))
1051 && (bcl->GetBadChannelN(modid, strind) & fgkBadChannelMask) )
1052 ngnch++;
1053 if ( (!(bcl->GetBadChannelP(modid, strind) & fgkBadChannelMask))
1054 && (fBadChannelsList->GetBadChannelP(modid, strind) & fgkBadChannelMask) ) {
1055 bcl->AddBadChannelP(modid, strind, fBadChannelsList->GetBadChannelP(modid, strind));
1056 nmpch++;
1057 }
1058 if ( (!(bcl->GetBadChannelN(modid, strind) & fgkBadChannelMask))
1059 && (fBadChannelsList->GetBadChannelN(modid, strind) & fgkBadChannelMask) ) {
1060 bcl->AddBadChannelN(modid, strind, fBadChannelsList->GetBadChannelN(modid, strind));
1061 nmnch++;
1062 }
1063 }
1064 }
1065 AliInfo(Form("Static bad, dynamic good: P%d, N%d", nmpch, nmnch));
1066 AliInfo(Form("Static good, dynamic bad: P%d, N%d", ngpch, ngnch));
1067 return (nmnch + nmpch);
1068}
1069
1070
c4d90345 1071
1072//______________________________________________________________________________
1073Bool_t AliITSHandleDaSSD::DumpModInfo(const Float_t meannosethreshold) const
1074{
1075// Dump calibration parameters
1076 AliITSModuleDaSSD *mod;
1077 AliITSChannelDaSSD *strip;
1078 if (!fModules) {
1079 cout << "SSDDALDC::DumpModInfo(): Error, no modules are allocated!" << endl;
1080 return kFALSE;
1081 }
1082 cout << "Modules with MeanNoise > " << meannosethreshold << endl;
1083 for (Int_t i = 0; i < fNumberOfModules; i++) {
1084 if (!(mod = fModules[i])) continue;
371588bb 1085 Float_t maxnoise = 0.0f, meannoise = 0.0f, maxped = 0.0f;
c4d90345 1086 Int_t maxstrind = 0, novfstr = 0;
1087 for (Int_t strind = 0; strind < mod->GetNumberOfStrips(); strind++) {
1088 if (!(strip = mod->GetStrip(strind))) {novfstr++; continue; }
1089 if (strip->GetNoiseCM() >= AliITSChannelDaSSD::GetUndefinedValue() ) {novfstr++; continue; }
1090 if (maxnoise < strip->GetNoiseCM()) {
1091 maxnoise = strip->GetNoiseCM();
1092 maxstrind = strind;
1093 }
1094 meannoise = (strind - novfstr) ? meannoise + (strip->GetNoiseCM() - meannoise) / static_cast<Float_t>(strind - novfstr + 1)
1095 : strip->GetNoiseCM();
371588bb 1096 if (TMath::Abs(maxped) < TMath::Abs(strip->GetPedestal())) maxped = strip->GetPedestal();
c4d90345 1097 }
1098 if (meannoise > meannosethreshold)
1099 cout << "Mod: " << i << "; DDl: " << (int)mod->GetDdlId() << "; AD: " << (int)mod->GetAD()
371588bb 1100 << "; ADC: " << (int)mod->GetADC() << "; MaxPed = " << maxped
1101 << "; MeanNoise = " << meannoise
c4d90345 1102 << "; NOfStrips = " << (mod->GetNumberOfStrips() - novfstr) << endl;
1103 }
1104 return kTRUE;
1105}
1106
1107
1108
1109//______________________________________________________________________________
1110Bool_t AliITSHandleDaSSD::PrintModCalibrationData(const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Char_t *fname) const
1111{
1112// Print Module calibration data whether in file on in cout
1113 AliITSChannelDaSSD *strip;
1114 ofstream datafile;
1115 ostream *outputfile;
1116 if (!fname) { outputfile = &cout; }
1117 else {
1118 datafile.open(fname, ios::out);
1119 if (datafile.fail()) return kFALSE;
1120 outputfile = dynamic_cast<ostream*>(&datafile);
1121 }
1122 *outputfile << "DDL = " << (int)ddlID << "; AD = " << (int)ad << "; ADC = " << (int)adc << endl;
1123 for (Int_t strind = 0; strind < AliITSModuleDaSSD::GetStripsPerModuleConst(); strind++) {
8bcdc40d 1124 if ( (strip = GetStrip(ddlID, ad, adc, strind)) ) {
c4d90345 1125 *outputfile << "Str = " << strind << "; ped = " << strip->GetPedestal()
1126 << "; noise = " << strip->GetNoiseCM() << endl;
1127 }
1128 else continue;
1129 }
1130 if (datafile.is_open()) datafile.close();
1131 return kTRUE;
1132}
1133
1134
1135
371588bb 1136//______________________________________________________________________________
c4d90345 1137void AliITSHandleDaSSD::DumpInitData(const Char_t *str) const
1138{
371588bb 1139// Print general information retrieved from raw data file
c4d90345 1140 cout << "Raw data file: " << fRawDataFileName << endl
1141 << "LDC: " << (Int_t)fLdcId << "; RunId: " << fRunId << endl
1142 << "Number of physics events: " << fNumberOfEvents << endl
1143 << str;
1144}
1145
1146
1147//______________________________________________________________________________
1148Bool_t AliITSHandleDaSSD::AllocateSimulatedModules(const Int_t copymodind)
1149{
1150// Used to allocate simulated modules to test the performance
1151 AliITSModuleDaSSD *module;
1152 UChar_t ad, adc, ddlID;
1153 ad = adc = ddlID = 0;
1154 if (!(fModules[copymodind])) return kFALSE;
1155 for (Int_t modind = 0; modind < fNumberOfModules; modind++) {
1156 if (!fModules[modind]) {
1157 module = new AliITSModuleDaSSD(AliITSModuleDaSSD::GetStripsPerModuleConst());
1158 if ((adc < 5) || ((adc > 7) && (adc < 13)) ) adc += 1;
1159 else if (adc == 5) adc = 8;
1160 else if (adc == 13) {
1161 adc = 0;
1162 if (ad < 8) ad += 1;
1163 else {
1164 ad = 0;
1165 ddlID +=1;
1166 }
1167 }
1168 if (!module->SetModuleIdData (ddlID, ad, adc, modind)) return kFALSE;
1169 fModules[modind] = module;
1170 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
1171 AliITSChannelDaSSD *cstrip = fModules[copymodind]->GetStrip(strind);
1172 Long_t eventsnumber = cstrip->GetEventsNumber();
1173 AliITSChannelDaSSD *strip = new AliITSChannelDaSSD(strind, eventsnumber);
1174 for (Long_t evind = 0; evind < eventsnumber; evind++) {
61a57d07 1175 Short_t sign = cstrip->GetSignal(evind);
c4d90345 1176 if (!strip->SetSignal(evind, sign)) AliError(Form("AliITSHandleDaSSD: Copy events error! mod = %i, str = %i", modind, strind));
1177 }
1178 module->SetStrip(strip, strind);
1179 }
1180 }
1181 else {
1182 ddlID = fModules[modind]->GetDdlId();
1183 ad = fModules[modind]->GetAD();
1184 adc = fModules[modind]->GetADC();
1185 }
1186 }
1187 for (UShort_t modind = 0; modind < fNumberOfModules; modind++) fModules[modind]->SetModuleId(modind + 1080);
f67db810 1188 return kTRUE;
1189}
be4f467e 1190
1191
1192
1193//___________________________________________________________________________________________
1194Bool_t AliITSHandleDaSSD::AdDataPresent(const Int_t ddl, const Int_t ad) const
1195{
1196// Check if there are calibration data for given ddl and slot
1197 for (Int_t modind = 0; modind < fNumberOfModules; modind++)
1198 if ((GetModule(modind)->GetAD() == ad) && (GetModule(modind)->GetDdlId() == ddl)) return kTRUE;
1199 return kFALSE;
1200}
1201
1202
1203
1204//___________________________________________________________________________________________
1205Bool_t AliITSHandleDaSSD::SaveEqSlotCalibrationData(const Int_t ddl, const Int_t ad, const Char_t *fname) const
1206// Saves calibration files for selected equipment (DDL)
1207{
1208 fstream feefile;
1209 Int_t zsml, offsetml;
1210 ULong_t zsth, offset, zsoffset;
1211 if (!fname) {
1212 AliError("File name must be specified!");
1213 return kFALSE;
1214 }
1215 if (!AdDataPresent(ddl, ad)) {
1216 AliError(Form("Error SaveEqSlotCalibrationData(ddl = %i, ad = %i) no data present", ddl, ad));
1217 return kFALSE;
1218 }
1219 feefile.open(fname, ios::out);
1220 if (!feefile.is_open()) {
1221 AliError(Form("Can not open the file %s for output!", fname));
1222 return kFALSE;
1223 }
1224 for (zsml = 0; fgkZsBitMask >> zsml; zsml++);
1225 for (offsetml = 0; fgkOffSetBitMask >> offsetml; offsetml++);
1226 for (Int_t strind = 0; strind < AliITSModuleDaSSD::GetStripsPerModuleConst(); strind++) {
1227 for (Int_t adcb = 0; adcb < fgkAdcPerDBlock; adcb++) {
1228 zsoffset = 0x0;
1229 for (Int_t j = 0; j < 2; j++) {
1230 Int_t adc = adcb + j * 8;
1231 zsth = ZsThreshold(ddl, ad, adc, strind);
1232 offset = OffsetValue(ddl, ad, adc, strind);
1233 zsoffset = zsoffset | (((zsth << offsetml) | offset) << ((j == 0) ? (offsetml + zsml) : 0));
1234 }
1235 feefile << "0x" << ConvBase(static_cast<unsigned long>(zsoffset), 16) << endl;
1236 }
1237 }
1238 feefile.close();
1239 return kTRUE;
1240}
1241
1242
1243//______________________________________________________________________________
1244Int_t AliITSHandleDaSSD::ChannelIsBad(const UChar_t ddl, const UChar_t ad, const UChar_t adc, const Int_t strn) const
1245{
1246// Check if the channel is bad
61a57d07 1247 AliITSModuleDaSSD *module = NULL;
1248 Int_t modn = -1;
1249 if (fBadChannelsList && fDDLModuleMap) {
be4f467e 1250 modn = RetrieveModuleId(ddl, ad, adc);
1251 if (modn < 0) return -1;
61a57d07 1252 if (modn < fgkMinSSDModuleId) {
1253 AliWarning(Form("Module ddl/ad/adc: %i/%i/%i has number %i which is wrong for SSD module", ddl, ad, adc, strn, modn));
1254 return -1;
be4f467e 1255 }
61a57d07 1256 Short_t modid = modn - fgkMinSSDModuleId;
1257 if (strn < AliITSModuleDaSSD::GetPNStripsPerModule())
1258 return (fBadChannelsList->GetBadChannelP(modid, strn) & fgkBadChannelMask);
1259 else return (fBadChannelsList->GetBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strn)) & fgkBadChannelMask);
1260 } else {
1261 AliError("Error ether bad channels list or DDLMap is not initialized or both, AliITSModuleDaSSD::CheckIfBad(str) is used!");
1262 if (module = GetModule(ddl, ad, adc)) {
1263 return (module->CheckIfBad(strn) & fgkBadChannelMask);
be4f467e 1264 } else {
61a57d07 1265 AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, 0 is used!", ddl, ad, adc));
1266 return 0ul;
be4f467e 1267 }
be4f467e 1268 return 0;
1269 }
1270}
61a57d07 1271
1272
1273
1274//______________________________________________________________________________
1275Int_t AliITSHandleDaSSD::LadderIsOff(const UChar_t ddl, const UChar_t ad, const UChar_t adc) const
1276{
1277//Checks if the module with given ddl, ad, adc is on the ladder which is in the list of ladders which are off
1278 const Int_t nm5 = 500;
1279 const Int_t nm6 = 1248;
1280 const Int_t nml5a = 12;
1281 const Int_t nml5c = 10;
1282 const Int_t nml6a = 12;
1283 const Int_t nml6c = 13;
1284 Int_t modn, ladder, layer, side;
1285 AliITSModuleDaSSD *module;
1286 if (!(module = GetModule(ddl, ad, adc))) return 0;
1287 if ((modn = module->GetModuleId()) <= 0) modn = RetrieveModuleId(ddl, ad, adc);
1288 if (modn <= 0) return 0;
1289 layer = modn >= nm6 ? 1 : 0; // 6 : 5
1290 ladder = (modn - (layer ? nm6 : nm5)) / (layer ? (nml6a + nml6c) : (nml5a + nml5c));
1291 if ( ((modn - (layer ? nm6 : nm5)) % (layer ? (nml6a + nml6c) : (nml5a + nml5c))) < (layer ? nml6a : nml5a))
1292 side = 0; // A
1293 else side = 1; // C
1294 ladder += (layer ? 600 : 500);
1295 layer += 5;
1296 if (side)
1297 if (fCLaddersOff.GetSize()) {
1298 for(Int_t i = 0; i < fCLaddersOff.GetSize(); i++)
1299 if (fCLaddersOff.At(i) == ladder) return fCLaddersOff.At(i);
1300 return 0;
1301 } else return 0;
1302 else
1303 if (fALaddersOff.GetSize()) {
1304 for(Int_t i = 0; i < fALaddersOff.GetSize(); i++)
1305 if (fALaddersOff.At(i) == ladder) return fALaddersOff.At(i);
1306 return 0;
1307 } else return 0;
1308 return 0;
1309}
1310
1311
be4f467e 1312
1313//______________________________________________________________________________
1314ULong_t AliITSHandleDaSSD::OffsetValue(const AliITSChannelDaSSD *strip,
1315 const UChar_t ddl, const UChar_t ad, const UChar_t adc, const Int_t strn) const
1316{
1317// Calculate the offset value to be upload to FEROM
1318 Int_t pedint;
1319 if (fOffsetDefault < INT_MAX) pedint = fOffsetDefault;
1320 else pedint = TMath::Nint(strip->GetPedestal());
1321 if (pedint > static_cast<Int_t>((fgkOffSetBitMask >> 1))) {
61a57d07 1322 if (!ChannelIsBad(ddl, ad, adc, strn) && !((fMergeBCLists) && (GetModule(ddl, ad, adc)->CheckIfBad(strn))))
1323 AliError(Form("Offset %i, channel(ddl/ad/adc/strip) %i/%i/%i/%i can not be represented with mask 0x%s, Offset = %i",
1324 pedint, ddl, ad, adc, strn, ConvBase(fgkOffSetBitMask, 16).c_str(), (fgkOffSetBitMask >> 1)));
1325 return (fgkOffSetBitMask >> 1);
be4f467e 1326 }
1327 if ((-pedint) > static_cast<Int_t>(((fgkOffSetBitMask + 1) >> 1))) {
61a57d07 1328 if (!ChannelIsBad(ddl, ad, adc, strn) && !((fMergeBCLists) && (GetModule(ddl, ad, adc)->CheckIfBad(strn))))
1329 AliError(Form("Offset %i, channel(ddl/ad/adc/strip) %i/%i/%i/%i can not be represented with mask 0x%s, Offset = %i",
1330 pedint, ddl, ad, adc, strn, ConvBase(fgkOffSetBitMask, 16).c_str(),
1331 ((fgkOffSetBitMask & (~fgkOffSetBitMask >> 1)) - fgkOffSetBitMask - 1)));
be4f467e 1332 return fgkOffSetBitMask & (~fgkOffSetBitMask >> 1);
1333 }
1334 return fgkOffSetBitMask & (pedint >= 0 ? pedint : pedint + fgkOffSetBitMask + 1);
1335}
1336
1337
1338
1339//______________________________________________________________________________
1340ULong_t AliITSHandleDaSSD::OffsetValue(const UChar_t ddl, const UChar_t ad, const UChar_t adc, const Int_t strn) const
1341{
1342// Calculate the offset value to be upload to FEROM
1343 AliITSChannelDaSSD *strip = NULL;
1344 AliITSModuleDaSSD *module = NULL;
61a57d07 1345 if (module = GetModule(ddl, ad, adc)) {
1346 if (strip = module->GetStrip(strn)) return OffsetValue(strip, ddl, ad, adc, strn);
be4f467e 1347 else {
1348 AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, strip = %i, 0 is used!", ddl, ad, adc, strn));
1349 return 0ul;
1350 }
1351 } else {
1352 AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, 0 is used!", ddl, ad, adc));
1353 return 0ul;
1354 }
1355}
1356
1357
1358
1359//______________________________________________________________________________
1360ULong_t AliITSHandleDaSSD::ZsThreshold(AliITSChannelDaSSD *strip) const
1361{
1362// Calculate the value of zero suppression threshold to be upload to FEROM
1363 ULong_t zs;
61a57d07 1364 if (fZsDefault < 0) {
1365 zs = TMath::Nint(fZsFactor * strip->GetNoiseCM());
1366 if (zs < static_cast<ULong_t>(fZsMinimum)) zs = static_cast<ULong_t>(fZsMinimum);
1367 }
be4f467e 1368 else zs = fZsDefault;
1369 return (zs < fgkZsBitMask) ? (zs & fgkZsBitMask) : fgkZsBitMask;
1370}
1371
1372
1373//______________________________________________________________________________
1374ULong_t AliITSHandleDaSSD::ZsThreshold(const UChar_t ddl, const UChar_t ad, const UChar_t adc, const Int_t strn) const
1375{
1376// Calculate the value of zero suppression threshold to be upload to FEROM, account bad channels list
1377 AliITSChannelDaSSD *strip = NULL;
1378 AliITSModuleDaSSD *module = NULL;
61a57d07 1379 if (ChannelIsBad(ddl, ad, adc, strn)) return fgkZsBitMask;
1380 if (LadderIsOff(ddl, ad, adc)) return fgkZsBitMask;
1381 if (module = GetModule(ddl, ad, adc)) {
1382 if (fMergeBCLists) if (module->CheckIfBad(strn)) return fgkZsBitMask;
1383 if (strip = module->GetStrip(strn)) return ZsThreshold(strip);
be4f467e 1384 else {
1385 AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, strip = %i, 0 is used!", ddl, ad, adc, strn));
1386 return 0ul;
1387 }
1388 } else {
1389 AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, 0 is used!", ddl, ad, adc));
1390 return 0ul;
1391 }
1392}
1393
1394
1395//______________________________________________________________________________
1396string AliITSHandleDaSSD::ConvBase(const unsigned long value, const long base) const
1397{
1398// Converts the unsigned long number into that in another base
1399 string digits = "0123456789ABCDEF";
1400 string result;
1401 unsigned long v = value;
1402 if((base < 2) || (base > 16)) {
1403 result = "Error: base out of range.";
1404 }
1405 else {
1406 int i = 0;
1407 do {
1408 result = digits[v % base] + result;
1409 v /= base;
1410 i++;
1411 }
1412 while((v) || (i<8));
1413 }
1414 return result;
1415}
61a57d07 1416
1417
1418
1419//______________________________________________________________________________
1420Int_t AliITSHandleDaSSD::CheckOffChips() const
1421{
1422// Check if the chip, module are off
1423 AliITSChannelDaSSD *strip;
1424 Int_t offthreshold;
1425 Int_t strnd, chipnd, modnd, stroff, chipoff, modoff;
1426 offthreshold = TMath::Nint(fZsMinimum/fZsFactor);
1427 modnd = modoff = 0;
1428 for (Int_t mi = 0; mi < fNumberOfModules; mi++) {
1429 if (!fModules[mi]) { modnd++; continue; }
1430 if (fModules[mi]->GetModuleId() < 0) continue;
1431 if (LadderIsOff(fModules[mi]->GetDdlId(), fModules[mi]->GetAD(), fModules[mi]->GetADC()) ) continue;
1432 chipoff = chipnd = 0;
1433 for (Int_t chipind = 0; chipind < AliITSModuleDaSSD::GetChipsPerModuleConst(); chipind++) {
1434 strnd = stroff = 0;
1435 Int_t stripind = chipind * AliITSModuleDaSSD::GetStripsPerChip();
1436 for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
1437 if (!(strip = fModules[mi]->GetStrip(strind))) { strnd++; continue; }
1438 if (strip->GetNoiseCM() < offthreshold ) stroff++;
1439 }
1440 if (strnd == AliITSModuleDaSSD::GetStripsPerChip()) chipnd++;
1441 else if (stroff == AliITSModuleDaSSD::GetStripsPerChip()) chipoff++;
1442 else if ((stroff + strnd) == AliITSModuleDaSSD::GetStripsPerChip()) chipoff++;
1443 }
1444 if ((!chipoff) && (!chipnd)) continue;
1445 if (chipnd == AliITSModuleDaSSD::GetChipsPerModuleConst()) {
1446 AliInfo(Form("Module: (ddl/ad/adc) %i/%i/%i seems to be off and it is not on the ladders which are off!",
1447 fModules[mi]->GetDdlId(), fModules[mi]->GetAD(), fModules[mi]->GetADC()));
1448 modnd++;
1449 }
1450 if (chipoff == AliITSModuleDaSSD::GetChipsPerModuleConst()) {
1451 AliInfo(Form("Module (ddl/ad/adc): %i/%i/%i seems to be off and it is not on the ladders which are off!",
1452 fModules[mi]->GetDdlId(), fModules[mi]->GetAD(), fModules[mi]->GetADC()));
1453 modoff++;
1454 }
1455 else if ((chipoff + chipnd) == AliITSModuleDaSSD::GetChipsPerModuleConst()) {
1456 AliInfo(Form("Module: (ddl/ad/adc): %i/%i/%i seems to be off and it is not on the ladders which are off!",
1457 fModules[mi]->GetDdlId(), fModules[mi]->GetAD(), fModules[mi]->GetADC()));
1458 modoff++;
1459 }
1460 else if (chipoff) {
1461 AliInfo(Form("Module: (ddl/ad/adc): %i/%i/%i has %i chips which are off!",
1462 fModules[mi]->GetDdlId(), fModules[mi]->GetAD(), fModules[mi]->GetADC(), chipoff));
1463 modoff++;
1464 }
1465 }
1466 return (modoff + modnd);
1467}