]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Simple analysis task to count events under different event selections, to cross check...
authorgconesab <gconesab@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 8 Feb 2011 15:52:38 +0000 (15:52 +0000)
committergconesab <gconesab@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 8 Feb 2011 15:52:38 +0000 (15:52 +0000)
PWG4/CMakelibPWG4PartCorrBase.pkg
PWG4/PWG4PartCorrBaseLinkDef.h
PWG4/PartCorrBase/AliAnalysisTaskCounter.cxx [new file with mode: 0644]
PWG4/PartCorrBase/AliAnalysisTaskCounter.h [new file with mode: 0644]

index 9961529a1d457a671ed0688e07db32066850d94a..c3fb0e88f1423ba4501ded8e5084361a2fcbce82 100644 (file)
@@ -25,7 +25,7 @@
 # SHLIBS - Shared Libraries and objects for linking (Executables only)           #
 #--------------------------------------------------------------------------------#
 
-set ( SRCS  PartCorrBase/AliNeutralMesonSelection.cxx PartCorrBase/AliFiducialCut.cxx PartCorrBase/AliCaloPID.cxx PartCorrBase/AliMCAnalysisUtils.cxx PartCorrBase/AliIsolationCut.cxx PartCorrBase/AliAnaScale.cxx PartCorrBase/AliAnaPartCorrMaker.cxx PartCorrBase/AliAnaPartCorrBaseClass.cxx PartCorrBase/AliAnalysisTaskParticleCorrelation.cxx PartCorrBase/AliAnalysisTaskParticleCorrelationM.cxx PartCorrBase/AliCaloTrackReader.cxx PartCorrBase/AliCaloTrackESDReader.cxx PartCorrBase/AliCaloTrackAODReader.cxx PartCorrBase/AliCaloTrackMCReader.cxx PartCorrBase/AliCalorimeterUtils.cxx)
+set ( SRCS  PartCorrBase/AliNeutralMesonSelection.cxx PartCorrBase/AliFiducialCut.cxx PartCorrBase/AliCaloPID.cxx PartCorrBase/AliMCAnalysisUtils.cxx PartCorrBase/AliIsolationCut.cxx PartCorrBase/AliAnaScale.cxx PartCorrBase/AliAnaPartCorrMaker.cxx PartCorrBase/AliAnaPartCorrBaseClass.cxx PartCorrBase/AliAnalysisTaskParticleCorrelation.cxx PartCorrBase/AliAnalysisTaskParticleCorrelationM.cxx PartCorrBase/AliCaloTrackReader.cxx PartCorrBase/AliCaloTrackESDReader.cxx PartCorrBase/AliCaloTrackAODReader.cxx PartCorrBase/AliCaloTrackMCReader.cxx PartCorrBase/AliCalorimeterUtils.cxx AliAnalysisTaskCounter.cxx)
 
 string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" )
 
index 08577dc403ccc8e65545e029b9de5ae249094713..7072b82aa4c7489c3c9f78405f2b5b702d2941b8 100755 (executable)
@@ -19,5 +19,6 @@
 #pragma link C++ class AliCaloTrackAODReader+;
 #pragma link C++ class AliCaloTrackMCReader+;
 #pragma link C++ class AliCalorimeterUtils+;
+#pragma link C++ class AliAnalysisTaskCounter+;
 
 #endif
diff --git a/PWG4/PartCorrBase/AliAnalysisTaskCounter.cxx b/PWG4/PartCorrBase/AliAnalysisTaskCounter.cxx
new file mode 100644 (file)
index 0000000..2f1e9a6
--- /dev/null
@@ -0,0 +1,360 @@
+/**************************************************************************\r
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
+ *                                                                        *\r
+ * Author: The ALICE Off-line Project.                                    *\r
+ * Contributors are mentioned in the code where appropriate.              *\r
+ *                                                                        *\r
+ * Permission to use, copy, modify and distribute this software and its   *\r
+ * documentation strictly for non-commercial purposes is hereby granted   *\r
+ * without fee, provided that the above copyright notice appears in all   *\r
+ * copies and that both the copyright notice and this permission notice   *\r
+ * appear in the supporting documentation. The authors make no claims     *\r
+ * about the suitability of this software for any purpose. It is          *\r
+ * provided "as is" without express or implied warranty.                  *\r
+ **************************************************************************/\r
+/* $Id: $ */\r
+\r
+//_________________________________________________________________________\r
+// Count events with different selections\r
+//\r
+// It produces a histogram with the number of events with 9 bins:\r
+// 0: all events (that passed the physics selection if it was on)\r
+// 1: same but cross check that event pointer did exist\r
+// 2: passes vertex cut\r
+// 3: passes track number cut, tracks for eta < 0.8\r
+// 4: 3 && 2\r
+// 5: pass VAND\r
+// 6: 5 && 2\r
+// 7: 5 && 3\r
+// 8: 5 && 3 && 2\r
+// 9: not pileup from SPD\r
+// 10: Good vertex\r
+// 11: 10 && 5\r
+// 12: 10 && 3\r
+// 13: 10 && 2\r
+// 14: 10 && 2 && 3 && 5\r
+// 15: 10 && 9\r
+// 16: 9  && 5\r
+//\r
+// Author: Gustavo Conesa Balbastre (LPSC)\r
+//         \r
+//_________________________________________________________________________\r
+\r
+#include "TH2F.h"\r
+#include "AliAODHeader.h"\r
+#include "AliTriggerAnalysis.h"\r
+#include "AliESDEvent.h"\r
+#include "AliESDtrackCuts.h"\r
+#include "AliAnalysisManager.h"\r
+#include "AliInputEventHandler.h"\r
+\r
+#include "AliAnalysisTaskCounter.h"\r
+ClassImp(AliAnalysisTaskCounter)\r
+\r
+//________________________________________________________________________\r
+AliAnalysisTaskCounter::AliAnalysisTaskCounter(const char *name) \r
+: AliAnalysisTaskSE(name), \r
+  fZVertexCut(10.),\r
+  fTrackMultEtaCut(0.8),\r
+  fCaloFilterPatch(kFALSE),\r
+  fOutputContainer(0x0), \r
+  fESDtrackCuts(AliESDtrackCuts::GetStandardITSTPCTrackCuts2010()),\r
+  fTriggerAnalysis (new AliTriggerAnalysis),\r
+  fhNEvents(0),\r
+  fhXVertex(0),fhYVertex(0),fhZVertex(0),\r
+  fhXGoodVertex(0),fhYGoodVertex(0),fhZGoodVertex(0)\r
+{\r
+  //ctor\r
+  DefineOutput(1, TList::Class());\r
+}\r
+\r
+//________________________________________________________________________\r
+AliAnalysisTaskCounter::AliAnalysisTaskCounter() \r
+  : AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisTaskCounter"),\r
+    fZVertexCut(10.),\r
+    fTrackMultEtaCut(0.8),\r
+    fCaloFilterPatch(kFALSE),\r
+    fOutputContainer(0x0), \r
+    fESDtrackCuts(AliESDtrackCuts::GetStandardITSTPCTrackCuts2010()),\r
+    fTriggerAnalysis (new AliTriggerAnalysis),\r
+    fhNEvents(0),\r
+    fhXVertex(0),fhYVertex(0),fhZVertex(0),\r
+    fhXGoodVertex(0),fhYGoodVertex(0),fhZGoodVertex(0)\r
+{\r
+  // ctor\r
+  DefineOutput(1, TList::Class());\r
+}\r
+\r
+//__________________________________________________\r
+AliAnalysisTaskCounter::~AliAnalysisTaskCounter()\r
+{\r
+  //Destructor\r
+  if(fOutputContainer){\r
+    fOutputContainer->Delete() ; \r
+    delete fOutputContainer ;\r
+  }\r
+  \r
+  if(fESDtrackCuts)    delete fESDtrackCuts;\r
+  if(fTriggerAnalysis) delete fTriggerAnalysis;\r
+  \r
+}\r
+\r
+\r
+//-------------------------------------------------------------------\r
+void AliAnalysisTaskCounter::UserCreateOutputObjects()\r
+{\r
+  // Init histograms\r
+  \r
+  fOutputContainer = new TList();\r
+  \r
+  fhZVertex     = new TH1F("hZVertex", " Z vertex distribution"   , 200 , -50 , 50  ) ;\r
+  fhZVertex->SetXTitle("v_{z} (cm)");\r
+  fOutputContainer->Add(fhZVertex);\r
+\r
+  fhZGoodVertex     = new TH1F("hZGoodVertex", " Good Z vertex distribution"   , 200 , -50 , 50  ) ;\r
+  fhZGoodVertex->SetXTitle("v_{z} (cm)");\r
+  fOutputContainer->Add(fhZGoodVertex);\r
+  \r
+  fhXVertex     = new TH1F("hXVertex", " X vertex distribution"   , 200 , -2 , 2  ) ;\r
+  fhXVertex->SetXTitle("v_{x} (cm)");\r
+  fOutputContainer->Add(fhXVertex);\r
+  \r
+  fhXGoodVertex     = new TH1F("hXGoodVertex", " Good X vertex distribution"   , 200 , -2 , 2  ) ;\r
+  fhXGoodVertex->SetXTitle("v_{x} (cm)");\r
+  fOutputContainer->Add(fhXGoodVertex);\r
+  \r
+  fhYVertex     = new TH1F("hYVertex", " Y vertex distribution"   , 200 , -2 , 2  ) ;\r
+  fhYVertex->SetXTitle("v_{y} (cm)");\r
+  fOutputContainer->Add(fhYVertex);\r
+  \r
+  fhYGoodVertex     = new TH1F("hYGoodVertex", " Good Y vertex distribution"   , 200 , -2 , 2  ) ;\r
+  fhYGoodVertex->SetXTitle("v_{y} (cm)");\r
+  fOutputContainer->Add(fhYGoodVertex);\r
+  \r
+  \r
+  fhNEvents = new TH1I("hNEvents", "Number of analyzed events", 17, 0, 17) ;\r
+  fhNEvents->SetXTitle("Selection");\r
+  fhNEvents->SetYTitle("# events");\r
+  fhNEvents->GetXaxis()->SetBinLabel(1 ,"1  = PS");\r
+  fhNEvents->GetXaxis()->SetBinLabel(2 ,"2  = 1  & ESD");\r
+  fhNEvents->GetXaxis()->SetBinLabel(3 ,"3  = 2  & |Z|<10");\r
+  fhNEvents->GetXaxis()->SetBinLabel(4 ,"4  = 2  & |eta|<0.8");\r
+  fhNEvents->GetXaxis()->SetBinLabel(5 ,"5  = 3  & 4");\r
+  fhNEvents->GetXaxis()->SetBinLabel(6 ,"6  = 2  & V0AND");\r
+  fhNEvents->GetXaxis()->SetBinLabel(7 ,"7  = 3  & 6");\r
+  fhNEvents->GetXaxis()->SetBinLabel(8 ,"8  = 4  & 6");\r
+  fhNEvents->GetXaxis()->SetBinLabel(9 ,"9  = 5  & 6");\r
+  fhNEvents->GetXaxis()->SetBinLabel(10,"10 = 2  & not pileup");\r
+  fhNEvents->GetXaxis()->SetBinLabel(11,"11 = 2  & good vertex");\r
+  fhNEvents->GetXaxis()->SetBinLabel(12,"12 = 3  & 11");\r
+  fhNEvents->GetXaxis()->SetBinLabel(13,"13 = 4  & 11");\r
+  fhNEvents->GetXaxis()->SetBinLabel(14,"14 = 6  & 11");\r
+  fhNEvents->GetXaxis()->SetBinLabel(15,"15 = 9  & 11");\r
+  fhNEvents->GetXaxis()->SetBinLabel(16,"16 = 10 & 11");\r
+  fhNEvents->GetXaxis()->SetBinLabel(17,"17 = 6  & 10");\r
+\r
+  fOutputContainer->Add(fhNEvents);\r
+\r
+  fOutputContainer->SetOwner(kTRUE);\r
+  \r
+  PostData(1,fOutputContainer);\r
+  \r
+}\r
+\r
+//________________________________________________________________________\r
+void AliAnalysisTaskCounter::UserExec(Option_t *) \r
+{\r
+  // Main loop\r
+  // Called for each event\r
+  \r
+  //printf("___ Event __ %d __\n",(Int_t)Entry());\r
+  \r
+  fhNEvents->Fill(0.5);  \r
+  \r
+  AliVEvent * event = InputEvent();\r
+  if (!event) {\r
+    printf("AliAnalysisTaskCounter::UserExec() - ERROR: event not available \n");\r
+    return;\r
+  }\r
+  AliESDEvent * esdevent = dynamic_cast<AliESDEvent*> (event);\r
+\r
+  fhNEvents->Fill(1.5);  \r
+    \r
+  //Initialize bools\r
+  Bool_t bSelectVZ    = kFALSE;\r
+  Bool_t bV0AND       = kFALSE; \r
+  Bool_t bPileup      = kFALSE;\r
+  Bool_t bGoodV       = kFALSE;\r
+  Bool_t bSelectTrack = kFALSE;   \r
+  Int_t  trackMult    = 0;\r
+  \r
+  //---------------------------------\r
+  //Get the primary vertex, cut on Z\r
+  //---------------------------------\r
+  Double_t v[3];\r
+  event->GetPrimaryVertex()->GetXYZ(v) ;\r
+  fhXVertex->Fill(v[0]);\r
+  fhYVertex->Fill(v[1]);\r
+  fhZVertex->Fill(v[2]);\r
+  \r
+  if(TMath::Abs(v[2]) < fZVertexCut) {\r
+    bSelectVZ=kTRUE;\r
+    fhNEvents->Fill(2.5);  \r
+  }\r
+  //else printf("Vertex out %f \n",v[2]);\r
+  \r
+\r
+  //--------------------------------------------------\r
+  //Tweak for calorimeter only productions\r
+  //--------------------------------------------------\r
+  if(fCaloFilterPatch && !esdevent){ \r
+    if(event->GetNumberOfCaloClusters() > 0) {\r
+      AliVCluster * calo = event->GetCaloCluster(0);\r
+      if(calo->GetNLabels() == 4){\r
+        Int_t * selection = calo->GetLabels();\r
+        bPileup   = selection[0];\r
+        bGoodV    = selection[1]; \r
+        bV0AND    = selection[2]; \r
+        trackMult = selection[3];\r
+        //if(selection[0] || selection[1] || selection[2])\r
+        //printf(" pu %d, gv %d, v0 %d, track mult %d\n ", selection[0], selection[1], selection[2], selection[3]);\r
+        if(trackMult > 0 )  \r
+          bSelectTrack = kFALSE;\r
+      } else {\r
+        //First filtered AODs, track multiplicity stored there.  \r
+        trackMult = (Int_t) ((AliAODHeader*)fInputEvent->GetHeader())->GetCentrality();\r
+      }\r
+    }else{//at least one cluster\r
+        //printf("AliAnalysisTaskCounter::UserExec() - No clusters in event\n");\r
+        //Remove events with  vertex (0,0,0), bad vertex reconstruction\r
+        if(TMath::Abs(v[0]) < 1.e-6 && TMath::Abs(v[1]) < 1.e-6 && TMath::Abs(v[2]) < 1.e-6) bGoodV = kFALSE;\r
+      \r
+        //First filtered AODs, track multiplicity stored there.  \r
+        trackMult = (Int_t) ((AliAODHeader*)fInputEvent->GetHeader())->GetCentrality();\r
+    }\r
+  }\r
+  else {\r
+    //--------------------------------------------------\r
+    //Count tracks, cut on number of tracks in eta < 0.8\r
+    //--------------------------------------------------\r
+    Int_t nTracks   = event->GetNumberOfTracks() ;\r
+    for (Int_t itrack =  0; itrack <  nTracks; itrack++) {////////////// track loop\r
+      AliVTrack * track = (AliVTrack*)event->GetTrack(itrack) ; // retrieve track from esd\r
+      \r
+      //Only for ESDs\r
+      if(esdevent && !fESDtrackCuts->AcceptTrack((AliESDtrack*)track)) continue;\r
+      \r
+      //Do not count tracks out of acceptance cut\r
+      if(TMath::Abs(track->Eta())< fTrackMultEtaCut) trackMult++;\r
+    }\r
+  }\r
+  \r
+  //printf("AliAnalysisTaskCounter::UserExec() - Track Mult %d \n",trackMult);\r
+  \r
+  //--------------------------------------------------\r
+  // At least one track\r
+  //--------------------------------------------------\r
+  if (trackMult > 0) {\r
+    bSelectTrack = kTRUE; \r
+                  fhNEvents->Fill(3.5);\r
+    if(bSelectVZ) fhNEvents->Fill(4.5);\r
+  }\r
+  \r
+  //---------------------------------\r
+  // V0AND\r
+  //---------------------------------\r
+  if(esdevent && !fCaloFilterPatch) bV0AND = fTriggerAnalysis->IsOfflineTriggerFired(esdevent, AliTriggerAnalysis::kV0AND);\r
+  //else if(aodevent  && !fCaloFilterPatch) bV0AND = //FIXME FOR AODs\r
+  \r
+  if(bV0AND)\r
+  {\r
+                                    fhNEvents->Fill(5.5);\r
+    if (bSelectVZ)                  fhNEvents->Fill(6.5);\r
+    if (bSelectTrack)               fhNEvents->Fill(7.5);\r
+    if (bSelectVZ &&  bSelectTrack) fhNEvents->Fill(8.5);\r
+  }\r
+  \r
+  //---------------------------------\r
+  // Pileup\r
+  //---------------------------------\r
+  if(!fCaloFilterPatch)\r
+    bPileup = event->IsPileupFromSPD(3, 0.8, 3., 2., 5.); //Default values, if not it does not compile\r
+  //bPileup = event->IsPileupFromSPD(); \r
+  if (!bPileup){\r
+                fhNEvents->Fill(9.5);\r
+    if(bV0AND)  fhNEvents->Fill(16.5);\r
+  }\r
+  \r
+  //---------------------------------\r
+  // Good vertex\r
+  //---------------------------------\r
+  if(esdevent && !fCaloFilterPatch) bGoodV = CheckForPrimaryVertex();\r
+  if(bGoodV) \r
+  {\r
+    fhXGoodVertex->Fill(v[0]);\r
+    fhYGoodVertex->Fill(v[1]);\r
+    fhZGoodVertex->Fill(v[2]);\r
+    \r
+                     fhNEvents->Fill(10.5);\r
+    if(bSelectVZ)    fhNEvents->Fill(11.5);\r
+    if(bSelectTrack) fhNEvents->Fill(12.5);\r
+    if(bV0AND)       fhNEvents->Fill(13.5);\r
+    if(bSelectVZ && bSelectTrack && bV0AND)    \r
+                     fhNEvents->Fill(14.5); \r
+    if(!bPileup)     fhNEvents->Fill(15.5); \r
+  }\r
+\r
+  //printf("AliAnalysisTaskCounter::UserExec() : z vertex %d, good vertex %d, v0and %d, pile up %d, track mult %d\n ", bSelectVZ, bGoodV, bV0AND, bPileup, trackMult);\r
+  \r
+  PostData(1,fOutputContainer);\r
+\r
+}\r
+\r
+//____________________________________________________________________________\r
+Bool_t AliAnalysisTaskCounter::CheckForPrimaryVertex(){\r
+  //Check if the vertex was well reconstructed, copy from V0Reader of conversion group\r
+  //It only works for ESDs\r
+  \r
+  AliESDEvent * event = dynamic_cast<AliESDEvent*> (InputEvent());\r
+  if(event->GetPrimaryVertexTracks()->GetNContributors() > 0) {\r
+    return 1;\r
+  }\r
+  \r
+  if(event->GetPrimaryVertexTracks()->GetNContributors() < 1) {\r
+    // SPD vertex\r
+    if(event->GetPrimaryVertexSPD()->GetNContributors() > 0) {\r
+      //cout<<"spd vertex type::"<< fESDEvent->GetPrimaryVertex()->GetName() << endl;\r
+      return 1;\r
+      \r
+    }\r
+    if(event->GetPrimaryVertexSPD()->GetNContributors() < 1) {\r
+      //      cout<<"bad vertex type::"<< fESDEvent->GetPrimaryVertex()->GetName() << endl;\r
+      return 0;\r
+    }\r
+  }\r
+  return 0;\r
+  //return fInputEvent->GetPrimaryVertex()->GetNContributors()>0;\r
+}\r
+\r
+\r
+\r
+//_____________________________________________________\r
+void AliAnalysisTaskCounter::FinishTaskOutput()\r
+{\r
+  // Put in the output some event summary histograms\r
+  \r
+  AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();\r
+  AliInputEventHandler *inputH = dynamic_cast<AliInputEventHandler*>(am->GetInputEventHandler());\r
+  if (!inputH) return; \r
+  TH2F *histStat = dynamic_cast<TH2F*>(inputH->GetStatistics()); \r
+  TH2F *histBin0 = dynamic_cast<TH2F*>(inputH->GetStatistics("BIN0"));\r
+  \r
+  if(histStat)\r
+    fOutputContainer->Add(histStat);\r
+  else\r
+    printf("AliAnalysisTaskCounter::FinishTaskOutput() - Stat histogram not available check, \n if ESDs, that AliPhysicsSelection was on, \n if AODs, if EventStat_temp.root exists \n");\r
+\r
+  if(histBin0)\r
+    fOutputContainer->Add(histBin0); \r
+  \r
+}\r
diff --git a/PWG4/PartCorrBase/AliAnalysisTaskCounter.h b/PWG4/PartCorrBase/AliAnalysisTaskCounter.h
new file mode 100644 (file)
index 0000000..4e6c858
--- /dev/null
@@ -0,0 +1 @@
+#ifndef ALIANALYSISTASKCOUNTER_H\r\r#define ALIANALYSISTASKCOUNTER_H\r\r\r\r//_________________________________________________________________________\r\r//\r\r// Count events with different selections\r\r//\r\r//_________________________________________________________________________\r\r\r\rclass TH1F;\r\rclass TList;\r\rclass AliESDtrackCuts;\r\rclass AliTriggerAnalysis;\r\r#include "AliAnalysisTaskSE.h"\r\r\r\rclass AliAnalysisTaskCounter : public AliAnalysisTaskSE {\r\r public:\r\r  AliAnalysisTaskCounter();\r\r  AliAnalysisTaskCounter(const char *name);\r\r  virtual ~AliAnalysisTaskCounter() ;\r\r\r private:\r\r  AliAnalysisTaskCounter(const AliAnalysisTaskCounter&); // not implemented\r\r  AliAnalysisTaskCounter& operator=(const AliAnalysisTaskCounter&); // not implemented\r  \r\r public:\r\r  virtual void UserCreateOutputObjects();\r\r  virtual void UserExec(Option_t *option);\r\r  virtual void FinishTaskOutput();\r\r  \r\r  void SetZVertexCut(Float_t vcut) { fZVertexCut = vcut;}\r\r  void SetTrackMultiplicityEtaCut(Float_t eta) { fTrackMultEtaCut = eta  ; }                \r\r\r\r  void SwitchOnCaloFilterPatch()  { fCaloFilterPatch = kTRUE  ; }\r\r  void SwitchOffCaloFilterPatch() { fCaloFilterPatch = kFALSE ; }\r\r  Bool_t IsCaloFilterPatchOn()    { return fCaloFilterPatch   ; } \r\r  Bool_t CheckForPrimaryVertex() ;\r  \r\r private:\r\r  Float_t fZVertexCut;            // Z vertex cut\r\r  Float_t fTrackMultEtaCut;       // Track multiplicity eta cut\r\r  Bool_t  fCaloFilterPatch;       // CaloFilter patch\r\r  TList*  fOutputContainer;       //! Histogram container\r\r  AliESDtrackCuts    *fESDtrackCuts;    // Track cut  \r\r  AliTriggerAnalysis *fTriggerAnalysis; // Trigger algorithm\r\r  TH1I *  fhNEvents;               //! Events that delivers the analysis frame after different assumptions\r\r  TH1F *  fhXVertex;               //! X Vertex distribution\r  TH1F *  fhYVertex;               //! Y Vertex distribution\r  TH1F *  fhZVertex;               //! Z Vertex distribution\r  TH1F *  fhXGoodVertex;           //! X Vertex good distribution\r  TH1F *  fhYGoodVertex;           //! Y Vertex good distribution\r  TH1F *  fhZGoodVertex;           //! Z Vertex good distribution\r\r  ClassDef(AliAnalysisTaskCounter, 1);\r\r};\r\r\r\r#endif //ALIANALYSISTASKCOUNTER_H\r\r
\ No newline at end of file