1 /**************************************************************************
2 * Copyright(c) 2007-2009, 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 ///////////////////////////////////////////////////////////////////////////////
20 /// This class provides storage container ITS SSD module callibration data
24 ///////////////////////////////////////////////////////////////////////////////
26 #include "AliITSNoiseSSD.h"
27 #include "AliITSPedestalSSD.h"
28 #include "AliITSBadChannelsSSD.h"
29 #include "AliITSModuleDaSSD.h"
33 ClassImp(AliITSModuleDaSSD)
36 const Int_t AliITSModuleDaSSD::fgkStripsPerModule = 1536; // Number of strips per SSD module
37 const Int_t AliITSModuleDaSSD::fgkPNStripsPerModule = 768; // Number of N/P strips per SSD module
38 const Int_t AliITSModuleDaSSD::fgkStripsPerChip = 128; // Number of strips per chip HAL25
39 const UChar_t AliITSModuleDaSSD::fgkMaxAdNumber = 9; // MAx SSD FEROM AD number
40 const UChar_t AliITSModuleDaSSD::fgkMaxAdcNumber = 13; // MAx SSD FEROM ADC number
41 const Int_t AliITSModuleDaSSD::fgkChipsPerModule = 12; // Number of HAL25 chips per SSD module
47 //______________________________________________________________________________
48 AliITSModuleDaSSD::AliITSModuleDaSSD() :
62 // Default constructor
66 //______________________________________________________________________________
67 AliITSModuleDaSSD::AliITSModuleDaSSD(const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const UShort_t moduleID) :
81 // Constructor, set module id data
86 //______________________________________________________________________________
87 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips) :
101 // Constructor, allocates memory for AliITSChannelDaSSD* and TArrayS* array for CM calculated in FEROM
102 if (numberofstrips != fgkStripsPerModule)
103 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
104 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
106 fNumberOfStrips = numberofstrips;
107 for (Int_t i = 0; i < numberofstrips; i++) fStrips[i]= NULL;
109 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
116 //______________________________________________________________________________
117 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips, const Long_t eventsnumber) :
131 // Constructor, allocates memory for AliITSChannelDaSSD* and events data
132 if (numberofstrips != fgkStripsPerModule)
133 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
134 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
136 fNumberOfStrips = numberofstrips;
137 memset(fStrips, 0, numberofstrips * sizeof(AliITSChannelDaSSD*));
138 for (Int_t i = 0; i < fNumberOfStrips; i++) {
139 fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber);
140 if (!fStrips[i]) AliError(Form("AliITSModuleDaSSD: Error allocating memory for AliITSChannelDaSSD %i-th object", i));
143 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
151 //______________________________________________________________________________
152 AliITSModuleDaSSD::AliITSModuleDaSSD(const AliITSModuleDaSSD& module) :
154 fEquipId(module.fEquipId),
155 fEquipType(module.fEquipType),
156 fDdlId(module.fDdlId),
159 fModuleId(module.fModuleId),
160 fNumberOfStrips(module.fNumberOfStrips),
162 fNumberOfChips(module.fNumberOfChips),
165 fEventsNumber(module.fEventsNumber)
168 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
169 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
171 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
172 if (module.fStrips[strind]) {
173 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
174 if (!fStrips[strind]) {
175 AliError("AliITSModuleDaSSD: Error copy constructor");
176 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
181 } else fStrips[strind] = NULL;
184 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
190 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
192 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
194 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
200 if (module.fCmFerom) {
201 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
203 for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
205 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
213 //______________________________________________________________________________
214 AliITSModuleDaSSD& AliITSModuleDaSSD::operator = (const AliITSModuleDaSSD& module)
216 // assignment operator
217 if (this == &module) return *this;
218 TObject::operator=(module);
220 for (Long_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
224 fEquipId = module.fEquipId;
225 fEquipType = module.fEquipType;
226 fDdlId = module.fDdlId;
229 fModuleId = module.fModuleId;
231 fNumberOfChips = module.fNumberOfChips;
233 fEventsNumber = module.fEventsNumber;
234 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
235 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
237 memset(fStrips, 0, (sizeof(AliITSChannelDaSSD*) * module.fNumberOfStrips));
238 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
239 if (module.fStrips[strind]) {
240 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
241 if (!fStrips[strind]) {
242 AliError("AliITSModuleDaSSD: Error copy constructor");
243 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
249 } else fStrips[strind] = NULL;
251 fNumberOfStrips = module.fNumberOfStrips;
253 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
258 if (fCm) delete [] fCm;
260 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
262 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
264 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
269 if (fCmFerom) { delete [] fCmFerom; fCmFerom = NULL; }
270 if (module.fCmFerom) {
271 fCmFerom = new (nothrow) TArrayS [module.fNumberOfChips];
273 for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
275 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
284 //______________________________________________________________________________
285 AliITSModuleDaSSD::~AliITSModuleDaSSD()
290 for (Long_t i = 0; i < fNumberOfStrips; i++)
292 if (fStrips[i]) delete fStrips[i];
296 if (fCm) delete [] fCm;
297 if (fCmFerom) delete [] fCmFerom;
302 //______________________________________________________________________________
303 Bool_t AliITSModuleDaSSD::SetNumberOfStrips(const Int_t numberofstrips)
305 // Allocates memory for AliITSChannelDaSSD*
307 for (Int_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
311 if (numberofstrips <= 0) {fNumberOfStrips = 0; return kTRUE; }
312 if (numberofstrips != fgkStripsPerModule)
313 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
314 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
316 fNumberOfStrips = numberofstrips;
317 memset(fStrips, 0, sizeof(AliITSChannelDaSSD*) * numberofstrips);
320 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
328 //______________________________________________________________________________
329 Bool_t AliITSModuleDaSSD::SetNumberOfChips(const Int_t nchips)
331 // Allocate nchips TArrayF objects to save Common Mode
333 if (nchips <= 0) {fNumberOfChips = 0; return kTRUE; }
334 if (nchips != fgkChipsPerModule)
335 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i HAL25 chips", fgkChipsPerModule));
336 fCm = new (nothrow) TArrayF [nchips];
338 fNumberOfChips = nchips;
341 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", nchips));
349 //______________________________________________________________________________
350 Bool_t AliITSModuleDaSSD::SetModuleIdData (const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Short_t moduleID)
353 if (ad > fgkMaxAdNumber) {
354 AliWarning(Form("AliITSModuleDaSSD: Wrong AD number: %i", ad));
357 if (adc > fgkMaxAdcNumber || ForbiddenAdcNumber(adc)) {
358 AliWarning(Form("AliITSModuleDaSSD: Wrong ADC number: %i", adc));
364 fModuleId = moduleID;
369 //______________________________________________________________________________
370 void AliITSModuleDaSSD::SetModuleFEEId (const UChar_t ddlID, const UChar_t ad, const UChar_t adc)
372 // Set id data of FEE connected to the Module
379 //______________________________________________________________________________
380 void AliITSModuleDaSSD::SetModuleRorcId (const Int_t equipid, const Int_t equiptype)
382 // Set data to access FEROM registres via DDL
384 fEquipType = equiptype;
388 //______________________________________________________________________________
389 Bool_t AliITSModuleDaSSD::SetEventsNumber(const Long_t eventsnumber)
391 // Allocate the memory for the events data
393 if (!fStrips) return kFALSE;
394 for (i = 0; i < fNumberOfStrips; i++) {
396 if (!fStrips[i]->SetEvenetsNumber(eventsnumber)) {
397 for (Int_t j = 0; j < i; j++) fStrips[j]->DeleteSignal();
398 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %ld event for module %d, strip %d",eventsnumber, (Int_t)fModuleId, i));
403 if (!(fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber))) {
404 for (Int_t j = 0; j < i; j++) delete fStrips[j];
408 AliError(Form("AliITSModuleDaSSD: Error allocating memory for strip %i of module %i!", (Int_t)fModuleId, i));
413 fEventsNumber = eventsnumber;
419 //______________________________________________________________________________
420 Bool_t AliITSModuleDaSSD::SetCM (const Float_t cm, const Int_t chipn, const Int_t evn)
422 // Set value of CM for a given chip and event
423 if ((!fCm) || (chipn >= fNumberOfChips)) return kFALSE;
424 if (evn >= fCm[chipn].GetSize()) return kFALSE;
425 else fCm[chipn][evn] = cm;
431 //______________________________________________________________________________
432 Float_t AliITSModuleDaSSD::GetCM(const Int_t chipn, const Long_t evn) const
434 // Get value of CM for a given chip and event
435 if ((!fCm) || (chipn >= fNumberOfChips)) return 0.0f;
436 if (evn >= fCm[chipn].GetSize()) return 0.0f;
437 else return fCm[chipn][evn];
441 //______________________________________________________________________________
442 Bool_t AliITSModuleDaSSD::AllocateCMFeromArray(void)
444 // Allocates memory for the channels which contains CM calculated in Ferom
446 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
448 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
457 //______________________________________________________________________________
458 Bool_t AliITSModuleDaSSD::SetCMFeromEventsNumber(const Long_t eventsnumber)
460 // Allocates memory for the values of CM calculated in Ferom
461 if (!fCmFerom) return kFALSE;
462 for (Int_t chipind = 0; chipind < fgkChipsPerModule; chipind++) {
463 fCmFerom[chipind].Set(eventsnumber);
464 fCmFerom[chipind].Reset(0);
469 //______________________________________________________________________________
470 Bool_t AliITSModuleDaSSD::SetCMFerom (const Short_t cm, const Int_t chipn, const Int_t evn)
472 // Set value of FeromCM for a given chip and event
473 if ((!fCmFerom) || (chipn >= fgkChipsPerModule)) return kFALSE;
474 if (evn >= fCmFerom[chipn].GetSize()) return kFALSE;
475 else fCmFerom[chipn][evn] = cm;
480 void AliITSModuleDaSSD::SetCMFerom (Short_t* cm, const Int_t chipn)
481 // Set value of FeromCM for a given chip
484 if (!AllocateCMFeromArray()) return;
485 if (chipn < fgkChipsPerModule) fCmFerom[chipn].Set(fCmFerom[chipn].GetSize(), cm);
489 //______________________________________________________________________________
490 Short_t AliITSModuleDaSSD::GetCMFerom(const Int_t chipn, const Long_t evn) const
492 // Get value of FeromCM for a given chip and event
493 if ((!fCmFerom) || (chipn >= fgkChipsPerModule)) return 0;
494 if (evn >= fCmFerom[chipn].GetSize()) return 0;
495 else return fCmFerom[chipn][evn];