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() :
60 // Default constructor
64 //______________________________________________________________________________
65 AliITSModuleDaSSD::AliITSModuleDaSSD(const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const UShort_t moduleID) :
78 // Constructor, set module id data
83 //______________________________________________________________________________
84 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips) :
97 // Constructor, allocates memory for AliITSChannelDaSSD*
98 if (numberofstrips != fgkStripsPerModule)
99 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
100 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
102 fNumberOfStrips = numberofstrips;
103 for (Int_t i = 0; i < numberofstrips; i++) fStrips[i]= NULL;
105 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
112 //______________________________________________________________________________
113 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips, const Long_t eventsnumber) :
126 // Constructor, allocates memory for AliITSChannelDaSSD* and events data
127 if (numberofstrips != fgkStripsPerModule)
128 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
129 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
131 fNumberOfStrips = numberofstrips;
132 memset(fStrips, 0, numberofstrips * sizeof(AliITSChannelDaSSD*));
133 for (Int_t i = 0; i < fNumberOfStrips; i++) {
134 fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber);
135 if (!fStrips[i]) AliError(Form("AliITSModuleDaSSD: Error allocating memory for AliITSChannelDaSSD %i-th object", i));
138 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
146 //______________________________________________________________________________
147 AliITSModuleDaSSD::AliITSModuleDaSSD(const AliITSModuleDaSSD& module) :
149 fEquipId(module.fEquipId),
150 fEquipType(module.fEquipType),
151 fDdlId(module.fDdlId),
154 fModuleId(module.fModuleId),
155 fNumberOfStrips(module.fNumberOfStrips),
157 fNumberOfChips(module.fNumberOfChips),
159 fEventsNumber(module.fEventsNumber)
162 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
163 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
165 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
166 if (module.fStrips[strind]) {
167 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
168 if (!fStrips[strind]) {
169 AliError("AliITSModuleDaSSD: Error copy constructor");
170 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
175 } else fStrips[strind] = NULL;
178 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
184 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
186 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
188 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
197 //______________________________________________________________________________
198 AliITSModuleDaSSD& AliITSModuleDaSSD::operator = (const AliITSModuleDaSSD& module)
200 // assignment operator
201 if (this == &module) return *this;
203 for (Long_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
206 fEquipId = module.fEquipId;
207 fEquipType = module.fEquipType;
208 fDdlId = module.fDdlId;
211 fModuleId = module.fModuleId;
212 fNumberOfStrips = module.fNumberOfStrips;
214 fNumberOfChips = module.fNumberOfChips;
216 fEventsNumber = module.fEventsNumber;
217 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
218 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
220 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
221 if (module.fStrips[strind]) {
222 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
223 if (!fStrips[strind]) {
224 AliError("AliITSModuleDaSSD: Error copy constructor");
225 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
230 } else fStrips[strind] = NULL;
233 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
238 if (fCm) delete [] fCm;
240 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
242 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
244 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
254 //______________________________________________________________________________
255 AliITSModuleDaSSD::~AliITSModuleDaSSD()
260 for (Long_t i = 0; i < fNumberOfStrips; i++)
262 if (fStrips[i]) delete fStrips[i];
266 if (fCm) delete [] fCm;
271 //______________________________________________________________________________
272 Bool_t AliITSModuleDaSSD::SetNumberOfStrips(const Int_t numberofstrips)
274 // Allocates memory for AliITSChannelDaSSD*
276 for (Int_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
280 if (numberofstrips <= 0) {fNumberOfStrips = 0; return kTRUE; }
281 if (numberofstrips != fgkStripsPerModule)
282 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
283 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
285 fNumberOfStrips = numberofstrips;
286 memset(fStrips, 0, sizeof(AliITSChannelDaSSD*) * numberofstrips);
289 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
297 //______________________________________________________________________________
298 Bool_t AliITSModuleDaSSD::SetNumberOfChips(const Int_t nchips)
300 // Allocate nchips TArrayF objects to save Common Mode
302 if (nchips <= 0) {fNumberOfChips = 0; return kTRUE; }
303 if (nchips != fgkChipsPerModule)
304 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i HAL25 chips", fgkChipsPerModule));
305 fCm = new (nothrow) TArrayF [nchips];
307 fNumberOfChips = nchips;
310 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", nchips));
318 //______________________________________________________________________________
319 Bool_t AliITSModuleDaSSD::SetModuleIdData (const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Short_t moduleID)
322 if (ad > fgkMaxAdNumber) {
323 AliWarning(Form("AliITSModuleDaSSD: Wrong AD number: %i", ad));
326 if (adc > fgkMaxAdcNumber || ForbiddenAdcNumber(adc)) {
327 AliWarning(Form("AliITSModuleDaSSD: Wrong ADC number: %i", adc));
333 fModuleId = moduleID;
338 //______________________________________________________________________________
339 void AliITSModuleDaSSD::SetModuleFEEId (const UChar_t ddlID, const UChar_t ad, const UChar_t adc)
341 // Set id data of FEE connected to the Module
348 //______________________________________________________________________________
349 void AliITSModuleDaSSD::SetModuleRorcId (const Int_t equipid, const Int_t equiptype)
351 // Set data to access FEROM registres via DDL
353 fEquipType = equiptype;
357 //______________________________________________________________________________
358 Bool_t AliITSModuleDaSSD::SetEventsNumber(const Long_t eventsnumber)
360 // Allocate the memory for the events data
362 if (!fStrips) return kFALSE;
363 for (i = 0; i < fNumberOfStrips; i++) {
365 if (!fStrips[i]->SetEvenetsNumber(eventsnumber)) {
366 for (Int_t j = 0; j < i; j++) fStrips[j]->DeleteSignal();
367 AliError(Form("AliITSModuleDaSSD: Error allocating memory for i% events for module %i, strip %i",
368 eventsnumber, (Int_t)fModuleId, i));
372 if (!(fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber))) {
373 for (Int_t j = 0; j < i; j++) delete fStrips[j];
377 AliError(Form("AliITSModuleDaSSD: Error allocating memory for strip %i of module %i!", (Int_t)fModuleId, i));
386 //______________________________________________________________________________
387 Bool_t AliITSModuleDaSSD::SetCM (const Float_t cm, const Int_t chipn, const Int_t evn)
389 // Set value of CM for a given chip and event
390 if ((!fCm) || (chipn >= fNumberOfChips)) return kFALSE;
391 if (evn >= fCm[chipn].GetSize()) return kFALSE;
392 else fCm[chipn][evn] = cm;
398 //______________________________________________________________________________
399 Float_t AliITSModuleDaSSD::GetCM(const Int_t chipn, const Long_t evn) const
401 // Get value of CM for a given chip and event
402 if ((!fCm) || (chipn >= fNumberOfChips)) return 0.0f;
403 if (evn >= fCm[chipn].GetSize()) return 0.0f;
404 else return fCm[chipn][evn];
409 //______________________________________________________________________________
410 AliITSNoiseSSD* AliITSModuleDaSSD::GetCalibrationNoise() const
412 // Creates the AliITSNoiseSSD objects with callibration data
415 if (!fStrips) return NULL;
416 mc = new AliITSNoiseSSD();
417 mc->SetMod(fModuleId);
418 mc->SetNNoiseP(fgkPNStripsPerModule);
419 mc->SetNNoiseN(fgkPNStripsPerModule);
420 for (Int_t i = 0; i < fNumberOfStrips; i++) {
421 if (!fStrips[i]) noise = AliITSChannelDaSSD::GetUndefinedValue();
422 else noise = fStrips[i]->GetNoiseCM();
423 if (i < fgkPNStripsPerModule)
424 mc->AddNoiseP(i, noise);
425 else mc->AddNoiseN((AliITSChannelDaSSD::GetMaxStripIdConst() - i), noise);
432 //______________________________________________________________________________
433 AliITSPedestalSSD* AliITSModuleDaSSD::GetCalibrationPedestal() const
435 // Creates the AliITSPedestalSSD objects with callibration data
436 AliITSPedestalSSD *mc;
438 if (!fStrips) return NULL;
439 mc = new AliITSPedestalSSD();
440 mc->SetMod(fModuleId);
441 mc->SetNPedestalP(fgkPNStripsPerModule);
442 mc->SetNPedestalN(fgkPNStripsPerModule);
443 for (Int_t i = 0; i < fNumberOfStrips; i++) {
444 if (!fStrips[i]) ped = AliITSChannelDaSSD::GetUndefinedValue();
445 else ped = fStrips[i]->GetPedestal();
446 if (i < fgkPNStripsPerModule)
447 mc->AddPedestalP(i, ped);
448 else mc->AddPedestalN((AliITSChannelDaSSD::GetMaxStripIdConst() - i), ped);
455 //______________________________________________________________________________
456 AliITSBadChannelsSSD* AliITSModuleDaSSD::GetCalibrationBadChannels() const
458 // Creates the AliITSBadChannelsSSD objects with callibration data
459 AliITSBadChannelsSSD *mc;
460 Int_t *chlist, nch = 0, nchn = 0, nchp = 0;
461 if (!fStrips) return NULL;
462 chlist = new Int_t [GetStripsPerModuleConst()];
463 for (Int_t i = 0; i < fNumberOfStrips; i++) {
464 if (!fStrips[i]) { chlist[nch++] = i; if (i < fgkPNStripsPerModule) nchp++; else nchn++; continue;}
465 if (fStrips[i]->GetNoiseCM() == AliITSChannelDaSSD::GetUndefinedValue())
466 { chlist[nch++] = i; if (i < fgkPNStripsPerModule) nchp++; else nchn++; }
468 mc = new AliITSBadChannelsSSD();
469 mc->SetMod(fModuleId);
471 mc->SetNBadPChannelsList(nchp);
472 mc->SetNBadNChannelsList(nchn);
473 for (Int_t i = 0; i < nch; i++) {
474 if (chlist[i] < fgkPNStripsPerModule) mc->AddBadPChannel(chlist[i], i);
475 else mc->AddBadNChannel((AliITSChannelDaSSD::GetMaxStripIdConst() - chlist[i]), (i-nchp));