]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSDetTypeRec.cxx
Fixes for reading zero-suppressed data. These should be propagated to
[u/mrichter/AliRoot.git] / ITS / AliITSDetTypeRec.cxx
index 9b8c4d4826cebebd3cfb60b6a6e0d61fc2c7eb97..41a1a1ec2bf431704e080c612bfcbed242416d9f 100644 (file)
 #include "AliITSClusterFinderSDD.h"
 #include "AliITSClusterFinderSSD.h"
 #include "AliITSDetTypeRec.h"
+#include "AliITSgeom.h"
 #include "AliITSRawCluster.h"
 #include "AliITSRawClusterSPD.h"
 #include "AliITSRawClusterSDD.h"
 #include "AliITSRawClusterSSD.h"
 #include "AliITSRecPoint.h"
+#include "AliITSReconstructor.h"
+#include "AliITSRecoParam.h"
 #include "AliITSCalibrationSDD.h"
+#include "AliITSMapSDD.h"
+#include "AliITSDriftSpeedArraySDD.h"
+#include "AliITSDriftSpeedSDD.h"
+#include "AliITSHLTforSDD.h"
+#include "AliITSCalibrationSSD.h"
+#include "AliITSNoiseSSDv2.h"
+#include "AliITSGainSSDv2.h"
+#include "AliITSBadChannelsSSDv2.h"
+#include "AliITSNoiseSSD.h"
+#include "AliITSGainSSD.h"
+#include "AliITSBadChannelsSSD.h"
 #include "AliITSsegmentationSPD.h"
 #include "AliITSsegmentationSDD.h"
 #include "AliITSsegmentationSSD.h"
@@ -59,57 +73,26 @@ ClassImp(AliITSDetTypeRec)
 //________________________________________________________________
 AliITSDetTypeRec::AliITSDetTypeRec(): TObject(),
 fNMod(0),
+fITSgeom(0),
 fReconstruction(0),
 fSegmentation(0),
 fCalibration(0),
+fSSDCalibration(0),
+fSPDDead(0),
 fPreProcess(0),
 fPostProcess(0),
 fDigits(0),
+fDDLMapSDD(0),
+fRespSDD(0),
+fIsHLTmodeC(0),
 fNdtype(0),
 fCtype(0),
 fNctype(0),
 fRecPoints(0),
 fNRecPoints(0),
 fSelectedVertexer(),
-fLoader(0),
-fRunNumber(0),
-fFirstcall(kTRUE){
-    // Default Constructor
-    // Inputs:
-    //    none.
-    // Outputs:
-    //    none.
-    // Return:
-    //    A properly zero-ed AliITSDetTypeRec class.
-
-  for(Int_t i=0; i<3; i++){
-    fClusterClassName[i]=0;
-    fDigClassName[i]=0;
-    fRecPointClassName[i]=0;
-  }
-
-  SelectVertexer(" ");
-
-
-}
-//________________________________________________________________
-AliITSDetTypeRec::AliITSDetTypeRec(AliITSLoader *loader): TObject(),
-fNMod(0),
-fReconstruction(0),
-fSegmentation(0),
-fCalibration(0),
-fPreProcess(0),
-fPostProcess(0),
-fDigits(0),
-fNdtype(0),
-fCtype(0),
-fNctype(0),
-fRecPoints(0),
-fNRecPoints(0),
-fSelectedVertexer(),
-fLoader(loader),
-fRunNumber(0),
-fFirstcall(kTRUE){
+fFirstcall(kTRUE),
+fLoadOnlySPDCalib(0){
     // Standard Constructor
     // Inputs:
     //    none.
@@ -125,6 +108,7 @@ fFirstcall(kTRUE){
     fDigClassName[i]=0;
     fRecPointClassName[i]=0;
   }
+  fSSDCalibration=new AliITSCalibrationSSD();
   fNdtype = new Int_t[fgkNdettypes];
   fCtype = new TObjArray(fgkNdettypes);
   fNctype = new Int_t[fgkNdettypes];
@@ -141,28 +125,31 @@ fFirstcall(kTRUE){
   }
   
   SelectVertexer(" "); 
-  SetRunNumber();
 }
 
 //______________________________________________________________________
 AliITSDetTypeRec::AliITSDetTypeRec(const AliITSDetTypeRec & rec):TObject(rec),
 fNMod(rec.fNMod),
+fITSgeom(rec.fITSgeom),
 fReconstruction(rec.fReconstruction),
 fSegmentation(rec.fSegmentation),
 fCalibration(rec.fCalibration),
+fSSDCalibration(rec.fSSDCalibration),
+fSPDDead(rec.fSPDDead),
 fPreProcess(rec.fPreProcess),
 fPostProcess(rec.fPostProcess),
 fDigits(rec.fDigits),
+fDDLMapSDD(rec.fDDLMapSDD),
+fRespSDD(rec.fRespSDD),
+fIsHLTmodeC(rec.fIsHLTmodeC),
 fNdtype(rec.fNdtype),
 fCtype(rec.fCtype),
 fNctype(rec.fNctype),
 fRecPoints(rec.fRecPoints),
 fNRecPoints(rec.fNRecPoints),
 fSelectedVertexer(rec.fSelectedVertexer),
-fLoader(rec.fLoader),
-fRunNumber(rec.fRunNumber),
-fFirstcall(rec.fFirstcall)
-{
+fFirstcall(rec.fFirstcall),
+fLoadOnlySPDCalib(rec.fLoadOnlySPDCalib){
 
   // Copy constructor. 
 
@@ -179,7 +166,7 @@ AliITSDetTypeRec& AliITSDetTypeRec::operator=(const AliITSDetTypeRec& source){
 //_____________________________________________________________________
 AliITSDetTypeRec::~AliITSDetTypeRec(){
   //Destructor
+
   if(fReconstruction){
     fReconstruction->Delete();
     delete fReconstruction;
@@ -190,20 +177,25 @@ AliITSDetTypeRec::~AliITSDetTypeRec(){
     delete fSegmentation;
     fSegmentation = 0;
   }
-  if(fCalibration && fRunNumber<0){
-    AliITSresponse* rspd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSPD()))->GetResponse();    
-    AliITSresponse* rsdd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSDD()))->GetResponse();
-    AliITSresponse* rssd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSSD()))->GetResponse();
-    if(rspd) delete rspd;
-    if(rsdd) delete rsdd;
-    if(rssd) delete rssd;
-    fCalibration->Delete();
-    delete fCalibration;
-    fCalibration = 0;
+  if(fCalibration){
+    if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+      fCalibration->Delete();
+      delete fCalibration;
+      fCalibration = 0;
+      if(fRespSDD) delete fRespSDD;
+      if(fDDLMapSDD) delete fDDLMapSDD;
+   }
   }
+  if(fSSDCalibration) delete fSSDCalibration;
+   if(fSPDDead){
+    if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+      fSPDDead->Delete();
+      delete fSPDDead;
+      fSPDDead = 0;
+    }
+  }  
   if(fPreProcess) delete fPreProcess;
   if(fPostProcess) delete fPostProcess;
-
   if(fDigits){
     fDigits->Delete();
     delete fDigits;
@@ -222,8 +214,9 @@ AliITSDetTypeRec::~AliITSDetTypeRec(){
   delete [] fNctype;
   delete [] fNdtype;
   delete [] fNMod;
-  if(fLoader) delete fLoader;
   
+  if (fITSgeom) delete fITSgeom;
 }
 
 //___________________________________________________________________
@@ -284,6 +277,20 @@ void AliITSDetTypeRec::SetCalibrationModel(Int_t iMod, AliITSCalibration *cal){
 
 }
 //_______________________________________________________________________
+void AliITSDetTypeRec::SetSPDDeadModel(Int_t iMod, AliITSCalibration *cal){
+
+  //Set dead pixel info for the SPD module iMod
+  if (fSPDDead==0) {
+    fSPDDead = new TObjArray(fgkDefaultNModulesSPD);
+    fSPDDead->SetOwner(kTRUE);
+    fSPDDead->Clear();
+  }
+
+  if (fSPDDead->At(iMod) != 0)
+    delete (AliITSCalibration*) fSPDDead->At(iMod);
+  fSPDDead->AddAt(cal,iMod);
+}
+//_______________________________________________________________________
 AliITSCalibration* AliITSDetTypeRec::GetCalibrationModel(Int_t iMod){
   
   //Get calibration model for module type
@@ -293,19 +300,28 @@ AliITSCalibration* AliITSDetTypeRec::GetCalibrationModel(Int_t iMod){
     return 0; 
   }  
 
-  return (AliITSCalibration*)fCalibration->At(iMod);
+  if(iMod<fgkDefaultNModulesSPD+fgkDefaultNModulesSDD){
+    return (AliITSCalibration*)fCalibration->At(iMod);
+  }else{
+    Int_t i=iMod-(fgkDefaultNModulesSPD+fgkDefaultNModulesSDD);
+    fSSDCalibration->SetModule(i);
+    return (AliITSCalibration*)fSSDCalibration;
+  }
+
 }
+//_______________________________________________________________________
+AliITSCalibration* AliITSDetTypeRec::GetSPDDeadModel(Int_t iMod){
+  
+  //Get SPD dead for module iMod
+  
+  if(fSPDDead==0) {
+    AliWarning("fSPDDead is 0!");
+    return 0; 
+  }  
 
-//______________________________________________________________________
-void AliITSDetTypeRec::SetTreeAddress(){
-    // Set branch address for the Trees.
-  TTree *treeR = fLoader->TreeR();
-  TTree *treeD = fLoader->TreeD();
-  SetTreeAddressD(treeD);
-  SetTreeAddressR(treeR);
+  return (AliITSCalibration*)fSPDDead->At(iMod);
 }
+
 //______________________________________________________________________
 void AliITSDetTypeRec::SetTreeAddressD(TTree *treeD){
     // Set branch address for the tree of digits.
@@ -338,7 +354,7 @@ void AliITSDetTypeRec::SetTreeAddressD(TTree *treeD){
 TBranch* AliITSDetTypeRec::MakeBranchInTree(TTree *tree, const char* name, 
                                        const char *classname, 
                                        void* address,Int_t size, 
-                                       Int_t splitlevel, const char */*file*/)
+                                       Int_t splitlevel)
 { 
 //
 // Makes branch in given tree and diverts them to a separate file
@@ -379,33 +395,32 @@ void AliITSDetTypeRec::SetDefaults(){
 
   for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
     if(dettype==0){
-      seg = new AliITSsegmentationSPD(GetITSgeom());
+      seg = new AliITSsegmentationSPD();
       SetSegmentationModel(dettype,seg);
       SetDigitClassName(dettype,"AliITSdigitSPD");
       SetClusterClassName(dettype,"AliITSRawClusterSPD");
 
     }
-    if(dettype==1){
-      AliITSCalibrationSDD* res=(AliITSCalibrationSDD*) GetCalibrationModel(GetITSgeom()->GetStartSDD()); 
-      seg = new AliITSsegmentationSDD(GetITSgeom(),res);
-      SetSegmentationModel(dettype,seg);
-      const char *kopt = ((AliITSresponseSDD*)res->GetResponse())->ZeroSuppOption();
-      if((!strstr(kopt,"2D"))&&(!strstr(kopt,"1D"))) SetDigitClassName(dettype,"AliITSdigit");
-      else SetDigitClassName(dettype,"AliITSdigitSDD");
-      SetClusterClassName(dettype,"AliITSRawClusterSDD");
-
+    if(fLoadOnlySPDCalib==kFALSE){
+      if(dettype==1){
+       seg = new AliITSsegmentationSDD();
+       AliITSCalibrationSDD* cal=(AliITSCalibrationSDD*)GetCalibrationModel(fgkDefaultNModulesSPD+1);
+       if(cal->IsAMAt20MHz()){ 
+         seg->SetPadSize(seg->Dpz(0),20.);
+         seg->SetNPads(seg->Npz()/2,128);
+       }
+       SetSegmentationModel(dettype,seg);
+       SetDigitClassName(dettype,"AliITSdigitSDD");
+       SetClusterClassName(dettype,"AliITSRawClusterSDD");
+      }
     }
     if(dettype==2){
-      AliITSsegmentationSSD* seg2 = new AliITSsegmentationSSD(GetITSgeom());
-      seg2->SetAngles(0.0075,0.0275); // strip angels rad P and N side.
-      seg2->SetAnglesLay5(0.0075,0.0275); // strip angels rad P and N side.
-      seg2->SetAnglesLay6(0.0275,0.0075); // strip angels rad P and N side.
+      AliITSsegmentationSSD* seg2 = new AliITSsegmentationSSD();
       SetSegmentationModel(dettype,seg2);
       SetDigitClassName(dettype,"AliITSdigitSSD");
       SetClusterClassName(dettype,"AliITSRawClusterSSD");
     }
   }
-  
 }
 //______________________________________________________________________
 Bool_t AliITSDetTypeRec::GetCalibration() {
@@ -414,101 +429,210 @@ Bool_t AliITSDetTypeRec::GetCalibration() {
   if(!fFirstcall){
     AliITSCalibration* cal = GetCalibrationModel(0);
     if(cal)return kTRUE;
-  }
-  else {
+  }else {
     fFirstcall = kFALSE;
   }
 
-  SetRunNumber((Int_t)AliCDBManager::Instance()->GetRun());
-  Int_t run=GetRunNumber();
+  //  SetRunNumber((Int_t)AliCDBManager::Instance()->GetRun());
+  //  Int_t run=GetRunNumber();
 
-  Bool_t origCacheStatus = AliCDBManager::Instance()->GetCacheFlag();
-  Bool_t isCacheActive = kTRUE;
-  if(GetRunNumber()<0)isCacheActive=kFALSE;
+  Bool_t cacheStatus = AliCDBManager::Instance()->GetCacheFlag();
   if (fCalibration==0) {
     fCalibration = new TObjArray(GetITSgeom()->GetIndexMax());
-    fCalibration->SetOwner(isCacheActive);
+    fCalibration->SetOwner(!cacheStatus);
     fCalibration->Clear();
   }
+  
+  // dead pixel are not used for local reconstruction
+  AliCDBEntry *entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDNoisy");
+  AliCDBEntry *deadSPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDDead");
+  if(!entrySPD || !deadSPD ){
+    AliFatal("SPD Calibration object retrieval failed! ");
+    return kFALSE;
+  }    
+  
+  TObjArray *calSPD = (TObjArray *)entrySPD->GetObject();
+  if(!cacheStatus)entrySPD->SetObject(NULL);
+  entrySPD->SetOwner(kTRUE);
+  TObjArray *caldeadSPD = (TObjArray *)deadSPD->GetObject();
+  if(!cacheStatus)deadSPD->SetObject(NULL);
+  deadSPD->SetOwner(kTRUE);
 
-  AliCDBManager::Instance()->SetCacheFlag(isCacheActive);
+  if(!cacheStatus){
+    delete entrySPD;
+    delete deadSPD;
+  }
+  if ((!calSPD) || (!caldeadSPD)){ 
+    AliWarning("Can not get SPD calibration from calibration database !");
+    return kFALSE;
+  }
 
-  AliCDBEntry *entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", run);
-  AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", run);
-  AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", run);
-  AliCDBEntry *entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", run);
-  AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", run);
-  AliCDBEntry *entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", run);
+  fNMod[0] = calSPD->GetEntries();
 
-  if(!entrySPD || !entrySDD || !entrySSD || !entry2SPD || !entry2SDD || !entry2SSD){
-    AliFatal("Calibration object retrieval failed! ");
+  AliITSCalibration* cal;
+  for (Int_t i=0; i<fNMod[0]; i++) {
+    cal = (AliITSCalibration*) calSPD->At(i);
+    SetCalibrationModel(i, cal);
+    cal = (AliITSCalibration*) caldeadSPD->At(i);
+    SetSPDDeadModel(i, cal);
+  }
+
+
+
+  if(fLoadOnlySPDCalib==kFALSE){
+    Bool_t retCode=GetCalibrationSDDSSD(cacheStatus);
+    if(retCode==kFALSE) return kFALSE;
+  }
+  AliInfo(Form("%i SPD, %i SDD and %i SSD in calibration database",
+              fNMod[0], fNMod[1], fNMod[2]));
+  return kTRUE;
+}
+//______________________________________________________________________
+Bool_t AliITSDetTypeRec::GetCalibrationSDDSSD(Bool_t cacheStatus) {
+  // Get SDD and SSD calibration objects from OCDB
+  AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD");
+  //  AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD");
+  AliCDBEntry *entryNoiseSSD = AliCDBManager::Instance()->Get("ITS/Calib/NoiseSSD");
+  AliCDBEntry *entryGainSSD = AliCDBManager::Instance()->Get("ITS/Calib/GainSSD");
+  AliCDBEntry *entryBadChannelsSSD = AliCDBManager::Instance()->Get("ITS/Calib/BadChannelsSSD");
+  AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD");
+  AliCDBEntry *drSpSDD = AliCDBManager::Instance()->Get("ITS/Calib/DriftSpeedSDD");
+  AliCDBEntry *ddlMapSDD = AliCDBManager::Instance()->Get("ITS/Calib/DDLMapSDD");
+  AliCDBEntry *hltforSDD = AliCDBManager::Instance()->Get("ITS/Calib/HLTforSDD");
+  //   AliCDBEntry *mapASDD = AliCDBManager::Instance()->Get("ITS/Calib/MapsAnodeSDD");
+  AliCDBEntry *mapTSDD = AliCDBManager::Instance()->Get("ITS/Calib/MapsTimeSDD");
+
+  if(!entrySDD || !entryNoiseSSD || !entryGainSSD || 
+     !entryBadChannelsSSD || 
+     !entry2SDD || !drSpSDD || !ddlMapSDD || !hltforSDD || !mapTSDD ){
+    AliFatal("SDD,SSD Calibration object retrieval failed! ");
     return kFALSE;
   }    
 
-  TObjArray *calSPD = (TObjArray *)entrySPD->GetObject();
-  if(!isCacheActive)entrySPD->SetObject(NULL);
-  entrySPD->SetOwner(kTRUE);
-  AliITSresponseSPD *pSPD = (AliITSresponseSPD*)entry2SPD->GetObject();
-  if(!isCacheActive)entry2SPD->SetObject(NULL);
-  entry2SPD->SetOwner(kTRUE);
+
     
   TObjArray *calSDD = (TObjArray *)entrySDD->GetObject();
-  if(!isCacheActive)entrySDD->SetObject(NULL);
+  if(!cacheStatus)entrySDD->SetObject(NULL);
   entrySDD->SetOwner(kTRUE);
  
   AliITSresponseSDD *pSDD = (AliITSresponseSDD*)entry2SDD->GetObject();
-  if(!isCacheActive)entry2SDD->SetObject(NULL);
+  if(!cacheStatus)entry2SDD->SetObject(NULL);
   entry2SDD->SetOwner(kTRUE);
 
-  TObjArray *calSSD = (TObjArray *)entrySSD->GetObject();
-  if(!isCacheActive)entrySSD->SetObject(NULL);
-  entrySSD->SetOwner(kTRUE);
+  TObjArray *drSp = (TObjArray *)drSpSDD->GetObject();
+  if(!cacheStatus)drSpSDD->SetObject(NULL);
+  drSpSDD->SetOwner(kTRUE);
 
-  AliITSresponseSSD *pSSD = (AliITSresponseSSD*)entry2SSD->GetObject();
-  if(!isCacheActive)entry2SSD->SetObject(NULL);
-  entry2SSD->SetOwner(kTRUE);
+  AliITSDDLModuleMapSDD *ddlsdd=(AliITSDDLModuleMapSDD*)ddlMapSDD->GetObject();
+  if(!cacheStatus)ddlMapSDD->SetObject(NULL);
+  ddlMapSDD->SetOwner(kTRUE);
+
+  AliITSHLTforSDD* hltsdd=(AliITSHLTforSDD*)hltforSDD->GetObject();
+  if(!cacheStatus)hltforSDD->SetObject(NULL);
+  hltforSDD->SetOwner(kTRUE);
+  
+//   TObjArray *mapAn = (TObjArray *)mapASDD->GetObject();
+//   if(!cacheStatus)mapASDD->SetObject(NULL);
+//   mapASDD->SetOwner(kTRUE);
+
+  TObjArray *mapT = (TObjArray *)mapTSDD->GetObject();
+  if(!cacheStatus)mapTSDD->SetObject(NULL);
+  mapTSDD->SetOwner(kTRUE);
+
+  TObject *emptyssd = 0; TString ssdobjectname = 0;
+  AliITSNoiseSSDv2 *noiseSSD = new AliITSNoiseSSDv2();  
+  emptyssd = (TObject *)entryNoiseSSD->GetObject();
+  ssdobjectname = emptyssd->GetName();
+  if(ssdobjectname=="TObjArray") {
+    TObjArray *noiseSSDOld = (TObjArray *)entryNoiseSSD->GetObject();
+    ReadOldSSDNoise(noiseSSDOld, noiseSSD);
+  }
+  else if(ssdobjectname=="AliITSNoiseSSDv2")
+    noiseSSD = (AliITSNoiseSSDv2 *)entryNoiseSSD->GetObject();
+  if(!cacheStatus)entryNoiseSSD->SetObject(NULL);
+  entryNoiseSSD->SetOwner(kTRUE);
+
+  AliITSGainSSDv2 *gainSSD = new AliITSGainSSDv2();
+  emptyssd = (TObject *)entryGainSSD->GetObject();
+  ssdobjectname = emptyssd->GetName();
+  if(ssdobjectname=="Gain") {
+    TObjArray *gainSSDOld = (TObjArray *)entryGainSSD->GetObject();
+    ReadOldSSDGain(gainSSDOld, gainSSD);
+  }
+  else if(ssdobjectname=="AliITSGainSSDv2")
+    gainSSD = (AliITSGainSSDv2 *)entryGainSSD->GetObject();
+  if(!cacheStatus)entryGainSSD->SetObject(NULL);
+  entryGainSSD->SetOwner(kTRUE);
+
+  AliITSBadChannelsSSDv2 *badChannelsSSD = new AliITSBadChannelsSSDv2();
+  emptyssd = (TObject *)entryBadChannelsSSD->GetObject();
+  ssdobjectname = emptyssd->GetName();
+  if(ssdobjectname=="TObjArray") {
+    TObjArray *badChannelsSSDOld = (TObjArray *)entryBadChannelsSSD->GetObject();
+    ReadOldSSDBadChannels(badChannelsSSDOld, badChannelsSSD);
+  }
+  else if(ssdobjectname=="AliITSBadChannelsSSDv2")
+    badChannelsSSD = (AliITSBadChannelsSSDv2*)entryBadChannelsSSD->GetObject();
+  if(!cacheStatus)entryBadChannelsSSD->SetObject(NULL);
+  entryBadChannelsSSD->SetOwner(kTRUE);
 
   // DB entries are deleted. In this way metadeta objects are deleted as well
-  if(!isCacheActive){
-    delete entrySPD;
+  if(!cacheStatus){
     delete entrySDD;
-    delete entrySSD;
-    delete entry2SPD;
+    delete entryNoiseSSD;
+    delete entryGainSSD;
+    delete entryBadChannelsSSD;
     delete entry2SDD;
-    delete entry2SSD;
+    //delete mapASDD;
+    delete hltforSDD;
+    delete mapTSDD;
+    delete drSpSDD;
+    delete ddlMapSDD;
   }
 
-  AliCDBManager::Instance()->SetCacheFlag(origCacheStatus);
-  
-  if ((!pSPD)||(!pSDD)||(!pSSD) || (!calSPD) || (!calSDD) || (!calSSD)) {
-    AliWarning("Can not get calibration from calibration database !");
+  if ((!pSDD)||(!calSDD) || (!drSp) || (!ddlsdd)
+      || (!hltsdd) || (!mapT) || (!noiseSSD)|| (!gainSSD)|| (!badChannelsSSD)) {
+    AliWarning("Can not get SDD, SSD calibration from calibration database !");
     return kFALSE;
   }
 
-  fNMod[0] = calSPD->GetEntries();
   fNMod[1] = calSDD->GetEntries();
-  fNMod[2] = calSSD->GetEntries();
-  AliInfo(Form("%i SPD, %i SDD and %i SSD in calibration database",
-              fNMod[0], fNMod[1], fNMod[2]));
+
+  fDDLMapSDD=ddlsdd;
+  fRespSDD=pSDD;
+  fIsHLTmodeC=hltsdd->IsHLTmodeC();
   AliITSCalibration* cal;
-  for (Int_t i=0; i<fNMod[0]; i++) {
-    cal = (AliITSCalibration*) calSPD->At(i);
-    cal->SetResponse((AliITSresponse*)pSPD);
-    SetCalibrationModel(i, cal);
- }
-  for (Int_t i=0; i<fNMod[1]; i++) {
-    cal = (AliITSCalibration*) calSDD->At(i);
-    cal->SetResponse((AliITSresponse*)pSDD);
-    Int_t iMod = i + fNMod[0];
-    SetCalibrationModel(iMod, cal);
- }
-  for (Int_t i=0; i<fNMod[2]; i++) {
-    cal = (AliITSCalibration*) calSSD->At(i);
-    cal->SetResponse((AliITSresponse*)pSSD);
-    Int_t iMod = i + fNMod[0] + fNMod[1];
-    SetCalibrationModel(iMod, cal);
- }
+  for(Int_t iddl=0; iddl<AliITSDDLModuleMapSDD::GetNDDLs(); iddl++){
+    for(Int_t icar=0; icar<AliITSDDLModuleMapSDD::GetNModPerDDL();icar++){
+      Int_t iMod=fDDLMapSDD->GetModuleNumber(iddl,icar);
+      if(iMod==-1) continue;
+      Int_t i=iMod - fgkDefaultNModulesSPD;
+      cal = (AliITSCalibration*) calSDD->At(i);
+      Int_t i0=2*i;
+      Int_t i1=1+2*i;
+      AliITSDriftSpeedArraySDD* arr0 = (AliITSDriftSpeedArraySDD*) drSp->At(i0);
+      //      AliITSMapSDD* ma0 = (AliITSMapSDD*)mapAn->At(i0);
+      AliITSMapSDD* mt0 = (AliITSMapSDD*)mapT->At(i0);
+      AliITSDriftSpeedArraySDD* arr1 = (AliITSDriftSpeedArraySDD*) drSp->At(i1);
+      //      AliITSMapSDD* ma1 = (AliITSMapSDD*)mapAn->At(i1);
+      AliITSMapSDD* mt1 = (AliITSMapSDD*)mapT->At(i1);
+      cal->SetDriftSpeed(0,arr0);
+      cal->SetDriftSpeed(1,arr1);
+//       cal->SetMapA(0,ma0);
+//       cal->SetMapA(1,ma1);
+      cal->SetMapT(0,mt0);
+      cal->SetMapT(1,mt1);
+      SetCalibrationModel(iMod, cal);
+    }
+  }
+
+  fSSDCalibration->SetNoise(noiseSSD);
+  fSSDCalibration->SetGain(gainSSD);
+  fSSDCalibration->SetBadChannels(badChannelsSSD);
+  //fSSDCalibration->FillBadChipMap();
+
+
 
   return kTRUE;
 }
@@ -526,9 +650,7 @@ void AliITSDetTypeRec::SetDefaultClusterFinders(){
 
   AliITSClusterFinder *clf; 
 
-  MakeTreeC();
- for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
+  for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
     //SPD
     if(dettype==0){
       if(!GetReconstructionModel(dettype)){
@@ -576,7 +698,6 @@ void AliITSDetTypeRec::SetDefaultClusterFindersV2(Bool_t rawdata){
 
   AliITSClusterFinder *clf; 
 
-  MakeTreeC();
   for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
     //SPD
     if(dettype==0){
@@ -613,7 +734,7 @@ void AliITSDetTypeRec::SetDefaultClusterFindersV2(Bool_t rawdata){
    
 }
 //______________________________________________________________________
-void AliITSDetTypeRec::MakeBranch(Option_t* option){
+void AliITSDetTypeRec::MakeBranch(TTree* tree, Option_t* option){
 
   //Creates branches for clusters and recpoints
   Bool_t cR = (strstr(option,"R")!=0);
@@ -621,100 +742,8 @@ void AliITSDetTypeRec::MakeBranch(Option_t* option){
   
   if(cRF)cR = kFALSE;
 
-  if(cR) MakeBranchR(0);
-  if(cRF) MakeBranchRF(0);
-
-}
-
-//_____________________________________________________________
-void AliITSDetTypeRec::MakeTreeC(){
-  
-  //Create a separate tree to store the clusters
-  if(!fLoader){
-    Warning("MakeTreeC","ITS loader is null!");
-    return;
-  }
-  if(fLoader->TreeC()== 0x0) fLoader->MakeTree("C");
-  MakeBranchC();
-}
-
-//______________________________________________________________
-void AliITSDetTypeRec::MakeBranchC(){
-  
-  //Make branches in the tree of clusters
-
-  if(!fLoader){
-    Warning("MakeBranchC","ITS loader is null!");
-    return;
-  }
-  TTree* lTC = fLoader->TreeC();
-  if(lTC==0x0){
-    Error("MakeTreeC","Can not get TreeC from loader");
-    return;
-  }
-  
-  Int_t buffersize = 4000;
-  Char_t branchname[30];
-  Char_t* cluclass;
-  const char *det[4]={"SPD","SDD","SSD","ITS"};
-
-  for(Int_t i=0;i<fgkNdettypes;i++){
-    cluclass = GetClusterClassName(i);
-    if(fCtype==0x0)  fCtype = new TObjArray(fgkNdettypes);
-    if(!ClustersAddress(i)){
-      fCtype->AddAt(new TClonesArray(cluclass,1000),i);
-    }
-    if(fgkNdettypes==3) sprintf(branchname,"%sClusters%s",det[3],det[i]);
-    else sprintf(branchname,"%sClusters%d",det[3],i+1);
-    if(fCtype && lTC){
-      if(lTC->GetBranch(branchname)){
-       Warning("MakeBranchC","Branch %s already exists in TreeC",branchname);
-      } else{
-       Info("MakeBranchC","Creating branch %s in TreeC",branchname);
-       lTC->Branch(branchname,&((*fCtype)[i]),buffersize);
-      }
-    }
-
-  }
-  
-}
-
-//_______________________________________________________________
-void AliITSDetTypeRec::GetTreeC(Int_t event){
-  
-  //Get the clusters tree for this event and
-  //sets the branch address
-
-
-  if(!fLoader){
-    Warning("GetTreeC","ITS loader is null!");
-    return;
-  }
-  
-  Char_t branchname[30];
-  const char *det[4] = {"SPD","SDD","SSD","ITS"};
-  TTree* lTC = fLoader->TreeC();
-  
-  ResetClusters();
-  if(lTC) fLoader->CleanRawClusters();
-
-  TBranch* branch;
-  if(lTC){
-    Char_t* cluclass;
-    for(Int_t i=0;i<fgkNdettypes;i++){
-      cluclass = GetClusterClassName(i);
-      if(fCtype==0x0) fCtype = new TObjArray(fgkNdettypes);
-      if(!fCtype->At(i)) fCtype->AddAt(new TClonesArray(cluclass,1000),i);
-      if(fgkNdettypes==3) sprintf(branchname,"%sClusters%s",det[3],det[i]);
-      else sprintf(branchname,"%sClusters%d",det[3],i+1);
-      if(fCtype){
-       branch = lTC->GetBranch(branchname);
-       if(branch) branch->SetAddress(&((*fCtype)[i]));
-      }
-    }
-  } else{
-    Error("GetTreeC","cannot find clusters Tree for vent %d",event);
-  }
+  if(cR) MakeBranchR(tree);
+  if(cRF) MakeBranchRF(tree);
 
 }
 
@@ -771,7 +800,7 @@ void AliITSDetTypeRec::ResetClusters(Int_t i){
   if (fNctype)  fNctype[i]=0;
 }
 //__________________________________________________________________
-void AliITSDetTypeRec::MakeBranchR(const char *file, Option_t *opt){
+void AliITSDetTypeRec::MakeBranchR(TTree *treeR, Option_t *opt){
 
   //Creates tree branches for recpoints
   // Inputs:
@@ -779,11 +808,6 @@ void AliITSDetTypeRec::MakeBranchR(const char *file, Option_t *opt){
   //                       to. If blank it write the SDigits to the same
   //                       file in which the Hits were found.
 
-  if(!fLoader){
-    Warning("MakeBranchR","ITS loader is null!");
-    return;
-  }
-
   Int_t buffsz = 4000;
   char branchname[30];
 
@@ -800,13 +824,8 @@ void AliITSDetTypeRec::MakeBranchR(const char *file, Option_t *opt){
   }
   
   if(!fRecPoints)fRecPoints = new TClonesArray("AliITSRecPoint",1000);
-  if (fLoader->TreeR()) {
-    if(fRecPoints==0x0) fRecPoints = new TClonesArray("AliITSRecPoint",
-                                                     1000);
-    MakeBranchInTree(fLoader->TreeR(),branchname,0,&fRecPoints,buffsz,99,file);
-  } // end if
-
-  
+  if (treeR)
+    MakeBranchInTree(treeR,branchname,0,&fRecPoints,buffsz,99);
 }
 //______________________________________________________________________
 void AliITSDetTypeRec::SetTreeAddressR(TTree *treeR){
@@ -852,28 +871,20 @@ void AliITSDetTypeRec::AddRecPoint(const AliITSRecPoint &r){
 }
 
 //______________________________________________________________________
-void AliITSDetTypeRec::DigitsToRecPoints(Int_t evNumber,Int_t lastentry,Option_t *opt, Bool_t v2){
+void AliITSDetTypeRec::DigitsToRecPoints(TTree *treeD,TTree *treeR,Int_t lastentry,Option_t *opt, Bool_t v2){
   // cluster finding and reconstruction of space points
   // the condition below will disappear when the geom class will be
   // initialized for all versions - for the moment it is only for v5 !
   // 7 is the SDD beam test version
   // Inputs:
-  //      Int_t evNumber   Event number to be processed.
+  //      TTree *treeD     Digits tree
+  //      TTree *treeR     Clusters tree
   //      Int_t lastentry  Offset for module when not all of the modules
   //                       are processed.
   //      Option_t *opt    String indicating which ITS sub-detectors should
   //                       be processed. If ="All" then all of the ITS
   //                       sub detectors are processed.
 
-  if(!GetITSgeom()){
-    Warning("DigitsToRecPoints","Null pointer to AliITSgeom !");
-    return;
-  }
-  if(!fLoader){
-    Warning("DigitsToRecPoints","ITS loader is null!");
-    return;
-  }
-
   const char *all = strstr(opt,"All");
   const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
                         strstr(opt,"SSD")};
@@ -886,11 +897,6 @@ void AliITSDetTypeRec::DigitsToRecPoints(Int_t evNumber,Int_t lastentry,Option_t
     AliInfo("V2 cluster finder has been selected \n");
   }
 
-  TTree *treeC=fLoader->TreeC();
-  if(!treeC){
-    MakeTreeC();
-    MakeBranchC();
-  }
   AliITSClusterFinder *rec     = 0;
   Int_t id,module,first=0;
   for(module=0;module<GetITSgeom()->GetIndexMax();module++){
@@ -899,69 +905,47 @@ void AliITSDetTypeRec::DigitsToRecPoints(Int_t evNumber,Int_t lastentry,Option_t
       if(det[id]) first = GetITSgeom()->GetStartDet(id);
       rec = (AliITSClusterFinder*)GetReconstructionModel(id);
       TClonesArray *itsDigits  = DigitsAddress(id);
-      if (!rec) {
-          Error("DigitsToRecPoints",
-                "The reconstruction class was not instanciated! event=%d",
-                evNumber);
-          exit(1);
-      } 
-      ResetDigits();
-      TTree *lTD = fLoader->TreeD();
+      if (!rec)
+          AliFatal("The reconstruction class was not instanciated!");
+      ResetDigits();  // MvL: Not sure we neeed this when rereading anyways
       if (all) {
-          lTD->GetEvent(lastentry+module);
+          treeD->GetEvent(lastentry+module);
       }else {
-          lTD->GetEvent(lastentry+(module-first));
+          treeD->GetEvent(lastentry+(module-first));
       }
       Int_t ndigits = itsDigits->GetEntriesFast();
       if(ndigits>0){
        rec->SetDetTypeRec(this);
        rec->SetDigits(DigitsAddress(id));
-       rec->SetClusters(ClustersAddress(id));
+       //      rec->SetClusters(ClustersAddress(id));
        rec->FindRawClusters(module);
       } // end if
-      fLoader->TreeR()->Fill();
+      treeR->Fill();
       ResetRecPoints();
-      treeC->Fill();
       ResetClusters();
   } 
-      
-  fLoader->WriteRecPoints("OVERWRITE");
-  fLoader->WriteRawClusters("OVERWRITE");
 }
 //______________________________________________________________________
-void AliITSDetTypeRec::DigitsToRecPoints(AliRawReader* rawReader){
+void AliITSDetTypeRec::DigitsToRecPoints(AliRawReader* rawReader,TTree *treeR,Option_t *opt){
   // cluster finding and reconstruction of space points
   // the condition below will disappear when the geom class will be
   // initialized for all versions - for the moment it is only for v5 !
   // 7 is the SDD beam test version
   // Inputs:
-  //      Int_t evNumber   Event number to be processed.
-  //      Int_t lastentry  Offset for module when not all of the modules
-  //                       are processed.
-  //      Option_t *opt    String indicating which ITS sub-detectors should
-  //                       be processed. If ="All" then all of the ITS
-  //                       sub detectors are processed.
+  //      AliRawReader *rawReader  Pointer to the raw-data reader
+  //      TTree *treeR             Clusters tree
   // Outputs:
   //      none.
   // Return:
   //      none.
-  if(!GetITSgeom()){
-    Warning("DigitsToRecPoints","Null pointer to AliITSgeom !");
-    return;
-  }
-  if(!fLoader){
-    Warning("DigitsToRecPoints","ITS loader is null!");
-    return;
-  }
-
-  
+  const char *all = strstr(opt,"All");
+  const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
+                        strstr(opt,"SSD")};
   AliITSClusterFinderV2 *rec     = 0;
   Int_t id=0;
 
-  if(!fLoader->TreeR()) fLoader->MakeTree("R");
-  TTree* cTree = fLoader->TreeR();
   TClonesArray *array=new TClonesArray("AliITSRecPoint",1000);
-  cTree->Branch("ITSRecPoints",&array);
+  TBranch *branch = treeR->Branch("ITSRecPoints",&array);
   delete array;
  
   TClonesArray** clusters = new TClonesArray*[GetITSgeom()->GetIndexMax()]; 
@@ -969,23 +953,25 @@ void AliITSDetTypeRec::DigitsToRecPoints(AliRawReader* rawReader){
     clusters[iModule] = NULL;
   }
   for(id=0;id<3;id++){
+    if (!all && !det[id]) continue;
     rec = (AliITSClusterFinderV2*)GetReconstructionModel(id);
-    rec->SetDetTypeRec(this);
     if (!rec)
       AliFatal("The reconstruction class was not instanciated");
-
+    rec->SetDetTypeRec(this);
     rec->RawdataToClusters(rawReader,clusters);    
   } 
   Int_t nClusters =0;
   TClonesArray *emptyArray=new TClonesArray("AliITSRecPoint");
   for(Int_t iModule=0;iModule<GetITSgeom()->GetIndexMax();iModule++){
+    id = GetITSgeom()->GetModuleType(iModule);
+    if (!all && !det[id]) continue;
     array = clusters[iModule];
     if(!array){
       AliDebug(1,Form("data for module %d missing!",iModule));
       array = emptyArray;
     }
-    cTree->SetBranchAddress("ITSRecPoints",&array);
-    cTree->Fill();
+    branch->SetAddress(&array);
+    treeR->Fill();
     nClusters+=array->GetEntriesFast();
 
     if (array != emptyArray) {
@@ -995,12 +981,82 @@ void AliITSDetTypeRec::DigitsToRecPoints(AliRawReader* rawReader){
   }
   delete emptyArray;
 
-  fLoader->WriteRecPoints("OVERWRITE");
-
   delete[] clusters;
   Info("DigitsToRecPoints", "total number of found recpoints in ITS: %d\n", 
        nClusters);
   
 }
 
+//______________________________________________________________________
+void AliITSDetTypeRec::ReadOldSSDNoise(TObjArray *array, 
+                                      AliITSNoiseSSDv2 *noiseSSD) {
+  //Reads the old SSD calibration object and converts it to the new format
+  const Int_t fgkSSDSTRIPSPERMODULE = 1536;
+  const Int_t fgkSSDPSIDESTRIPSPERMODULE = 768;
+
+  Int_t fNMod = array->GetEntries();
+  cout<<"Converting old calibration object for noise..."<<endl;
+
+  //NOISE
+  Double_t noise = 0.0;
+  for (Int_t iModule = 0; iModule < fNMod; iModule++) {
+    AliITSNoiseSSD *noiseModule = (AliITSNoiseSSD*) (array->At(iModule));
+    for(Int_t iStrip = 0; iStrip < fgkSSDSTRIPSPERMODULE; iStrip++) {
+      noise = (iStrip < fgkSSDPSIDESTRIPSPERMODULE) ? noiseModule->GetNoiseP(iStrip) : noiseModule->GetNoiseN(1535 - iStrip);
+      if(iStrip < fgkSSDPSIDESTRIPSPERMODULE)
+       noiseSSD->AddNoiseP(iModule,iStrip,noise);
+      if(iStrip >= fgkSSDPSIDESTRIPSPERMODULE)
+       noiseSSD->AddNoiseN(iModule,1535 - iStrip,noise);
+    }//loop over strips
+  }//loop over modules      
+}
+
+//______________________________________________________________________
+void AliITSDetTypeRec::ReadOldSSDBadChannels(TObjArray *array, 
+                                            AliITSBadChannelsSSDv2 *badChannelsSSD) {
+  //Reads the old SSD calibration object and converts it to the new format
+  Int_t fNMod = array->GetEntries();
+  cout<<"Converting old calibration object for bad channels..."<<endl;
+  for (Int_t iModule = 0; iModule < fNMod; iModule++) {
+    //for (Int_t iModule = 0; iModule < 1; iModule++) {
+    AliITSBadChannelsSSD *bad = (AliITSBadChannelsSSD*) (array->At(iModule));
+    TArrayI arrayPSide = bad->GetBadPChannelsList();
+    for(Int_t iPCounter = 0; iPCounter < arrayPSide.GetSize(); iPCounter++) 
+      badChannelsSSD->AddBadChannelP(iModule,
+                                    iPCounter,
+                                    (Char_t)arrayPSide.At(iPCounter));
+        
+    TArrayI arrayNSide = bad->GetBadNChannelsList();
+    for(Int_t iNCounter = 0; iNCounter < arrayNSide.GetSize(); iNCounter++) 
+      badChannelsSSD->AddBadChannelN(iModule,
+                                    iNCounter,
+                                    (Char_t)arrayNSide.At(iNCounter));
+    
+  }//loop over modules      
+}
+
+//______________________________________________________________________
+void AliITSDetTypeRec::ReadOldSSDGain(TObjArray *array, 
+                                     AliITSGainSSDv2 *gainSSD) {
+  //Reads the old SSD calibration object and converts it to the new format
+
+  Int_t fNMod = array->GetEntries();
+  cout<<"Converting old calibration object for gain..."<<endl;
+
+  //GAIN
+  for (Int_t iModule = 0; iModule < fNMod; iModule++) {
+    AliITSGainSSD *gainModule = (AliITSGainSSD*) (array->At(iModule));
+    TArrayF arrayPSide = gainModule->GetGainP();
+    for(Int_t iPCounter = 0; iPCounter < arrayPSide.GetSize(); iPCounter++)
+      gainSSD->AddGainP(iModule,
+                       iPCounter,
+                       arrayPSide.At(iPCounter));
+    TArrayF arrayNSide = gainModule->GetGainN();
+    for(Int_t iNCounter = 0; iNCounter < arrayNSide.GetSize(); iNCounter++)
+      gainSSD->AddGainN(iModule,
+                       iNCounter,
+                       arrayNSide.At(iNCounter));
+  }//loop over modules 
+}
+