adding v0 fake counting
authorjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Feb 2010 17:44:32 +0000 (17:44 +0000)
committerjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Feb 2010 17:44:32 +0000 (17:44 +0000)
ANALYSIS/AliPhysicsSelection.cxx
ANALYSIS/AliPhysicsSelectionTask.h
ANALYSIS/AliTriggerAnalysis.cxx
ANALYSIS/AliTriggerAnalysis.h

index e76baa5..5dd4d09 100644 (file)
@@ -233,8 +233,12 @@ Bool_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       // replay CINT1B hardware trigger
       // TODO this has to depend on the actual hardware trigger (and that depends on the run...)
       Int_t fastORHW = triggerAnalysis->SPDFiredChips(aEsd, 1); // SPD number of chips from trigger bits (!)
-      Bool_t v0A = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0A);
-      Bool_t v0C = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0C);
+      
+      AliTriggerAnalysis::V0Decision v0ADecision = triggerAnalysis->V0Trigger(aEsd, AliTriggerAnalysis::kASide);
+      AliTriggerAnalysis::V0Decision v0CDecision = triggerAnalysis->V0Trigger(aEsd, AliTriggerAnalysis::kCSide);
+      
+      Bool_t v0A = (v0ADecision == AliTriggerAnalysis::kV0BB);
+      Bool_t v0C = (v0CDecision == AliTriggerAnalysis::kV0BB);
         
       if (fastORHW == 0 && !v0A && !v0C)
       {
@@ -246,8 +250,8 @@ Bool_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
     
       // offline trigger
       Int_t fastOROffline = triggerAnalysis->SPDFiredChips(aEsd, 0); // SPD number of chips from clusters (!)
-      Bool_t v0ABG = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0ABG);
-      Bool_t v0CBG = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0CBG);
+      Bool_t v0ABG = (v0ADecision == AliTriggerAnalysis::kV0BG);
+      Bool_t v0CBG = (v0CDecision == AliTriggerAnalysis::kV0BG);
       Bool_t v0BG = v0ABG || v0CBG;
     
       if (fastOROffline > 0)
@@ -264,34 +268,39 @@ Bool_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       if (v0CBG)
         fHistStatistics->Fill(8, i);
         
-      if (fastOROffline > 1 && !v0BG)
+      if (v0ADecision == AliTriggerAnalysis::kV0Fake)
         fHistStatistics->Fill(9, i);
+      if (v0CDecision == AliTriggerAnalysis::kV0Fake)
+        fHistStatistics->Fill(10, i);
+      
+      if (fastOROffline > 1 && !v0BG)
+        fHistStatistics->Fill(11, i);
         
       if ((fastOROffline > 0 || v0A || v0C) && !v0BG)
-        fHistStatistics->Fill(10, i);
+        fHistStatistics->Fill(12, i);
     
       if (fastOROffline > 0 && (v0A || v0C) && !v0BG)
-        fHistStatistics->Fill(11, i);
+        fHistStatistics->Fill(13, i);
   
       if (v0A && v0C && !v0BG)
-        fHistStatistics->Fill(12, i);
-        
+        fHistStatistics->Fill(14, i);
+      
       if (fastOROffline > 1 || (fastOROffline > 0 && (v0A || v0C)) || (v0A && v0C))
       {
         if (!v0BG)
         {
-          fHistStatistics->Fill(13, i);
+          fHistStatistics->Fill(15, i);
       
           if (fBackgroundIdentification && !fBackgroundIdentification->IsSelected(const_cast<AliESDEvent*> (aEsd)))
           {
             AliDebug(AliLog::kDebug, "Rejecting event because of background identification");
-            fHistStatistics->Fill(14, i);
+            fHistStatistics->Fill(16, i);
           }
           else
           {
             AliDebug(AliLog::kDebug, "Accepted event for histograms");
             
-            fHistStatistics->Fill(15, i);
+            fHistStatistics->Fill(17, i);
             fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i);
             if (i < fCollTrigClasses.GetEntries() || fSkipTriggerClassSelection)
               accept = kTRUE;
@@ -392,7 +401,7 @@ Bool_t AliPhysicsSelection::Initialize(UInt_t runNumber)
     if (fHistStatistics)
       delete fHistStatistics;
   
-    fHistStatistics = new TH2F("fHistStatistics", "fHistStatistics;;", 15, 0.5, 15.5, count, -0.5, -0.5 + count);
+    fHistStatistics = new TH2F("fHistStatistics", "fHistStatistics;;", 17, 0.5, 17.5, count, -0.5, -0.5 + count);
       
     Int_t n = 1;
     fHistStatistics->GetXaxis()->SetBinLabel(n++, "Trigger class");
@@ -403,6 +412,8 @@ Bool_t AliPhysicsSelection::Initialize(UInt_t runNumber)
     fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0C");
     fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0A BG");
     fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0C BG");
+    fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0A Fake");
+    fHistStatistics->GetXaxis()->SetBinLabel(n++, "V0C Fake");
     fHistStatistics->GetXaxis()->SetBinLabel(n++, "FO >= 2 &!V0 BG");
     fHistStatistics->GetXaxis()->SetBinLabel(n++, "(FO >= 1 | V0A | V0C) & !V0 BG");
     fHistStatistics->GetXaxis()->SetBinLabel(n++, "FO >= 1 & (V0A | V0C) & !V0 BG");
index de6752e..e611f6b 100644 (file)
@@ -25,7 +25,7 @@ class AliPhysicsSelectionTask : public AliAnalysisTaskSE {
     void SetOption(const char* opt) { fOption = opt; }
     
     void SetPhysicsSelection(AliPhysicsSelection* physicsSelection) { fPhysicsSelection = physicsSelection; }
-    AliPhysicsSelection* GetPhysicsSelection() const {return fPhysicsSelection; }
+    AliPhysicsSelection* GetPhysicsSelection() const { return fPhysicsSelection; }
 
  protected:
     TList* fOutput;                  //! list send on output slot 1
index 1ae3ce7..c4c6ce8 100644 (file)
@@ -29,6 +29,7 @@
 #include <TIterator.h>
 #include "TParameter.h"
 #include <TMap.h>
+#include <TRandom.h>
 
 #include <AliTriggerAnalysis.h>
 
@@ -45,6 +46,7 @@ ClassImp(AliTriggerAnalysis)
 
 AliTriggerAnalysis::AliTriggerAnalysis() :
   fSPDGFOThreshold(2),
+  fSPDGFOEfficiency(0),
   fV0TimeOffset(0),
   fFMDLowCut(0.2),
   fFMDHitCut(0.5),
@@ -175,6 +177,8 @@ const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
     case kSPDGFOBits : str = "SPD GFO Bits"; break;
     case kV0A : str = "V0 A BB"; break;
     case kV0C : str = "V0 C BB"; break;
+    case kV0OR : str = "V0 OR BB"; break;
+    case kV0AND : str = "V0 AND BB"; break;
     case kV0ABG : str = "V0 A BG"; break;
     case kV0CBG : str = "V0 C BG"; break;
     case kZDC : str = "ZDC"; break;
@@ -183,6 +187,7 @@ const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
     case kFMDA : str = "FMD A"; break;
     case kFMDC : str = "FMD C"; break;
     case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
+    case kNSD1 : str = "NSD1"; break;
     default: str = ""; break;
   }
    
@@ -322,6 +327,18 @@ Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigge
         return kTRUE;
       break;
     }
+    case kV0OR:
+    {
+      if (V0Trigger(aEsd, kASide) == kV0BB || V0Trigger(aEsd, kCSide) == kV0BB)
+        return kTRUE;
+      break;
+    }
+    case kV0AND:
+    {
+      if (V0Trigger(aEsd, kASide) == kV0BB && V0Trigger(aEsd, kCSide) == kV0BB)
+        return kTRUE;
+      break;
+    }
     case kV0ABG:
     {
       if (V0Trigger(aEsd, kASide) == kV0BG)
@@ -370,6 +387,12 @@ Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigge
         return kTRUE;
       break;
     }
+    case kNSD1:
+    {
+      if (SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide) == kV0BB && V0Trigger(aEsd, kCSide) == kV0BB))
+        return kTRUE;
+       break;
+    }
     default:
     {
       AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
@@ -528,12 +551,21 @@ Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, B
   {
     Int_t nChips = 0;
     for (Int_t i=0; i<1200; i++)
+    {
       if (mult->TestFastOrFiredChips(i) == kTRUE)
       {
+        // efficiency simulation (if enabled)
+        if (fSPDGFOEfficiency)
+        {
+          if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1))
+            continue;
+        }
+        
         nChips++;
         if (fillHists)
           fHistFiredBitsSPD->Fill(i);
       }
+    }
     return nChips;
   }
   
@@ -555,7 +587,11 @@ AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent*
 {
   // Returns the V0 trigger decision in V0A | V0C
   //
-  // Based on algorithm by Cvetan Cheshkov
+  // Returns kV0Fake if the calculated average time is in a window where neither BB nor BG is expected. 
+  // The rate of such triggers can be used to estimate the background. Note that the rate has to be 
+  // rescaled with the size of the windows (numerical values see below in the code)
+  //
+  // Based on an algorithm by Cvetan Cheshkov
   
   AliESDVZERO* esdV0 = aEsd->GetVZEROData();
   if (!esdV0)
@@ -630,6 +666,8 @@ AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent*
       return kV0BB;
     if (time > 54 && time < 57.5) 
       return kV0BG;
+    if (time > 57.5 && time < 72)
+      return kV0Fake;
   }
   
   if (side == kCSide)
@@ -638,6 +676,8 @@ AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent*
       return kV0BB;
     if (time > 69.5 && time < 73)
       return kV0BG; 
+    if (time > 55 && time < 69.5)
+      return kV0Fake;
   }
   
   return kV0Empty;
@@ -870,6 +910,9 @@ void AliTriggerAnalysis::SaveHistograms() const
   fHistFMDSingle->Write();
   fHistFMDSum->Write();
   
+  if (fSPDGFOEfficiency)
+    fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
+  
   fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
 }
 
index d48fdc9..00ff6dd 100644 (file)
@@ -24,9 +24,9 @@ class TMap;
 class AliTriggerAnalysis : public TObject
 {
   public:
-    enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kSPDGFOBits, kV0A, kV0C, kV0ABG, kV0CBG, kZDC, kZDCA, kZDCC, kFMDA, kFMDC, kFPANY, kStartOfFlags = 0x0100, kOfflineFlag = 0x8000 }; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
+    enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kSPDGFOBits, kV0A, kV0C, kV0OR, kV0AND, kV0ABG, kV0CBG, kZDC, kZDCA, kZDCC, kFMDA, kFMDC, kFPANY, kNSD1, kStartOfFlags = 0x0100, kOfflineFlag = 0x8000 }; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
     enum AliceSide { kASide = 1, kCSide, kCentralBarrel };
-    enum V0Decision { kV0Invalid = -1, kV0Empty = 0, kV0BB, kV0BG };
+    enum V0Decision { kV0Invalid = -1, kV0Empty = 0, kV0BB, kV0BG, kV0Fake };
     
     AliTriggerAnalysis();
     virtual ~AliTriggerAnalysis();
@@ -60,6 +60,7 @@ class AliTriggerAnalysis : public TObject
     void FillTriggerClasses(const AliESDEvent* aEsd);
     
     void SetSPDGFOThreshhold(Int_t t) { fSPDGFOThreshold = t; }
+    void SetSPDGFOEfficiency(TH1* hist) { fSPDGFOEfficiency = hist; }
     void SetV0TimeOffset(Float_t offset) { fV0TimeOffset = offset; }
     void SetFMDThreshold(Float_t low, Float_t hit) { fFMDLowCut = low; fFMDHitCut = hit; }
     
@@ -85,6 +86,8 @@ class AliTriggerAnalysis : public TObject
     Int_t FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists = kFALSE);
 
     Int_t fSPDGFOThreshold;         // number of chips to accept a SPD GF0 trigger
+    TH1* fSPDGFOEfficiency;         // SPD FASTOR efficiency - is applied in SPDFiredChips. Histogram contains efficiency as function of chip number (bin 1..400: first layer; 401..1200: second layer)
+    
     Float_t fV0TimeOffset;          // time offset applied to the times read from the V0 (in ns)
  
     Float_t fFMDLowCut;                    // 
@@ -104,7 +107,7 @@ class AliTriggerAnalysis : public TObject
     
     Bool_t fMC;              // flag if MC is analyzed
 
-    ClassDef(AliTriggerAnalysis, 6)
+    ClassDef(AliTriggerAnalysis, 7)
     
   private:
     AliTriggerAnalysis(const AliTriggerAnalysis&);