]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
PID cuts + fixes
authorsnelling <snelling@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 30 Nov 2010 11:22:34 +0000 (11:22 +0000)
committersnelling <snelling@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 30 Nov 2010 11:22:34 +0000 (11:22 +0000)
PWG2/FLOW/AliFlowTasks/AliAnalysisTaskFlowEvent.cxx
PWG2/FLOW/AliFlowTasks/AliAnalysisTaskFlowEvent.h
PWG2/FLOW/AliFlowTasks/AliAnalysisTaskQAflow.cxx
PWG2/FLOW/AliFlowTasks/AliAnalysisTaskQAflow.h
PWG2/FLOW/AliFlowTasks/AliFlowEventCuts.cxx
PWG2/FLOW/AliFlowTasks/AliFlowTrackCuts.cxx
PWG2/FLOW/AliFlowTasks/AliFlowTrackCuts.h
PWG2/FLOW/macros/AddTaskFlowCentrality.C
PWG2/FLOW/macros/CreateAlienHandler.C
PWG2/FLOW/macros/runFlowTaskCentralityTrain.C
PWG2/libPWG2flowTasks.pkg

index 664cef6ba63a57b4148be5f82abf35b1825cdd2b..0ad5447a6efa6310e3b8e598abb6b6a990aa3f0a 100644 (file)
 #include "AliFlowCommonConstants.h"
 #include "AliAnalysisTaskFlowEvent.h"
 
+#include "AliESDpid.h"
+#include "AliTOFcalib.h"
+#include "AliTOFT0maker.h"
+#include "AliCDBManager.h"
+
 #include "AliLog.h"
 
 ClassImp(AliAnalysisTaskFlowEvent)
@@ -116,7 +121,11 @@ AliAnalysisTaskFlowEvent::AliAnalysisTaskFlowEvent() :
   fV2(0.),
   fV3(0.),
   fV4(0.),
-  fMyTRandom3(NULL)
+  fMyTRandom3(NULL),
+  fESDpid(NULL),
+  fTOFresolution(0.0),
+  fTOFcalib(NULL),
+  ftofT0maker(NULL)
 {
   // Constructor
   cout<<"AliAnalysisTaskFlowEvent::AliAnalysisTaskFlowEvent()"<<endl;
@@ -167,7 +176,11 @@ AliAnalysisTaskFlowEvent::AliAnalysisTaskFlowEvent(const char *name, TString RPt
   fV2(0.),
   fV3(0.),
   fV4(0.),
-  fMyTRandom3(NULL)
+  fMyTRandom3(NULL),
+  fESDpid(NULL),
+  fTOFresolution(0.0),
+  fTOFcalib(NULL),
+  ftofT0maker(NULL)
 {
   // Constructor
   cout<<"AliAnalysisTaskFlowEvent::AliAnalysisTaskFlowEvent(const char *name, Bool_t on, UInt_t iseed)"<<endl;
@@ -179,6 +192,10 @@ AliAnalysisTaskFlowEvent::AliAnalysisTaskFlowEvent(const char *name, TString RPt
     DefineInput(1, TList::Class());
   }
 
+  //PID
+  fESDpid=new AliESDpid();
+  fTOFcalib = new AliTOFcalib();
+
   // Define output slots here
   // Define here the flow event output
   DefineOutput(1, AliFlowEventSimple::Class());
@@ -198,12 +215,34 @@ AliAnalysisTaskFlowEvent::~AliAnalysisTaskFlowEvent()
   //
   // Destructor
   //
-  if (fMyTRandom3) delete fMyTRandom3;
+  delete fMyTRandom3;
+  delete fESDpid;
+  delete fTOFcalib;
+  delete ftofT0maker;
   // objects in the output list are deleted
   // by the TSelector dtor (I hope)
 
 }
 
+//________________________________________________________________________
+void AliAnalysisTaskFlowEvent::NotifyRun()
+{
+  //at the beginning of each new run
+       AliESDEvent* fESD = dynamic_cast<AliESDEvent*> (InputEvent());
+       Int_t run = fESD->GetRunNumber();
+       if(fTOFresolution>0.0)
+       {
+               AliCDBManager *cdb = AliCDBManager::Instance();
+    cdb->SetDefaultStorage("raw://");
+    cdb->SetRun(run);
+    fTOFcalib->Init(run);
+    fTOFcalib->CreateCalObjects();
+    delete ftofT0maker;
+    ftofT0maker= new AliTOFT0maker(fESDpid,fTOFcalib);  
+  } 
+   AliInfo(Form("Stariting run #%i",run));
+}
+
 //________________________________________________________________________
 void AliAnalysisTaskFlowEvent::UserCreateOutputObjects()
 {
@@ -216,6 +255,37 @@ void AliAnalysisTaskFlowEvent::UserCreateOutputObjects()
     exit(1);
   }
 
+  if (!(fCutsRP&&fCutsPOI))
+  {
+    AliError("cuts not set");
+    return;
+  }
+  if (fCutsEvent) 
+  {
+    if (!fCutsEvent->IsSelected(InputEvent())) return;
+  }
+
+  //PID
+  if (fCutsRP->GetParamType()==AliFlowTrackCuts::kMC)
+  {
+    fESDpid->GetTPCResponse().SetBetheBlochParameters( 2.15898e+00/50.,
+                                                       1.75295e+01,
+                                                       3.40030e-09,
+                                                       1.96178e+00,
+                                                       3.91720e+00);
+  }
+  else
+  {
+    fESDpid->GetTPCResponse().SetBetheBlochParameters( 0.0283086,
+                                                       2.63394e+01,
+                                                       5.04114e-11,
+                                                       2.12543e+00,
+                                                       4.88663e+00 );
+  }
+
+  fCutsRP->SetESDpid(fESDpid);
+  fCutsPOI->SetESDpid(fESDpid);
+
   //set the common constants
   AliFlowCommonConstants* cc = AliFlowCommonConstants::GetMaster();
   cc->SetNbinsMult(fNbinsMult);
@@ -265,21 +335,17 @@ void AliAnalysisTaskFlowEvent::UserExec(Option_t *)
   //use the new and temporarily inclomplete way of doing things
   if (fAnalysisType == "AUTOMATIC")
   {
-    if (!(fCutsRP&&fCutsPOI))
-    {
-      AliError("cuts not set");
-      return;
-    }
-    if (fCutsEvent) 
-    {
-      if (!fCutsEvent->IsSelected(InputEvent())) return;
-    }
+    //PID
+    recalibTOF(dynamic_cast<AliESDEvent*>(InputEvent()));
 
     //first attach all possible information to the cuts
     fCutsRP->SetEvent( InputEvent() );  //attach event
     fCutsRP->SetMCevent( MCEvent() );   //attach mc truth
     fCutsPOI->SetEvent( InputEvent() );
     fCutsPOI->SetMCevent( MCEvent() );
+    fCutsRP->SetESDpid(fESDpid);
+    fCutsPOI->SetESDpid(fESDpid);
+
     //then make the event
     flowEvent = new AliFlowEvent( fCutsRP, fCutsPOI );
     if (myESD)
@@ -468,4 +534,12 @@ void AliAnalysisTaskFlowEvent::Terminate(Option_t *)
   // Called once at the end of the query -- do not call in case of CAF
 }
 
-
+//___________________________________________________________
+void AliAnalysisTaskFlowEvent::recalibTOF(AliESDEvent *event)
+{
+       if(!(fTOFresolution>0.0))
+               return;
+       ftofT0maker->SetTimeResolution(fTOFresolution);
+         ftofT0maker->ComputeT0TOF(event);
+       ftofT0maker->WriteInESD(event);
+}
index c03c9ac659cf371ab1ae7f638da4ab43b5cb045b..f8fa3a2cd9971e9a0b53ed11fc0843f9b010c17f 100644 (file)
@@ -19,6 +19,9 @@ class TList;
 class TRandom3;
 class AliAnalysisTaskSE;
 class TString;
+class AliESDpid;
+class AliTOFcalib;
+class AliTOFT0maker;
 
 class AliAnalysisTaskFlowEvent : public AliAnalysisTaskSE {
  public:
@@ -29,6 +32,7 @@ class AliAnalysisTaskFlowEvent : public AliAnalysisTaskSE {
   virtual void   UserCreateOutputObjects();
   virtual void   UserExec(Option_t *option);
   virtual void   Terminate(Option_t *);
+  virtual void   NotifyRun();
 
   void    SetAnalysisType(TString type) { this->fAnalysisType = type; }
   TString GetAnalysisType() const       { return this->fAnalysisType; }
@@ -95,6 +99,10 @@ class AliAnalysisTaskFlowEvent : public AliAnalysisTaskSE {
   void SetFlow(Double_t v1, Double_t v2, Double_t v3, Double_t v4) {fV1=v1;fV2=v2;fV3=v3;fV4=v4;}
   // end setters afterburner
 
+  //PID
+  void recalibTOF(AliESDEvent *event);
+  void SetTOFresolution(Float_t res) {fTOFresolution=res;}
+
  private:
 
   AliAnalysisTaskFlowEvent(const AliAnalysisTaskFlowEvent& aAnalysisTask);
@@ -160,6 +168,12 @@ class AliAnalysisTaskFlowEvent : public AliAnalysisTaskSE {
   TRandom3* fMyTRandom3;     // TRandom3 generator
   // end afterburner
   
+  //PID stuff
+  AliESDpid *fESDpid;//pid object
+  Float_t      fTOFresolution;
+  AliTOFcalib*   fTOFcalib;
+  AliTOFT0maker* ftofT0maker; 
+
   ClassDef(AliAnalysisTaskFlowEvent, 1); // example of analysis
 };
 
index 8d162abc293971988e101f78171f6af896ab9e4c..2436a7d731a0d0eec8c0dd0f614324eee79bd7f8 100644 (file)
@@ -43,6 +43,7 @@ AliAnalysisTaskQAflow::AliAnalysisTaskQAflow()
   : AliAnalysisTaskSE(),
     fOutput(NULL),
     fFillNtuple(kFALSE),
+    fDoCorrelations(kFALSE),
     fNtuple(NULL),
     fEventCuts(NULL),
     fTrackCuts(NULL)
@@ -55,6 +56,7 @@ AliAnalysisTaskQAflow::AliAnalysisTaskQAflow(const char* name)
   : AliAnalysisTaskSE(name),
     fOutput(NULL),
     fFillNtuple(kFALSE),
+    fDoCorrelations(kFALSE),
     fNtuple(NULL),
     fEventCuts(NULL),
     fTrackCuts(NULL)
@@ -119,7 +121,7 @@ void AliAnalysisTaskQAflow::UserCreateOutputObjects()
   before->Add(hist); after->Add(hist->Clone()); //17
   hist = new TH1D("charges", "charge distribution", 5,-2.5,2.5);
   before->Add(hist); after->Add(hist->Clone()); //18
-  hist = new TH1D("dphivsdeta", "#Delta#phi separation", 10000,-0.1,0.1);
+  hist = new TH1D("dphivsdeta", "#Delta#phi separation", 10000,-TMath::PiOver2(),TMath::Pi()+TMath::PiOver2());
   before->Add(hist); after->Add(hist->Clone()); //19
   hist = new TH1I("standardTPC_multiplicity", "standard TPC track multiplicity",10000,0,10000);
   before->Add(hist); after->Add(hist->Clone()); //20
@@ -203,6 +205,9 @@ void AliAnalysisTaskQAflow::UserExec(Option_t *)
   TH1* hstdspdtrmultB = dynamic_cast<TH1*>(before->At(23));
   TH1* hstdspdtrmultA = dynamic_cast<TH1*>(after->At(23));
 
+  Bool_t passevent = fEventCuts->IsSelected(event);
+  Bool_t isSelectedEventSelection = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
+
   AliMultiplicity* tracklets = const_cast<AliMultiplicity*>(event->GetMultiplicity());
   Int_t ntracklets=0;
   Int_t nspdclusters=0;
@@ -224,8 +229,6 @@ void AliAnalysisTaskQAflow::UserExec(Option_t *)
     }
   }
 
-  AliFlowEventCuts newcuts;
-  newcuts.SetRefMultCuts(fTrackCuts);
   AliFlowEventCuts stdtpcrefmultcuts;
   stdtpcrefmultcuts.SetRefMultMethod(AliFlowEventCuts::kTPConly);
   AliFlowEventCuts stdv0refmultcuts;
@@ -235,17 +238,20 @@ void AliAnalysisTaskQAflow::UserExec(Option_t *)
   AliFlowEventCuts stdspdrefmult;
   stdspdrefmult.SetRefMultMethod(AliFlowEventCuts::kSPDtracklets);
 
-  Int_t trackmult = newcuts.RefMult(event);
+  AliFlowEventSimple* flowevent=NULL;
+  AliFlowEventSimple* floweventin = dynamic_cast<AliFlowEventSimple*>(GetInputData(1));
+  if (!floweventin) flowevent = new AliFlowEvent(fTrackCuts,fTrackCuts);
+  else flowevent = new AliFlowEventSimple(*floweventin);
+
+  Int_t rpmult = flowevent->GetReferenceMultiplicity();
   Int_t refmult = fEventCuts->RefMult(event);
   Int_t refmultv0 = stdv0refmultcuts.RefMult(event);
   Int_t refmulttpc = stdtpcrefmultcuts.RefMult(event);
   Int_t refmultspdtr = stdspdrefmult.RefMult(event);
   Int_t refmultspdcls = stdspd1refmult.RefMult(event);
 
-  Bool_t passevent = fEventCuts->IsSelected(event);
-
   htrackletmultB->Fill(ntracklets); if (passevent) htrackletmultA->Fill(ntracklets); 
-  htrackmultB->Fill(trackmult); if (passevent) htrackmultA->Fill( trackmult); 
+  htrackmultB->Fill(rpmult); if (passevent) htrackmultA->Fill(rpmult); 
   hrefmultB->Fill(refmult); if (passevent) hrefmultA->Fill( refmult); 
   hstdv0multB->Fill(refmultv0); if (passevent) hstdv0multA->Fill( refmultv0);
   hstdtpcmultB->Fill(refmulttpc); if (passevent) hstdtpcmultA->Fill( refmulttpc);
@@ -342,25 +348,29 @@ void AliAnalysisTaskQAflow::UserExec(Option_t *)
       if (charge>0) {hptyieldplusB->Fill(pt); if (pass) hptyieldplusA->Fill(pt);}
       if (charge<0) {hptyieldnegB->Fill(pt); if (pass) hptyieldnegA->Fill(pt);}
       hchargesB->Fill(charge); if (pass) hchargesA->Fill(charge);
-      for (Int_t j=i+1; j<ntracks; j++)
+      /////////////////////////////////////////////////////////////////////////////
+      ////  correlation part   ///////////////////////
+      /////////////////////////////////////////
+      if (fDoCorrelations)
       {
-        TObject* obj2 = fTrackCuts->GetInputObject(j);
-        if (!obj2) continue;
-        Bool_t pass2 = fTrackCuts->IsSelected(obj2,j);
-        AliESDtrack* track2 = dynamic_cast<AliESDtrack*>(fTrackCuts->GetTrack());
-        if (track2)
+        for (Int_t j=i+1; j<ntracks; j++)
         {
-          Double_t dphi = phi-track2->Phi();
-          hphisepB->Fill(dphi); if (pass&&pass2) hphisepA->Fill(dphi);
+          TObject* obj2 = fTrackCuts->GetInputObject(j);
+          if (!obj2) continue;
+          Bool_t pass2 = fTrackCuts->IsSelected(obj2,j);
+          AliESDtrack* track2 = dynamic_cast<AliESDtrack*>(fTrackCuts->GetTrack());
+          if (track2)
+          {
+            Double_t dphi = phi-track2->Phi();
+            hphisepB->Fill(dphi); if (pass&&pass2) hphisepA->Fill(dphi);
+          }
         }
-      }
+      }//correlations
     }
   }
-  if (ntracks!=0) meanpt = meanpt/nselected;
+  if (nselected!=0) meanpt = meanpt/nselected;
   if (ntracks!=0) rawmeanpt = rawmeanpt/ntracks;
   
-  Bool_t isSelectedEventSelection = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
-  
   ///////////////////////////////////////////////////////////////////////
   if (fFillNtuple)
   {
@@ -379,50 +389,33 @@ void AliAnalysisTaskQAflow::UserExec(Option_t *)
     Double_t qxb = 0.0;
     Double_t qyb = 0.0;
     Double_t qmb = 0.0;
-    AliFlowVector qvec;
-    AliFlowEventSimple* flowevent = dynamic_cast<AliFlowEventSimple*>(GetInputData(1));
-    if (!flowevent) flowevent = new AliFlowEvent(fTrackCuts,fTrackCuts);
 
-    AliFlowTrackCuts cutspos(*fTrackCuts);
-    cutspos.SetEvent(event);
-    cutspos.SetCharge(1);
-    AliFlowTrackCuts cutsneg(*fTrackCuts);
-    cutsneg.SetEvent(event);
-    cutsneg.SetCharge(-1);
-    AliFlowTrackCuts cutssuba(*fTrackCuts);
-    cutssuba.SetEvent(event);
-    cutssuba.SetEtaRange(-0.8,-0.1);
-    AliFlowTrackCuts cutssubb(*fTrackCuts);
-    cutssubb.SetEvent(event);
-    cutssubb.SetEtaRange(0.1,0.8);
-    AliFlowEvent evpos(&cutspos,&cutspos);
-    AliFlowEvent evneg(&cutsneg,&cutsneg);
-    AliFlowEvent evsuba(&cutssuba,&cutssuba);
-    AliFlowEvent evsubb(&cutssubb, &cutssubb);
+    AliFlowVector qvec[2];
+
+    qvec[0] = flowevent->GetQ(2);
+    qx = qvec[0].X();
+    qy = qvec[0].Y();
+    qm = qvec[0].GetMult();
+    flowevent->TagSubeventsByCharge();
+    flowevent->Get2Qsub(qvec,2);
+    qxp = qvec[0].X();
+    qyp = qvec[0].Y();
+    qmp = qvec[0].GetMult();
+    qxn = qvec[1].X();
+    qyn = qvec[1].Y();
+    qmn = qvec[1].GetMult();
+    flowevent->TagSubeventsInEta(-0.8,-0.1,0.1,0.8);
+    flowevent->Get2Qsub(qvec,2);
+    qxa = qvec[0].X();
+    qya = qvec[0].Y();
+    qma = qvec[0].GetMult();
+    qxb = qvec[1].X();
+    qyb = qvec[1].Y();
+    qmb = qvec[1].GetMult();
 
-    qvec = flowevent->GetQ(2);
-    qx = qvec.X();
-    qy = qvec.Y();
-    qm = qvec.GetMult();
-    qvec = evpos.GetQ(2);
-    qxp = qvec.X();
-    qyp = qvec.Y();
-    qmp = qvec.GetMult();
-    qvec = evneg.GetQ(2);
-    qxn = qvec.X();
-    qyn = qvec.Y();
-    qmn = qvec.GetMult();
-    qvec = evsuba.GetQ(2);
-    qxa = qvec.X();
-    qya = qvec.Y();
-    qma = qvec.GetMult();
-    qvec = evsubb.GetQ(2);
-    qxb = qvec.X();
-    qyb = qvec.Y();
-    qmb = qvec.GetMult();
 
     Float_t x[45];
-    x[0]=meanpt; x[1]=qx; x[2]=qy; x[3]=trackmult; x[4]=refmult; x[5]=(isSelectedEventSelection)?1:0;
+    x[0]=meanpt; x[1]=qx; x[2]=qy; x[3]=rpmult; x[4]=refmult; x[5]=(isSelectedEventSelection)?1:0;
     x[6]=vtxTPCx; x[7]=vtxTPCy; x[8]=vtxTPCz; x[9]=ntrackletsA; x[10]=ntrackletsC;
     x[11]=mv0a; x[12]=mv0c; x[13]=zdcp1; x[14]=zdcn1; x[15]=zdcp2; x[16]=zdcn2;
     x[17]=zdcpart1; x[18]=zdcpart2;
@@ -454,6 +447,8 @@ void AliAnalysisTaskQAflow::UserExec(Option_t *)
     x[44]=qmb;
     fNtuple->Fill(x);
   }//if flowevent
+
+  delete flowevent;
 }
 
 //________________________________________________________________________
index 8f334585f7559680741c09673af9375052a84fc8..0206484a8f18de0b28c76cbf66fe94982c4bc084 100644 (file)
@@ -23,11 +23,13 @@ class AliAnalysisTaskQAflow: public AliAnalysisTaskSE
 
     void SetTrackCuts(AliFlowTrackCuts* trackcuts) {fTrackCuts=trackcuts;}
     void SetEventCuts(AliFlowEventCuts* eventcuts) {fEventCuts=eventcuts;}
-    void SetFillNTuple(Bool_t b) {fFillNtuple=b;}
+    void SetFillNTuple(Bool_t b=kTRUE) {fFillNtuple=b;}
+    void SetDoCorrelations(Bool_t b=kTRUE) {fDoCorrelations=b;}
   
   private:
     TObjArray* fOutput; //output histograms
     Bool_t fFillNtuple;  //fil; the ntuple
+    Bool_t fDoCorrelations; //do the slow loopinloop correlations
     TNtuple* fNtuple; //output ntuple
     AliFlowEventCuts* fEventCuts; //AliAnalysisCuts - applied before analysis - for comparing different event classes
     AliFlowTrackCuts* fTrackCuts; //AliFlowTrackCuts go in here
index 1dc9e2a1a2c244076f5bc38293030fd03adb2da0..7b135e1f59da72db159f63a8c11fb98fbbc3b344 100644 (file)
@@ -270,33 +270,33 @@ Int_t AliFlowEventCuts::RefMult(const AliVEvent* event)
   const AliESDEvent* esdevent = dynamic_cast<const AliESDEvent*>(event);
   const AliMultiplicity* mult = esdevent->GetMultiplicity();
   Int_t refmult=0;
-  if (!fRefMultCuts)
+
+  switch (fRefMultMethod)
   {
-    switch (fRefMultMethod)
-    {
-      case kTPConly:
-        fRefMultCuts = AliFlowTrackCuts::GetStandardTPCOnlyTrackCuts();
-        fRefMultCuts->SetEtaRange(-0.8,0.8);
-        fRefMultCuts->SetPtMin(0.15);
-        break;
-      case kSPDtracklets:
-        fRefMultCuts = new AliFlowTrackCuts();
-        fRefMultCuts->SetParamType(AliFlowTrackCuts::kESD_SPDtracklet);
-        fRefMultCuts->SetEtaRange(-0.8,0.8);
-        break;
-      case kV0:
-        if (!esdevent) return 0;
-        vzero=esdevent->GetVZEROData();
-        if (!vzero) return 0;
-        refmult = TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
-        return refmult;
-      case kSPD1clusters:
-        if (!mult) return 0;
-        refmult = mult->GetNumberOfITSClusters(1);
-        return refmult;
-      default:
-        return 0;
-    }
+    case kTPConly:
+      if (fRefMultCuts) break;
+      fRefMultCuts = AliFlowTrackCuts::GetStandardTPCOnlyTrackCuts();
+      fRefMultCuts->SetEtaRange(-0.8,0.8);
+      fRefMultCuts->SetPtMin(0.15);
+      break;
+    case kSPDtracklets:
+      if (fRefMultCuts) break;
+      fRefMultCuts = new AliFlowTrackCuts();
+      fRefMultCuts->SetParamType(AliFlowTrackCuts::kESD_SPDtracklet);
+      fRefMultCuts->SetEtaRange(-0.8,0.8);
+      break;
+    case kV0:
+      if (!esdevent) return 0;
+      vzero=esdevent->GetVZEROData();
+      if (!vzero) return 0;
+      refmult = TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
+      return refmult;
+    case kSPD1clusters:
+      if (!mult) return 0;
+      refmult = mult->GetNumberOfITSClusters(1);
+      return refmult;
+    default:
+      return 0;
   }
 
   fRefMultCuts->SetEvent(const_cast<AliVEvent*>(event));
index d6f7728e0a1efe73ae786f1733dab97d441625ca..014ffa57152b1197038674d8f8f232fc7010cc27 100644 (file)
@@ -36,6 +36,7 @@
 
 #include <limits.h>
 #include <float.h>
+#include <TMatrix.h>
 #include "TParticle.h"
 #include "TObjArray.h"
 #include "AliStack.h"
@@ -49,6 +50,7 @@
 #include "AliFlowTrack.h"
 #include "AliFlowTrackCuts.h"
 #include "AliLog.h"
+#include "AliESDpid.h"
 
 ClassImp(AliFlowTrackCuts)
 
@@ -76,6 +78,9 @@ AliFlowTrackCuts::AliFlowTrackCuts():
   fCutChi2PerClusterTPC(kFALSE),
   fMaxChi2PerClusterTPC(FLT_MAX),
   fMinChi2PerClusterTPC(-FLT_MAX),
+  fCutNClustersTPC(kFALSE),
+  fNClustersTPCMax(INT_MAX),
+  fNClustersTPCMin(INT_MIN),  
   fParamType(kGlobal),
   fParamMix(kPure),
   fTrack(NULL),
@@ -86,7 +91,13 @@ AliFlowTrackCuts::AliFlowTrackCuts():
   fMCevent(NULL),
   fMCparticle(NULL),
   fEvent(NULL),
-  fTPCtrack()
+  fTPCtrack(),
+  fESDpid(NULL),
+  fPIDsource(kTPCTOFpid),
+  fTPCpidCuts(NULL),
+  fTOFpidCuts(NULL),
+  fTPCTOFpidCrossOverPt(0.4),
+  fAliPID(AliPID::kPion)
 {
   //constructor 
 }
@@ -115,6 +126,9 @@ AliFlowTrackCuts::AliFlowTrackCuts(const AliFlowTrackCuts& that):
   fCutChi2PerClusterTPC(that.fCutChi2PerClusterTPC),
   fMaxChi2PerClusterTPC(that.fMaxChi2PerClusterTPC),
   fMinChi2PerClusterTPC(that.fMinChi2PerClusterTPC),
+  fCutNClustersTPC(that.fCutNClustersTPC),
+  fNClustersTPCMax(that.fNClustersTPCMax),
+  fNClustersTPCMin(that.fNClustersTPCMin),
   fParamType(that.fParamType),
   fParamMix(that.fParamMix),
   fTrack(NULL),
@@ -125,9 +139,17 @@ AliFlowTrackCuts::AliFlowTrackCuts(const AliFlowTrackCuts& that):
   fMCevent(NULL),
   fMCparticle(NULL),
   fEvent(NULL),
-  fTPCtrack()
+  fTPCtrack(),
+  fESDpid(that.fESDpid),
+  fPIDsource(that.fPIDsource),
+  fTPCpidCuts(NULL),
+  fTOFpidCuts(NULL),
+  fTPCTOFpidCrossOverPt(that.fTPCTOFpidCrossOverPt),
+  fAliPID(that.fAliPID)
 {
   //copy constructor
+  if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
+  if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
 }
 
 //-----------------------------------------------------------------------
@@ -156,6 +178,9 @@ AliFlowTrackCuts& AliFlowTrackCuts::operator=(const AliFlowTrackCuts& that)
   fCutChi2PerClusterTPC=that.fCutChi2PerClusterTPC;
   fMaxChi2PerClusterTPC=that.fMaxChi2PerClusterTPC;
   fMinChi2PerClusterTPC=that.fMinChi2PerClusterTPC;
+  fCutNClustersTPC=that.fCutNClustersTPC;
+  fNClustersTPCMax=that.fNClustersTPCMax;
+  fNClustersTPCMin=that.fNClustersTPCMin;  
   fParamType=that.fParamType;
   fParamMix=that.fParamMix;
 
@@ -168,6 +193,15 @@ AliFlowTrackCuts& AliFlowTrackCuts::operator=(const AliFlowTrackCuts& that)
   fMCparticle=NULL;
   fEvent=NULL;
 
+  fESDpid = that.fESDpid;
+  fPIDsource = that.fPIDsource;
+
+  if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
+  if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
+  fTPCTOFpidCrossOverPt=that.fTPCTOFpidCrossOverPt;
+
+  fAliPID=that.fAliPID;
+
   return *this;
 }
 
@@ -176,6 +210,8 @@ AliFlowTrackCuts::~AliFlowTrackCuts()
 {
   //dtor
   delete fAliESDtrackCuts;
+  delete fTPCpidCuts;
+  delete fTOFpidCuts;
 }
 
 //-----------------------------------------------------------------------
@@ -326,8 +362,9 @@ Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
   
   Bool_t pass=kTRUE;
   //check the common cuts for the current particle fTrack (MC,AOD,ESD)
+  Double_t pt = fTrack->Pt();
   if (!fFakesAreOK) {if (fTrackLabel<0) pass=kFALSE;}
-  if (fCutPt) {if (fTrack->Pt() < fPtMin || fTrack->Pt() >= fPtMax ) pass=kFALSE;}
+  if (fCutPt) {if (pt < fPtMin || pt >= fPtMax ) pass=kFALSE;}
   if (fCutEta) {if (fTrack->Eta() < fEtaMin || fTrack->Eta() >= fEtaMax ) pass=kFALSE;}
   if (fCutPhi) {if (fTrack->Phi() < fPhiMin || fTrack->Phi() >= fPhiMax ) pass=kFALSE;}
   if (fRequireCharge) {if (fTrack->Charge() == 0) pass=kFALSE;}
@@ -336,7 +373,7 @@ Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
   { 
     //in case of an MC particle the charge is stored in units of 1/3|e| 
     Int_t charge = TMath::Nint(fTrack->Charge()/3.0); //mc particles have charge in units of 1/3e
-    return (charge==fCharge);
+    if (charge!=fCharge) pass=kFALSE;
   }
   //if(fCutPID) {if (fTrack->PID() != fPID) pass=kFALSE;}
 
@@ -359,16 +396,51 @@ Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
         if (zout < fIgnoreTPCzRangeMin || zout > fIgnoreTPCzRangeMax) pass=kFALSE;
       }
     }
     if (!fAliESDtrackCuts->IsSelected(static_cast<AliESDtrack*>(fTrack))) pass=kFALSE;
+    Int_t ntpccls = ( fParamType==kESD_TPConly )?
+                      esdTrack->GetTPCNclsIter1():esdTrack->GetTPCNcls();    
     if (fCutChi2PerClusterTPC)
     {
       Float_t tpcchi2 = (fParamType==kESD_TPConly)?
                          esdTrack->GetTPCchi2Iter1():esdTrack->GetTPCchi2();
-      Int_t ntpccls = esdTrack->GetTPCNcls();
       tpcchi2 = (ntpccls>0)?tpcchi2/ntpccls:-FLT_MAX;
       if (tpcchi2<fMinChi2PerClusterTPC || tpcchi2 >=fMaxChi2PerClusterTPC)
         pass=kFALSE;
     }
+
+    if (fCutNClustersTPC)
+    {
+      if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
+    }
+
+    if (fCutPID)
+    {
+      switch (fPIDsource)    
+      {
+        case kTPCpid:
+          if (!PassesTPCpidCut(esdTrack)) pass=kFALSE;
+          break;
+        case kTOFpid:
+          if (!PassesTOFpidCut(esdTrack)) pass=kFALSE;
+          break;
+        case kTPCTOFpid:
+          if (pt< fTPCTOFpidCrossOverPt)
+          {
+            if (!PassesTPCpidCut(esdTrack)) pass=kFALSE;
+          }
+          else //if (pt>=fTPCTOFpidCrossOverPt)
+          {
+            if (!PassesTOFpidCut(esdTrack)) pass=kFALSE;
+          }
+          break;
+        default:
+          printf("AliFlowTrackCuts::PassesCuts() this should never be called!\n");
+          pass=kFALSE;
+          break;
+      }
+    }    
   }
 
   return pass; //true by default, if we didn't set any cuts
@@ -382,6 +454,7 @@ void AliFlowTrackCuts::HandleVParticle(AliVParticle* track)
   {
     default:
       fTrack = track;
+      break;
   }
 }
 
@@ -410,6 +483,7 @@ void AliFlowTrackCuts::HandleESDtrack(AliESDtrack* track)
       break;
     default:
       fTrack = track;
+      break;
   }
 }
 
@@ -477,10 +551,12 @@ AliFlowTrack* AliFlowTrackCuts::MakeFlowTrack() const
         tmpTParticle = fMCparticle->Particle();
         tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
         flowtrack->SetPt(tmpAliMCParticle->Pt());
+        break;
       default:
         flowtrack = new AliFlowTrack();
         flowtrack->SetPhi(fTrackPhi);
         flowtrack->SetEta(fTrackEta);
+        break;
     }
     flowtrack->SetSource(AliFlowTrack::kFromTracklet);
   }
@@ -503,14 +579,17 @@ AliFlowTrack* AliFlowTrackCuts::MakeFlowTrack() const
         if (!fMCparticle) return NULL;
         flowtrack = new AliFlowTrack(fTrack);
         flowtrack->SetPt(fMCparticle->Pt());
+        break;
       case kTrackWithPtFromFirstMother:
         if (!fMCparticle) return NULL;
         flowtrack = new AliFlowTrack(fTrack);
         tmpTParticle = fMCparticle->Particle();
         tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
         flowtrack->SetPt(tmpAliMCParticle->Pt());
+        break;
       default:
         flowtrack = new AliFlowTrack(fTrack);
+        break;
     }
     if (fParamType==kMC) flowtrack->SetSource(AliFlowTrack::kFromMC);
     else if (dynamic_cast<AliESDtrack*>(fTrack)) flowtrack->SetSource(AliFlowTrack::kFromESD);
@@ -623,3 +702,241 @@ void AliFlowTrackCuts::Clear(Option_t*)
   fTrackEta=0.0;
   fTrackPhi=0.0;
 }
+
+//-----------------------------------------------------------------------
+Bool_t AliFlowTrackCuts::PassesTOFpidCut(AliESDtrack* t )
+{
+  //check if passes PID cut using timing in TOF
+  if (!fESDpid) return kFALSE;
+  if (!(t && (t->GetStatus() & AliESDtrack::kTOFout) && (t->GetStatus() & AliESDtrack::kTIME)
+       && (t->GetTOFsignal() > 12000) && (t->GetTOFsignal() < 100000) && (t->GetIntegratedLength() > 365)))
+       return kFALSE;
+  Float_t pt = t->Pt();
+  Float_t p = t->GetP();
+  Float_t trackT0 = fESDpid->GetTOFResponse().GetStartTime(p);
+  Float_t timeTOF = t->GetTOFsignal()- trackT0; 
+  //2=pion 3=kaon 4=protons
+  Double_t inttimes[5] = {-1.0,-1.0,-1.0,-1.0,-1.0};
+  t->GetIntegratedTimes(inttimes);
+  //construct the pid index because it's screwed up in TOF
+  Int_t pid = 0;
+  switch (fAliPID)
+  {
+    case AliPID::kPion:
+      pid=2;
+      break;
+    case AliPID::kKaon:
+      pid=3;
+      break;
+    case AliPID::kProton:
+      pid=4;
+      break;
+    default:
+      return kFALSE;
+  }
+  Float_t s = timeTOF-inttimes[pid];
+
+  Float_t* arr = fTOFpidCuts->GetMatrixArray();
+  Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(pt));
+  if (col<0) return kFALSE;
+  Float_t min = (*fTOFpidCuts)(1,col);
+  Float_t max = (*fTOFpidCuts)(2,col);
+
+  //printf("TOF pid cut %s\n",(s>min && s<max)?"PASS":"FAIL");
+  return (s>min && s<max);
+}
+
+//-----------------------------------------------------------------------
+Bool_t AliFlowTrackCuts::PassesTPCpidCut(AliESDtrack* track)
+{
+  //check if passes PID cut using dedx signal in the TPC
+  if (!fESDpid) 
+  {
+    return kFALSE;
+  }
+  if (!fTPCpidCuts)
+  {
+    printf("no TPCpidCuts\n");
+    return kFALSE;
+  }
+
+  const AliExternalTrackParam* tpcparam = track->GetInnerParam();
+  if (!tpcparam) return kFALSE;
+  Float_t sigExp = fESDpid->GetTPCResponse().GetExpectedSignal(tpcparam->GetP(), fAliPID);
+  Float_t sigTPC = track->GetTPCsignal();
+  Float_t s = (sigTPC-sigExp)/sigExp;
+  Double_t pt = track->Pt();
+
+  Float_t* arr = fTPCpidCuts->GetMatrixArray();
+  Int_t col = TMath::BinarySearch(fTPCpidCuts->GetNcols(),arr,static_cast<Float_t>(pt));
+  if (col<0) return kFALSE;
+  Float_t min = (*fTPCpidCuts)(1,col);
+  Float_t max = (*fTPCpidCuts)(2,col);
+
+  //printf("------------TPC pid cut %s\n",(s>min && s<max)?"PASS":"FAIL");
+  return (s>min && s<max);
+}
+
+//-----------------------------------------------------------------------
+void AliFlowTrackCuts::InitPIDcuts()
+{
+  //init matrices with PID cuts
+  TMatrixF* t = NULL;
+  if (!fTPCpidCuts)
+  {
+    if (fAliPID==AliPID::kPion)
+    {
+      t = new TMatrixF(3,10);
+      (*t)(0,0)  = 0.20;  (*t)(1,0)  = -0.4;  (*t)(2,0)  =   0.2;
+      (*t)(0,1)  = 0.25;  (*t)(1,1)  = -0.4;  (*t)(2,1)  =   0.2;
+      (*t)(0,2)  = 0.30;  (*t)(1,2)  = -0.4;  (*t)(2,2)  =  0.25;
+      (*t)(0,3)  = 0.35;  (*t)(1,3)  = -0.4;  (*t)(2,3)  =  0.25;
+      (*t)(0,4)  = 0.40;  (*t)(1,4)  = -0.4;  (*t)(2,4)  =   0.3;
+      (*t)(0,5)  = 0.45;  (*t)(1,5)  = -0.4;  (*t)(2,5)  =   0.3;
+      (*t)(0,6)  = 0.50;  (*t)(1,6)  = -0.4;  (*t)(2,6)  =  0.25;
+      (*t)(0,7)  = 0.55;  (*t)(1,7)  = -0.4;  (*t)(2,7)  =  0.15;
+      (*t)(0,8)  = 0.60;  (*t)(1,8)  = -0.4;  (*t)(2,8)  =   0.1;
+      (*t)(0,9)  = 0.65;  (*t)(1,9)  =    0;  (*t)(2,9)  =     0;
+    }
+    else
+    if (fAliPID==AliPID::kProton)
+    {
+      t = new TMatrixF(3,16);
+      (*t)(0,0)  = 0.20;  (*t)(1,0)  =     0;  (*t)(2,0)  =  0.3; 
+      (*t)(0,1)  = 0.25;  (*t)(1,1)  =  -0.2;  (*t)(2,1)  =  0.6; 
+      (*t)(0,2)  = 0.30;  (*t)(1,2)  =  -0.2;  (*t)(2,2)  =  0.6; 
+      (*t)(0,3)  = 0.35;  (*t)(1,3)  =  -0.2;  (*t)(2,3)  =  0.6; 
+      (*t)(0,4)  = 0.40;  (*t)(1,4)  =  -0.2;  (*t)(2,4)  =  0.6; 
+      (*t)(0,5)  = 0.45;  (*t)(1,5)  = -0.15;  (*t)(2,5)  =  0.6; 
+      (*t)(0,6)  = 0.50;  (*t)(1,6)  =  -0.1;  (*t)(2,6)  =  0.6; 
+      (*t)(0,7)  = 0.55;  (*t)(1,7)  = -0.05;  (*t)(2,7)  = 0.45; 
+      (*t)(0,8)  = 0.60;  (*t)(1,8)  = -0.05;  (*t)(2,8)  = 0.45; 
+      (*t)(0,9)  = 0.65;  (*t)(1,9)  = -0.05;  (*t)(2,9)  = 0.45; 
+      (*t)(0,10) = 0.70;  (*t)(1,10) = -0.05;  (*t)(2,10) = 0.45; 
+      (*t)(0,11) = 0.75;  (*t)(1,11) = -0.05;  (*t)(2,11) = 0.45; 
+      (*t)(0,12) = 0.80;  (*t)(1,12) =     0;  (*t)(2,12) = 0.45; 
+      (*t)(0,13) = 0.85;  (*t)(1,13) =     0;  (*t)(2,13) = 0.45; 
+      (*t)(0,14) = 0.90;  (*t)(1,14) =     0;  (*t)(2,14) = 0.45;
+      (*t)(0,15) = 0.95;  (*t)(1,15) =     0;  (*t)(2,15) =    0;
+    }
+    else
+    if (fAliPID==AliPID::kKaon)
+    {
+      t = new TMatrixF(3,7);
+      (*t)(0,0)  = 0.20;  (*t)(1,0)  = -0.2;  (*t)(2,0)  = 0.4; 
+      (*t)(0,1)  = 0.25;  (*t)(1,1)  =-0.15;  (*t)(2,1)  = 0.4;
+      (*t)(0,2)  = 0.30;  (*t)(1,2)  = -0.1;  (*t)(2,2)  = 0.4;
+      (*t)(0,3)  = 0.35;  (*t)(1,3)  = -0.1;  (*t)(2,3)  = 0.4;
+      (*t)(0,4)  = 0.40;  (*t)(1,4)  = -0.1;  (*t)(2,4)  = 0.6;
+      (*t)(0,5)  = 0.45;  (*t)(1,5)  = -0.1;  (*t)(2,5)  = 0.6;
+      (*t)(0,6)  = 0.50;  (*t)(1,6)  =    0;  (*t)(2,6)  =0;
+    }
+    fTPCpidCuts=t;
+  }
+  if (!fTOFpidCuts)
+  {
+    if (fAliPID==AliPID::kPion)
+    {
+      t = new TMatrixF(3,26);
+      (*t)(0,0)  = 0.3;   (*t)(1,0)  = -700;  (*t)(2,0)  = 700;
+      (*t)(0,1)  = 0.35;  (*t)(1,1)  = -800;  (*t)(2,1)  = 800;
+      (*t)(0,2)  = 0.40;  (*t)(1,2)  = -600;  (*t)(2,2)  = 800;
+      (*t)(0,3)  = 0.45;  (*t)(1,3)  = -500;  (*t)(2,3)  = 700;
+      (*t)(0,4)  = 0.50;  (*t)(1,4)  = -400;  (*t)(2,4)  = 700;
+      (*t)(0,5)  = 0.55;  (*t)(1,5)  = -400;  (*t)(2,5)  = 700;
+      (*t)(0,6)  = 0.60;  (*t)(1,6)  = -400;  (*t)(2,6)  = 700;
+      (*t)(0,7)  = 0.65;  (*t)(1,7)  = -400;  (*t)(2,7)  = 700;
+      (*t)(0,8)  = 0.70;  (*t)(1,8)  = -400;  (*t)(2,8)  = 700;
+      (*t)(0,9)  = 0.75;  (*t)(1,9)  = -400;  (*t)(2,9)  = 700;
+      (*t)(0,10) = 0.80;  (*t)(1,10) = -400;  (*t)(2,10) = 600;
+      (*t)(0,11) = 0.85;  (*t)(1,11) = -400;  (*t)(2,11) = 600;
+      (*t)(0,12) = 0.90;  (*t)(1,12) = -400;  (*t)(2,12) = 600;
+      (*t)(0,13) = 0.95;  (*t)(1,13) = -400;  (*t)(2,13) = 600;
+      (*t)(0,14) = 1.00;  (*t)(1,14) = -400;  (*t)(2,14) = 550;
+      (*t)(0,15) = 1.10;  (*t)(1,15) = -400;  (*t)(2,15) = 450;
+      (*t)(0,16) = 1.20;  (*t)(1,16) = -400;  (*t)(2,16) = 400;
+      (*t)(0,17) = 1.30;  (*t)(1,17) = -400;  (*t)(2,17) = 300;
+      (*t)(0,18) = 1.40;  (*t)(1,18) = -400;  (*t)(2,18) = 300;
+      (*t)(0,19) = 1.50;  (*t)(1,19) = -400;  (*t)(2,19) = 250;
+      (*t)(0,20) = 1.60;  (*t)(1,20) = -400;  (*t)(2,20) = 200;
+      (*t)(0,21) = 1.70;  (*t)(1,21) = -400;  (*t)(2,21) = 150;
+      (*t)(0,22) = 1.80;  (*t)(1,22) = -400;  (*t)(2,22) = 100;
+      (*t)(0,23) = 1.90;  (*t)(1,23) = -400;  (*t)(2,23) =  70;
+      (*t)(0,24) = 2.00;  (*t)(1,24) = -400;  (*t)(2,24) =  50;
+      (*t)(0,25) = 2.10;  (*t)(1,25) =    0;  (*t)(2,25) =   0;
+    }
+    else
+    if (fAliPID==AliPID::kProton)
+    {
+      t = new TMatrixF(3,39);
+      (*t)(0,0)  = 0.3;  (*t)(1,0)   = 0; (*t)(2,0) = 0;
+      (*t)(0,1)  = 0.35;  (*t)(1,1)  = 0; (*t)(2,1) = 0;
+      (*t)(0,2)  = 0.40;  (*t)(1,2)  = 0; (*t)(2,2) = 0;
+      (*t)(0,3)  = 0.45;  (*t)(1,3)  = 0; (*t)(2,3) = 0;
+      (*t)(0,4)  = 0.50;  (*t)(1,4)  = 0; (*t)(2,4) = 0;
+      (*t)(0,5)  = 0.55;  (*t)(1,5)  = -900;  (*t)(2,5)  = 600;
+      (*t)(0,6)  = 0.60;  (*t)(1,6)  = -800;  (*t)(2,6)  = 600;
+      (*t)(0,7)  = 0.65;  (*t)(1,7)  = -800;  (*t)(2,7)  = 600;
+      (*t)(0,8)  = 0.70;  (*t)(1,8)  = -800;  (*t)(2,8)  = 600;
+      (*t)(0,9)  = 0.75;  (*t)(1,9)  = -700;  (*t)(2,9)  = 500;
+      (*t)(0,10) = 0.80;  (*t)(1,10) = -700;  (*t)(2,10) = 500;
+      (*t)(0,11) = 0.85;  (*t)(1,11) = -700;  (*t)(2,11) = 500;
+      (*t)(0,12) = 0.90;  (*t)(1,12) = -600;  (*t)(2,12) = 500;
+      (*t)(0,13) = 0.95;  (*t)(1,13) = -600;  (*t)(2,13) = 500;
+      (*t)(0,14) = 1.00;  (*t)(1,14) = -600;  (*t)(2,14) = 500;
+      (*t)(0,15) = 1.10;  (*t)(1,15) = -600;  (*t)(2,15) = 500;
+      (*t)(0,16) = 1.20;  (*t)(1,16) = -500;  (*t)(2,16) = 500;
+      (*t)(0,17) = 1.30;  (*t)(1,17) = -500;  (*t)(2,17) = 500;
+      (*t)(0,18) = 1.40;  (*t)(1,18) = -500;  (*t)(2,18) = 500;
+      (*t)(0,19) = 1.50;  (*t)(1,19) = -500;  (*t)(2,19) = 500;
+      (*t)(0,20) = 1.60;  (*t)(1,20) = -400;  (*t)(2,20) = 500;
+      (*t)(0,21) = 1.70;  (*t)(1,21) = -400;  (*t)(2,21) = 500;
+      (*t)(0,22) = 1.80;  (*t)(1,22) = -400;  (*t)(2,22) = 500;
+      (*t)(0,23) = 1.90;  (*t)(1,23) = -400;  (*t)(2,23) = 500;
+      (*t)(0,24) = 2.00;  (*t)(1,24) = -400;  (*t)(2,24) = 500;
+      (*t)(0,25) = 2.10;  (*t)(1,25) = -350;  (*t)(2,25) = 500;
+      (*t)(0,26) = 2.20;  (*t)(1,26) = -350;  (*t)(2,26) = 500;
+      (*t)(0,27) = 2.30;  (*t)(1,27) = -300;  (*t)(2,27) = 500;
+      (*t)(0,28) = 2.40;  (*t)(1,28) = -300;  (*t)(2,28) = 500;
+      (*t)(0,29) = 3.30;  (*t)(1,29) = -300;  (*t)(2,29) = 500;
+      (*t)(0,30) = 3.30;  (*t)(1,30) = -250;  (*t)(2,30) = 500;
+      (*t)(0,31) = 3.30;  (*t)(1,31) = -200;  (*t)(2,31) = 500;
+      (*t)(0,32) = 3.30;  (*t)(1,32) = -150;  (*t)(2,32) = 500;
+      (*t)(0,33) = 3.30;  (*t)(1,33) = -150;  (*t)(2,33) = 500;
+      (*t)(0,34) = 3.30;  (*t)(1,34) = -100;  (*t)(2,34) = 400;
+      (*t)(0,35) = 3.30;  (*t)(1,35) = -100;  (*t)(2,35) = 400;
+      (*t)(0,36) = 3.30;  (*t)(1,36) =    0;  (*t)(2,36) = 0;
+      (*t)(0,37) = 3.30;  (*t)(1,37) =    0;  (*t)(2,37) = 0;
+      (*t)(0,38) = 3.30;  (*t)(1,38) =    0;  (*t)(2,38) = 0;
+    }
+    else
+    if (fAliPID==AliPID::kKaon)
+    {
+      t = new TMatrixF(3,23);
+      (*t)(0,0)  = 0.3;   (*t)(1,0)  =    0;  (*t)(2,0)  =    0;
+      (*t)(0,1)  = 0.35;  (*t)(1,1)  =    0;  (*t)(2,1)  =    0;
+      (*t)(0,2)  = 0.40;  (*t)(1,2)  = -800;  (*t)(2,2)  =  600;
+      (*t)(0,3)  = 0.45;  (*t)(1,3)  = -800;  (*t)(2,3)  =  600;
+      (*t)(0,4)  = 0.50;  (*t)(1,4)  = -800;  (*t)(2,4)  =  600;
+      (*t)(0,5)  = 0.55;  (*t)(1,5)  = -800;  (*t)(2,5)  =  600;
+      (*t)(0,6)  = 0.60;  (*t)(1,6)  = -800;  (*t)(2,6)  =  600;
+      (*t)(0,7)  = 0.65;  (*t)(1,7)  = -700;  (*t)(2,7)  =  600;
+      (*t)(0,8)  = 0.70;  (*t)(1,8)  = -600;  (*t)(2,8)  =  600;
+      (*t)(0,9)  = 0.75;  (*t)(1,9)  = -600;  (*t)(2,9)  =  500;
+      (*t)(0,10) = 0.80;  (*t)(1,10) = -500;  (*t)(2,10) =  500;
+      (*t)(0,11) = 0.85;  (*t)(1,11) = -500;  (*t)(2,11) =  500;
+      (*t)(0,12) = 0.90;  (*t)(1,12) = -400;  (*t)(2,12) =  500;
+      (*t)(0,13) = 0.95;  (*t)(1,13) = -400;  (*t)(2,13) =  500;
+      (*t)(0,14) = 1.00;  (*t)(1,14) = -400;  (*t)(2,14) =  500;
+      (*t)(0,15) = 1.10;  (*t)(1,15) = -350;  (*t)(2,15) =  450;
+      (*t)(0,16) = 1.20;  (*t)(1,16) = -300;  (*t)(2,16) =  400;
+      (*t)(0,17) = 1.30;  (*t)(1,17) = -300;  (*t)(2,17) =  400;
+      (*t)(0,18) = 1.40;  (*t)(1,18) = -250;  (*t)(2,18) =  400;
+      (*t)(0,19) = 1.50;  (*t)(1,19) = -200;  (*t)(2,19) =  400;
+      (*t)(0,20) = 1.60;  (*t)(1,20) = -150;  (*t)(2,20) =  400;
+      (*t)(0,21) = 1.70;  (*t)(1,21) = -100;  (*t)(2,21) =  400;
+      (*t)(0,22) = 1.80;  (*t)(1,22) =    0;  (*t)(2,22) =    0;
+    }
+    fTOFpidCuts=t;
+  }
+}
index 37b8fab62197673fcf484403c7ec35ebd293b092..243fdfffbda4e3c01b61cfd710cc4004b3677b9e 100644 (file)
@@ -9,10 +9,12 @@
 #ifndef ALIFLOWTRACKCUTS_H
 #define ALIFLOWTRACKCUTS_H
 
+#include <TMatrix.h>
 #include "AliFlowTrackSimpleCuts.h"
 #include "AliESDtrackCuts.h"
 #include "TMCProcess.h"
 #include "AliESDtrack.h"
+#include "AliPID.h"
 
 class TObjArray;
 class AliVParticle;
@@ -21,6 +23,7 @@ class AliFlowTrack;
 class AliMCEvent;
 class AliVEvent;
 class AliMultiplicity; 
+class AliESDpid;
 
 class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
 
@@ -35,6 +38,7 @@ class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
 
   enum trackParameterType { kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet };
   enum trackParameterMix  { kPure, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt, kTrackWithPtFromFirstMother };
+  enum PIDsource {kTPCpid, kTOFpid, kTPCTOFpid};
 
   //setters (interface to AliESDtrackCuts)
   void SetMinNClustersTPC( Int_t a ) {fAliESDtrackCuts->SetMinNClustersTPC(a);}
@@ -124,15 +128,25 @@ class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
   TObject* GetInputObject(Int_t i);
   void Clear(Option_t* option="");
 
+  //PID
+  void SetPID(AliPID::EParticleType pid, PIDsource s=kTPCTOFpid) {fAliPID=pid; fPIDsource=s; fCutPID=kTRUE; InitPIDcuts();}
+  void SetESDpid(AliESDpid* o) {fESDpid=o;}
+  void SetTPCTOFpidCrossOverPt(Double_t pt) {fTPCTOFpidCrossOverPt=pt;}
+  void SetTPCpidCuts(TMatrixF* mat) {fTPCpidCuts=new TMatrixF(*mat);}
+  void SetTOFpidCuts(TMatrixF* mat) {fTOFpidCuts=new TMatrixF(*mat);}
+
  protected:
   Bool_t PassesCuts(AliVParticle* track);
   Bool_t PassesCuts(AliFlowTrackSimple* track);
   Bool_t PassesCuts(AliMultiplicity* track, Int_t id);
   Bool_t PassesMCcuts();
   Bool_t PassesMCcuts(AliMCEvent* mcevent, Int_t label);
+  Bool_t PassesTPCpidCut(AliESDtrack* track);
+  Bool_t PassesTOFpidCut(AliESDtrack* track);  
   void HandleESDtrack(AliESDtrack* track);
   void HandleVParticle(AliVParticle* track);
   void DefineHistograms();
+  void InitPIDcuts();
 
   //the cuts
   AliESDtrackCuts* fAliESDtrackCuts; //alianalysis cuts
@@ -156,6 +170,9 @@ class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
   Bool_t fCutChi2PerClusterTPC; //cut on tpc chi2
   Float_t fMaxChi2PerClusterTPC; //max chi2 tpc/cluster
   Float_t fMinChi2PerClusterTPC; //min chi2 tpc/cluster
+  Bool_t fCutNClustersTPC;       //cut on clusters?
+  Int_t fNClustersTPCMax;        //max tpc ncls
+  Int_t fNClustersTPCMin;        //min tpc clusters  
 
   trackParameterType fParamType;     //parameter type tu cut on
   trackParameterMix fParamMix;       //parameter mixing
@@ -169,6 +186,14 @@ class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
   AliVEvent* fEvent;                 //!placeholder for current event
   AliESDtrack fTPCtrack;             //!placeholder for TPC only track to avoid new/delete on every track
 
+  //PID
+  AliESDpid* fESDpid; //pid obj
+  PIDsource fPIDsource; //pid source
+  TMatrixF* fTPCpidCuts; //tpc pid cuts
+  TMatrixF* fTOFpidCuts; //tof pid cuts
+  Double_t fTPCTOFpidCrossOverPt; //pt cross over for pid, below TPC is taken, above TOF
+  AliPID::EParticleType fAliPID; //alipid
+
   ClassDef(AliFlowTrackCuts,4)
 };
 
index 0893ca9c777486220af2fe3849d645fe8cc19361..ba2d14fac3d1495fc2188856a3e630a859767c47 100644 (file)
@@ -33,6 +33,7 @@ Bool_t  UsePhysicsSelection = kTRUE;
 
 // generate the control ntuple
 Bool_t FillQAntuple=kFALSE;
+Bool_t DoQAcorrelations=kFALSE;
 
 // RUN SETTINGS
 // Flow analysis method can be:(set to kTRUE or kFALSE)
@@ -136,6 +137,11 @@ void AddTaskFlowCentrality( Int_t refMultMin=0,
   //cutsPOI->SetMaxNsigmaToVertex(1.e+10);
   //cutsPOI->SetRequireSigmaToVertex(kFALSE);
   cutsPOI->SetAcceptKinkDaughters(kFALSE);
+  //cutsPOI->SetPID(AliPID::kProton, AliFlowTrackCuts::kTOFpid);
+  //cutsPOI->SetPID(AliPID::kPion, AliFlowTrackCuts::kTPCpid);
+  //cutsPOI->SetPID(AliPID::kProton, AliFlowTrackCuts::kTPCTOFpid);
+  //cutsPOI->SetTPCTOFpidCrossOverPt(0.4);
+
   
   // common constants:
   Int_t nBinsMult = 10000;  
@@ -321,7 +327,8 @@ void AddTaskFlowCentrality( Int_t refMultMin=0,
   // Pass cuts for RPs and POIs to the task:
   taskFE->SetCutsRP(cutsRP);
   taskFE->SetCutsPOI(cutsPOI);
+  taskFE->SetTOFresolution(80);
+
   // Pass common constants:
   taskFE->SetNbinsMult(nBinsMult);
   taskFE->SetNbinsPt(nBinsPt);
@@ -430,6 +437,7 @@ void AddTaskFlowCentrality( Int_t refMultMin=0,
   taskQAflow->SetEventCuts(cutsEvent);
   taskQAflow->SetTrackCuts(cutsRP);
   taskQAflow->SetFillNTuple(FillQAntuple);
+  taskQAflow->SetDoCorrelations(DoQAcorrelations);
   mgr->AddTask(taskQAflow);
   
   // Create the output container for the data produced by the task
@@ -629,7 +637,7 @@ void AddTaskFlowCentrality( Int_t refMultMin=0,
   mgr->ConnectInput(taskQAflow,0,mgr->GetCommonInputContainer());
   mgr->ConnectInput(taskQAflow,1,coutputFE);
   mgr->ConnectOutput(taskQAflow,1,coutputQAtask);
-  mgr->ConnectOutput(taskQAflow,2,coutputQAtaskTree);
+  if (FillQAntuple) mgr->ConnectOutput(taskQAflow,2,coutputQAtaskTree);
 }
 
 
index 7b8a113cf536cd2d55f266de3d43e0af02513bb8..34c7faa6e75d831968f702e58765e35d8a313543 100644 (file)
@@ -6,7 +6,7 @@ AliAnalysisGrid* CreateAlienHandler() {
   AliAnalysisAlien *plugin = new AliAnalysisAlien();
   
   // Set if you want to use par files on Grid:
-  Bool_t bUseParFiles = kFALSE;
+  Bool_t bUseParFiles = kTRUE;
   
   // Set the run mode (can be "full", "test", "offline", "submit" or "terminate")
   //plugin->SetRunMode("test");
@@ -14,12 +14,12 @@ AliAnalysisGrid* CreateAlienHandler() {
   //plugin->SetRunMode("submit");
   plugin->SetRunMode("full");
   //plugin->SetRunMode("terminate");
-  plugin->SetNtestFiles(1); // Relevant only for run mode "test" 
+  plugin->SetNtestFiles(3); // Relevant only for run mode "test" 
 
   // Set versions of used packages
   plugin->SetAPIVersion("V1.1x");
   plugin->SetROOTVersion("v5-27-06b");
-  plugin->SetAliROOTVersion("v4-21-04-AN");  
+  plugin->SetAliROOTVersion("v4-21-07-AN");  
   
   // Declare input data to be processed - can be done in two ways:
   // METHOD 1: Create automatically XML collections using alien 'find' command.
@@ -32,9 +32,9 @@ AliAnalysisGrid* CreateAlienHandler() {
   // ============================================================================
   //  Example 2: Real data (set in macro runFlowTask.C: DATA = kTRUE, MCEP = kFALSE)
   plugin->SetGridDataDir("/alice/data/2010/LHC10h");
-  plugin->SetDataPattern("*ESDs/pass1/*ESDs.root");
+  plugin->SetDataPattern("*ESDs/pass1_5plus/*ESDs.root");
   plugin->SetRunPrefix("000"); // IMPORTANT!
-  plugin->AddRunNumber(137042); 
+  plugin->AddRunNumber(137161); 
   // plugin->AddRunNumber(119844); // Alternatively use e.g. plugin->SetRunRange(104044,106044); to add more runs in one go 
   plugin->SetOutputToRunNo();  
   // ============================================================================
@@ -48,21 +48,24 @@ AliAnalysisGrid* CreateAlienHandler() {
   // Define alien work directory where all files will be copied. Relative to alien $HOME.
   plugin->SetGridWorkingDir("data");
   // Declare alien output directory. Relative to working directory.
-  plugin->SetGridOutputDir("output"); // In this case will be $HOME/work/output
+  plugin->SetGridOutputDir("output1_5plus"); // In this case will be $HOME/work/output
   // Declare the analysis source files names separated by blancs. To be compiled runtime
   // using ACLiC on the worker nodes:
   // ... (if this is needed see in official tutorial example how to do it!)
 
   // Declare all libraries (other than the default ones for the framework. These will be
   // loaded by the generated analysis macro. Add all extra files (task .cxx/.h) here.
+  //plugin->SetAdditionalLibs("libCORRFW.so libTOFbase.so libTOFrec.so");
   if(!bUseParFiles)
   {
-   plugin->SetAdditionalLibs("libPWG2flowCommon.so libPWG2flowTasks.so");
-  } else // load libs via par files
-    { 
-     plugin->EnablePackage("PWG2flowCommon.par");
-     plugin->EnablePackage("PWG2flowTasks.par");
-    }
+    plugin->SetAdditionalLibs("libGui.so libProof.so libMinuit.so libXMLParser.so libRAWDatabase.so libRAWDatarec.so libCDB.so libSTEERBase.so libSTEER.so libTOFbase.so libTOFrec.so libPWG2flowCommon.so libPWG2flowTasks.so");
+  } 
+  else // load libs via par files
+  { 
+    plugin->SetAdditionalLibs("libGui.so libProof.so libMinuit.so libXMLParser.so libRAWDatabase.so libRAWDatarec.so libCDB.so libSTEERBase.so libSTEER.so libTOFbase.so libTOFrec.so");
+    plugin->EnablePackage("PWG2flowCommon.par");
+    plugin->EnablePackage("PWG2flowTasks.par");
+  }
   // Do not specify your outputs by hand anymore:
   plugin->SetDefaultOutputs(kTRUE);
   // To specify your outputs by hand set plugin->SetDefaultOutputs(kFALSE); and comment in line plugin->SetOutputFiles("..."); 
index 2b1daaf9bbfe94e804c254c9a42c4b41d8a97717..3b6c2568ea4e081e1925100a811e2a0ac0df7b78 100644 (file)
@@ -22,7 +22,9 @@ TString commonOutputFileName = "outputCentrality"; // e.g.: result for centralit
 //Bool_t DATA = kFALSE, const Char_t* dataDir="/Users/snelling/alice_data/Therminator_midcentral", Int_t offset = 0)
 
 void runFlowTaskCentralityTrain(Int_t mode = mPROOF, Int_t nRuns = 50000000, 
-                               Bool_t DATA = kTRUE, const Char_t* dataDir="/alice/data/LHC10h_000137161_p1_plusplusplus", Int_t offset=0) 
+                Bool_t DATA = kTRUE, const Char_t* dataDir="/alice/data/LHC10h_000137161_p1_plusplusplus", Int_t offset=0) 
+//void runFlowTaskCentralityTrain(Int_t mode = mLocal, Int_t nRuns = 50000000, 
+//                             Bool_t DATA = kTRUE, const Char_t* dataDir="./data/", Int_t offset=0) 
 //void runFlowTaskCentralityTrain(Int_t mode = mGridPAR, Bool_t DATA = kTRUE)
 {
   // Time:
@@ -61,10 +63,12 @@ void runFlowTaskCentralityTrain(Int_t mode = mPROOF, Int_t nRuns = 50000000,
     mgr->SetMCtruthEventHandler(mc); 
   }
 
-  // Load the analysis task:
-  gROOT->LoadMacro("AddTaskFlowCentrality.C");
+  // Task to check the offline trigger:
+  gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C"); 
+  AliPhysicsSelectionTask* physicsSelTask = AddTaskPhysicsSelection(!DATA,0);
   
   // Setup analysis per centrality bin:
+  gROOT->LoadMacro("AddTaskFlowCentrality.C");
   for (Int_t i=binfirst; i<binlast+1; i++)
   {
     Int_t lowCentralityBinEdge = centralityArray[i];
@@ -76,16 +80,6 @@ void runFlowTaskCentralityTrain(Int_t mode = mPROOF, Int_t nRuns = 50000000,
                            i ); 
   } // end of for (Int_t i=0; i<numberOfCentralityBins; i++)
 
-  // Task to check the offline trigger:
-  if(mode == mLocal || mode == mGrid || mode == mGridPAR) {
-    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C"); 
-  } else if(mode == mPROOF || mode == mLocalPAR) {
-    gROOT->LoadMacro("AddTaskPhysicsSelection.C"); 
-  }
-
-
-  AliPhysicsSelectionTask* physicsSelTask = AddTaskPhysicsSelection(!DATA,0);
-  
   // Enable debug printouts:
   mgr->SetDebugLevel(2);
   // Run the analysis:
@@ -124,69 +118,41 @@ void LoadLibraries(const anaModes mode)
   // Load the needed libraries most of them already loaded by aliroot
   //--------------------------------------
 
+  gSystem->Load("libCore");  
+  gSystem->Load("libTree");
   gSystem->Load("libGeom");
   gSystem->Load("libVMC");
   gSystem->Load("libXMLIO");
   gSystem->Load("libPhysics");
+  gSystem->Load("libXMLParser");
+  gSystem->Load("libProof");
   
-  //----------------------------------------------------------
-  // >>>>>>>>>>> Local mode <<<<<<<<<<<<<< 
-  //----------------------------------------------------------
-  if (mode==mLocal || mode==mGrid || mode == mGridPAR) {
-    //--------------------------------------------------------
-    // If you want to use already compiled libraries 
-    // in the aliroot distribution
-    //--------------------------------------------------------
+  if (mode==mLocal || mode==mGrid || mode == mGridPAR || mode == mLocalPAR )
+  {
     gSystem->Load("libSTEERBase");
+    gSystem->Load("libCDB");
+    gSystem->Load("libRAWDatabase");
+    gSystem->Load("libRAWDatarec");
     gSystem->Load("libESD");
     gSystem->Load("libAOD");
+    gSystem->Load("libSTEER");
     gSystem->Load("libANALYSIS");
-    gSystem->Load("libANALYSISalice");
-    gSystem->Load("libCORRFW");
-    gSystem->Load("libPWG2forward");
-    if(mode==mLocal || mode==mGrid) 
+    gSystem->Load("libANALYSISalice");   
+    gSystem->Load("libTOFbase"); 
+    gSystem->Load("libTOFrec"); 
+
+    if (mode == mLocal || mode == mGrid)
     {
-     gSystem->Load("libPWG2flowCommon");
-     cerr<<"libPWG2flowCommon loaded..."<<endl;
-     gSystem->Load("libPWG2flowTasks");
-     cerr<<"libPWG2flowTasks loaded..."<<endl;
+      gSystem->Load("libPWG2flowCommon"); 
+      gSystem->Load("libPWG2flowTasks"); 
     }
-    if(mode==mGridPAR) 
+    if (mode == mLocalPAR || mode == mGridPAR )
     {
-     AliAnalysisAlien::SetupPar("STEERBase");
-     cerr<<"STEERBase.par loaded..."<<endl;
-     AliAnalysisAlien::SetupPar("ESD");
-     cerr<<"ESD.par loaded..."<<endl;
-     AliAnalysisAlien::SetupPar("AOD");
-     cerr<<"AOD.par loaded..."<<endl;
-     AliAnalysisAlien::SetupPar("ANALYSIS");
-     cerr<<"ANALYSIS.par loaded..."<<endl;
-     AliAnalysisAlien::SetupPar("ANALYSISalice");
-     cerr<<"ANALYSISalice.par loaded..."<<endl;
-     AliAnalysisAlien::SetupPar("CORRFW");
-     AliAnalysisAlien::SetupPar("PWG2flowCommon");
-     cerr<<"PWG2flowCommon.par loaded..."<<endl;
-     AliAnalysisAlien::SetupPar("PWG2flowTasks");
-     cerr<<"PWG2flowTasks.par loaded..."<<endl;
+      AliAnalysisAlien::SetupPar("PWG2flowCommon");
+      AliAnalysisAlien::SetupPar("PWG2flowTasks");
     }
   }
   
-  else if (mode == mLocalPAR) {
-    //--------------------------------------------------------
-    //If you want to use root and par files from aliroot
-    //--------------------------------------------------------  
-    AliAnalysisAlien::SetupPar("STEERBase");
-    AliAnalysisAlien::SetupPar("ESD");
-    AliAnalysisAlien::SetupPar("AOD");
-    AliAnalysisAlien::SetupPar("ANALYSIS");
-    AliAnalysisAlien::SetupPar("ANALYSISalice");
-    AliAnalysisAlien::SetupPar("CORRFW");
-    AliAnalysisAlien::SetupPar("PWG2flowCommon");
-    cerr<<"PWG2flowCommon.par loaded..."<<endl;
-    AliAnalysisAlien::SetupPar("PWG2flowTasks");
-    cerr<<"PWG2flowTasks.par loaded..."<<endl;
-  }
-  
   //---------------------------------------------------------
   // <<<<<<<<<< PROOF mode >>>>>>>>>>>>
   //---------------------------------------------------------
@@ -198,8 +164,8 @@ void LoadLibraries(const anaModes mode)
     // Connect to proof
     printf("*** Connect to PROOF ***\n");
     gEnv->SetValue("XSec.GSI.DelegProxy","2");
-    TProof::Open("alice-caf.cern.ch");
-    //TProof::Open("skaf.saske.sk");
+    TProof::Open("mkrzewic@alice-caf.cern.ch");
+    //TProof::Open("mkrzewic@skaf.saske.sk");
      // list the data available
     //gProof->ShowDataSets("/*/*"); 
     //gProof->ShowDataSets("/alice/sim/"); //for MC Data
@@ -213,7 +179,7 @@ void LoadLibraries(const anaModes mode)
     */
     //gProof->ClearPackage("ANALYSIS.par");
     //gProof->ClearPackage("ANALYSISalice.par");
-    gProof->ClearPackage("CORRFW.par");
+    //gProof->ClearPackage("CORRFW.par");
     
     gProof->ClearPackage("PWG2flowCommon");
     gProof->ClearPackage("PWG2flowTasks");
@@ -228,21 +194,17 @@ void LoadLibraries(const anaModes mode)
     gProof->UploadPackage("CORRFW.par");
     gProof->UploadPackage("PWG2flowCommon.par");
     gProof->UploadPackage("PWG2flowTasks.par");
+    gProof->UploadPackage("ALIRECO.par");
 
     // Enable the Packages 
     // The global package
-    gProof->EnablePackage("VO_ALICE@AliRoot::v4-21-05-AN");
-    //gProof->EnablePackage("aliroot_v4-19-05-AN",kTRUE);
-    // Or separate
-    
-    //gProof->EnablePackage("STEERBase");
-    //gProof->EnablePackage("ESD");
-    //gProof->EnablePackage("AOD");
-    
-    // Always needed
+    TList* list = new TList();
+    list->Add(new TNamed("ALIROOT_EXTRA_INCLUDES","RAW:OCDB:STEER:TOF"));
+    gProof->EnablePackage("VO_ALICE@AliRoot::v4-21-07-AN",list);
+    gProof->EnablePackage("ALIRECO");
     //gProof->EnablePackage("ANALYSIS");
     //gProof->EnablePackage("ANALYSISalice");
-    gProof->EnablePackage("CORRFW");
+    //gProof->EnablePackage("CORRFW");
     gProof->EnablePackage("PWG2flowCommon");
     gProof->EnablePackage("PWG2flowTasks");
 
index fdcd704685c97fed603bac46ae81b0d550641d4c..b99a77cd9c1dd5752852178d0a51a700455c12c6 100644 (file)
@@ -24,7 +24,7 @@ DHDR:=PWG2flowTasksLinkDef.h
 
 EXPORT:=
 
-EINCLUDE:= PWG2/FLOW/AliFlowCommon PWG2/FLOW/AliFlowTasks
+EINCLUDE:= PWG2/FLOW/AliFlowCommon PWG2/FLOW/AliFlowTasks TOF
 
 ifeq (win32gcc,$(ALICE_TARGET))
 PACKSOFLAGS:= $(SOFLAGS) -L$(ALICE_ROOT)/lib/tgt_$(ALICE_TARGET) -lSTEERBase \