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
23 ///////////////////////////////////////////////////////////////////////////////
25 #include "AliITSNoiseSSD.h"
26 #include "AliITSPedestalSSD.h"
27 #include "AliITSBadChannelsSSD.h"
28 #include "AliITSModuleDaSSD.h"
32 ClassImp(AliITSModuleDaSSD)
35 const Int_t AliITSModuleDaSSD::fgkStripsPerModule = 1536; // Number of strips per SSD module
36 const Int_t AliITSModuleDaSSD::fgkPNStripsPerModule = 768; // Number of N/P strips per SSD module
37 const Int_t AliITSModuleDaSSD::fgkStripsPerChip = 128; // Number of strips per chip HAL25
38 const UChar_t AliITSModuleDaSSD::fgkMaxAdNumber = 9; // MAx SSD FEROM AD number
39 const UChar_t AliITSModuleDaSSD::fgkMaxAdcNumber = 13; // MAx SSD FEROM ADC number
40 const Int_t AliITSModuleDaSSD::fgkChipsPerModule = 12; // Number of HAL25 chips per SSD module
46 //______________________________________________________________________________
47 AliITSModuleDaSSD::AliITSModuleDaSSD() :
61 // Default constructor
65 //______________________________________________________________________________
66 AliITSModuleDaSSD::AliITSModuleDaSSD(const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const UShort_t moduleID) :
80 // Constructor, set module id data
85 //______________________________________________________________________________
86 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips) :
100 // Constructor, allocates memory for AliITSChannelDaSSD* and TArrayS* array for CM calculated in FEROM
101 if (numberofstrips != fgkStripsPerModule)
102 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
103 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
105 fNumberOfStrips = numberofstrips;
106 for (Int_t i = 0; i < numberofstrips; i++) fStrips[i]= NULL;
108 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
112 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
114 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
120 //______________________________________________________________________________
121 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips, const Long_t eventsnumber) :
135 // Constructor, allocates memory for AliITSChannelDaSSD* and events data
136 if (numberofstrips != fgkStripsPerModule)
137 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
138 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
140 fNumberOfStrips = numberofstrips;
141 memset(fStrips, 0, numberofstrips * sizeof(AliITSChannelDaSSD*));
142 for (Int_t i = 0; i < fNumberOfStrips; i++) {
143 fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber);
144 if (!fStrips[i]) AliError(Form("AliITSModuleDaSSD: Error allocating memory for AliITSChannelDaSSD %i-th object", i));
147 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
151 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
153 for (Int_t i = 0; i < fgkChipsPerModule; i++) {
154 fCmFerom[i].Set(eventsnumber);
155 fCmFerom[i].Reset(0);
159 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
166 //______________________________________________________________________________
167 AliITSModuleDaSSD::AliITSModuleDaSSD(const AliITSModuleDaSSD& module) :
169 fEquipId(module.fEquipId),
170 fEquipType(module.fEquipType),
171 fDdlId(module.fDdlId),
174 fModuleId(module.fModuleId),
175 fNumberOfStrips(module.fNumberOfStrips),
177 fNumberOfChips(module.fNumberOfChips),
180 fEventsNumber(module.fEventsNumber)
183 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
184 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
186 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
187 if (module.fStrips[strind]) {
188 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
189 if (!fStrips[strind]) {
190 AliError("AliITSModuleDaSSD: Error copy constructor");
191 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
196 } else fStrips[strind] = NULL;
199 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
205 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
207 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
209 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
215 if (module.fCmFerom) {
216 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
218 for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
220 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
228 //______________________________________________________________________________
229 AliITSModuleDaSSD& AliITSModuleDaSSD::operator = (const AliITSModuleDaSSD& module)
231 // assignment operator
232 if (this == &module) return *this;
234 for (Long_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
237 fEquipId = module.fEquipId;
238 fEquipType = module.fEquipType;
239 fDdlId = module.fDdlId;
242 fModuleId = module.fModuleId;
243 fNumberOfStrips = module.fNumberOfStrips;
245 fNumberOfChips = module.fNumberOfChips;
247 fEventsNumber = module.fEventsNumber;
248 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
249 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
251 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
252 if (module.fStrips[strind]) {
253 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
254 if (!fStrips[strind]) {
255 AliError("AliITSModuleDaSSD: Error copy constructor");
256 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
261 } else fStrips[strind] = NULL;
264 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
269 if (fCm) delete [] fCm;
271 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
273 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
275 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
280 if (fCmFerom) delete [] fCmFerom;
281 if (module.fCmFerom) {
282 fCmFerom = new (nothrow) TArrayS [module.fNumberOfChips];
284 for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
286 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
295 //______________________________________________________________________________
296 AliITSModuleDaSSD::~AliITSModuleDaSSD()
301 for (Long_t i = 0; i < fNumberOfStrips; i++)
303 if (fStrips[i]) delete fStrips[i];
307 if (fCm) delete [] fCm;
308 if (fCmFerom) delete [] fCmFerom;
313 //______________________________________________________________________________
314 Bool_t AliITSModuleDaSSD::SetNumberOfStrips(const Int_t numberofstrips)
316 // Allocates memory for AliITSChannelDaSSD*
318 for (Int_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
322 if (numberofstrips <= 0) {fNumberOfStrips = 0; return kTRUE; }
323 if (numberofstrips != fgkStripsPerModule)
324 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
325 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
327 fNumberOfStrips = numberofstrips;
328 memset(fStrips, 0, sizeof(AliITSChannelDaSSD*) * numberofstrips);
331 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
339 //______________________________________________________________________________
340 Bool_t AliITSModuleDaSSD::SetNumberOfChips(const Int_t nchips)
342 // Allocate nchips TArrayF objects to save Common Mode
344 if (nchips <= 0) {fNumberOfChips = 0; return kTRUE; }
345 if (nchips != fgkChipsPerModule)
346 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i HAL25 chips", fgkChipsPerModule));
347 fCm = new (nothrow) TArrayF [nchips];
349 fNumberOfChips = nchips;
352 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", nchips));
360 //______________________________________________________________________________
361 Bool_t AliITSModuleDaSSD::SetModuleIdData (const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Short_t moduleID)
364 if (ad > fgkMaxAdNumber) {
365 AliWarning(Form("AliITSModuleDaSSD: Wrong AD number: %i", ad));
368 if (adc > fgkMaxAdcNumber || ForbiddenAdcNumber(adc)) {
369 AliWarning(Form("AliITSModuleDaSSD: Wrong ADC number: %i", adc));
375 fModuleId = moduleID;
380 //______________________________________________________________________________
381 void AliITSModuleDaSSD::SetModuleFEEId (const UChar_t ddlID, const UChar_t ad, const UChar_t adc)
383 // Set id data of FEE connected to the Module
390 //______________________________________________________________________________
391 void AliITSModuleDaSSD::SetModuleRorcId (const Int_t equipid, const Int_t equiptype)
393 // Set data to access FEROM registres via DDL
395 fEquipType = equiptype;
399 //______________________________________________________________________________
400 Bool_t AliITSModuleDaSSD::SetEventsNumber(const Long_t eventsnumber)
402 // Allocate the memory for the events data
404 if (!fStrips) return kFALSE;
405 for (i = 0; i < fNumberOfStrips; i++) {
407 if (!fStrips[i]->SetEvenetsNumber(eventsnumber)) {
408 for (Int_t j = 0; j < i; j++) fStrips[j]->DeleteSignal();
409 AliError(Form("AliITSModuleDaSSD: Error allocating memory for i% events for module %i, strip %i",
410 eventsnumber, (Int_t)fModuleId, i));
414 if (!(fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber))) {
415 for (Int_t j = 0; j < i; j++) delete fStrips[j];
419 AliError(Form("AliITSModuleDaSSD: Error allocating memory for strip %i of module %i!", (Int_t)fModuleId, i));
424 for (Int_t ie = 0; ie < fgkChipsPerModule; ie++) {
425 fCmFerom[ie].Set(eventsnumber);
426 fCmFerom[ie].Reset(0);
429 else AliError("AliITSModuleDaSSD: No memory was allocated for fCmFerom!");
430 fEventsNumber = eventsnumber;
436 //______________________________________________________________________________
437 Bool_t AliITSModuleDaSSD::SetCM (const Float_t cm, const Int_t chipn, const Int_t evn)
439 // Set value of CM for a given chip and event
440 if ((!fCm) || (chipn >= fNumberOfChips)) return kFALSE;
441 if (evn >= fCm[chipn].GetSize()) return kFALSE;
442 else fCm[chipn][evn] = cm;
448 //______________________________________________________________________________
449 Float_t AliITSModuleDaSSD::GetCM(const Int_t chipn, const Long_t evn) const
451 // Get value of CM for a given chip and event
452 if ((!fCm) || (chipn >= fNumberOfChips)) return 0.0f;
453 if (evn >= fCm[chipn].GetSize()) return 0.0f;
454 else return fCm[chipn][evn];
459 //______________________________________________________________________________
460 Bool_t AliITSModuleDaSSD::SetCMFeromEventsNumber(const Long_t eventsnumber)
462 // Allocates memory for the values of CM calculated in Ferom
463 if (!fCmFerom) return kFALSE;
464 for (Int_t chipind = 0; chipind < fgkChipsPerModule; chipind++) {
465 fCmFerom[chipind].Set(eventsnumber);
466 fCmFerom[chipind].Reset(0);
471 //______________________________________________________________________________
472 Bool_t AliITSModuleDaSSD::SetCMFerom (const Short_t cm, const Int_t chipn, const Int_t evn)
474 // Set value of FeromCM for a given chip and event
475 if ((!fCmFerom) || (chipn >= fgkChipsPerModule)) return kFALSE;
476 if (evn >= fCmFerom[chipn].GetSize()) return kFALSE;
477 else fCmFerom[chipn][evn] = cm;
483 //______________________________________________________________________________
484 Short_t AliITSModuleDaSSD::GetCMFerom(const Int_t chipn, const Long_t evn) const
486 // Get value of FeromCM for a given chip and event
487 if ((!fCmFerom) || (chipn >= fgkChipsPerModule)) return 0;
488 if (evn >= fCmFerom[chipn].GetSize()) return 0;
489 else return fCmFerom[chipn][evn];
494 //______________________________________________________________________________
495 AliITSNoiseSSD* AliITSModuleDaSSD::GetCalibrationNoise() const
497 // Creates the AliITSNoiseSSD objects with callibration data
500 if (!fStrips) return NULL;
501 mc = new AliITSNoiseSSD();
502 mc->SetMod(fModuleId);
503 mc->SetNNoiseP(fgkPNStripsPerModule);
504 mc->SetNNoiseN(fgkPNStripsPerModule);
505 for (Int_t i = 0; i < fNumberOfStrips; i++) {
506 if (!fStrips[i]) noise = AliITSChannelDaSSD::GetUndefinedValue();
507 else noise = fStrips[i]->GetNoiseCM();
508 if (i < fgkPNStripsPerModule)
509 mc->AddNoiseP(i, noise);
510 else mc->AddNoiseN((AliITSChannelDaSSD::GetMaxStripIdConst() - i), noise);
517 //______________________________________________________________________________
518 AliITSPedestalSSD* AliITSModuleDaSSD::GetCalibrationPedestal() const
520 // Creates the AliITSPedestalSSD objects with callibration data
521 AliITSPedestalSSD *mc;
523 if (!fStrips) return NULL;
524 mc = new AliITSPedestalSSD();
525 mc->SetMod(fModuleId);
526 mc->SetNPedestalP(fgkPNStripsPerModule);
527 mc->SetNPedestalN(fgkPNStripsPerModule);
528 for (Int_t i = 0; i < fNumberOfStrips; i++) {
529 if (!fStrips[i]) ped = AliITSChannelDaSSD::GetUndefinedValue();
530 else ped = fStrips[i]->GetPedestal();
531 if (i < fgkPNStripsPerModule)
532 mc->AddPedestalP(i, ped);
533 else mc->AddPedestalN((AliITSChannelDaSSD::GetMaxStripIdConst() - i), ped);
540 //______________________________________________________________________________
541 AliITSBadChannelsSSD* AliITSModuleDaSSD::GetCalibrationBadChannels() const
543 // Creates the AliITSBadChannelsSSD objects with callibration data
544 AliITSBadChannelsSSD *mc;
545 Int_t *chlist, nch = 0, nchn = 0, nchp = 0;
546 if (!fStrips) return NULL;
547 chlist = new Int_t [GetStripsPerModuleConst()];
548 for (Int_t i = 0; i < fNumberOfStrips; i++) {
549 if (!fStrips[i]) { chlist[nch++] = i; if (i < fgkPNStripsPerModule) nchp++; else nchn++; continue;}
550 if (fStrips[i]->GetNoiseCM() == AliITSChannelDaSSD::GetUndefinedValue())
551 { chlist[nch++] = i; if (i < fgkPNStripsPerModule) nchp++; else nchn++; }
553 mc = new AliITSBadChannelsSSD();
554 mc->SetMod(fModuleId);
556 mc->SetNBadPChannelsList(nchp);
557 mc->SetNBadNChannelsList(nchn);
558 for (Int_t i = 0; i < nch; i++) {
559 if (chlist[i] < fgkPNStripsPerModule) mc->AddBadPChannel(chlist[i], i);
560 else mc->AddBadNChannel((AliITSChannelDaSSD::GetMaxStripIdConst() - chlist[i]), (i-nchp));