// Date: 18/07/2008
///////////////////////////////////////////////////////////////////////////////
-#include <string>
+#include <cstring>
#include <fstream>
#include <new>
#include <Riostream.h>
#include "AliITSHandleDaSSD.h"
-#include <math.h>
+//#include <math.h>
#include <limits.h>
#include "event.h"
#include "TFile.h"
#include "TString.h"
+#include "TMath.h"
#include "AliLog.h"
#include "AliITSNoiseSSDv2.h"
#include "AliITSPedestalSSDv2.h"
//______________________________________________________________________________
AliITSHandleDaSSD::AliITSHandleDaSSD(const AliITSHandleDaSSD& ssdadldc) :
TObject(ssdadldc),
- fRawDataFileName(ssdadldc.fRawDataFileName),
+ fRawDataFileName(NULL),
fNumberOfModules(ssdadldc.fNumberOfModules),
fModules(NULL),
fModIndProcessed(ssdadldc.fModIndProcessed),
fModIndRead(ssdadldc.fModIndRead),
fModIndex(NULL),
- fEqIndex(0),
+ fEqIndex(ssdadldc.fEqIndex),
fNumberOfEvents(ssdadldc.fNumberOfEvents),
fBadChannelsList(NULL),
fDDLModuleMap(NULL),
fZsFactor(ssdadldc.fZsFactor)
{
// copy constructor
+ if (ssdadldc.fRawDataFileName) {
+ fRawDataFileName = new (nothrow) Char_t[strlen(ssdadldc.fRawDataFileName)+1];
+ if (fRawDataFileName) strncpy(fRawDataFileName, ssdadldc.fRawDataFileName, strlen(ssdadldc.fRawDataFileName)+1);
+ } else fRawDataFileName = NULL;
if ((ssdadldc.fNumberOfModules > 0) && (ssdadldc.fModules)) {
fModules = new (nothrow) AliITSModuleDaSSD* [ssdadldc.fNumberOfModules];
if (fModules) {
fModules = NULL;
}
}
- if (ssdadldc.fBadChannelsList) AliWarning("fBadChannelsList is not copied by copy constructor, use other methods to init it!");
- if (ssdadldc.fDDLModuleMap) AliWarning("fDDLModuleMap is not copied by copy constructor, use other methods to init it!");
+ if (ssdadldc.fModIndex) {
+ fModIndex = new (nothrow) Int_t [ssdadldc.fNumberOfModules];
+ if (fModIndex) memcpy(fModIndex, ssdadldc.fModIndex, ssdadldc.fNumberOfModules*sizeof(Int_t));
+ } else fModIndex = NULL;
+ fBadChannelsList = new AliITSBadChannelsSSDv2(*ssdadldc.fBadChannelsList);
+ if (ssdadldc.fDDLModuleMap) {
+ fDDLModuleMap = new (nothrow) Int_t [fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl];
+ if (fDDLModuleMap) memcpy(fDDLModuleMap, ssdadldc.fDDLModuleMap, fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl * sizeof(Int_t));
+ } else fDDLModuleMap = NULL;
+
+ // if (ssdadldc.fBadChannelsList) AliWarning("fBadChannelsList is not copied by copy constructor, use other methods to init it!");
+ // if (ssdadldc.fDDLModuleMap) AliWarning("fDDLModuleMap is not copied by copy constructor, use other methods to init it!");
}
-
//______________________________________________________________________________
AliITSHandleDaSSD& AliITSHandleDaSSD::operator = (const AliITSHandleDaSSD& ssdadldc)
{
fModules = NULL;
}
if (fModIndex) { delete [] fModIndex; fModIndex = NULL; }
- if ((ssdadldc.fNumberOfModules > 0) && (ssdadldc.fModules)) {
- fModules = new (nothrow) AliITSModuleDaSSD* [ssdadldc.fNumberOfModules];
+ fNumberOfModules = ssdadldc.fNumberOfModules;
+ if ((fNumberOfModules > 0) && (ssdadldc.fModules)) {
+ fModules = new (nothrow) AliITSModuleDaSSD* [fNumberOfModules];
if (fModules) {
- for (Int_t modind = 0; modind < ssdadldc.fNumberOfModules; modind++) {
+ for (Int_t modind = 0; modind < fNumberOfModules; modind++) {
if (ssdadldc.fModules[modind]) {
fModules[modind] = new AliITSModuleDaSSD(*(ssdadldc.fModules[modind]));
if (!fModules[modind]) {
fModules = NULL;
}
}
- fRawDataFileName = NULL;
- fModIndProcessed = 0;
- fModIndRead = 0;
- fModIndex = NULL;
+ if(fRawDataFileName)delete[]fRawDataFileName;
+ if (ssdadldc.fRawDataFileName) {
+ fRawDataFileName = new (nothrow) Char_t[strlen(ssdadldc.fRawDataFileName)+1];
+ if (fRawDataFileName) strncpy(fRawDataFileName, ssdadldc.fRawDataFileName, strlen(ssdadldc.fRawDataFileName)+1);
+ } else fRawDataFileName = NULL;
+ fModIndProcessed = ssdadldc.fModIndProcessed;
+ fModIndRead = ssdadldc.fModIndRead;
+
+ if (ssdadldc.fModIndex) {
+ fModIndex = new (nothrow) Int_t [ssdadldc.fNumberOfModules];
+ if (fModIndex) memcpy(fModIndex, ssdadldc.fModIndex, ssdadldc.fNumberOfModules*sizeof(Int_t));
+ } else fModIndex = NULL;
+
fEqIndex = ssdadldc.fEqIndex;
fNumberOfEvents = ssdadldc.fNumberOfEvents;
fLdcId = ssdadldc.fLdcId;
fZsFactor = ssdadldc.fZsFactor;
fALaddersOff = ssdadldc.fALaddersOff;
fCLaddersOff = ssdadldc.fCLaddersOff;
- fBadChannelsList = NULL;
- fDDLModuleMap = NULL;
- fModIndex = NULL;
- if (ssdadldc.fBadChannelsList) AliWarning("fBadChannelsList is not copied by assignment operator, use other methods to init it!");
- if (ssdadldc.fDDLModuleMap) AliWarning("fDDLModuleMap is not copied by assignment operator, use other methods to init it!");
+ if (fBadChannelsList) delete fBadChannelsList;
+ fBadChannelsList = new AliITSBadChannelsSSDv2(*ssdadldc.fBadChannelsList);
+ if (fDDLModuleMap) delete [] fDDLModuleMap;
+ if (ssdadldc.fDDLModuleMap) {
+ fDDLModuleMap = new (nothrow) Int_t [fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl];
+ if (fDDLModuleMap) memcpy(fDDLModuleMap, ssdadldc.fDDLModuleMap, fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl * sizeof(Int_t));
+ } else fDDLModuleMap = NULL;
+
+ // if (ssdadldc.fBadChannelsList) AliWarning("fBadChannelsList is not copied by assignment operator, use other methods to init it!");
+ // if (ssdadldc.fDDLModuleMap) AliWarning("fDDLModuleMap is not copied by assignment operator, use other methods to init it!");
return *this;
}
AliITSHandleDaSSD::~AliITSHandleDaSSD()
{
// Default destructor
+ delete []fRawDataFileName;
if (fModules)
{
for (Int_t i = 0; i < fNumberOfModules; i++)
*/
fALaddersOff.Set(0);
fCLaddersOff.Set(0);
- fRawDataFileName = NULL;
+ if(fRawDataFileName){
+ delete []fRawDataFileName;
+ fRawDataFileName = NULL;
+ }
fModIndProcessed = fModIndRead = 0;
fNumberOfEvents = 0;
fLdcId = fRunId = 0;
datasize = rawreaderdate->GetDataSize();
eqbelsize = rawreaderdate->GetEquipmentElementSize();
if ( datasize % eqbelsize ) {
- AliError(Form("AliITSHandleDaSSD: Error Init(%s): event data size %i is not an integer of equipment data size %i",
+ AliError(Form("AliITSHandleDaSSD: Error Init(%s): event data size %ld is not an integer of equipment data size %ld",
rdfname, datasize, eqbelsize));
MakeZombie();
return kFALSE;
nofstripsev += (Int_t) (datasize / eqbelsize);
}
if (physeventind++) {
- if (nofstrips != nofstripsev) AliWarning(Form("AliITSHandleDaSSD: number of strips varies from event to event, ev = %i, %i",
+ if (nofstrips != nofstripsev) AliWarning(Form("AliITSHandleDaSSD: number of strips varies from event to event, ev = %ld, %ld",
physeventind, nofstripsev));
if (nofeqipment != nofeqipmentev) AliWarning("AliITSHandleDaSSD: number of DDLs varies from event to event");
}
if ((physeventind > 0) && (strn > 0))
{
fNumberOfEvents = physeventind;
- fRawDataFileName = rdfname;
+ if(rdfname){
+ delete []fRawDataFileName;
+ fRawDataFileName = new Char_t[strlen(rdfname)+1];
+ strncpy(fRawDataFileName,rdfname,strlen(rdfname)+1);
+ }
fEqIndex.Set(eqn);
fEqIndex.Reset(-1);
fModIndex = new (nothrow) Int_t [fgkNumberOfSSDModulesPerDdl * eqn];
else AliWarning(Form("AliITSHandleDaSSD: Error Init(%s): Index array for %i modules was not created",
rdfname, fgkNumberOfSSDModulesPerDdl * eqn));
if (SetNumberOfModules(fgkNumberOfSSDModulesPerDdl * eqn)) {
- TString str = TString::Format("Max number of equipment: %i, max number of channels: %i\n", eqn, strn);
+ TString str = TString::Format("Max number of equipment: %d, max number of channels: %ld\n", eqn, strn);
DumpInitData(str.Data());
return kTRUE;
}
Int_t ind = 0;
while((!ddlmfile.eof()) && (ind < (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl))) {
ddlmfile >> fDDLModuleMap[ind++];
- if (ddlmfile.fail()) AliError(Form("Error extracting number from the DDL map file %s, ind: ", filename, ind));
+ if (ddlmfile.fail()) AliError(Form("Error extracting number from the DDL map file %s, ind: %d ", filename, ind));
}
if (ind != (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl))
AliWarning(Form("Only %i (< %i) entries were read from DDL Map!", ind, (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl)));
else mddli = 0;
if (!module->SetModuleIdData (ddlID, ad, adc, mddli)) return 0;
module->SetModuleRorcId (equipid, equiptype);
- module->SetCMFeromEventsNumber(fNumberOfEvents);
modpos = fModIndRead + modind;
modind += 1;
fModules[modpos] = module;
fModules[modpos]->SetStrip(strip, stripID);
}
strip->SetSignal(eventind, signal);
- } else fModules[modpos]->SetCMFerom(signal, (stripID - AliITSModuleDaSSD::GetStripsPerModuleConst()), eventind);
+ } else {
+ if (!(fModules[modpos]->GetCMFerom())) {
+ fModules[modpos]->AllocateCMFeromArray();
+ fModules[modpos]->SetCMFeromEventsNumber(fNumberOfEvents);
+ }
+ fModules[modpos]->SetCMFerom(signal, (stripID - AliITSModuleDaSSD::GetStripsPerModuleConst()), eventind);
+ }
}
if (++eventind > fNumberOfEvents) break;
}
//______________________________________________________________________________
-Bool_t AliITSHandleDaSSD::AddFeromCm(AliITSModuleDaSSD *const module)
-// Restore the original signal value adding CM calculated and subtracted in ferom
+Bool_t AliITSHandleDaSSD::AddFeromCm(const AliITSModuleDaSSD *const module)
{
+// Restore the original signal value adding CM calculated and subtracted in ferom
AliITSChannelDaSSD *strip;
Short_t *signal, *cmferom;
if (!module) return kFALSE;
+ if (!module->GetCMFerom()) return kTRUE;
for (Int_t chipind = 0; chipind < AliITSModuleDaSSD::GetChipsPerModuleConst(); chipind++) {
if (!(cmferom = module->GetCMFerom(chipind))) {
AliWarning(Form("AliITSHandleDaSSD: There is no Ferom CM values for chip %i, module %i!", chipind, module->GetModuleId()));
//______________________________________________________________________________
-Bool_t AliITSHandleDaSSD::CalculatePedestal(AliITSModuleDaSSD *const module)
+Bool_t AliITSHandleDaSSD::CalculatePedestal(const AliITSModuleDaSSD *const module)
{
// Calculates Pedestal
AliITSChannelDaSSD *strip;
- Float_t pedestal, noise;
+ Double_t pedestal, noise;
Short_t *signal;
Long_t ovev, ev, n;
if (!module) return kFALSE;
continue;
}
//************* pedestal first pass ****************
- pedestal = 0.0f;
+ pedestal = 0.0L;
ovev = 0l;
for (ev = 0; ev < strip->GetEventsNumber(); ev++)
if (SignalOutOfRange(signal[ev])) ovev += 1;
- else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Float_t>(ev - ovev + 1) : signal[ev];
+ else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Double_t>(ev - ovev + 1) : signal[ev];
if (ev == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
- strip->SetPedestal(pedestal);
+ strip->SetPedestal(static_cast<Float_t>(pedestal));
//************* noise *******************************
Double_t nsum = 0.0L;
ovev = 0l;
if (SignalOutOfRange(signal[ev])) ovev += 1;
else nsum += pow((signal[ev] - strip->GetPedestal()), 2);
}
- if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
+ if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = TMath::Sqrt(nsum / (Double_t)(n));
else noise = AliITSChannelDaSSD::GetUndefinedValue();
- strip->SetNoise(noise);
+ strip->SetNoise(static_cast<Float_t>(noise));
//************* pedestal second pass ****************
- pedestal = 0.0f;
+ pedestal = 0.0L;
ovev = 0l;
for (ev = 0; ev < strip->GetEventsNumber(); ev++)
if ( SignalOutOfRange(signal[ev])
|| TMath::Abs(signal[ev] - strip->GetPedestal()) > (fPedestalThresholdFactor * strip->GetNoise())) ovev += 1;
- else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Float_t>(ev - ovev + 1) : signal[ev];
+ else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Double_t>(ev - ovev + 1) : signal[ev];
if (ev == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
- strip->SetPedestal(pedestal);
+ strip->SetPedestal(static_cast<Float_t>(pedestal));
strip->SetOverflowNumber(ovev);
}
return kTRUE;
//______________________________________________________________________________
-Bool_t AliITSHandleDaSSD::CalculateNoise(AliITSModuleDaSSD *const module)
+Bool_t AliITSHandleDaSSD::CalculateNoise(const AliITSModuleDaSSD *const module)
{
// Calculates Noise
AliITSChannelDaSSD *strip;
if (SignalOutOfRange(signal[ev])) ovev += 1;
else nsum += pow((signal[ev] - strip->GetPedestal()), 2);
}
- if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
+ if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = static_cast<Float_t>(TMath::Sqrt(nsum / (Float_t)(n)));
else noise = AliITSChannelDaSSD::GetUndefinedValue();
strip->SetNoise(noise);
}
if (!(strip = module->GetStrip(strind))) continue; //return kFALSE;
if (!(signal = strip->GetSignal())) {
strip->SetNoiseCM(AliITSChannelDaSSD::GetUndefinedValue());
- AliError(Form("SSDDAModule: Error CalculateNoiseWithoutCM(): there are no events data for module[%i] strip[%i]->GetSignal()",
+ AliError(Form("AliITSHandleDaSSD: Error CalculateNoiseCM(): there are no events data for module[%i] strip[%i]->GetSignal()",
module->GetModuleId(), strind));
continue; //return kFALSE;
}
if (SignalOutOfRange(signal[ev])) ovev += 1;
else nsum += pow((signal[ev] - strip->GetPedestal() - module->GetCM(chipind, ev)), 2);
}
- if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
+ if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = static_cast<Float_t>(TMath::Sqrt(nsum / (Double_t)(n)));
else noise = AliITSChannelDaSSD::GetUndefinedValue();
strip->SetNoiseCM(noise);
}
if ((SignalOutOfRange(signal[ev])) || (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())) ovstr += 1;
else cmsigma += pow((cm0 - (signal[ev] - strip->GetPedestal())), 2);
}
- if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsigma = sqrt(cmsigma / (Float_t)(n));
+ if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsigma = TMath::Sqrt(cmsigma / (Float_t)(n));
else { module->SetCM(0.0f, chipind, ev); continue; }
// calculate cm with threshold
Double_t cmsum = 0.0L;
}
if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsum /= (Float_t)(n);
else cmsum = 0.0L;
- if (!module->SetCM(cmsum, chipind, ev));
+ if (!(module->SetCM(cmsum, chipind, ev)))
+ AliError(Form("AliITSHandleDaSSD: Error, module->SetCM(...) returned kFALSE module:chip:event : [%d]:[%d]:[%ld]\n",
+ module->GetModuleId(), chipind, ev));
}
}
return kTRUE;
//______________________________________________________________________________
-Bool_t AliITSHandleDaSSD::ProcessRawData(const Int_t nmread)
+Bool_t AliITSHandleDaSSD::ProcessRawData(const Int_t nmread, const Bool_t usewelford)
{
// Performs calculation of calibration parameters (pedestal, noise, ...)
Int_t nm = 0;
return kFALSE;
}
AddFeromCm(fModules[modind]);
- CalculatePedestal(fModules[modind]);
- CalculateNoise(fModules[modind]);
- CalculateNoiseCM(fModules[modind]);
+ if (usewelford) {
+ CalculatePedNoiseW(fModules[modind]);
+ CalculateNoiseCMW(fModules[modind]);
+ } else {
+ CalculatePedestal(fModules[modind]);
+ CalculateNoise(fModules[modind]);
+ CalculateNoiseCM(fModules[modind]);
+ }
}
DeleteSignal();
DeleteCM();
DeleteCMFerom();
fModIndProcessed = fModIndRead;
cout << fModIndProcessed << " - done" << endl;
+ if (nm < nmread ) break;
}
return kTRUE;
}
if (!(strip = module->GetStrip(strind))) continue;
Short_t modid = module->GetModuleId() - fgkMinSSDModuleId;
if (strip->GetStripId() < AliITSModuleDaSSD::GetPNStripsPerModule() )
- ldcbc->AddBadChannelP(modid, strip->GetStripId(), module->CheckIfBad(strip->GetStripId()));
+ ldcbc->AddBadChannelP(modid, strip->GetStripId(), EvaluateIfChannelIsBad(module, strip->GetStripId()));
else
ldcbc->AddBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()),
- module->CheckIfBad(strip->GetStripId()));
+ EvaluateIfChannelIsBad(module, strip->GetStripId()));
}
}
return ldcbc;
if (strip->GetStripId() < AliITSModuleDaSSD::GetPNStripsPerModule() ) {
ldcn->AddNoiseP(modid, strip->GetStripId(), strip->GetNoiseCM());
ldcp->AddPedestalP(modid, strip->GetStripId(), strip->GetPedestal());
- ldcbc->AddBadChannelP(modid, strip->GetStripId(), module->CheckIfBad(strip->GetStripId()));
+ ldcbc->AddBadChannelP(modid, strip->GetStripId(), EvaluateIfChannelIsBad(module, strip->GetStripId()));
} else {
ldcn->AddNoiseN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()), strip->GetNoiseCM());
ldcp->AddPedestalN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()), strip->GetPedestal());
ldcbc->AddBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strip->GetStripId()),
- module->CheckIfBad(strip->GetStripId()));
+ EvaluateIfChannelIsBad(module, strip->GetStripId()));
}
}
}
if (dafname) dadatafilename.Form("%s/", dafname);
dadatafilename += TString::Format("ITSSSDda_%i.root", fLdcId);
tmpfname = new Char_t[dadatafilename.Length()+1];
- dafname = strcpy(tmpfname, dadatafilename.Data());
+ Int_t sz = dadatafilename.Sizeof();
+ dafname = strncpy(tmpfname, dadatafilename.Data(),sz);
TFile *fileRun = new TFile (dadatafilename.Data(),"RECREATE");
if (fileRun->IsZombie()) {
AliError(Form("AliITSHandleDaSSD: SaveCalibrationSSDLDC() error open file %s", dadatafilename.Data()));
cout << "Modules with MeanNoise > " << meannosethreshold << endl;
for (Int_t i = 0; i < fNumberOfModules; i++) {
if (!(mod = fModules[i])) continue;
- Float_t maxnoise = 0.0f, meannoise = 0.0f, maxped = 0.0f;
- Int_t maxstrind = 0, novfstr = 0;
+ Double_t maxnoise = 0.0L, meannoise = 0.0L, meanovf = 0.0L;
+ Float_t maxped = 0.0f;
+ Int_t maxstrind = 0, novfstr = 0, maxovf = 0;
for (Int_t strind = 0; strind < mod->GetNumberOfStrips(); strind++) {
if (!(strip = mod->GetStrip(strind))) {novfstr++; continue; }
if (strip->GetNoiseCM() >= AliITSChannelDaSSD::GetUndefinedValue() ) {novfstr++; continue; }
maxnoise = strip->GetNoiseCM();
maxstrind = strind;
}
- meannoise = (strind - novfstr) ? meannoise + (strip->GetNoiseCM() - meannoise) / static_cast<Float_t>(strind - novfstr + 1)
+ meannoise = (strind - novfstr) ? meannoise + (strip->GetNoiseCM() - meannoise) / static_cast<Double_t>(strind - novfstr + 1)
: strip->GetNoiseCM();
- if (TMath::Abs(maxped) < TMath::Abs(strip->GetPedestal())) maxped = strip->GetPedestal();
+ if (TMath::Abs(maxped) < TMath::Abs(strip->GetPedestal())) maxped = strip->GetPedestal();
+ meanovf = (strind - novfstr) ? meanovf + (strip->GetOverflowNumber() - meanovf) / static_cast<Double_t>(strind - novfstr + 1)
+ : strip->GetOverflowNumber();
+ if (strip->GetOverflowNumber() > maxovf) maxovf = strip->GetOverflowNumber();
}
if (meannoise > meannosethreshold)
cout << "Mod: " << i << "; DDl: " << (int)mod->GetDdlId() << "; AD: " << (int)mod->GetAD()
<< "; ADC: " << (int)mod->GetADC() << "; MaxPed = " << maxped
- << "; MeanNoise = " << meannoise
+ << "; MeanNoise = " << meannoise << "; MaxNoise = " << maxnoise << "; MaxNoiseStrip = " << maxstrind
<< "; NOfStrips = " << (mod->GetNumberOfStrips() - novfstr) << endl;
+ if (maxovf > 10) cout << "Max number of events with overflow : " << maxovf << "; mean : " << meanovf << endl;
}
return kTRUE;
}
//______________________________________________________________________________
Bool_t AliITSHandleDaSSD::PrintModCalibrationData(const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Char_t *fname) const
{
-// Print Module calibration data whether in file on in cout
+// Print Module calibration data whether in file or in cout
AliITSChannelDaSSD *strip;
ofstream datafile;
ostream *outputfile;
fModules[modind] = module;
for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
AliITSChannelDaSSD *cstrip = fModules[copymodind]->GetStrip(strind);
+ if(!cstrip)return kFALSE;
Long_t eventsnumber = cstrip->GetEventsNumber();
AliITSChannelDaSSD *strip = new AliITSChannelDaSSD(strind, eventsnumber);
for (Long_t evind = 0; evind < eventsnumber; evind++) {
//___________________________________________________________________________________________
Bool_t AliITSHandleDaSSD::SaveEqSlotCalibrationData(const Int_t ddl, const Int_t ad, const Char_t *fname) const
-// Saves calibration files for selected equipment (DDL)
{
+// Saves calibration files for selected equipment (DDL)
fstream feefile;
Int_t zsml, offsetml;
ULong_t zsth, offset, zsoffset;
AliError(Form("Can not open the file %s for output!", fname));
return kFALSE;
}
- for (zsml = 0; fgkZsBitMask >> zsml; zsml++);
- for (offsetml = 0; fgkOffSetBitMask >> offsetml; offsetml++);
+ for (zsml = 0; fgkZsBitMask >> zsml; zsml++) ;
+ for (offsetml = 0; fgkOffSetBitMask >> offsetml; offsetml++) ;
for (Int_t strind = 0; strind < AliITSModuleDaSSD::GetStripsPerModuleConst(); strind++) {
for (Int_t adcb = 0; adcb < fgkAdcPerDBlock; adcb++) {
zsoffset = 0x0;
modn = RetrieveModuleId(ddl, ad, adc);
if (modn < 0) return -1;
if (modn < fgkMinSSDModuleId) {
- AliWarning(Form("Module ddl/ad/adc: %i/%i/%i has number %i which is wrong for SSD module", ddl, ad, adc, strn, modn));
+ AliWarning(Form("Module ddl/ad/adc: %d/%d/%d has number %d which is wrong for SSD module %d", ddl, ad, adc, strn, modn));
return -1;
}
Short_t modid = modn - fgkMinSSDModuleId;
return (fBadChannelsList->GetBadChannelP(modid, strn) & fgkBadChannelMask);
else return (fBadChannelsList->GetBadChannelN(modid, (AliITSChannelDaSSD::GetMaxStripIdConst() - strn)) & fgkBadChannelMask);
} else {
- AliError("Error ether bad channels list or DDLMap is not initialized or both, AliITSModuleDaSSD::CheckIfBad(str) is used!");
- if (module = GetModule(ddl, ad, adc)) {
- return (module->CheckIfBad(strn) & fgkBadChannelMask);
+ AliError("Error ether bad channels list or DDLMap is not initialized or both, EvaluateIfChannelIsBad(module, strip) is used!");
+ if ((module = GetModule(ddl, ad, adc))) {
+ return (EvaluateIfChannelIsBad(module, strn) & fgkBadChannelMask);
} else {
AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, 0 is used!", ddl, ad, adc));
return 0ul;
if (fOffsetDefault < INT_MAX) pedint = fOffsetDefault;
else pedint = TMath::Nint(strip->GetPedestal());
if (pedint > static_cast<Int_t>((fgkOffSetBitMask >> 1))) {
- if (!ChannelIsBad(ddl, ad, adc, strn) && !((fMergeBCLists) && (GetModule(ddl, ad, adc)->CheckIfBad(strn))))
+ if (!ChannelIsBad(ddl, ad, adc, strn) && !((fMergeBCLists) && (EvaluateIfChannelIsBad(GetModule(ddl, ad, adc), strn))))
AliError(Form("Offset %i, channel(ddl/ad/adc/strip) %i/%i/%i/%i can not be represented with mask 0x%s, Offset = %i",
pedint, ddl, ad, adc, strn, ConvBase(fgkOffSetBitMask, 16).c_str(), (fgkOffSetBitMask >> 1)));
return (fgkOffSetBitMask >> 1);
}
if ((-pedint) > static_cast<Int_t>(((fgkOffSetBitMask + 1) >> 1))) {
- if (!ChannelIsBad(ddl, ad, adc, strn) && !((fMergeBCLists) && (GetModule(ddl, ad, adc)->CheckIfBad(strn))))
+ if (!ChannelIsBad(ddl, ad, adc, strn) && !((fMergeBCLists) && (EvaluateIfChannelIsBad(GetModule(ddl, ad, adc), strn))))
AliError(Form("Offset %i, channel(ddl/ad/adc/strip) %i/%i/%i/%i can not be represented with mask 0x%s, Offset = %i",
pedint, ddl, ad, adc, strn, ConvBase(fgkOffSetBitMask, 16).c_str(),
((fgkOffSetBitMask & (~fgkOffSetBitMask >> 1)) - fgkOffSetBitMask - 1)));
// Calculate the offset value to be upload to FEROM
AliITSChannelDaSSD *strip = NULL;
AliITSModuleDaSSD *module = NULL;
- if (module = GetModule(ddl, ad, adc)) {
- if (strip = module->GetStrip(strn)) return OffsetValue(strip, ddl, ad, adc, strn);
+ if ((module = GetModule(ddl, ad, adc))) {
+ if ((strip = module->GetStrip(strn))) return OffsetValue(strip, ddl, ad, adc, strn);
else {
AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, strip = %i, 0 is used!", ddl, ad, adc, strn));
return 0ul;
//______________________________________________________________________________
-ULong_t AliITSHandleDaSSD::ZsThreshold(AliITSChannelDaSSD *strip) const
+ULong_t AliITSHandleDaSSD::ZsThreshold(const AliITSChannelDaSSD *strip) const
{
// Calculate the value of zero suppression threshold to be upload to FEROM
ULong_t zs;
AliITSModuleDaSSD *module = NULL;
if (ChannelIsBad(ddl, ad, adc, strn)) return fgkZsBitMask;
if (LadderIsOff(ddl, ad, adc)) return fgkZsBitMask;
- if (module = GetModule(ddl, ad, adc)) {
- if (fMergeBCLists) if (module->CheckIfBad(strn)) return fgkZsBitMask;
- if (strip = module->GetStrip(strn)) return ZsThreshold(strip);
+ if (fZsDefault > 0) if (static_cast<ULong_t>(fZsDefault) >= fgkZsBitMask) return fgkZsBitMask;
+ if ((module = GetModule(ddl, ad, adc))) {
+ if (fMergeBCLists) if (EvaluateIfChannelIsBad(module, strn)) return fgkZsBitMask;
+ if ((strip = module->GetStrip(strn))) return ZsThreshold(strip);
else {
AliWarning(Form("There is no calibration data for ddl = %i, ad = %i, adc = %i, strip = %i, 0 is used!", ddl, ad, adc, strn));
return 0ul;
}
return (modoff + modnd);
}
+
+
+//______________________________________________________________________________
+Bool_t AliITSHandleDaSSD::CalculatePedNoiseW(const AliITSModuleDaSSD *const module)
+{
+// Calculates Pedestal and Noise using Welford algorithm
+ AliITSChannelDaSSD *strip;
+ Double_t pedestal, noise, p0, s0;
+ Short_t *signal;
+ Int_t ovev, n;
+ if (!module) return kFALSE;
+ for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
+ if (!(strip = module->GetStrip(strind))) continue;
+ if (!(signal = strip->GetSignal())) {
+ AliError(Form("AliITSHandleDaSSD: Error CalculatePedestal(): there are no events data for module[%i] strip[%i]->GetSignal()",
+ module->GetModuleId(), strind));
+ continue;
+ }
+//************* pedestal and noise first pass ****************
+ pedestal = p0 = noise = 0.0L;
+ ovev = 0;
+ for (Int_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
+ if (SignalOutOfRange(signal[ev])) ovev += 1;
+ else
+ if (!(ev - ovev)) {
+ pedestal = p0 = signal[ev];
+ noise = 0.0L;
+ } else {
+ p0 = pedestal + (signal[ev] - pedestal) / static_cast<Double_t>(ev - ovev + 1);
+ s0 = noise + (signal[ev] - pedestal) * (signal[ev] - p0);
+ pedestal = p0;
+ noise = s0;
+ }
+ }
+ if (strip->GetEventsNumber() == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
+ strip->SetPedestal(static_cast<Float_t>(pedestal));
+ if ((n = strip->GetEventsNumber() - ovev - 1) > 0)
+ strip->SetNoise( static_cast<Float_t>(TMath::Sqrt(noise / static_cast<Double_t>(n))) );
+ else {
+ strip->SetNoise(AliITSChannelDaSSD::GetUndefinedValue());
+ continue;
+ }
+//************* Second pass excluds event with |p - s|>f*noise *****************
+ pedestal = p0 = noise = 0.0L;
+ ovev = 0;
+ for (Int_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
+ if ( SignalOutOfRange(signal[ev])
+ || TMath::Abs(signal[ev] - strip->GetPedestal()) > (fPedestalThresholdFactor * strip->GetNoise())) ovev += 1;
+ else
+ if (!(ev - ovev)) {
+ pedestal = p0 = signal[ev];
+ noise = 0.0L;
+ } else {
+ p0 = pedestal + (signal[ev] - pedestal) / static_cast<Double_t>(ev - ovev + 1);
+ s0 = noise + (signal[ev] - pedestal) * (signal[ev] - p0);
+ pedestal = p0;
+ noise = s0;
+ }
+ }
+ if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = TMath::Sqrt(noise / static_cast<Double_t>(n));
+ else noise = AliITSChannelDaSSD::GetUndefinedValue();
+ strip->SetNoise(static_cast<Float_t>(noise));
+ if (strip->GetEventsNumber() == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
+ strip->SetPedestal(static_cast<Float_t>(pedestal));
+ strip->SetOverflowNumber(ovev);
+ }
+ return kTRUE;
+}
+
+
+//______________________________________________________________________________
+Bool_t AliITSHandleDaSSD::CalculateCMW(AliITSModuleDaSSD *const module)
+{
+// Calculates CM using Welford algorithm
+ AliITSChannelDaSSD *strip = NULL;
+ Short_t *signal;
+ Int_t ovstr, n;
+ Int_t stripind;
+ Double_t cm0, cm1, cmsigma, cms1;
+ module->SetNumberOfChips(AliITSModuleDaSSD::GetChipsPerModuleConst());
+ for (Int_t chipind = 0; chipind < module->GetNumberOfChips(); chipind++) {
+ stripind = chipind * module->GetStripsPerChip();
+ module->GetCM()[chipind].Set(fNumberOfEvents);
+ module->GetCM()[chipind].Reset(0.0f);
+ for (Long_t ev = 0; ev < fNumberOfEvents; ev++) {
+ // calculate firs approximation of CM and SigmaCM.
+ cm0 = cm1 = cmsigma = 0.0L;
+ ovstr = 0;
+ for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
+ if (!(strip = module->GetStrip(strind))) { ovstr += 1; continue; } //return kFALSE;
+ if (!(signal = strip->GetSignal())) { ovstr += 1; continue; } //return kFALSE;
+ if ((SignalOutOfRange(signal[ev])) || (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())) ovstr += 1;
+ else {
+ if (!(strind - stripind - ovstr)) {
+ cm0 = cm1 = signal[ev] - strip->GetPedestal();
+ cmsigma = 0.0L;
+ } else {
+ cm1 = cm0 + (signal[ev] - strip->GetPedestal() - cm0) / static_cast<Double_t>(strind - stripind - ovstr + 1);
+ cms1 = cmsigma + (signal[ev] - strip->GetPedestal() - cm0) * (signal[ev] - strip->GetPedestal() - cm1);
+ cm0 = cm1;
+ cmsigma = cms1;
+ } }
+ }
+ if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr - 1) > 0) cmsigma = TMath::Sqrt(cmsigma / static_cast<Double_t>(n));
+ else {
+ AliWarning(Form("AliITSHandleDaSSD: Too little number of strips have a signal for module:chip:event : [%d]:[%d]:[%ld]\n",
+ module->GetModuleId(), chipind, ev));
+ if (!(module->SetCM(0.0f, chipind, ev)))
+ AliError(Form("AliITSHandleDaSSD: Error, module->SetCM(...) returned kFALSE module:chip:event : [%d]:[%d]:[%ld]\n",
+ module->GetModuleId(), chipind, ev));
+ continue;
+ }
+ // calculate cm with threshold
+ Double_t cmsum = 0.0L;
+ ovstr = 0;
+ for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
+ if (!(strip = module->GetStrip(strind))) { ovstr += 1; continue; }
+ if (!(signal = strip->GetSignal())) { ovstr += 1; continue; }
+ if ( (SignalOutOfRange(signal[ev])) || (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())
+ || (TMath::Abs(cm0 - (signal[ev] - strip->GetPedestal())) > (fCmThresholdFactor * cmsigma)) ) ovstr += 1;
+ else cmsum += (signal[ev] - strip->GetPedestal());
+ }
+ if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsum /= (Double_t)(n);
+ else cmsum = 0.0L;
+ if (!(module->SetCM(static_cast<Float_t>(cmsum), chipind, ev)))
+ AliError(Form("AliITSHandleDaSSD: Error, module->SetCM(...) returned kFALSE module:chip:event : [%d]:[%d]:[%ld]\n",
+ module->GetModuleId(), chipind, ev));
+ }
+ }
+ return kTRUE;
+}
+
+
+//______________________________________________________________________________
+Bool_t AliITSHandleDaSSD::CalculateNoiseCMW(AliITSModuleDaSSD *const module)
+{
+// Calculates Noise with CM correction
+ AliITSChannelDaSSD *strip = NULL;
+ Short_t *signal;
+ Int_t ovev, n;
+ if (!CalculateCMW(module)) {
+ AliError("Error: AliITSHandleDaSSD::CalculateCMW() returned kFALSE");
+ return kFALSE;
+ }
+ for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
+ if (!(strip = module->GetStrip(strind))) continue; //return kFALSE;
+ if (!(signal = strip->GetSignal())) {
+ strip->SetNoiseCM(AliITSChannelDaSSD::GetUndefinedValue());
+ AliError(Form("AliITSHandleDaSSD: Error CalculateNoiseCMW(): there are no events data for module[%i] strip[%i]->GetSignal()",
+ module->GetModuleId(), strind));
+ continue; //return kFALSE;
+ }
+//** To get exactly the same set of events as for pedestal and noise calculation **
+ Double_t pedestal, noise, p0, s0;
+ pedestal = p0 = noise = 0.0L;
+ ovev = 0;
+ for (Int_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
+ if (SignalOutOfRange(signal[ev])) ovev += 1;
+ else
+ if (!(ev - ovev)) {
+ pedestal = p0 = signal[ev];
+ noise = 0.0L;
+ } else {
+ p0 = pedestal + (signal[ev] - pedestal) / static_cast<Double_t>(ev - ovev + 1);
+ s0 = noise + (signal[ev] - pedestal) * (signal[ev] - p0);
+ pedestal = p0;
+ noise = s0;
+ }
+ }
+ if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = TMath::Sqrt(noise / static_cast<Double_t>(n));
+ else {
+ strip->SetNoiseCM(AliITSChannelDaSSD::GetUndefinedValue());
+ continue;
+ }
+//** Calculation of CM corrected noise **
+ Int_t chipind = strind / AliITSModuleDaSSD::GetStripsPerChip();
+ Double_t nsum = 0.0L;
+ ovev = 0;
+ for (Int_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
+ if ( SignalOutOfRange(signal[ev])
+ || TMath::Abs(signal[ev] - pedestal) > (fPedestalThresholdFactor * noise)) ovev += 1;
+ else nsum += pow((signal[ev] - strip->GetPedestal() - module->GetCM(chipind, ev)), 2);
+ }
+ if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = TMath::Sqrt(nsum / static_cast<Double_t>(n));
+ else noise = AliITSChannelDaSSD::GetUndefinedValue();
+ strip->SetNoiseCM(static_cast<Float_t>(noise));
+ }
+ return kTRUE;
+}
+
+
+
+//______________________________________________________________________________
+UChar_t AliITSHandleDaSSD::EvaluateIfChannelIsBad(const AliITSModuleDaSSD *const module, const Int_t stripn) const
+{
+//Applies the bad channel creteria and set the appropriate flags for returned value
+ AliITSChannelDaSSD *strip = 0;
+ UInt_t bcflags = 0;
+ if (fZsDefault >= 0) { if (static_cast<ULong_t>(fZsDefault) >= fgkZsBitMask) bcflags |= 3; }
+ else if (static_cast<ULong_t>(fZsMinimum) >= fgkZsBitMask) bcflags |= 3;
+ if (LadderIsOff(module->GetDdlId(), module->GetAD(), module->GetADC()) ) bcflags |= 3;
+
+ if (!(strip = module->GetStrip(stripn))) bcflags |= 3;
+ else {
+ if (strip->GetNoiseCM() == AliITSChannelDaSSD::GetUndefinedValue()) bcflags |= 8;
+ if (static_cast<ULong_t>(TMath::Nint(fZsFactor * strip->GetNoiseCM())) >= fgkZsBitMask) bcflags |= 8;
+ if (strip->GetNoiseCM() < 1) bcflags |= 16;
+ if (strip->GetPedestal() > ((fgkOffSetBitMask >> 1) - 1)) bcflags |= 4;
+ else if ((-(strip->GetPedestal())) > (fgkOffSetBitMask >> 1)) bcflags |= 4;
+ if (bcflags) bcflags |= 3;
+ }
+ return bcflags;
+}
+