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 "AliITSModuleDaSSD.h"
30 ClassImp(AliITSModuleDaSSD)
33 const Int_t AliITSModuleDaSSD::fgkStripsPerModule = 1536; // Number of strips per SSD module
34 const Int_t AliITSModuleDaSSD::fgkPNStripsPerModule = 768; // Number of N/P strips per SSD module
35 const Int_t AliITSModuleDaSSD::fgkStripsPerChip = 128; // Number of strips per chip HAL25
36 const UChar_t AliITSModuleDaSSD::fgkMaxAdNumber = 9; // MAx SSD FEROM AD number
37 const UChar_t AliITSModuleDaSSD::fgkMaxAdcNumber = 13; // MAx SSD FEROM ADC number
38 const Int_t AliITSModuleDaSSD::fgkChipsPerModule = 12; // Number of HAL25 chips per SSD module
44 //______________________________________________________________________________
45 AliITSModuleDaSSD::AliITSModuleDaSSD() :
58 // Default constructor
62 //______________________________________________________________________________
63 AliITSModuleDaSSD::AliITSModuleDaSSD(const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const UShort_t moduleID) :
76 // Constructor, set module id data
81 //______________________________________________________________________________
82 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips) :
95 // Constructor, allocates memory for AliITSChannelDaSSD*
96 if (numberofstrips != fgkStripsPerModule)
97 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
98 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
100 fNumberOfStrips = numberofstrips;
101 for (Int_t i = 0; i < numberofstrips; i++) fStrips[i]= NULL;
103 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
110 //______________________________________________________________________________
111 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips, const Long_t eventsnumber) :
124 // Constructor, allocates memory for AliITSChannelDaSSD* and events data
125 if (numberofstrips != fgkStripsPerModule)
126 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
127 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
129 fNumberOfStrips = numberofstrips;
130 memset(fStrips, 0, numberofstrips * sizeof(AliITSChannelDaSSD*));
131 for (Int_t i = 0; i < fNumberOfStrips; i++) {
132 fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber);
133 if (!fStrips[i]) AliError(Form("AliITSModuleDaSSD: Error allocating memory for AliITSChannelDaSSD %i-th object", i));
136 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
144 //______________________________________________________________________________
145 AliITSModuleDaSSD::AliITSModuleDaSSD(const AliITSModuleDaSSD& module) :
147 fEquipId(module.fEquipId),
148 fEquipType(module.fEquipType),
149 fDdlId(module.fDdlId),
152 fModuleId(module.fModuleId),
153 fNumberOfStrips(module.fNumberOfStrips),
155 fNumberOfChips(module.fNumberOfChips),
157 fEventsNumber(module.fEventsNumber)
160 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
161 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
163 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
164 if (module.fStrips[strind]) {
165 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
166 if (!fStrips[strind]) {
167 AliError("AliITSModuleDaSSD: Error copy constructor");
168 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
173 } else fStrips[strind] = NULL;
176 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
182 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
184 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
186 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
195 //______________________________________________________________________________
196 AliITSModuleDaSSD& AliITSModuleDaSSD::operator = (const AliITSModuleDaSSD& module)
198 // assignment operator
199 if (this == &module) return *this;
201 for (Long_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
204 fEquipId = module.fEquipId;
205 fEquipType = module.fEquipType;
206 fDdlId = module.fDdlId;
209 fModuleId = module.fModuleId;
210 fNumberOfStrips = module.fNumberOfStrips;
212 fNumberOfChips = module.fNumberOfChips;
214 fEventsNumber = module.fEventsNumber;
215 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
216 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
218 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
219 if (module.fStrips[strind]) {
220 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
221 if (!fStrips[strind]) {
222 AliError("AliITSModuleDaSSD: Error copy constructor");
223 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
228 } else fStrips[strind] = NULL;
231 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
236 if (fCm) delete [] fCm;
238 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
240 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
242 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
252 //______________________________________________________________________________
253 AliITSModuleDaSSD::~AliITSModuleDaSSD()
258 for (Long_t i = 0; i < fNumberOfStrips; i++)
260 if (fStrips[i]) delete fStrips[i];
264 if (fCm) delete [] fCm;
269 //______________________________________________________________________________
270 Bool_t AliITSModuleDaSSD::SetNumberOfStrips(const Int_t numberofstrips)
272 // Allocates memory for AliITSChannelDaSSD*
274 for (Int_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
278 if (numberofstrips <= 0) {fNumberOfStrips = 0; return kTRUE; }
279 if (numberofstrips != fgkStripsPerModule)
280 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
281 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
283 fNumberOfStrips = numberofstrips;
284 memset(fStrips, 0, sizeof(AliITSChannelDaSSD*) * numberofstrips);
287 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
295 //______________________________________________________________________________
296 Bool_t AliITSModuleDaSSD::SetNumberOfChips(const Int_t nchips)
298 // Allocate nchips TArrayF objects to save Common Mode
300 if (nchips <= 0) {fNumberOfChips = 0; return kTRUE; }
301 if (nchips != fgkChipsPerModule)
302 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i HAL25 chips", fgkChipsPerModule));
303 fCm = new (nothrow) TArrayF [nchips];
305 fNumberOfChips = nchips;
308 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", nchips));
316 //______________________________________________________________________________
317 Bool_t AliITSModuleDaSSD::SetModuleIdData (const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Short_t moduleID)
320 if (ad > fgkMaxAdNumber) {
321 AliWarning(Form("AliITSModuleDaSSD: Wrong AD number: %i", ad));
324 if (adc > fgkMaxAdcNumber || ForbiddenAdcNumber(adc)) {
325 AliWarning(Form("AliITSModuleDaSSD: Wrong ADC number: %i", adc));
331 fModuleId = moduleID;
336 //______________________________________________________________________________
337 void AliITSModuleDaSSD::SetModuleFEEId (const UChar_t ddlID, const UChar_t ad, const UChar_t adc)
339 // Set id data of FEE connected to the Module
346 //______________________________________________________________________________
347 void AliITSModuleDaSSD::SetModuleRorcId (const Int_t equipid, const Int_t equiptype)
349 // Set data to access FEROM registres via DDL
351 fEquipType = equiptype;
355 //______________________________________________________________________________
356 Bool_t AliITSModuleDaSSD::SetEventsNumber(const Long_t eventsnumber)
358 // Allocate the memory for the events data
360 if (!fStrips) return kFALSE;
361 for (i = 0; i < fNumberOfStrips; i++) {
363 if (!fStrips[i]->SetEvenetsNumber(eventsnumber)) {
364 for (Int_t j = 0; j < i; j++) fStrips[j]->DeleteSignal();
365 AliError(Form("AliITSModuleDaSSD: Error allocating memory for i% events for module %i, strip %i",
366 eventsnumber, (Int_t)fModuleId, i));
370 if (!(fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber))) {
371 for (Int_t j = 0; j < i; j++) delete fStrips[j];
375 AliError(Form("AliITSModuleDaSSD: Error allocating memory for strip %i of module %i!", (Int_t)fModuleId, i));
384 //______________________________________________________________________________
385 Bool_t AliITSModuleDaSSD::SetCM (const Float_t cm, const Int_t chipn, const Int_t evn)
387 // Set value of CM for a given chip and event
388 if ((!fCm) || (chipn >= fNumberOfChips)) return kFALSE;
389 if (evn >= fCm[chipn].GetSize()) return kFALSE;
390 else fCm[chipn][evn] = cm;
396 //______________________________________________________________________________
397 Float_t AliITSModuleDaSSD::GetCM(const Int_t chipn, const Long_t evn) const
399 // Get value of CM for a given chip and event
400 if ((!fCm) || (chipn >= fNumberOfChips)) return 0.0f;
401 if (evn >= fCm[chipn].GetSize()) return 0.0f;
402 else return fCm[chipn][evn];
407 //______________________________________________________________________________
408 AliITSNoiseSSD* AliITSModuleDaSSD::GetCalibrationSSDModule() const
410 // Creates the AliITSNoiseSSD objects with callibration data
413 if (!fStrips) return NULL;
414 mc = new AliITSNoiseSSD();
415 mc->SetMod(fModuleId);
416 mc->SetNNoiseP(fgkPNStripsPerModule);
417 mc->SetNNoiseN(fgkPNStripsPerModule);
418 for (Int_t i = 0; i < fNumberOfStrips; i++) {
419 if (!fStrips[i]) noise = AliITSChannelDaSSD::GetUndefinedValue();
420 else noise = fStrips[i]->GetNoiseCM();
421 if (i < fgkPNStripsPerModule)
422 mc->AddNoiseP(i, noise);
423 else mc->AddNoiseN((AliITSChannelDaSSD::GetMaxStripIdConst() - i), noise);