]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - AD/ADrec/AliADReconstructor.cxx
Reconstructor to fill new ESD, Digitizer reading new OCDBs and macros to crate them
[u/mrichter/AliRoot.git] / AD / ADrec / AliADReconstructor.cxx
index c2ebd66c4686de02aec8d339c31d885b6b4b54ab..c0dc36bc0040527b2c2542a46f957fb232f3b01d 100644 (file)
 #include "AliCDBStorage.h"
 #include "AliCDBEntry.h"
 #include "AliESDEvent.h"
+#include "AliRunInfo.h"
+#include "AliCTPTimeParams.h"
+#include "AliLHCClockPhase.h"
 
 #include "AliADReconstructor.h"
 #include "AliADdigit.h"
 #include "AliESDAD.h"
+#include "AliESDADfriend.h"
 #include "AliADConst.h"
 #include "AliADCalibData.h"
 #include "AliADRawStream.h"
@@ -39,8 +43,12 @@ ClassImp(AliADReconstructor)
 AliADReconstructor:: AliADReconstructor():
   AliReconstructor(),
   fESDAD(0x0),
+  fESD(0x0),
+  fESDADfriend(0x0),
   fCalibData(NULL),
-  fDigitsArray(0)
+  fDigitsArray(0),
+  fCollisionMode(0),
+  fBeamEnergy(0.)
 
 {
   fCalibData = GetCalibData();
@@ -64,6 +72,7 @@ AliADReconstructor::~AliADReconstructor()
 {
 // destructor
   delete fESDAD;
+  delete fESDADfriend;
   delete fDigitsArray;
 }
 
@@ -72,6 +81,7 @@ void AliADReconstructor::Init()
 {
 // initializer
     fESDAD  = new AliESDAD;
+    fESDADfriend  = new AliESDADfriend;
 }
 
 //_____________________________________________________________________________
@@ -113,7 +123,19 @@ void AliADReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digitsTre
       if(!fCalibData->IsChannelDead(iChannel)){
          new ((*fDigitsArray)[fDigitsArray->GetEntriesFast()]) AliADdigit(offlineCh, time, width,integrator, chargeADC, BBflag, BGflag);
       }
+      
+      fESDADfriend->SetTriggerInputs(rawStream.GetTriggerInputs());
+      fESDADfriend->SetTriggerInputsMask(rawStream.GetTriggerInputsMask());
+    
+      fESDADfriend->SetBBScalers(offlineCh,rawStream.GetBBScalers(iChannel));
+      fESDADfriend->SetBGScalers(offlineCh,rawStream.GetBGScalers(iChannel));
+      for (Int_t iEv = 0; iEv < kNClocks; iEv++) {
+         fESDADfriend->SetBBFlag(offlineCh,iEv,rawStream.GetBBFlag(iChannel,iEv));
+         fESDADfriend->SetBGFlag(offlineCh,iEv,rawStream.GetBGFlag(iChannel,iEv));
+      }
     }
+    for(Int_t iScaler = 0; iScaler < AliESDADfriend::kNScalers; iScaler++)
+      fESDADfriend->SetTriggerScalers(iScaler,rawStream.GetTriggerScalers(iScaler));
 
     digitsTree->Fill();
   }
@@ -128,47 +150,140 @@ void AliADReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,AliE
 
   printf("Running AD Reconstruction \n");
 
-  // fills ESD with AD Digits
-
-  if (!digitsTree)
-    {
+  if (!digitsTree) {
       AliError("No digits tree!");
       return;
-    }
-
-  TBranch* digitBranch = digitsTree->GetBranch("ADdigit");
-  if (!digitBranch) {
-    AliError("No AD digits branch found!");
-    return;
   }
+
+  TBranch* digitBranch = digitsTree->GetBranch("ADDigit");
   digitBranch->SetAddress(&fDigitsArray);
 
-  digitsTree->GetEvent(0);
+  Float_t   mult[16];  
+  Float_t    adc[16]; 
+  Float_t   time[16]; 
+  Float_t  width[16];
+  Bool_t aBBflag[16];
+  Bool_t aBGflag[16];
+   
+  for (Int_t i=0; i<16; i++){
+       adc[i]    = 0.0;
+       mult[i]   = 0.0;
+       time[i]   = kInvalidTime;
+       width[i]  = 0.0;
+       aBBflag[i] = kFALSE;
+       aBGflag[i] = kFALSE;
+  }
 
-  Bool_t ADHits[16];
-  for(Int_t i = 0; i < 16; i++) { ADHits[i] = kFALSE; }
+  Int_t nEntries = (Int_t)digitsTree->GetEntries();
+  for (Int_t e=0; e<nEntries; e++) {
+    digitsTree->GetEvent(e);
 
-  Int_t nDigits = fDigitsArray->GetEntriesFast();
+    Int_t nDigits = fDigitsArray->GetEntriesFast();
     
-  for (Int_t d=0; d<nDigits; d++) {    
-    AliADdigit* digit = (AliADdigit*) fDigitsArray->At(d);
-    Int_t module = digit->PMNumber();
- //   printf("AD Module: %d\n",module);
-    ADHits[module] = kTRUE;
-  }  
-  if (!esd) {
-       AliError("NO AD ESD branch found!");
-       return;
-}
-  fESDAD->SetADBitCell(ADHits);
-
-  if (esd)
-    {
-      AliDebug(1, Form("Writing AD data to ESD Tree"));
-      esd->SetADData(fESDAD);
+    for (Int_t d=0; d<nDigits; d++) {    
+        AliADdigit* digit = (AliADdigit*) fDigitsArray->At(d);      
+        Int_t  pmNumber = digit->PMNumber();
+
+        // Pedestal retrieval and suppression
+       Bool_t integrator = digit->Integrator();
+        Float_t maxadc = 0;
+        Int_t imax = -1;
+        Float_t adcPedSub[kNClocks];
+        for(Int_t iClock=0; iClock < kNClocks; ++iClock) {
+         Short_t charge = digit->ChargeADC(iClock);
+         Bool_t iIntegrator = (iClock%2 == 0) ? integrator : !integrator;
+         Int_t k = pmNumber + 16*iIntegrator;
+         adcPedSub[iClock] = (Float_t)charge - fCalibData->GetPedestal(k);
+         //if(adcPedSub[iClock] <= GetRecoParam()->GetNSigmaPed()*fCalibData->GetSigma(k)) {
+         if(adcPedSub[iClock] <= 2*fCalibData->GetSigma(k)) {
+           adcPedSub[iClock] = 0;
+           continue;
+         }
+         //if(iClock < GetRecoParam()->GetStartClock() || iClock > GetRecoParam()->GetEndClock()) continue;
+         if(iClock < 8 || iClock > 12) continue;
+         if(adcPedSub[iClock] > maxadc) {
+           maxadc = adcPedSub[iClock];
+           imax   = iClock;
+         }
+       }
+
+       if (imax != -1) {
+         //Int_t start = imax - GetRecoParam()->GetNPreClocks();
+         Int_t start = imax - 2;
+         if (start < 0) start = 0;
+         //Int_t end = imax + GetRecoParam()->GetNPostClocks();
+         Int_t end = imax + 1;
+         if (end > 20) end = 20;
+         for(Int_t iClock = start; iClock <= end; iClock++) {
+           adc[pmNumber] += adcPedSub[iClock];
+         }
+       }
+
+       // HPTDC leading time and width
+       // Correction for slewing and various time delays
+        //time[pmNumber]  =  CorrectLeadingTime(pmNumber,digit->Time(),adc[pmNumber]);
+       time[pmNumber]  =  digit->Time();
+       width[pmNumber] =  digit->Width();
+       aBBflag[pmNumber] = digit->GetBBflag();
+       aBGflag[pmNumber] = digit->GetBGflag();
+
+       if (adc[pmNumber] > 0) {
+         AliDebug(1,Form("PM = %d ADC = %.2f (%.2f) TDC %.2f (%.2f)   Int %d (%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d)    %.2f %.2f   %.2f %.2f    %d %d",pmNumber, adc[pmNumber],
+                      digit->ChargeADC(11)+digit->ChargeADC(10)+digit->ChargeADC(9)+digit->ChargeADC(8)+
+                      digit->ChargeADC(7)+digit->ChargeADC(6)+digit->ChargeADC(5)+digit->ChargeADC(4)-
+                      4.*fCalibData->GetPedestal(pmNumber)-4.*fCalibData->GetPedestal(pmNumber+16),
+                         digit->Time(),time[pmNumber],
+                         integrator,
+                         digit->ChargeADC(0),digit->ChargeADC(1),digit->ChargeADC(2),digit->ChargeADC(3),digit->ChargeADC(4),digit->ChargeADC(5),digit->ChargeADC(6),digit->ChargeADC(7),
+                         digit->ChargeADC(8),digit->ChargeADC(9),digit->ChargeADC(10),
+                         digit->ChargeADC(11),digit->ChargeADC(12),
+                         digit->ChargeADC(13),digit->ChargeADC(14),digit->ChargeADC(15),digit->ChargeADC(16),digit->ChargeADC(17),digit->ChargeADC(18),digit->ChargeADC(19),digit->ChargeADC(20),
+                         fCalibData->GetPedestal(pmNumber),fCalibData->GetSigma(pmNumber),
+                         fCalibData->GetPedestal(pmNumber+16),fCalibData->GetSigma(pmNumber+16),
+                         aBBflag[pmNumber],aBGflag[pmNumber]));
+           };
+
+       // Fill ESD friend object
+       for (Int_t iEv = 0; iEv < kNClocks; iEv++) {
+         fESDADfriend->SetPedestal(pmNumber,iEv,(Float_t)digit->ChargeADC(iEv));
+         fESDADfriend->SetIntegratorFlag(pmNumber,iEv,(iEv%2 == 0) ? integrator : !integrator);
+       }
+       fESDADfriend->SetTime(pmNumber,digit->Time());
+       fESDADfriend->SetWidth(pmNumber,digit->Width());
+
+    } // end of loop over digits
+  } // end of loop over events in digits tree
+         
+  //fESDAD->SetBit(AliESDAD::kCorrectedLeadingTime,kTRUE);
+  //fESDAD->SetMultiplicity(mult);
+  fESDAD->SetADC(adc);
+  fESDAD->SetTime(time);
+  fESDAD->SetWidth(width);
+  fESDAD->SetBit(AliESDAD::kOnlineBitsFilled,kTRUE);
+  fESDAD->SetBBFlag(aBBflag);
+  fESDAD->SetBGFlag(aBGflag);
+  //fESDAD->SetBit(AliESDAD::kCorrectedForSaturation,kTRUE);
+
+  /*/ now fill the V0 decision and channel flags
+  {
+    AliADTriggerMask triggerMask;
+    triggerMask.SetRecoParam(GetRecoParam());
+    triggerMask.FillMasks(fESDAD, fCalibData, fTimeSlewing);
+  }/*/
+
+  if (esd) { 
+     AliDebug(1, Form("Writing AD data to ESD tree"));
+     esd->SetADData(fESDAD);
+     AliESDfriend *fr = (AliESDfriend*)esd->FindListObject("AliESDfriend");
+     if (fr) {
+        AliDebug(1, Form("Writing AD friend data to ESD tree"));
+        //fr->SetADfriend(fESDADfriend);
     }
+  }
 
   fDigitsArray->Clear();
+
 }
 
 //_____________________________________________________________________________
@@ -178,15 +293,15 @@ AliADCalibData* AliADReconstructor::GetCalibData() const
 
   AliCDBEntry *entry=0;
 
-  //entry = man->Get("AD/Calib/Data");
-  //if(!entry){
-    //AliWarning("Load of calibration data from default storage failed!");
-    //AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)");
+  entry = man->Get("AD/Calib/Data");
+  if(!entry){
+    AliWarning("Load of calibration data from default storage failed!");
+    AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)");
        
     man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
     man->SetRun(1);
     entry = man->Get("AD/Calib/Data");
-  //}
+  }
   // Retrieval of data in directory AD/Calib/Data:
 
   AliADCalibData *calibdata = 0;
@@ -197,4 +312,56 @@ AliADCalibData* AliADReconstructor::GetCalibData() const
   return calibdata;
 }
 
+//_____________________________________________________________________________
+AliCDBStorage* AliADReconstructor::SetStorage(const char *uri) 
+{
+// Sets the storage  
+
+  Bool_t deleteManager = kFALSE;
+  
+  AliCDBManager *manager = AliCDBManager::Instance();
+  AliCDBStorage *defstorage = manager->GetDefaultStorage();
+  
+  if(!defstorage || !(defstorage->Contains("AD"))){ 
+     AliWarning("No default storage set or default storage doesn't contain AD!");
+     manager->SetDefaultStorage(uri);
+     deleteManager = kTRUE;
+  }
+  AliCDBStorage *storage = manager->GetDefaultStorage();
+
+  if(deleteManager){
+     AliCDBManager::Instance()->UnsetDefaultStorage();
+     defstorage = 0;   // the storage is killed by AliCDBManager::Instance()->Destroy()
+  }
+
+  return storage; 
+}
+
+//____________________________________________________________________________
+void AliADReconstructor::GetCollisionMode()
+{
+  // Retrieval of collision mode 
+
+  TString beamType = GetRunInfo()->GetBeamType();
+  if(beamType==AliGRPObject::GetInvalidString()){
+     AliError("AD cannot retrieve beam type");
+     return;
+  }
+
+  if( (beamType.CompareTo("P-P") ==0)  || (beamType.CompareTo("p-p") ==0) ){
+    fCollisionMode=0;
+  }
+  else if( (beamType.CompareTo("Pb-Pb") ==0)  || (beamType.CompareTo("A-A") ==0) ){
+    fCollisionMode=1;
+  }
+    
+  fBeamEnergy = GetRunInfo()->GetBeamEnergy();
+  if(fBeamEnergy==AliGRPObject::GetInvalidFloat()) {
+     AliError("Missing value for the beam energy ! Using 0");
+     fBeamEnergy = 0.;
+  }
+  
+  AliDebug(1,Form("\n ++++++ Beam type and collision mode retrieved as %s %d @ %1.3f GeV ++++++\n\n",beamType.Data(), fCollisionMode, fBeamEnergy));
 
+}