///
/// This class provides storage container ITS SSD module callibration data
/// used by DA.
-///
+///
+/// Date: 18/07/2008
///////////////////////////////////////////////////////////////////////////////
#include "AliITSNoiseSSD.h"
+#include "AliITSPedestalSSD.h"
+#include "AliITSBadChannelsSSD.h"
#include "AliITSModuleDaSSD.h"
#include "TString.h"
#include "AliLog.h"
fStrips(NULL),
fNumberOfChips(0),
fCm(NULL),
+ fCmFerom(NULL),
fEventsNumber(0)
{
// Default constructor
fStrips(NULL),
fNumberOfChips(0),
fCm(NULL),
+ fCmFerom(NULL),
fEventsNumber(0)
{
// Constructor, set module id data
fStrips(NULL),
fNumberOfChips(0),
fCm(NULL),
+ fCmFerom(NULL),
fEventsNumber(0)
{
-// Constructor, allocates memory for AliITSChannelDaSSD*
+// Constructor, allocates memory for AliITSChannelDaSSD* and TArrayS* array for CM calculated in FEROM
if (numberofstrips != fgkStripsPerModule)
AliWarning(Form("AliITSModuleDaSSD: ALICE ITS SSD Module contains %i strips", fgkStripsPerModule));
fStrips = new (nothrow) AliITSChannelDaSSD* [numberofstrips];
fNumberOfStrips = 0;
fStrips = NULL;
}
+ fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
+ if (!fCmFerom) {
+ AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
+ fCmFerom = NULL;
+ }
}
fStrips(NULL),
fNumberOfChips(0),
fCm(NULL),
+ fCmFerom(NULL),
fEventsNumber(0)
{
// Constructor, allocates memory for AliITSChannelDaSSD* and events data
fNumberOfStrips = 0;
fStrips = NULL;
}
+ fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
+ if (fCmFerom) {
+ for (Int_t i = 0; i < fgkChipsPerModule; i++) {
+ fCmFerom[i].Set(eventsnumber);
+ fCmFerom[i].Reset(0);
+ }
+ }
+ else {
+ AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
+ fCmFerom = NULL;
+ }
}
fStrips(NULL),
fNumberOfChips(module.fNumberOfChips),
fCm(NULL),
+ fCmFerom(NULL),
fEventsNumber(module.fEventsNumber)
{
// copy constructor
fNumberOfChips = 0;
fCm = NULL;
}
- }
+ }
+
+ if (module.fCmFerom) {
+ fCmFerom = new (nothrow) TArrayS [fgkChipsPerModule];
+ if (fCmFerom) {
+ for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
+ } else {
+ AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
+ fCmFerom = NULL;
+ }
+ }
}
{
// assignment operator
if (this == &module) return *this;
+ TObject::operator=(module);
if (fStrips) {
for (Long_t i = 0; i < fNumberOfStrips; i++) if (fStrips[i]) delete fStrips[i];
delete [] fStrips;
+ fStrips = NULL;
}
fEquipId = module.fEquipId;
fEquipType = module.fEquipType;
fAd = module.fAd;
fAdc = module.fAdc;
fModuleId = module.fModuleId;
- fNumberOfStrips = module.fNumberOfStrips;
fStrips = NULL;
fNumberOfChips = module.fNumberOfChips;
fCm = NULL;
if ((module.fNumberOfStrips > 0) && (module.fStrips)) {
fStrips = new (nothrow) AliITSChannelDaSSD* [module.fNumberOfStrips];
if (fStrips) {
+ memset(fStrips, 0, (sizeof(AliITSChannelDaSSD*) * module.fNumberOfStrips));
for (Int_t strind = 0; strind < module.fNumberOfStrips; strind++) {
if (module.fStrips[strind]) {
- fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
- if (!fStrips[strind]) {
- AliError("AliITSModuleDaSSD: Error copy constructor");
+ fStrips[strind] = new AliITSChannelDaSSD(*(module.fStrips[strind]));
+ if (!fStrips[strind]) {
+ AliError("AliITSModuleDaSSD: Error copy constructor");
for (Int_t i = (strind - 1); i >= 0; i--) delete fStrips[strind];
- delete [] fStrips;
- fStrips = NULL;
- break;
- }
- } else fStrips[strind] = NULL;
- }
+ delete [] fStrips;
+ fStrips = NULL;
+ fNumberOfStrips = 0;
+ break;
+ }
+ } else fStrips[strind] = NULL;
+ }
+ fNumberOfStrips = module.fNumberOfStrips;
} else {
AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i AliITSChannelDaSSD* objects!", module.fNumberOfStrips));
fNumberOfStrips = 0;
fCm = NULL;
}
}
+ if (fCmFerom) delete [] fCmFerom;
+ if (module.fCmFerom) {
+ fCmFerom = new (nothrow) TArrayS [module.fNumberOfChips];
+ if (fCmFerom) {
+ for (Int_t chind = 0; chind < fgkChipsPerModule; chind++) fCmFerom[chind] = module.fCmFerom[chind];
+ } else {
+ AliError(Form("AliITSModuleDaSSD: Error allocating memory for %i TArrayS objects!", fgkChipsPerModule));
+ fCmFerom = NULL;
+ }
+ }
return *this;
}
delete [] fStrips;
}
if (fCm) delete [] fCm;
+ if (fCmFerom) delete [] fCmFerom;
}
Int_t i;
if (!fStrips) return kFALSE;
for (i = 0; i < fNumberOfStrips; i++) {
- if (fStrips[i])
+ if (fStrips[i]) {
if (!fStrips[i]->SetEvenetsNumber(eventsnumber)) {
for (Int_t j = 0; j < i; j++) fStrips[j]->DeleteSignal();
- AliError(Form("AliITSModuleDaSSD: Error allocating memory for i% events for module %i, strip %i",
- eventsnumber, (Int_t)fModuleId, i));
+ AliError(Form("AliITSModuleDaSSD: Error allocating memory for i% events for module %i, strip %i",eventsnumber, (Int_t)fModuleId, i));
return kFALSE;
}
- else
+ }
+ else {
if (!(fStrips[i] = new AliITSChannelDaSSD(i, eventsnumber))) {
for (Int_t j = 0; j < i; j++) delete fStrips[j];
delete [] fStrips;
AliError(Form("AliITSModuleDaSSD: Error allocating memory for strip %i of module %i!", (Int_t)fModuleId, i));
return kFALSE;
}
+ }
}
+ if (fCmFerom) {
+ for (Int_t ie = 0; ie < fgkChipsPerModule; ie++) {
+ fCmFerom[ie].Set(eventsnumber);
+ fCmFerom[ie].Reset(0);
+ }
+ }
+ else AliError("AliITSModuleDaSSD: No memory was allocated for fCmFerom!");
+ fEventsNumber = eventsnumber;
return kTRUE;
}
//______________________________________________________________________________
-AliITSNoiseSSD* AliITSModuleDaSSD::GetCalibrationSSDModule() const
+Bool_t AliITSModuleDaSSD::SetCMFeromEventsNumber(const Long_t eventsnumber)
+{
+// Allocates memory for the values of CM calculated in Ferom
+ if (!fCmFerom) return kFALSE;
+ for (Int_t chipind = 0; chipind < fgkChipsPerModule; chipind++) {
+ fCmFerom[chipind].Set(eventsnumber);
+ fCmFerom[chipind].Reset(0);
+ }
+ return kTRUE;
+}
+
+//______________________________________________________________________________
+Bool_t AliITSModuleDaSSD::SetCMFerom (const Short_t cm, const Int_t chipn, const Int_t evn)
+{
+// Set value of FeromCM for a given chip and event
+ if ((!fCmFerom) || (chipn >= fgkChipsPerModule)) return kFALSE;
+ if (evn >= fCmFerom[chipn].GetSize()) return kFALSE;
+ else fCmFerom[chipn][evn] = cm;
+ return kTRUE;
+}
+
+
+
+//______________________________________________________________________________
+Short_t AliITSModuleDaSSD::GetCMFerom(const Int_t chipn, const Long_t evn) const
+{
+// Get value of FeromCM for a given chip and event
+ if ((!fCmFerom) || (chipn >= fgkChipsPerModule)) return 0;
+ if (evn >= fCmFerom[chipn].GetSize()) return 0;
+ else return fCmFerom[chipn][evn];
+}
+
+
+
+UChar_t AliITSModuleDaSSD::CheckIfBad(const Int_t stripn) const
{
-// Creates the AliITSNoiseSSD objects with callibration data
- AliITSNoiseSSD *mc;
- Float_t noise;
- if (!fStrips) return NULL;
- mc = new AliITSNoiseSSD();
- mc->SetMod(fModuleId);
- mc->SetNNoiseP(fgkPNStripsPerModule);
- mc->SetNNoiseN(fgkPNStripsPerModule);
- for (Int_t i = 0; i < fNumberOfStrips; i++) {
- if (!fStrips[i]) noise = AliITSChannelDaSSD::GetUndefinedValue();
- else noise = fStrips[i]->GetNoiseCM();
- if (i < fgkPNStripsPerModule)
- mc->AddNoiseP(i, noise);
- else mc->AddNoiseN((AliITSChannelDaSSD::GetMaxStripIdConst() - i), noise);
+//Applies the bad channel creteria and set the appropriate flags for returned valie
+ UInt_t bcflags = 0;
+ const UInt_t WOffsetMask = 0x000003FF;
+ if (!fStrips[stripn]) bcflags |= 3;
+ else {
+ if (fStrips[stripn]->GetNoiseCM() == AliITSChannelDaSSD::GetUndefinedValue()) bcflags |= 8;
+ if (fStrips[stripn]->GetNoiseCM() > 20) bcflags |= 8;
+ if (fStrips[stripn]->GetNoiseCM() < 1) bcflags |= 16;
+ if (fStrips[stripn]->GetPedestal() > ((WOffsetMask >> 1) - 1)) bcflags |= 4;
+ else if ((-(fStrips[stripn]->GetPedestal())) > (WOffsetMask >> 1)) bcflags |= 4;
+ if (bcflags) bcflags |= 3;
}
- return mc;
+ return bcflags;
}