]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDPreprocessorOffline.cxx
Put 0.1 as minimal value of the gas gain (Raphaelle)
[u/mrichter/AliRoot.git] / TRD / AliTRDPreprocessorOffline.cxx
index cf67d89d56f6b306524a0771a8ef97b345beee3c..cc252ca7c752136adb328e8c6586d1122ee73c27 100644 (file)
@@ -57,6 +57,7 @@
 #include "AliTRDCalibraFit.h"
 #include "AliTRDCalibraVdriftLinearFit.h"
 #include "AliTRDPreprocessorOffline.h"
+#include "AliTRDCalChamberStatus.h"
 
 
 ClassImp(AliTRDPreprocessorOffline)
@@ -77,11 +78,16 @@ AliTRDPreprocessorOffline::AliTRDPreprocessorOffline():
   fCalibObjects(new TObjArray(8)),
   fVersionGainUsed(0),
   fSubVersionGainUsed(0),
+  fFirstRunVdriftUsed(0),
   fVersionVdriftUsed(0), 
   fSubVersionVdriftUsed(0),
   fSwitchOnValidation(kTRUE),
   fVdriftValidated(kFALSE),
-  fT0Validated(kFALSE)
+  fT0Validated(kFALSE),
+  fMinStatsVdriftT0PH(800*20),
+  fMinStatsVdriftLinear(800),
+  fMinStatsGain(800),
+  fMinStatsPRF(600)
 {
   //
   // default constructor
@@ -125,6 +131,7 @@ void AliTRDPreprocessorOffline::CalibVdriftT0(const Char_t* file, Int_t startRun
   // 2. extraction of the information
   //
   if(ReadVdriftT0Global(file)) AnalyzeVdriftT0();
+  //printf("Finish PH\n");
   if(ReadVdriftLinearFitGlobal(file)) AnalyzeVdriftLinearFit();
   //
   // 3. Append QA plots
@@ -229,6 +236,41 @@ void AliTRDPreprocessorOffline::CalibPRF(const Char_t* file, Int_t startRunNumbe
   //
   UpdateOCDBPRF(startRunNumber,endRunNumber,ocdbStorage);
   
+}
+//________________________________________________________________________________________________________________
+
+void AliTRDPreprocessorOffline::CalibChamberStatus(Int_t startRunNumber, Int_t endRunNumber, TString ocdbStorage){
+  //
+  // make calibration of the chamber status
+  // Input parameters:
+  //      startRunNumber, endRunNumber     - run validity period 
+  //      ocdbStorage                      - path to the OCDB storage
+  //                                       - if empty - local storage 'pwd' uesed
+  if (ocdbStorage.Length()<=0) ocdbStorage="local://"+gSystem->GetFromPipe("pwd")+"/OCDB";
+  //
+  //
+  // 2. extraction of the information
+  //
+  if(!AnalyzeChamberStatus()) return;
+  //
+  // 3. Append QA plots
+  //
+  //MakeDefaultPlots(fVdriftArray,fVdriftArray);
+  //
+  //
+  //
+  // 4. validate OCDB entries
+  //
+  if(fSwitchOnValidation==kTRUE && ValidateChamberStatus()==kFALSE) { 
+    AliError("TRD Chamber status OCDB parameters not ok!");
+    return;
+  }
+  //
+  // 5. update of OCDB
+  //
+  //
+  UpdateOCDBChamberStatus(startRunNumber,endRunNumber,ocdbStorage);
+  
 }
 //______________________________________________________________________________________________________
 Bool_t AliTRDPreprocessorOffline::Init(const Char_t* fileName){
@@ -239,6 +281,7 @@ Bool_t AliTRDPreprocessorOffline::Init(const Char_t* fileName){
   if(ReadVdriftT0Global(fileName)) {
     
     TString nameph = fPH2d->GetTitle();
+    fFirstRunVdriftUsed = GetFirstRun(nameph); 
     fVersionVdriftUsed = GetVersion(nameph);  
     fSubVersionVdriftUsed = GetSubVersion(nameph);    
 
@@ -370,7 +413,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeGain(){
   //
 
   AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
-  calibra->SetMinEntries(800); // If there is less than 1000 entries in the histo: no fit
+  calibra->SetMinEntries(fMinStatsGain); // If there is less than 1000 entries in the histo: no fit
   calibra->AnalyseCH(fCH2d);
 
   Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(0))
@@ -411,7 +454,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeVdriftT0(){
   //
 
   AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
-  calibra->SetMinEntries(800*20); // If there is less than 1000 entries in the histo: no fit
+  calibra->SetMinEntries(fMinStatsVdriftT0PH); // If there is less than 1000 entries in the histo: no fit
   calibra->AnalysePH(fPH2d);
 
   Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(1))
@@ -465,10 +508,15 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeVdriftLinearFit(){
   // Analyze vdrift linear fit - produce the calibration objects
   //
 
+  //printf("Analyse linear fit\n");
+
   AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
-  calibra->SetMinEntries(800); // If there is less than 1000 entries in the histo: no fit
+  calibra->SetMinEntries(fMinStatsVdriftLinear); // If there is less than 1000 entries in the histo: no fit
+  //printf("Fill PE Array\n");
   fAliTRDCalibraVdriftLinearFit->FillPEArray();
+  //printf("AliTRDCalibraFit\n");
   calibra->AnalyseLinearFitters(fAliTRDCalibraVdriftLinearFit);
+  //printf("After\n");
 
   //Int_t nbtg        = 540;
   Int_t nbfit       = calibra->GetNumberFit();
@@ -512,7 +560,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzePRF(){
   //
 
   AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
-  calibra->SetMinEntries(600); // If there is less than 1000 entries in the histo: no fit
+  calibra->SetMinEntries(fMinStatsPRF); // If there is less than 1000 entries in the histo: no fit
   calibra->AnalysePRFMarianFit(fPRF2d);
 
   Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(2))
@@ -541,263 +589,402 @@ Bool_t AliTRDPreprocessorOffline::AnalyzePRF(){
   return ok;
   
 }
-//________________________________________________________________________________________________
-void AliTRDPreprocessorOffline::CorrectFromDetGainUsed() {
+
+//_____________________________________________________________________________
+Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
+{
   //
-  // Correct from the gas gain used afterwards
+  // Produce AliTRDCalChamberStatus out of calibration results
   //
-  AliTRDCalDet *calDetGain = (AliTRDCalDet *) fCalibObjects->At(kGain);
-  if(!calDetGain) return;
-
-  // Calculate mean
-  Double_t mean = 0.0;
-  Int_t nbdet = 0;
   
-  for(Int_t det = 0; det < 540; det++) {
-    
-    Float_t gaininit = fCalDetGainUsed->GetValue(det);
-    Float_t gainout = calDetGain->GetValue(det);
+  // set up AliTRDCalChamberStatus
+  AliTRDCalChamberStatus *CalChamberStatus = new AliTRDCalChamberStatus();
+  for(Int_t det = 0; det < 540; det++) CalChamberStatus->SetStatus(det,1);
 
-   
-    if(TMath::Abs(gainout-1.0) > 0.000001) {
-      mean += (gaininit*gainout);
-      nbdet++;
-    }  
-  }
-  if(nbdet > 0) mean = mean/nbdet;
-   
-  for(Int_t det = 0; det < 540; det++) {
-    
-    Float_t gaininit = fCalDetGainUsed->GetValue(det);
-    Float_t gainout = calDetGain->GetValue(det);
+  // get calibration objects
+  AliTRDCalDet *calDetGain   = (AliTRDCalDet *) fCalibObjects->At(kGain);
+  AliTRDCalDet *calDetVDrift = (AliTRDCalDet *) fCalibObjects->At(kVdriftLinear);
+
+  // Check
+  if((!calDetGain) || (!calDetVDrift) || (!fCH2d)) return kFALSE;
+
+  // Gain
+  Double_t gainmean = calDetGain->GetMean();
+  Double_t vdriftmean = calDetVDrift->GetMean();
+
+  Double_t gainrms = calDetGain->GetRMSRobust();
+  Double_t vdriftrms = calDetVDrift->GetRMSRobust();
+
+  //printf("Gain mean: %f, rms: %f\n",gainmean,gainrms);
+  //printf("Vdrift mean: %f, rms: %f\n",vdriftmean,vdriftrms);
   
-    if(TMath::Abs(gainout-1.0) > 0.000001) calDetGain->SetValue(det,gaininit*gainout);
-    else calDetGain->SetValue(det,mean);
-  }
+  // Check
+  if((TMath::Abs(gainrms) < 0.001) || (TMath::Abs(vdriftrms) < 0.001)) return kFALSE;
 
+  // mask chambers with empty gain entries
+  //Int_t counter = 0;
+  for (Int_t idet = 0; idet < 540; idet++) {
 
-}
-//________________________________________________________________________________________________
-void AliTRDPreprocessorOffline::CorrectFromDetVdriftUsed() {
-  //
-  // Correct from the drift velocity
-  //
+    // ch2d
+    TH1I *projch =  (TH1I *) fCH2d->ProjectionX("projch",idet+1,idet+1,(Option_t *)"e");
+    Double_t entries = projch->GetEntries();
 
-  //printf("Correct for vdrift\n");
+    // gain
+    Double_t gain = calDetGain->GetValue(idet);
 
-  AliTRDCalDet *calDetGain = (AliTRDCalDet *) fCalibObjects->At(kGain);
-  if(!calDetGain) return;
+    // vdrift
+    Double_t vdrift = calDetVDrift->GetValue(idet);
 
-  Int_t detVdrift = kVdriftPHDet;
-  if(fMethodSecond) detVdrift = kVdriftLinear;
-  AliTRDCalDet *calDetVdrift = (AliTRDCalDet *) fCalibObjects->At(detVdrift);
-  if(!calDetVdrift) return;
 
-  // Calculate mean
-  
-  for(Int_t det = 0; det < 540; det++) {
-    
-    Float_t vdriftinit = fCalDetVdriftUsed->GetValue(det);
-    Float_t vdriftout = calDetVdrift->GetValue(det);
+    if(entries<=0.5 ||
+       TMath::Abs(gainmean-gain) > (15.0*gainrms) ||
+       TMath::Abs(vdriftmean-vdrift) > (15.0*vdriftrms)) {
+     
+      //printf(" chamber det %03d masked \n",idet);
+      //printf(" gainmean %f and gain %f, gainrms %f \n",gainmean,gain,gainrms);
+      //printf(" vdriftmean %f and vdrift %f, vdriftrms %f \n",vdriftmean,vdrift,vdriftrms);
+      CalChamberStatus->SetStatus(idet,AliTRDCalChamberStatus::kMasked);
+      //counter++;
+    }
 
-    Float_t gain = calDetGain->GetValue(det);
-    if(vdriftout > 0.0) gain = gain*vdriftinit/vdriftout;
-    calDetGain->SetValue(det,gain);
+     /*
+     // installed supermodules+1 -> abort
+     if(counter > (7+1)*30) {
+       printf("ERROR: more than one SM to be masked!! \n Abort...\n");
+       if(projch) delete projch;
+       return 0x0;
+     }
+     */
 
+    delete projch;
     
-  }
-}
-//_________________________________________________________________________________________________________________
-void AliTRDPreprocessorOffline::UpdateOCDBGain(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
-  //
-  // Update OCDB entry
-  //
-  
-  AliCDBMetaData *metaData= new AliCDBMetaData();
-  metaData->SetObjectClassName("AliTRDCalDet");
-  metaData->SetResponsible("Raphaelle Bailhache");
-  metaData->SetBeamPeriod(1);
-  
-  AliCDBId id1("TRD/Calib/ChamberGainFactor", startRunNumber, endRunNumber);
-  AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
-  AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kGain);
-  if(calDet) gStorage->Put(calDet, id1, metaData);
-    
+   }
 
-}
-//___________________________________________________________________________________________________________________
-void AliTRDPreprocessorOffline::UpdateOCDBVdrift(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
-  //
-  // Update OCDB entry
-  //
+   // Security
+   for(Int_t sm=0; sm < 18; sm++) {
+     Int_t counter = 0;
+     for(Int_t det = 0; det < 30; det++){
+       Int_t detector = sm*30+det;
+       if(CalChamberStatus->IsMasked(detector)) counter++;
+     }
+     if(counter >= 10) {
+       for(Int_t det = 0; det < 30; det++){
+        Int_t detector = sm*30+det;
+        CalChamberStatus->SetStatus(detector,AliTRDCalChamberStatus::kInstalled);
+       }
+     }
+   }
+
+   fCalibObjects->AddAt(CalChamberStatus,kChamberStatus);
+   return kTRUE;
+
+ }
 
-  Int_t detVdrift = kVdriftPHDet;
-  
-  if(fMethodSecond) detVdrift = kVdriftLinear;
-  
-  AliCDBMetaData *metaData= new AliCDBMetaData();
-  metaData->SetObjectClassName("AliTRDCalDet");
-  metaData->SetResponsible("Raphaelle Bailhache");
-  metaData->SetBeamPeriod(1);
-  
-  AliCDBId id1("TRD/Calib/ChamberVdrift", startRunNumber, endRunNumber);
-  AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
-  AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(detVdrift);
-  if(calDet) gStorage->Put(calDet, id1, metaData);
-  
-  //
 
-  if(!fMethodSecond) {
-    
-    AliCDBMetaData *metaDataPad= new AliCDBMetaData();
-    metaDataPad->SetObjectClassName("AliTRDCalPad");
-    metaDataPad->SetResponsible("Raphaelle Bailhache");
-    metaDataPad->SetBeamPeriod(1);
-    
-    AliCDBId id1Pad("TRD/Calib/LocalVdrift", startRunNumber, endRunNumber);
-    AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kVdriftPHPad);
-    if(calPad) gStorage->Put(calPad, id1Pad, metaDataPad);
-     
-  }
+ //________________________________________________________________________________________________
+ void AliTRDPreprocessorOffline::CorrectFromDetGainUsed() {
+   //
+   // Correct from the gas gain used afterwards
+   //
+   AliTRDCalDet *calDetGain = (AliTRDCalDet *) fCalibObjects->At(kGain);
+   if(!calDetGain) return;
 
-}
-//________________________________________________________________________________________________________________________
-void AliTRDPreprocessorOffline::UpdateOCDBT0(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
-  //
-  // Update OCDB entry
-  //
-  
-  AliCDBMetaData *metaData= new AliCDBMetaData();
-  metaData->SetObjectClassName("AliTRDCalDet");
-  metaData->SetResponsible("Raphaelle Bailhache");
-  metaData->SetBeamPeriod(1);
-  
-  AliCDBId id1("TRD/Calib/ChamberT0", startRunNumber, endRunNumber);
-  AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
-  AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kT0PHDet);
-  if(calDet) gStorage->Put(calDet, id1, metaData);
-  //
+   // Calculate mean
+   Double_t mean = 0.0;
+   Int_t nbdet = 0;
 
-  AliCDBMetaData *metaDataPad= new AliCDBMetaData();
-  metaDataPad->SetObjectClassName("AliTRDCalPad");
-  metaDataPad->SetResponsible("Raphaelle Bailhache");
-  metaDataPad->SetBeamPeriod(1);
-  
-  AliCDBId id1Pad("TRD/Calib/LocalT0", startRunNumber, endRunNumber);
-  AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kT0PHPad);
-  if(calPad) gStorage->Put(calPad, id1Pad, metaDataPad);
+   for(Int_t det = 0; det < 540; det++) {
 
+     Float_t gaininit = fCalDetGainUsed->GetValue(det);
+     Float_t gainout = calDetGain->GetValue(det);
 
-}
-//_________________________________________________________________________________________________________________
-void AliTRDPreprocessorOffline::UpdateOCDBPRF(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
-  //
-  // Update OCDB entry
-  //
-  
-  AliCDBMetaData *metaData= new AliCDBMetaData();
-  metaData->SetObjectClassName("AliTRDCalPad");
-  metaData->SetResponsible("Raphaelle Bailhache");
-  metaData->SetBeamPeriod(1);
-  
-  AliCDBId id1("TRD/Calib/PRFWidth", startRunNumber, endRunNumber);
-  AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
-  AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kPRF);
-  if(calPad) gStorage->Put(calPad, id1, metaData);
 
-}
-//__________________________________________________________________________________________________________________________
-Bool_t AliTRDPreprocessorOffline::ValidateGain() const {
-  //
-  // Validate OCDB entry
-  //
+     if(TMath::Abs(gainout-1.0) > 0.000001) {
+       mean += (gaininit*gainout);
+       nbdet++;
+     }  
+   }
+   if(nbdet > 0) mean = mean/nbdet;
 
-  AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kGain);
-  if(calDet) {
-    Double_t mean = calDet->GetMean();
-    Double_t rms = calDet->GetRMS();
-    if((mean > 0.2) && (mean < 1.4) && (rms < 0.5)) return kTRUE;
-    else return kFALSE;
-  }
-  else return kFALSE;
-    
+   for(Int_t det = 0; det < 540; det++) {
 
-}
-//__________________________________________________________________________________________________________________________
-Bool_t AliTRDPreprocessorOffline::ValidateVdrift(){
-  //
-  // Update OCDB entry
-  //
+     Float_t gaininit = fCalDetGainUsed->GetValue(det);
+     Float_t gainout = calDetGain->GetValue(det);
 
-  Int_t detVdrift = kVdriftPHDet;
-  Bool_t ok = kTRUE;
-  
-  if(fMethodSecond) detVdrift = kVdriftLinear;
-  
-  AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(detVdrift);
-  if(calDet) {
-    Double_t mean = calDet->GetMean();
-    Double_t rms = calDet->GetRMS();
-    //printf("Vdrift::mean %f, rms %f\n",mean,rms);
-    if(!((mean > 1.0) && (mean < 2.0) && (rms < 0.5))) ok = kFALSE;
-  }
-  else return kFALSE; 
-
-  if(!fMethodSecond) {
-    AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kVdriftPHPad);
-    if(calPad) {
-      Double_t mean = calPad->GetMean();
-      Double_t rms = calPad->GetRMS();
-      //printf("Vdrift::meanpad %f, rmspad %f\n",mean,rms);
-      if(!((mean > 0.9) && (mean < 1.1) && (rms < 0.6))) ok = kFALSE;
-    }
-    else return kFALSE;
-  }
+     if(TMath::Abs(gainout-1.0) > 0.000001) {
+       Double_t newgain = gaininit*gainout;
+       if(newgain < 0.1) newgain = 0.1;
+       calDetGain->SetValue(det,newgain);
+     }
+     else {
+       Double_t newgain = mean;
+       if(newgain < 0.1) newgain = 0.1;
+       calDetGain->SetValue(det,newgain);
+     }
+   }
 
-  return ok;
 
-}
-//__________________________________________________________________________________________________________________________
-Bool_t AliTRDPreprocessorOffline::ValidateT0(){
-  //
-  // Update OCDB entry
-  //
-  
-  AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kT0PHDet);
-  AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kT0PHPad);
-  if(calDet && calPad) {
-    Double_t meandet = calDet->GetMean();
-    Double_t rmsdet = calDet->GetRMS();
-    Double_t meanpad = calPad->GetMean();
-    //Double_t rmspad = calPad->GetRMS();
-    //printf("T0::minimum %f, rmsdet %f,meanpad %f, rmspad %f\n",meandet,rmsdet,meanpad,rmspad);
-    if((meandet > -1.5) && (meandet < 5.0) && (rmsdet < 4.0) && (meanpad < 5.0) && (meanpad > -0.5)) return kTRUE;
-    else return kFALSE;
-  }
-  else return kFALSE;
-}
-//__________________________________________________________________________________________________________________________
-Bool_t AliTRDPreprocessorOffline::ValidatePRF() const{
+ }
+ //________________________________________________________________________________________________
+ void AliTRDPreprocessorOffline::CorrectFromDetVdriftUsed() {
+   //
+   // Correct from the drift velocity
+   //
+
+   //printf("Correct for vdrift\n");
+
+   AliTRDCalDet *calDetGain = (AliTRDCalDet *) fCalibObjects->At(kGain);
+   if(!calDetGain) return;
+
+   Int_t detVdrift = kVdriftPHDet;
+   if(fMethodSecond) detVdrift = kVdriftLinear;
+   AliTRDCalDet *calDetVdrift = (AliTRDCalDet *) fCalibObjects->At(detVdrift);
+   if(!calDetVdrift) return;
+
+   // Calculate mean
+
+   for(Int_t det = 0; det < 540; det++) {
+
+     Float_t vdriftinit = fCalDetVdriftUsed->GetValue(det);
+     Float_t vdriftout = calDetVdrift->GetValue(det);
+
+     Float_t gain = calDetGain->GetValue(det);
+     if(vdriftout > 0.0) gain = gain*vdriftinit/vdriftout;
+     if(gain < 0.1) gain = 0.1;
+     calDetGain->SetValue(det,gain);
+
+
+   }
+
+ }
+ //_________________________________________________________________________________________________________________
+ void AliTRDPreprocessorOffline::UpdateOCDBGain(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
+   //
+   // Update OCDB entry
+   //
+
+   AliCDBMetaData *metaData= new AliCDBMetaData();
+   metaData->SetObjectClassName("AliTRDCalDet");
+   metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->SetBeamPeriod(1);
+
+   AliCDBId id1("TRD/Calib/ChamberGainFactor", startRunNumber, endRunNumber);
+   AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
+   AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kGain);
+   if(calDet) gStorage->Put(calDet, id1, metaData);
+
+
+ }
+ //___________________________________________________________________________________________________________________
+ void AliTRDPreprocessorOffline::UpdateOCDBVdrift(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
+   //
+   // Update OCDB entry
+   //
+
+   Int_t detVdrift = kVdriftPHDet;
+
+   if(fMethodSecond) detVdrift = kVdriftLinear;
+
+   AliCDBMetaData *metaData= new AliCDBMetaData();
+   metaData->SetObjectClassName("AliTRDCalDet");
+   metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->SetBeamPeriod(1);
+
+   AliCDBId id1("TRD/Calib/ChamberVdrift", startRunNumber, endRunNumber);
+   AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
+   AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(detVdrift);
+   if(calDet) gStorage->Put(calDet, id1, metaData);
+
+   //
+
+   if(!fMethodSecond) {
+
+     AliCDBMetaData *metaDataPad= new AliCDBMetaData();
+     metaDataPad->SetObjectClassName("AliTRDCalPad");
+     metaDataPad->SetResponsible("Raphaelle Bailhache");
+     metaDataPad->SetBeamPeriod(1);
+
+     AliCDBId id1Pad("TRD/Calib/LocalVdrift", startRunNumber, endRunNumber);
+     AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kVdriftPHPad);
+     if(calPad) gStorage->Put(calPad, id1Pad, metaDataPad);
+
+   }
+
+ }
+ //________________________________________________________________________________________________________________________
+ void AliTRDPreprocessorOffline::UpdateOCDBT0(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
+   //
+   // Update OCDB entry
+   //
+
+   AliCDBMetaData *metaData= new AliCDBMetaData();
+   metaData->SetObjectClassName("AliTRDCalDet");
+   metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->SetBeamPeriod(1);
+
+   AliCDBId id1("TRD/Calib/ChamberT0", startRunNumber, endRunNumber);
+   AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
+   AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kT0PHDet);
+   if(calDet) gStorage->Put(calDet, id1, metaData);
+
+   //
+
+   AliCDBMetaData *metaDataPad= new AliCDBMetaData();
+   metaDataPad->SetObjectClassName("AliTRDCalPad");
+   metaDataPad->SetResponsible("Raphaelle Bailhache");
+   metaDataPad->SetBeamPeriod(1);
+
+   AliCDBId id1Pad("TRD/Calib/LocalT0", startRunNumber, endRunNumber);
+   AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kT0PHPad);
+   if(calPad) gStorage->Put(calPad, id1Pad, metaDataPad);
+
+
+
+ }
+ //_________________________________________________________________________________________________________________
+ void AliTRDPreprocessorOffline::UpdateOCDBPRF(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
+   //
+   // Update OCDB entry
+   //
+
+   AliCDBMetaData *metaData= new AliCDBMetaData();
+   metaData->SetObjectClassName("AliTRDCalPad");
+   metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->SetBeamPeriod(1);
+
+   AliCDBId id1("TRD/Calib/PRFWidth", startRunNumber, endRunNumber);
+   AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
+   AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kPRF);
+   if(calPad) gStorage->Put(calPad, id1, metaData);
+
+
+ }
+ //_________________________________________________________________________________________________________________
+ void AliTRDPreprocessorOffline::UpdateOCDBChamberStatus(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
+   //
+   // Update OCDB entry
+   //
+
+   AliCDBMetaData *metaData= new AliCDBMetaData();
+   metaData->SetObjectClassName("AliTRDCalChamberStatus");
+   metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->SetBeamPeriod(1);
+
+   AliCDBId id1("TRD/Calib/ChamberStatus", startRunNumber, endRunNumber);
+   AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
+   AliTRDCalChamberStatus *calChamberStatus = (AliTRDCalChamberStatus *) fCalibObjects->At(kChamberStatus);
+   if(calChamberStatus) gStorage->Put(calChamberStatus, id1, metaData);
+
+
+ }
+ //__________________________________________________________________________________________________________________________
+ Bool_t AliTRDPreprocessorOffline::ValidateGain() const {
+   //
+   // Validate OCDB entry
+   //
+
+   AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kGain);
+   if(calDet) {
+     Double_t mean = calDet->GetMean();
+     Double_t rms = calDet->GetRMSRobust();
+     if((mean > 0.2) && (mean < 1.4) && (rms < 0.5)) return kTRUE;
+     //if((mean > 0.2) && (mean < 1.4)) return kTRUE;
+     else return kFALSE;
+   }
+   else return kFALSE;
+
+
+ }
+ //__________________________________________________________________________________________________________________________
+ Bool_t AliTRDPreprocessorOffline::ValidateVdrift(){
+   //
+   // Update OCDB entry
+   //
+
+   Int_t detVdrift = kVdriftPHDet;
+   Bool_t ok = kTRUE;
+
+   if(fMethodSecond) detVdrift = kVdriftLinear;
+
+   AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(detVdrift);
+   if(calDet) {
+     Double_t mean = calDet->GetMean();
+     Double_t rms = calDet->GetRMSRobust();
+     //printf("Vdrift::mean %f, rms %f\n",mean,rms);
+     if(!((mean > 1.0) && (mean < 2.0) && (rms < 0.5))) ok = kFALSE;
+   }
+   else return kFALSE; 
+
+   if(!fMethodSecond) {
+     AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kVdriftPHPad);
+     if(calPad) {
+       Double_t mean = calPad->GetMean();
+       Double_t rms = calPad->GetRMS();
+       //printf("Vdrift::meanpad %f, rmspad %f\n",mean,rms);
+       if(!((mean > 0.9) && (mean < 1.1) && (rms < 0.6))) ok = kFALSE;
+     }
+     else return kFALSE;
+   }
+
+   return ok;
+
+ }
+ //__________________________________________________________________________________________________________________________
+ Bool_t AliTRDPreprocessorOffline::ValidateT0(){
+   //
+   // Update OCDB entry
+   //
+
+   AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(kT0PHDet);
+   AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kT0PHPad);
+   if(calDet && calPad) {
+     Double_t meandet = calDet->GetMean();
+     Double_t rmsdet = calDet->GetRMSRobust();
+     Double_t meanpad = calPad->GetMean();
+     //Double_t rmspad = calPad->GetRMS();
+     //printf("T0::minimum %f, rmsdet %f,meanpad %f, rmspad %f\n",meandet,rmsdet,meanpad,rmspad);
+     if((meandet > -1.5) && (meandet < 5.0) && (rmsdet < 4.0) && (meanpad < 5.0) && (meanpad > -0.5)) return kTRUE;
+     else return kFALSE;
+   }
+   else return kFALSE;
+
+ }
+ //__________________________________________________________________________________________________________________________
+ Bool_t AliTRDPreprocessorOffline::ValidatePRF() const{
+   //
+   // Update OCDB entry
+   //
+
+   AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kPRF);
+   if(calPad) {
+     Double_t meanpad = calPad->GetMean();
+     Double_t rmspad = calPad->GetRMS();
+     //printf("PRF::meanpad %f, rmspad %f\n",meanpad,rmspad);
+     if((meanpad < 1.0) && (rmspad < 0.8)) return kTRUE;
+     else return kFALSE;
+   }
+   else return kFALSE;
+
+
+ }
+ //__________________________________________________________________________________________________________________________
+Bool_t AliTRDPreprocessorOffline::ValidateChamberStatus() const{
   //
   // Update OCDB entry
   //
   
-  AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kPRF);
-  if(calPad) {
-    Double_t meanpad = calPad->GetMean();
-    Double_t rmspad = calPad->GetRMS();
-    //printf("PRF::meanpad %f, rmspad %f\n",meanpad,rmspad);
-    if((meanpad < 1.0) && (rmspad < 0.8)) return kTRUE;
-    else return kFALSE;
+  AliTRDCalChamberStatus *calChamberStatus = (AliTRDCalChamberStatus *) fCalibObjects->At(kChamberStatus);
+  if(calChamberStatus) {
+    Int_t detectormasked = 0;
+    for(Int_t det = 0; det < 540; det++) {
+      if(calChamberStatus->IsMasked(det)) detectormasked++;
+    }
+    //printf("Number of chambers masked %d\n",detectormasked);
+    if(detectormasked > 29) return kFALSE;
+    else return kTRUE;
   }
   else return kFALSE;
  
-
 }
 //_____________________________________________________________________________
 Int_t AliTRDPreprocessorOffline::GetVersion(TString name) const
@@ -841,7 +1028,7 @@ Int_t AliTRDPreprocessorOffline::GetSubVersion(TString name) const
     
     TString vertry(subversion);
     vertry += ver;
-    vertry += "Nz";
+    vertry += "FirstRun";
 
     //printf("vertry %s and name %s\n",vertry.Data(),name.Data());
 
@@ -853,4 +1040,30 @@ Int_t AliTRDPreprocessorOffline::GetSubVersion(TString name) const
 
 }
 
+//_____________________________________________________________________________
+Int_t AliTRDPreprocessorOffline::GetFirstRun(TString name) const
+{
+  //
+  // Get first run from the title
+  //
+  
+  // Some patterns
+  const Char_t *firstrun = "FirstRun";
+  if(!strstr(name.Data(),firstrun)) return -1;
+  
+  for(Int_t ver = 0; ver < 999999999; ver++) {
+
+    TString vertry(firstrun);
+    vertry += ver;
+    vertry += "Nz";
+
+    //printf("vertry %s and name %s\n",vertry.Data(),name.Data());
+
+    if(strstr(name.Data(),vertry.Data())) return ver;
+    
+  }
+  
+  return -1;
+
+}