]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGLF/FORWARD/analysis2/AliForwardQATask.cxx
Refactoring for AliFMDEnergyFitter to allow sub-classing
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliForwardQATask.cxx
index efda8b46f2788454e46af98beba04d604534fed9..ee1aa45e60c2f574631bd50508048ebe459f131e 100644 (file)
 
 //====================================================================
 AliForwardQATask::AliForwardQATask()
-  : AliAnalysisTaskSE(),
+  : AliBaseESDTask(),
     fEnableLowFlux(false), 
-    fFirstEvent(true),
-    fCorrManager(0),
     fESDFMD(),
     fHistos(),
     fEventInspector(),
     fEnergyFitter(),
     fSharingFilter(),
-    fDensityCalculator(),
-    fList(0),
-    fDebug(0)
+    fDensityCalculator()
 {
   // 
   // Constructor
   //
+  fCloneList = true;
 }
 
 //____________________________________________________________________
 AliForwardQATask::AliForwardQATask(const char* name)
-  : AliAnalysisTaskSE(name),
+  : AliBaseESDTask(name, "", &(AliForwardCorrectionManager::Instance())),
     fEnableLowFlux(false), 
-    fFirstEvent(true),
-    fCorrManager(0),
     fESDFMD(),
     fHistos(),
     fEventInspector("event"),
     fEnergyFitter("energy"),
     fSharingFilter("sharing"), 
-    fDensityCalculator("density"),
-    fList(0),
-    fDebug(0)
+    fDensityCalculator("density")
 {
   // 
   // Constructor 
@@ -70,9 +63,6 @@ AliForwardQATask::AliForwardQATask(const char* name)
   // Parameters:
   //    name Name of task 
   //
-  DefineOutput(1, TList::Class());
-  DefineOutput(2, TList::Class());
-  fCorrManager = &AliForwardCorrectionManager::Instance(); 
   fEnergyFitter.SetNParticles(1); // Just find the 1st peak 
   fEnergyFitter.SetDoMakeObject(false); 
   fEnergyFitter.SetUseIncreasingBins(true);
@@ -80,247 +70,132 @@ AliForwardQATask::AliForwardQATask(const char* name)
   fEnergyFitter.SetLowCut(0.4);
   fEnergyFitter.SetFitRangeBinWidth(4);
   fEnergyFitter.SetMinEntries(1000);
+  fCloneList = true;
 }
-
 //____________________________________________________________________
-AliForwardQATask::AliForwardQATask(const AliForwardQATask& o)
-  : AliAnalysisTaskSE(o),
-    fEnableLowFlux(o.fEnableLowFlux), 
-    fFirstEvent(o.fFirstEvent),
-    fCorrManager(o.fCorrManager),
-    fESDFMD(o.fESDFMD),
-    fHistos(o.fHistos),
-    fEventInspector(o.fEventInspector),
-    fEnergyFitter(o.fEnergyFitter),
-    fSharingFilter(o.fSharingFilter),
-    fDensityCalculator(o.fDensityCalculator),
-    fList(o.fList),
-    fDebug(o.fDebug) 
+void
+AliForwardQATask::SetDebug(Int_t dbg)
 {
   // 
-  // Copy constructor 
+  // Set debug level 
   // 
   // Parameters:
-  //    o Object to copy from 
+  //    dbg Debug level
   //
-  DefineOutput(1, TList::Class());
-  DefineOutput(2, TList::Class());
+  AliBaseESDTask::        SetDebug(dbg);
+  GetEnergyFitter()     .SetDebug(dbg);
+  GetSharingFilter()    .SetDebug(dbg);
+  GetDensityCalculator().SetDebug(dbg);
 }
 
 //____________________________________________________________________
-AliForwardQATask&
-AliForwardQATask::operator=(const AliForwardQATask& o)
+TAxis*
+AliForwardQATask::DefaultEtaAxis() const
 {
-  // 
-  // Assignment operator 
-  // 
-  // Parameters:
-  //    o Object to assign from 
-  // 
-  // Return:
-  //    Reference to this object 
-  //
-  if (&o == this) return *this;
-  AliAnalysisTaskSE::operator=(o);
-
-  fEnableLowFlux     = o.fEnableLowFlux;
-  fFirstEvent        = o.fFirstEvent;
-  fCorrManager       = o.fCorrManager;
-  fEventInspector    = o.fEventInspector;
-  fEnergyFitter      = o.fEnergyFitter;
-  fSharingFilter     = o.fSharingFilter;
-  fDensityCalculator = o.fDensityCalculator;
-  fHistos            = o.fHistos;
-  fList              = o.fList;
-  fDebug             = o.fDebug;
-
-  return *this;
+  static TAxis* a = new TAxis(240, -6, 6);
+  return a;
 }
-
 //____________________________________________________________________
-void
-AliForwardQATask::SetDebug(Int_t dbg)
+TAxis*
+AliForwardQATask::DefaultVertexAxis() const
 {
-  // 
-  // Set debug level 
-  // 
-  // Parameters:
-  //    dbg Debug level
-  //
-  fDebug = dbg;
-  fEventInspector.SetDebug(dbg);
-  fEnergyFitter.SetDebug(dbg);
-  fSharingFilter.SetDebug(dbg);
-  fDensityCalculator.SetDebug(dbg);
+  static TAxis* a = new TAxis(10, -10, 10);
+  return a;
 }
 
 //____________________________________________________________________
-Bool_t 
-AliForwardQATask::CheckCorrections(UInt_t what) const
+Bool_t
+AliForwardQATask::Setup()
 {
-  // 
-  // Check if all needed corrections are there and accounted for.  If not,
-  // do a Fatal exit 
-  // 
-  // Parameters:
-  //    what Which corrections is needed
-  // 
-  // Return:
-  //    true if all present, false otherwise
-  //  
-
-  AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
-  // Check that we have the energy loss fits, needed by 
-  //   AliFMDSharingFilter 
-  //   AliFMDDensityCalculator 
-  if (what & AliForwardCorrectionManager::kELossFits && !fcm.GetELossFit()) { 
-    AliWarning("No energy loss fits");
-    return false;
-  }
+  fEnergyFitter.Init();
   return true;
 }
 
 //____________________________________________________________________
 Bool_t
-AliForwardQATask::ReadCorrections(const TAxis*& pe, 
-                                 const TAxis*& pv, 
-                                 Bool_t        mc)
+AliForwardQATask::Book()
 {
-  //
-  // Read corrections
-  //
+  // 
+  // Create output objects 
+  // 
   //
   UInt_t what = AliForwardCorrectionManager::kAll;
   what ^= AliForwardCorrectionManager::kDoubleHit;
   what ^= AliForwardCorrectionManager::kVertexBias;
   what ^= AliForwardCorrectionManager::kAcceptance;
   what ^= AliForwardCorrectionManager::kMergingEfficiency;
-
-  AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
-  if (!fcm.Init(GetEventInspector().GetCollisionSystem(),
-               GetEventInspector().GetEnergy(),
-               GetEventInspector().GetField(),
-               mc,
-               what)) return false;
-  if (!CheckCorrections(what)) {
-    return false;
-  }
-
-  // Sett our persistency pointer 
-  // fCorrManager = &fcm;
-
-  // Get the eta axis from the secondary maps - if read in
-  if (!pe) {
-    pe = fcm.GetEtaAxis();
-    if (!pe) AliFatal("No eta axis defined");
-  }
-  // Get the vertex axis from the secondary maps - if read in
-  if (!pv) {
-    pv = fcm.GetVertexAxis();
-    if (!pv) AliFatal("No vertex axis defined");
-  }
-
+  what ^= AliForwardCorrectionManager::kELossFits;
+  fNeededCorrections = what;
+  fExtraCorrections  = AliForwardCorrectionManager::kELossFits;
+  
+  fEnergyFitter.CreateOutputObjects(fList);
+  fSharingFilter.CreateOutputObjects(fList);
+  fDensityCalculator.CreateOutputObjects(fList);
+  
   return true;
 }
-
-//____________________________________________________________________
-AliESDEvent*
-AliForwardQATask::GetESDEvent()
-{
-  //
-  // Get the ESD event. IF this is the first event, initialise
-  //
-  if (IsZombie()) return 0;
-  AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
-  if (!esd) {
-    AliWarning("No ESD event found for input event");
-    return 0;
-  }
-
-  // On the first event, initialize the parameters
-  if (fFirstEvent && esd->GetESDRun()) {
-    GetEventInspector().ReadRunDetails(esd);
-
-    AliInfoF("Initializing with parameters from the ESD:\n"
-            "         AliESDEvent::GetBeamEnergy()   ->%f\n"
-            "         AliESDEvent::GetBeamType()     ->%s\n"
-            "         AliESDEvent::GetCurrentL3()    ->%f\n"
-            "         AliESDEvent::GetMagneticField()->%f\n"
-            "         AliESDEvent::GetRunNumber()    ->%d",
-            esd->GetBeamEnergy(),
-            esd->GetBeamType(),
-            esd->GetCurrentL3(),
-            esd->GetMagneticField(),
-            esd->GetRunNumber());
-
-
-    if (!InitializeSubs()) {
-      AliWarning("Initialisation of sub algorithms failed!");
-      SetZombie(true);
-      esd = 0;
-      return 0;
-    }
-    AliInfoF("Clearing first event flag from %s to false", 
-            fFirstEvent ? "true" : "false");
-    fFirstEvent = false;
-  }
-  return esd;
-}
 //____________________________________________________________________
 Bool_t
-AliForwardQATask::InitializeSubs()
+AliForwardQATask::PreData(const TAxis& /*vertex*/, const TAxis& eta)
 {
   // 
   // Initialise the sub objects and stuff.  Called on first event 
   // 
   //
-  const TAxis* pe = 0;
-  const TAxis* pv = 0;
-
-
-
-
-  if (!ReadCorrections(pe,pv)) 
-  { 
-    AliWarning("Used default binning");
-    pv=new TAxis(10,-10, 10);
-    pe=new TAxis(240,-6,6);
-    //return false;
+  AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
+  // We allow fall-back queries so that we may proceed in case we have no 
+  // valid corrections 
+  if (!fcm.GetELossFit()) { 
+    AliWarning("No energy loss fits");
+    
+    // Fall-back values if we do not have the energy loss fits 
+    AliFMDMultCuts& sfLCuts = GetSharingFilter().GetLCuts();
+    if (sfLCuts.GetMethod() != AliFMDMultCuts::kFixed) { 
+      Double_t cut = 0.3;
+      AliWarningF("Using fixed cut @ %f for the lower bound "
+                 "of the sharing filter", cut);
+      sfLCuts.SetMultCuts(cut);
+    }
+    AliFMDMultCuts& sfHCuts = GetSharingFilter().GetHCuts();
+    if (sfHCuts.GetMethod() != AliFMDMultCuts::kFixed) { 
+      Double_t cut = 100;
+      AliWarningF("Using fixed cut @ %f for the upper bound "
+                 "of the sharing filter", cut);
+      sfHCuts.SetMultCuts(cut);
+    }
+    AliFMDMultCuts& dcCuts  = GetDensityCalculator().GetCuts();
+    if (dcCuts.GetMethod() != AliFMDMultCuts::kFixed) { 
+      Double_t cut = 0.3;
+      AliWarningF("Using fixed cut @ %f for the lower bound "
+                 "of the density calculator", cut);
+      dcCuts.SetMultCuts(cut);
+    }
   }
+  else 
+    fcm.GetELossFit()->CacheBins(GetDensityCalculator().GetMinQuality());
 
-  fHistos.Init(*pe);
+  fHistos.Init(eta);
 
-  fEventInspector.Init(*pv);
-  fEnergyFitter.Init(*pe);
-  fSharingFilter.Init();
-  fDensityCalculator.Init(*pe);
-
-  this->Print();
+  // GetEventInspector().SetupForData(vertex);
+  GetEnergyFitter()     .SetupForData(eta);
+  GetSharingFilter()    .SetupForData(eta);
+  GetDensityCalculator().SetupForData(eta);
 
   return true;
 }
 
 //____________________________________________________________________
-void
-AliForwardQATask::UserCreateOutputObjects()
+Bool_t
+AliForwardQATask::PreEvent()
 {
-  // 
-  // Create output objects 
-  // 
-  //
-  fList = new TList;
-  fList->SetOwner();
-  
-  fEventInspector.DefineOutput(fList);
-  fEnergyFitter.DefineOutput(fList);
-  fSharingFilter.DefineOutput(fList);
-  fDensityCalculator.DefineOutput(fList);
-
-  PostData(1, fList);
+  // Clear stuff 
+  fHistos.Clear();
+  fESDFMD.Clear();
+  return true;
 }
 //____________________________________________________________________
-void
-AliForwardQATask::UserExec(Option_t*)
+Bool_t
+AliForwardQATask::Event(AliESDEvent& esd)
 {
   // 
   // Process each event 
@@ -328,76 +203,77 @@ AliForwardQATask::UserExec(Option_t*)
   // Parameters:
   //    option Not used
   //  
+  DGUARD(fDebug,1,"Process the input event");
 
-  // static Int_t cnt = 0;
-  // cnt++;
-  // Get the input data 
-  AliESDEvent* esd = GetESDEvent();
-  if (!esd) { 
-    AliWarning("Got no ESD event");
-    return;
-  }
   if (fFirstEvent) { 
     // If the first event flag wasn't cleared in the above call to
     // GetESDEvent, we should not do anything, since nothing has been
     // initialised yet, so we opt out here (with a warning) 
     AliWarning("Nothing has been initialized yet, opt'ing out");
-    return;
+    return false;
   }
 
-  // Clear stuff 
-  fHistos.Clear();
-  fESDFMD.Clear();
-  
   Bool_t   lowFlux   = kFALSE;
   UInt_t   triggers  = 0;
   UShort_t ivz       = 0;
-  Double_t vz        = 0;
+  TVector3 ip;
   Double_t cent      = -1;
   UShort_t nClusters = 0;
-  UInt_t   found     = fEventInspector.Process(esd, triggers, lowFlux, 
-                                              ivz, vz, cent, nClusters);
+  UInt_t   found     = fEventInspector.Process(&esd, triggers, lowFlux, 
+                                              ivz, ip, cent, nClusters);
   
-  if (found & AliFMDEventInspector::kNoEvent)    return;
-  if (found & AliFMDEventInspector::kNoTriggers) return;
-  if (found & AliFMDEventInspector::kNoSPD)      return;
-  if (found & AliFMDEventInspector::kNoFMD)      return;
-  if (found & AliFMDEventInspector::kNoVertex)   return;
-  if (triggers & AliAODForwardMult::kPileUp)     return;
-  if (found & AliFMDEventInspector::kBadVertex)  return;
+  Bool_t ok = true;
+  if (found & AliFMDEventInspector::kNoEvent)    ok = false;
+  if (found & AliFMDEventInspector::kNoTriggers) ok = false;
+  if (found & AliFMDEventInspector::kNoSPD)      ok = false;
+  if (found & AliFMDEventInspector::kNoFMD)      ok = false;
+  if (found & AliFMDEventInspector::kNoVertex)   ok = false;
+  if (triggers & AliAODForwardMult::kPileUp)     ok = false;
+  if (triggers & AliAODForwardMult::kA)          ok = false;
+  if (triggers & AliAODForwardMult::kC)          ok = false;
+  if (triggers & AliAODForwardMult::kE)          ok = false;
+  if (!(triggers & AliAODForwardMult::kOffline)) ok = false;
+  if (found & AliFMDEventInspector::kBadVertex)  ok = false;
+  if (!ok) { 
+    DMSG(fDebug,2,"Event failed selection: %s", 
+        AliFMDEventInspector::CodeString(found));
+    return false;
+  }
+  DMSG(fDebug,2,"Event triggers: %s", 
+       AliAODForwardMult::GetTriggerString(triggers));
 
   // We we do not want to use low flux specific code, we disable it here. 
   if (!fEnableLowFlux) lowFlux = false;
 
   // Get FMD data 
-  AliESDFMD* esdFMD = esd->GetFMDData();
+  AliESDFMD* esdFMD = esd.GetFMDData();
   
   // Run the energy loss fitter 
   if (!fEnergyFitter.Accumulate(*esdFMD, cent, 
                                triggers & AliAODForwardMult::kEmpty)) {
     AliWarning("Energy fitter failed");
-    return;
+    return false;
   }
   
   //  // Apply the sharing filter (or hit merging or clustering if you like)
-  if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD, vz)) { 
+  if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD, ip.Z())) { 
     AliWarning("Sharing filter failed!");
-    return;
+    return false;
   }
  
   // Calculate the inclusive charged particle density 
-  if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) { 
+  if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) { 
     // if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) { 
     AliWarning("Density calculator failed!");
-    return;
+    return false;
   }
   
-  PostData(1, fList);
+  return true;
 }
 
 //____________________________________________________________________
-void
-AliForwardQATask::Terminate(Option_t*)
+Bool_t
+AliForwardQATask::Finalize()
 {
   // 
   // End of job
@@ -409,47 +285,39 @@ AliForwardQATask::Terminate(Option_t*)
   TStopwatch swt;
   swt.Start();
 
-  TList* list = dynamic_cast<TList*>(GetOutputData(1));
-  if (!list) {
-    AliError(Form("No output list defined (%p)", GetOutputData(1)));
-    if (GetOutputData(1)) GetOutputData(1)->Print();
-    return;
-  }
-  
   // Get our histograms from the container 
-  TH1I* hEventsTr    = 0;//static_cast<TH1I*>(list->FindObject("nEventsTr"));
-  TH1I* hEventsTrVtx = 0;//static_cast<TH1I*>(list->FindObject("nEventsTrVtx"));
+  TH1I* hEventsTr    = 0;
+  TH1I* hEventsTrVtx = 0;
+  TH1I* hEventsAcc   = 0;
   TH1I* hTriggers    = 0;
-  if (!fEventInspector.FetchHistograms(list, hEventsTr, 
-                                      hEventsTrVtx, hTriggers)) { 
+  if (!fEventInspector.FetchHistograms(fList, 
+                                      hEventsTr, 
+                                      hEventsTrVtx, 
+                                      hEventsAcc,
+                                      hTriggers)) { 
     AliError(Form("Didn't get histograms from event selector "
-                 "(hEventsTr=%p,hEventsTrVtx=%p)", 
-                 hEventsTr, hEventsTrVtx));
-    return;
+                 "(hEventsTr=%p,hEventsTrVtx=%p,hEventsAcc=%p)", 
+                 hEventsTr, hEventsTrVtx,hEventsAcc));
+    return false;
   }
 
   TStopwatch swf;
   swf.Start();
-  fEnergyFitter.Fit(list);
+  fEnergyFitter.Fit(fResults);
   swf.Stop();
   AliInfoF("Fitting took %d real-time seconds, and %f CPU seconds", 
           Int_t(swf.RealTime()), swf.CpuTime());
 
-  fSharingFilter.ScaleHistograms(list,Int_t(hEventsTr->Integral()));
-  fDensityCalculator.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));
+  fSharingFilter.Terminate(fList,fResults,Int_t(hEventsTr->Integral()));
+  fDensityCalculator.Terminate(fList,fResults,Int_t(hEventsTrVtx->Integral()));
 
-  // Make a deep copy and post that as output 2 
-  TList* list2 = static_cast<TList*>(list->Clone(Form("%sResults", 
-                                                     list->GetName())));
   if (fDebug) AliInfoF("Posting post processing results to %s", 
-                      list2->GetName());
-  list2->SetOwner();
-  PostData(2, list2);
-
+                      fResults->GetName());
   swt.Stop();
-  AliInfoF("Terminate took %d real-time seconds, and %f CPU seconds", 
+  AliInfoF("Finalize took %d real-time seconds, and %f CPU seconds", 
           Int_t(swt.RealTime()), swt.CpuTime());
 
+  return true;
 }
 
 //____________________________________________________________________
@@ -462,21 +330,11 @@ AliForwardQATask::Print(Option_t* option) const
   // Parameters:
   //    option Not used
   //
-  
-  std::cout << ClassName() << ": " << GetName() << "\n" 
-           << "  Enable low flux code:   " << (fEnableLowFlux ? "yes" : "no") 
-           << "\n"
-           << "  Off-line trigger mask:  0x" 
-           << std::hex     << std::setfill('0') 
-           << std::setw (8) << fOfflineTriggerMask 
-           << std::dec     << std::setfill (' ') << std::endl;
+  AliBaseESDTask::Print(option);
   gROOT->IncreaseDirLevel();
-  if (fCorrManager) fCorrManager->Print();
-  else  
-    std::cout << "  Correction manager not set yet" << std::endl;
-  GetEventInspector()   .Print(option);
   GetEnergyFitter()     .Print(option);
   GetSharingFilter()    .Print(option);
+  GetDensityCalculator().Print(option);
   gROOT->DecreaseDirLevel();
 }