]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSHandleDaSSD.cxx
debug message removed
[u/mrichter/AliRoot.git] / ITS / AliITSHandleDaSSD.cxx
index 07bc44c9268bf2cb591aa0762836eaeca60be0a2..20dd2220aad2b9ef9bcc8d6ba16026d1b18bc0b8 100644 (file)
 //  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 "AliITSNoiseSSD.h"
-#include "AliITSPedestalSSD.h"
-#include "AliITSBadChannelsSSD.h"
+#include "AliITSNoiseSSDv2.h"
+#include "AliITSPedestalSSDv2.h"
+#include "AliITSBadChannelsSSDv2.h"
 #include "AliITSRawStreamSSD.h"
 #include "AliRawReaderDate.h"
 #include "AliITSRawStreamSSD.h"
@@ -121,13 +122,13 @@ AliITSHandleDaSSD::AliITSHandleDaSSD(Char_t *rdfname) :
 //______________________________________________________________________________
 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),
@@ -144,6 +145,10 @@ AliITSHandleDaSSD::AliITSHandleDaSSD(const AliITSHandleDaSSD& ssdadldc) :
   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) {
@@ -165,11 +170,20 @@ AliITSHandleDaSSD::AliITSHandleDaSSD(const AliITSHandleDaSSD& ssdadldc) :
       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)
 {
@@ -182,10 +196,11 @@ AliITSHandleDaSSD& AliITSHandleDaSSD::operator = (const AliITSHandleDaSSD& ssdad
     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]) { 
@@ -203,10 +218,19 @@ AliITSHandleDaSSD& AliITSHandleDaSSD::operator = (const AliITSHandleDaSSD& ssdad
       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;
@@ -220,11 +244,16 @@ AliITSHandleDaSSD& AliITSHandleDaSSD::operator = (const AliITSHandleDaSSD& ssdad
   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;
 }
 
@@ -233,6 +262,7 @@ AliITSHandleDaSSD& AliITSHandleDaSSD::operator = (const AliITSHandleDaSSD& ssdad
 AliITSHandleDaSSD::~AliITSHandleDaSSD()
 {
 // Default destructor 
+  delete []fRawDataFileName;
   if (fModules) 
   {
     for (Int_t i = 0; i < fNumberOfModules; i++)
@@ -267,7 +297,10 @@ void AliITSHandleDaSSD::Reset()
 */
   fALaddersOff.Set(0);
   fCLaddersOff.Set(0);
-  fRawDataFileName = NULL;
+  if(fRawDataFileName){
+    delete []fRawDataFileName;
+    fRawDataFileName = NULL;
+  }
   fModIndProcessed = fModIndRead = 0;
   fNumberOfEvents = 0;
   fLdcId = fRunId = 0;
@@ -311,7 +344,7 @@ Bool_t AliITSHandleDaSSD::Init(Char_t *rdfname)
       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;
@@ -319,7 +352,7 @@ Bool_t AliITSHandleDaSSD::Init(Char_t *rdfname)
       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");
     }
@@ -332,7 +365,11 @@ Bool_t AliITSHandleDaSSD::Init(Char_t *rdfname)
   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];
@@ -341,7 +378,7 @@ Bool_t AliITSHandleDaSSD::Init(Char_t *rdfname)
     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;
     }  
@@ -461,7 +498,7 @@ Bool_t AliITSHandleDaSSD::ReadStaticBadChannelsMap(const Char_t *filename)
     AliWarning(Form("Error reading file %s with Static Bad Channels Map!", filename));
     return kFALSE;
   }
-  bcfile->GetObject("AliITSBadChannelsSSD;1", fBadChannelsList);
+  bcfile->GetObject("AliITSBadChannelsSSDv2;1", fBadChannelsList);
   if (!fBadChannelsList) {
     AliWarning("Error fBadChannelsList == NULL!");
     bcfile->Close();
@@ -509,7 +546,7 @@ Bool_t AliITSHandleDaSSD::ReadDDLModuleMap(const Char_t *filename)
   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)));
@@ -585,7 +622,6 @@ Int_t AliITSHandleDaSSD::ReadModuleRawData (const Int_t modulesnumber)
         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;
@@ -597,7 +633,13 @@ Int_t AliITSHandleDaSSD::ReadModuleRawData (const Int_t modulesnumber)
           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;
   }
@@ -637,13 +679,14 @@ Bool_t AliITSHandleDaSSD::RelocateModules()
 
 
 //______________________________________________________________________________
-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()));
@@ -670,11 +713,11 @@ Bool_t AliITSHandleDaSSD::AddFeromCm(AliITSModuleDaSSD *const module)
 
 
 //______________________________________________________________________________
-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;
@@ -686,13 +729,13 @@ Bool_t AliITSHandleDaSSD::CalculatePedestal(AliITSModuleDaSSD *const module)
       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;
@@ -700,18 +743,18 @@ Bool_t AliITSHandleDaSSD::CalculatePedestal(AliITSModuleDaSSD *const module)
       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;
@@ -719,7 +762,7 @@ Bool_t AliITSHandleDaSSD::CalculatePedestal(AliITSModuleDaSSD *const module)
 
 
 //______________________________________________________________________________
-Bool_t AliITSHandleDaSSD::CalculateNoise(AliITSModuleDaSSD *const module)
+Bool_t AliITSHandleDaSSD::CalculateNoise(const AliITSModuleDaSSD *const module)
 {
 // Calculates Noise
   AliITSChannelDaSSD *strip;
@@ -741,7 +784,7 @@ Bool_t AliITSHandleDaSSD::CalculateNoise(AliITSModuleDaSSD *const module)
       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);
   }
@@ -766,7 +809,7 @@ Bool_t AliITSHandleDaSSD::CalculateNoiseCM(AliITSModuleDaSSD *const module)
     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;
     }
@@ -777,7 +820,7 @@ Bool_t AliITSHandleDaSSD::CalculateNoiseCM(AliITSModuleDaSSD *const module)
       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);
   }
@@ -828,7 +871,7 @@ Bool_t AliITSHandleDaSSD::CalculateCM(AliITSModuleDaSSD *const module)
         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;
@@ -842,7 +885,9 @@ Bool_t AliITSHandleDaSSD::CalculateCM(AliITSModuleDaSSD *const module)
       }
       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; 
@@ -850,7 +895,7 @@ Bool_t AliITSHandleDaSSD::CalculateCM(AliITSModuleDaSSD *const module)
 
 
 //______________________________________________________________________________
-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;
@@ -865,15 +910,21 @@ Bool_t AliITSHandleDaSSD::ProcessRawData(const Int_t nmread)
         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;  
 }
@@ -902,16 +953,16 @@ Short_t AliITSHandleDaSSD::RetrieveModuleId(const UChar_t ddlID, const UChar_t a
 
 
 //______________________________________________________________________________
-AliITSNoiseSSD* AliITSHandleDaSSD::GetCalibrationOCDBNoise() const
+AliITSNoiseSSDv2* AliITSHandleDaSSD::GetCalibrationOCDBNoise() const
 {
 // Fill in the array for OCDB 
-  AliITSNoiseSSD         *ldcn = NULL;
+  AliITSNoiseSSDv2         *ldcn = NULL;
   AliITSModuleDaSSD      *module = NULL;
   AliITSChannelDaSSD     *strip = NULL; 
   if (!fModules) return NULL;
-  ldcn = new AliITSNoiseSSD;
+  ldcn = new AliITSNoiseSSDv2;
   if (!ldcn) {
-    AliError("Error allocation mamory for AliITSBadChannelsSSD object, return NULL!");
+    AliError("Error allocation mamory for AliITSBadChannelsSSDv2 object, return NULL!");
     return NULL;
   }
   for (Int_t i = 0; i < fNumberOfModules; i++) {
@@ -931,16 +982,16 @@ AliITSNoiseSSD* AliITSHandleDaSSD::GetCalibrationOCDBNoise() const
 
 
 //______________________________________________________________________________
-AliITSBadChannelsSSD* AliITSHandleDaSSD::GetCalibrationBadChannels() const
+AliITSBadChannelsSSDv2* AliITSHandleDaSSD::GetCalibrationBadChannels() const
 {
 // Fill in the TObjArray with the list of bad channels 
-  AliITSBadChannelsSSD   *ldcbc = NULL;
+  AliITSBadChannelsSSDv2   *ldcbc = NULL;
   AliITSModuleDaSSD      *module = NULL;
   AliITSChannelDaSSD     *strip = NULL; 
   if (!fModules) return NULL;
-  ldcbc = new AliITSBadChannelsSSD;
+  ldcbc = new AliITSBadChannelsSSDv2;
   if (!ldcbc) {
-    AliError("Error allocation mamory for AliITSBadChannelsSSD object, return NULL!");
+    AliError("Error allocation mamory for AliITSBadChannelsSSDv2 object, return NULL!");
     return NULL;
   }
   for (Int_t i = 0; i < fNumberOfModules; i++) {
@@ -950,10 +1001,10 @@ AliITSBadChannelsSSD* AliITSHandleDaSSD::GetCalibrationBadChannels() const
       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;
@@ -965,17 +1016,17 @@ AliITSBadChannelsSSD* AliITSHandleDaSSD::GetCalibrationBadChannels() const
 Bool_t AliITSHandleDaSSD::SaveCalibrationSSDLDC(Char_t*& dafname)
 {
 // Save Calibration data locally
-  AliITSBadChannelsSSD   *ldcbc = NULL;
-  AliITSPedestalSSD      *ldcp = NULL;
-  AliITSNoiseSSD         *ldcn = NULL;
+  AliITSBadChannelsSSDv2   *ldcbc = NULL;
+  AliITSPedestalSSDv2      *ldcp = NULL;
+  AliITSNoiseSSDv2         *ldcn = NULL;
   AliITSModuleDaSSD      *module = NULL;
   AliITSChannelDaSSD     *strip = NULL; 
   Char_t         *tmpfname;
   TString         dadatafilename("");
   if (!fModules) return kFALSE;
-  ldcn = new AliITSNoiseSSD;
-  ldcp = new AliITSPedestalSSD;
-  ldcbc = new AliITSBadChannelsSSD;
+  ldcn = new AliITSNoiseSSDv2;
+  ldcp = new AliITSPedestalSSDv2;
+  ldcbc = new AliITSBadChannelsSSDv2;
   if ((!ldcn) || (!ldcp) || (!ldcp)) {
     AliError("Error allocation mamory for calibration objects, return kFALSE!");
     return kFALSE;
@@ -989,19 +1040,20 @@ Bool_t AliITSHandleDaSSD::SaveCalibrationSSDLDC(Char_t*& dafname)
       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()));
@@ -1030,7 +1082,7 @@ Bool_t AliITSHandleDaSSD::SaveCalibrationSSDLDC(Char_t*& dafname)
 
 
 //______________________________________________________________________________
-Int_t AliITSHandleDaSSD::MergeBadChannels(AliITSBadChannelsSSD*&  bcl) const
+Int_t AliITSHandleDaSSD::MergeBadChannels(AliITSBadChannelsSSDv2*&  bcl) const
 {
 // Merges the statick bad channels list with bad channels got upon calibration
   AliITSModuleDaSSD     *module = 0;
@@ -1082,8 +1134,9 @@ Bool_t AliITSHandleDaSSD::DumpModInfo(const Float_t meannosethreshold) const
   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; }
@@ -1091,15 +1144,19 @@ Bool_t AliITSHandleDaSSD::DumpModInfo(const Float_t meannosethreshold) const
         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;
 }
@@ -1109,7 +1166,7 @@ Bool_t AliITSHandleDaSSD::DumpModInfo(const Float_t meannosethreshold) const
 //______________________________________________________________________________
 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;
@@ -1169,6 +1226,7 @@ Bool_t AliITSHandleDaSSD::AllocateSimulatedModules(const Int_t copymodind)
       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++) {
@@ -1203,8 +1261,8 @@ Bool_t AliITSHandleDaSSD::AdDataPresent(const Int_t ddl, const Int_t ad) const
 
 //___________________________________________________________________________________________
 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;
@@ -1221,8 +1279,8 @@ Bool_t AliITSHandleDaSSD::SaveEqSlotCalibrationData(const Int_t ddl, const Int_t
        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;
@@ -1250,7 +1308,7 @@ Int_t AliITSHandleDaSSD::ChannelIsBad(const UChar_t ddl, const UChar_t ad, const
     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;
@@ -1258,9 +1316,9 @@ Int_t AliITSHandleDaSSD::ChannelIsBad(const UChar_t ddl, const UChar_t ad, const
       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;
@@ -1319,13 +1377,13 @@ ULong_t AliITSHandleDaSSD::OffsetValue(const AliITSChannelDaSSD *strip,
   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)));
@@ -1342,8 +1400,8 @@ ULong_t AliITSHandleDaSSD::OffsetValue(const UChar_t ddl, const UChar_t ad, cons
 // 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;
@@ -1357,7 +1415,7 @@ ULong_t AliITSHandleDaSSD::OffsetValue(const UChar_t ddl, const UChar_t ad, cons
 
 
 //______________________________________________________________________________
-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;
@@ -1378,9 +1436,10 @@ ULong_t AliITSHandleDaSSD::ZsThreshold(const UChar_t ddl, const UChar_t ad, cons
   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;
@@ -1465,3 +1524,217 @@ Int_t AliITSHandleDaSSD::CheckOffChips() const
   }
   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;
+}
+