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));
113 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
115 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
121 //______________________________________________________________________________
122 AliITSModuleDaSSD::AliITSModuleDaSSD(const Int_t numberofstrips, const Long_t eventsnumber) :
136 // Constructor, allocates memory for AliITSChannelDaSSD* and events data
137 if (numberofstrips != fgkStripsPerModule)
138 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
139 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
141 fNumberOfStrips = numberofstrips;
142 memset(fStrips, 0, numberofstrips * sizeof(AliITSChannelDaSSD*));
143 for (Int_t i = 0; i < fNumberOfStrips; i++) {
144 fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber);
145 if (!fStrips[i]) AliError(Form("AliITSModuleDaSSD: Error allocating memory for AliITSChannelDaSSD %i-th object", i));
148 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
152 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
154 for (Int_t i = 0; i < fgkChipsPerModule; i++) {
155 fCmFerom[i].Set(eventsnumber);
156 fCmFerom[i].Reset(0);
160 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
167 //______________________________________________________________________________
168 AliITSModuleDaSSD::AliITSModuleDaSSD(const AliITSModuleDaSSD& module) :
170 fEquipId(module.fEquipId),
171 fEquipType(module.fEquipType),
172 fDdlId(module.fDdlId),
175 fModuleId(module.fModuleId),
176 fNumberOfStrips(module.fNumberOfStrips),
178 fNumberOfChips(module.fNumberOfChips),
181 fEventsNumber(module.fEventsNumber)
184 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
185 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
187 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
188 if (module.fStrips[strind]) {
189 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
190 if (!fStrips[strind]) {
191 AliError("AliITSModuleDaSSD: Error copy constructor");
192 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
197 } else fStrips[strind] = NULL;
200 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
206 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
208 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
210 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
216 if (module.fCmFerom) {
217 fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
219 for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
221 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
229 //______________________________________________________________________________
230 AliITSModuleDaSSD& AliITSModuleDaSSD::operator = (const AliITSModuleDaSSD& module)
232 // assignment operator
233 if (this == &module) return *this;
234 TObject::operator=(module);
236 for (Long_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
240 fEquipId = module.fEquipId;
241 fEquipType = module.fEquipType;
242 fDdlId = module.fDdlId;
245 fModuleId = module.fModuleId;
247 fNumberOfChips = module.fNumberOfChips;
249 fEventsNumber = module.fEventsNumber;
250 if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
251 fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
253 memset(fStrips, 0, (sizeof(AliITSChannelDaSSD*) * module.fNumberOfStrips));
254 for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
255 if (module.fStrips[strind]) {
256 fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
257 if (!fStrips[strind]) {
258 AliError("AliITSModuleDaSSD: Error copy constructor");
259 for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
265 } else fStrips[strind] = NULL;
267 fNumberOfStrips = module.fNumberOfStrips;
269 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
274 if (fCm) delete [] fCm;
276 fCm = new (nothrow) TArrayF [module.fNumberOfChips];
278 for (Int_t chind = 0; chind < module.fNumberOfChips; chind++) fCm[chind] = module.fCm[chind];
280 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", module.fNumberOfChips));
285 if (fCmFerom) delete [] fCmFerom;
286 if (module.fCmFerom) {
287 fCmFerom = new (nothrow) TArrayS [module.fNumberOfChips];
289 for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
291 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
300 //______________________________________________________________________________
301 AliITSModuleDaSSD::~AliITSModuleDaSSD()
306 for (Long_t i = 0; i < fNumberOfStrips; i++)
308 if (fStrips[i]) delete fStrips[i];
312 if (fCm) delete [] fCm;
313 if (fCmFerom) delete [] fCmFerom;
318 //______________________________________________________________________________
319 Bool_t AliITSModuleDaSSD::SetNumberOfStrips(const Int_t numberofstrips)
321 // Allocates memory for AliITSChannelDaSSD*
323 for (Int_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
327 if (numberofstrips <= 0) {fNumberOfStrips = 0; return kTRUE; }
328 if (numberofstrips != fgkStripsPerModule)
329 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
330 fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
332 fNumberOfStrips = numberofstrips;
333 memset(fStrips, 0, sizeof(AliITSChannelDaSSD*) * numberofstrips);
336 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", numberofstrips));
344 //______________________________________________________________________________
345 Bool_t AliITSModuleDaSSD::SetNumberOfChips(const Int_t nchips)
347 // Allocate nchips TArrayF objects to save Common Mode
349 if (nchips <= 0) {fNumberOfChips = 0; return kTRUE; }
350 if (nchips != fgkChipsPerModule)
351 AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i HAL25 chips", fgkChipsPerModule));
352 fCm = new (nothrow) TArrayF [nchips];
354 fNumberOfChips = nchips;
357 AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayF objects!", nchips));
365 //______________________________________________________________________________
366 Bool_t AliITSModuleDaSSD::SetModuleIdData (const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Short_t moduleID)
369 if (ad > fgkMaxAdNumber) {
370 AliWarning(Form("AliITSModuleDaSSD: Wrong AD number: %i", ad));
373 if (adc > fgkMaxAdcNumber || ForbiddenAdcNumber(adc)) {
374 AliWarning(Form("AliITSModuleDaSSD: Wrong ADC number: %i", adc));
380 fModuleId = moduleID;
385 //______________________________________________________________________________
386 void AliITSModuleDaSSD::SetModuleFEEId (const UChar_t ddlID, const UChar_t ad, const UChar_t adc)
388 // Set id data of FEE connected to the Module
395 //______________________________________________________________________________
396 void AliITSModuleDaSSD::SetModuleRorcId (const Int_t equipid, const Int_t equiptype)
398 // Set data to access FEROM registres via DDL
400 fEquipType = equiptype;
404 //______________________________________________________________________________
405 Bool_t AliITSModuleDaSSD::SetEventsNumber(const Long_t eventsnumber)
407 // Allocate the memory for the events data
409 if (!fStrips) return kFALSE;
410 for (i = 0; i < fNumberOfStrips; i++) {
412 if (!fStrips[i]->SetEvenetsNumber(eventsnumber)) {
413 for (Int_t j = 0; j < i; j++) fStrips[j]->DeleteSignal();
414 AliError(Form("AliITSModuleDaSSD: Error allocating memory for i% events for module %i, strip %i",eventsnumber, (Int_t)fModuleId, i));
419 if (!(fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber))) {
420 for (Int_t j = 0; j < i; j++) delete fStrips[j];
424 AliError(Form("AliITSModuleDaSSD: Error allocating memory for strip %i of module %i!", (Int_t)fModuleId, i));
430 for (Int_t ie = 0; ie < fgkChipsPerModule; ie++) {
431 fCmFerom[ie].Set(eventsnumber);
432 fCmFerom[ie].Reset(0);
435 else AliError("AliITSModuleDaSSD: No memory was allocated for fCmFerom!");
436 fEventsNumber = eventsnumber;
442 //______________________________________________________________________________
443 Bool_t AliITSModuleDaSSD::SetCM (const Float_t cm, const Int_t chipn, const Int_t evn)
445 // Set value of CM for a given chip and event
446 if ((!fCm) || (chipn >= fNumberOfChips)) return kFALSE;
447 if (evn >= fCm[chipn].GetSize()) return kFALSE;
448 else fCm[chipn][evn] = cm;
454 //______________________________________________________________________________
455 Float_t AliITSModuleDaSSD::GetCM(const Int_t chipn, const Long_t evn) const
457 // Get value of CM for a given chip and event
458 if ((!fCm) || (chipn >= fNumberOfChips)) return 0.0f;
459 if (evn >= fCm[chipn].GetSize()) return 0.0f;
460 else return fCm[chipn][evn];
465 //______________________________________________________________________________
466 Bool_t AliITSModuleDaSSD::SetCMFeromEventsNumber(const Long_t eventsnumber)
468 // Allocates memory for the values of CM calculated in Ferom
469 if (!fCmFerom) return kFALSE;
470 for (Int_t chipind = 0; chipind < fgkChipsPerModule; chipind++) {
471 fCmFerom[chipind].Set(eventsnumber);
472 fCmFerom[chipind].Reset(0);
477 //______________________________________________________________________________
478 Bool_t AliITSModuleDaSSD::SetCMFerom (const Short_t cm, const Int_t chipn, const Int_t evn)
480 // Set value of FeromCM for a given chip and event
481 if ((!fCmFerom) || (chipn >= fgkChipsPerModule)) return kFALSE;
482 if (evn >= fCmFerom[chipn].GetSize()) return kFALSE;
483 else fCmFerom[chipn][evn] = 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];
500 UChar_t AliITSModuleDaSSD::CheckIfBad(const Int_t stripn) const
502 //Applies the bad channel creteria and set the appropriate flags for returned valie
504 const UInt_t WOffsetMask = 0x000003FF;
505 if (!fStrips[stripn]) bcflags |= 3;
507 if (fStrips[stripn]->GetNoiseCM() == AliITSChannelDaSSD::GetUndefinedValue()) bcflags |= 8;
508 if (fStrips[stripn]->GetNoiseCM() > 20) bcflags |= 8;
509 if (fStrips[stripn]->GetNoiseCM() < 1) bcflags |= 16;
510 if (fStrips[stripn]->GetPedestal() > ((WOffsetMask >> 1) - 1)) bcflags |= 4;
511 else if ((-(fStrips[stripn]->GetPedestal())) > (WOffsetMask >> 1)) bcflags |= 4;
512 if (bcflags) bcflags |= 3;