]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Added histos for flow QA (Carlos)
authorprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 3 Mar 2012 23:20:39 +0000 (23:20 +0000)
committerprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 3 Mar 2012 23:20:39 +0000 (23:20 +0000)
PWGHF/vertexingHF/AliAnalysisTaskSEDplus.cxx
PWGHF/vertexingHF/AliAnalysisTaskSEDplus.h
PWGHF/vertexingHF/AliAnalysisTaskSEHFQA.cxx
PWGHF/vertexingHF/AliAnalysisTaskSEHFQA.h
PWGHF/vertexingHF/macros/AddTaskHFQA.C

index 80cb573674a27f21eb5ccac961be01b973be25c2..d6dead6e646ee7c85a3d69dca234ca9b58173dc9 100644 (file)
@@ -43,7 +43,7 @@
 #include "AliAnalysisTaskSE.h"
 #include "AliAnalysisTaskSEDplus.h"
 #include "AliNormalizationCounter.h"
-
+#include "AliVertexingHFUtils.h"
 ClassImp(AliAnalysisTaskSEDplus)
 
 
@@ -58,13 +58,13 @@ AliAnalysisTaskSE(),
   fYVsPtTC(0),
   fYVsPtSig(0),
   fYVsPtSigTC(0),
+  fSPDMult(0),
   fNtupleDplus(0),
   fUpmasslimit(1.965),
   fLowmasslimit(1.765),
   fNPtBins(0),
   fBinWidth(0.002),
   fListCuts(0),
-  fRDCutsProduction(0),
   fRDCutsAnalysis(0),
   fCounter(0),
   fFillNtuple(kFALSE),
@@ -78,11 +78,11 @@ AliAnalysisTaskSE(),
   fHigherImpPar(2000.),
   fDoLS(0)
 {
-   // Default constructor
+  // Default constructor
 
   for(Int_t i=0;i<3;i++){
-   if(fHistCentrality[i])fHistCentrality[i]=0;
-   if(fCorreld0Kd0pi[i])fCorreld0Kd0pi[i]=0;
+    if(fHistCentrality[i])fHistCentrality[i]=0;
+    if(fCorreld0Kd0pi[i])fCorreld0Kd0pi[i]=0;
   }
   
   for(Int_t i=0; i<5; i++)fHistMassPtImpParTC[i]=0;
@@ -125,7 +125,7 @@ AliAnalysisTaskSE(),
 }
 
 //________________________________________________________________________
-AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus(const char *name,AliRDHFCutsDplustoKpipi *dpluscutsana,AliRDHFCutsDplustoKpipi *dpluscutsprod,Bool_t fillNtuple):
+AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus(const char *name,AliRDHFCutsDplustoKpipi *dpluscutsana,Bool_t fillNtuple):
   AliAnalysisTaskSE(name),
   fOutput(0),
   fHistNEvents(0),
@@ -135,13 +135,13 @@ AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus(const char *name,AliRDHFCutsDplus
   fYVsPtTC(0),
   fYVsPtSig(0),
   fYVsPtSigTC(0),
+  fSPDMult(0),
   fNtupleDplus(0),
   fUpmasslimit(1.965),
   fLowmasslimit(1.765),
   fNPtBins(0),
   fBinWidth(0.002),
   fListCuts(0),
-  fRDCutsProduction(dpluscutsprod),
   fRDCutsAnalysis(dpluscutsana),
   fCounter(0),
   fFillNtuple(fillNtuple),
@@ -161,8 +161,8 @@ AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus(const char *name,AliRDHFCutsDplus
   fNPtBins=fRDCutsAnalysis->GetNPtBins();
   
   for(Int_t i=0;i<3;i++){
-   if(fHistCentrality[i])fHistCentrality[i]=0;
-   if(fCorreld0Kd0pi[i])fCorreld0Kd0pi[i]=0;
+    if(fHistCentrality[i])fHistCentrality[i]=0;
+    if(fCorreld0Kd0pi[i])fCorreld0Kd0pi[i]=0;
   }
   
   for(Int_t i=0; i<5; i++)fHistMassPtImpParTC[i]=0;
@@ -205,7 +205,7 @@ AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus(const char *name,AliRDHFCutsDplus
   // Default constructor
   // Output slot #1 writes into a TList container
   DefineOutput(1,TList::Class());  //My private output
- // Output slot #2 writes cut to private output
 // Output slot #2 writes cut to private output
   //  DefineOutput(2,AliRDHFCutsDplustoKpipi::Class());
   DefineOutput(2,TList::Class());
   // Output slot #3 writes cut to private output
@@ -231,10 +231,11 @@ AliAnalysisTaskSEDplus::~AliAnalysisTaskSEDplus()
     delete fHistNEvents;
     fHistNEvents=0;
   }  
+  
   for(Int_t i=0;i<3;i++){
     if(fHistCentrality[i]){delete fHistCentrality[i]; fHistCentrality[i]=0;}
   }
-
+  
   for(Int_t i=0;i<3*fNPtBins;i++){
     if(fMassHist[i]){ delete fMassHist[i]; fMassHist[i]=0;}
     if(fCosPHist[i]){ delete fCosPHist[i]; fCosPHist[i]=0;}
@@ -292,6 +293,12 @@ AliAnalysisTaskSEDplus::~AliAnalysisTaskSEDplus()
     delete fYVsPtSigTC;
     fYVsPtSigTC=0;
   }
+  if(fSPDMult){
+    delete fSPDMult;
+    fSPDMult=0;
+  }  
+  
+  
   if(fNtupleDplus){
     delete fNtupleDplus;
     fNtupleDplus=0;
@@ -300,10 +307,6 @@ AliAnalysisTaskSEDplus::~AliAnalysisTaskSEDplus()
     delete fListCuts;
     fListCuts = 0;
   }
-  if(fRDCutsProduction){
-    delete fRDCutsProduction;
-    fRDCutsProduction = 0;
-  }
   if(fRDCutsAnalysis){
     delete fRDCutsAnalysis;
     fRDCutsAnalysis = 0;
@@ -394,7 +397,6 @@ void AliAnalysisTaskSEDplus::LSAnalysis(TClonesArray *arrayOppositeSign,TClonesA
     }else{
       nNegTrks++;
     }
-    //    if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate,aod)){
     fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate,aod);
     Int_t passTightCuts=fRDCutsAnalysis->GetIsSelectedCuts();
     if(passTightCuts>0){
@@ -468,12 +470,9 @@ void AliAnalysisTaskSEDplus::Init(){
   
   //PostData(2,fRDCutsloose);//we should then put those cuts in a tlist if we have more than 1
   fListCuts=new TList();
-  AliRDHFCutsDplustoKpipi *production = new AliRDHFCutsDplustoKpipi(*fRDCutsProduction);
-  production->SetName("ProductionCuts");
   AliRDHFCutsDplustoKpipi *analysis = new AliRDHFCutsDplustoKpipi(*fRDCutsAnalysis);
   analysis->SetName("AnalysisCuts");
   
-  fListCuts->Add(production);
   fListCuts->Add(analysis);
   PostData(2,fListCuts);
   
@@ -733,13 +732,14 @@ void AliAnalysisTaskSEDplus::UserCreateOutputObjects()
   fYVsPtTC=new TH2F("hYVsPtTC","YvsPt (analysis cuts)",40,0.,20.,80,-2.,2.);
   fYVsPtSig=new TH2F("hYVsPtSig","YvsPt (MC, only sig., prod. cuts)",40,0.,20.,80,-2.,2.);
   fYVsPtSigTC=new TH2F("hYVsPtSigTC","YvsPt (MC, only Sig, analysis cuts)",40,0.,20.,80,-2.,2.);
-
+  fSPDMult = new TH1F("hSPDMult", "Tracklets multiplicity; Tracklets ; Entries",200,0.,200.); 
   fOutput->Add(fPtVsMass);
   fOutput->Add(fPtVsMassTC);
   fOutput->Add(fYVsPt);
   fOutput->Add(fYVsPtTC);
   fOutput->Add(fYVsPtSig);
   fOutput->Add(fYVsPtSigTC);
+  fOutput->Add(fSPDMult);
 
 
   //Counter for Normalization
@@ -756,7 +756,7 @@ void AliAnalysisTaskSEDplus::UserCreateOutputObjects()
     OpenFile(4); // 4 is the slot number of the ntuple
    
     
-     fNtupleDplus = new TNtuple("fNtupleDplus","D +","pdg:Px:Py:Pz:Pt:pid:Ptpi:PtK:Ptpi2:Sumd0sq:ptmax:cosp:cospxy:DecLen:NormDecLen:DecLenXY:NormDecLenXY:InvMass:sigvert:d0Pi:d0K:d0Pi2:maxdca:ntracks:centr:RunNumber");
+    fNtupleDplus = new TNtuple("fNtupleDplus","D +","pdg:Px:Py:Pz:Pt:pid:Ptpi:PtK:Ptpi2:cosp:cospxy:DecLen:NormDecLen:DecLenXY:NormDecLenXY:InvMass:sigvert:d0Pi:d0K:d0Pi2:maxdca:ntracks:centr:RunNumber");
 
   }
   
@@ -771,16 +771,14 @@ void AliAnalysisTaskSEDplus::UserExec(Option_t */*option*/)
 
   AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
   
-
   TClonesArray *array3Prong = 0;
   TClonesArray *arrayLikeSign =0;
   if(!aod && AODEvent() && IsStandardAOD()) {
     // In case there is an AOD handler writing a standard AOD, use the AOD 
     // event in memory rather than the input (ESD) event.    
     aod = dynamic_cast<AliAODEvent*> (AODEvent());
-     // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
-     // have to taken from the AOD event hold by the AliAODExtension
+    // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
+    // have to taken from the AOD event hold by the AliAODExtension
     AliAODHandler* aodHandler = (AliAODHandler*) 
       ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
     if(aodHandler->GetExtensions()) {
@@ -803,30 +801,34 @@ void AliAnalysisTaskSEDplus::UserExec(Option_t */*option*/)
     return;
   }
 
-
   // fix for temporary bug in ESDfilter 
   // the AODs with null vertex pointer didn't pass the PhysSel
   if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
+
+  //Store the event in AliNormalizationCounter->To disable for Pb-Pb? Add a flag to disable it?
   fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC);
+
   fHistNEvents->Fill(0); // count event
   Int_t runNumber=aod->GetRunNumber();
-  Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
-  Bool_t isEvSelP=kTRUE;
-  isEvSelP=fRDCutsProduction->IsEventSelected(aod); // to have proper PID object settings
 
+  //Event selection
+  Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
   Float_t ntracks=aod->GetNTracks();//fRDCutsAnalysis->GetCentrality(aod);
   fHistCentrality[0]->Fill(ntracks);
-  Float_t centrality=fRDCutsAnalysis->GetCentrality(aod);
-  // trigger class for PbPb C0SMH-B-NOPF-ALLNOTRD
-  TString trigclass=aod->GetFiredTriggerClasses();
   if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(2);
   if(fRDCutsAnalysis->GetWhyRejection()==1) fHistNEvents->Fill(3); 
   if(fRDCutsAnalysis->GetWhyRejection()==2){fHistNEvents->Fill(4);fHistCentrality[2]->Fill(ntracks);}
   if(fRDCutsAnalysis->GetWhyRejection()==6)fHistNEvents->Fill(5);
   if(fRDCutsAnalysis->GetWhyRejection()==7)fHistNEvents->Fill(6);
+
+  // trigger class for PbPb C0SMH-B-NOPF-ALLNOTRD
+  //TString trigclass=aod->GetFiredTriggerClasses();
   // Post the data already here  
   PostData(1,fOutput);
   if(!isEvSel)return;
+  Int_t tracklets=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
+  // printf("ntracklet===%d\n",tracklets);
+  fSPDMult->Fill(tracklets);
 
   fHistCentrality[1]->Fill(ntracks);
   fHistNEvents->Fill(1);
@@ -837,72 +839,70 @@ void AliAnalysisTaskSEDplus::UserExec(Option_t */*option*/)
   // AOD primary vertex
   AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
   //    vtx1->Print();
-   TString primTitle = vtx1->GetTitle();
-   //if(primTitle.Contains("VertexerTracks") && vtx1->GetNContributors()>0)fHistNEvents->Fill(2);
+  //   TString primTitle = vtx1->GetTitle();
+  //if(primTitle.Contains("VertexerTracks") && vtx1->GetNContributors()>0)fHistNEvents->Fill(2);
  
   // load MC particles
   if(fReadMC){
-    
     arrayMC =  (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
     if(!arrayMC) {
       printf("AliAnalysisTaskSEDplus::UserExec: MC particles branch not found!\n");
       return;
     }
     
-  // load MC header
+    // load MC header
     mcHeader =  (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
     if(!mcHeader) {
-    printf("AliAnalysisTaskSEDplus::UserExec: MC header branch not found!\n");
-    return;
+      printf("AliAnalysisTaskSEDplus::UserExec: MC header branch not found!\n");
+      return;
     }
   }
   
   Int_t n3Prong = array3Prong->GetEntriesFast();
   //  printf("Number of D+->Kpipi: %d and of tracks: %d\n",n3Prong,aod->GetNumberOfTracks());
   
-  
   Int_t nOS=0;
   Int_t index;
   Int_t pdgDgDplustoKpipi[3]={321,211,211};
 
-  if(fDoLS>1){
+  if(fDoLS>1){//Normalizations for LS
     for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
       AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
       if(fUseBit && !d->HasSelectionBit(AliRDHFCuts::kDplusCuts)){
        if(fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate,aod))nOS++;
       }
     }
-  }else{
-  // Double_t cutsDplus[12]={0.2,0.4,0.4,0.,0.,0.01,0.06,0.02,0.,0.85,0.,10000000000.};//TO REMOVE
-  //Double_t *cutsDplus = new (Double_t*)fRDCuts->GetCuts();
-  Int_t nSelectedloose=0,nSelectedtight=0;
-  for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
-    AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
-    fHistNEvents->Fill(7);
-    if(fUseBit && !d->HasSelectionBit(AliRDHFCuts::kDplusCuts)){
-      fHistNEvents->Fill(8);
-      continue;
-    }
-    Bool_t unsetvtx=kFALSE;
-    if(!d->GetOwnPrimaryVtx()){
-      d->SetOwnPrimaryVtx(vtx1);
-      unsetvtx=kTRUE;
-    }
-
-    if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate,aod)) {
+  }else{//Standard analysis
+    // Double_t cutsDplus[12]={0.2,0.4,0.4,0.,0.,0.01,0.06,0.02,0.,0.85,0.,10000000000.};//TO REMOVE
+    //Double_t *cutsDplus = new (Double_t*)fRDCuts->GetCuts();
+    Int_t nSelectedloose=0,nSelectedtight=0;
+    for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
+      AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
+      fHistNEvents->Fill(7);
+      if(fUseBit && !d->HasSelectionBit(AliRDHFCuts::kDplusCuts)){
+       fHistNEvents->Fill(8);
+       continue;
+      }
+      Bool_t unsetvtx=kFALSE;
+      if(!d->GetOwnPrimaryVtx()){
+       d->SetOwnPrimaryVtx(vtx1);
+       unsetvtx=kTRUE;
+      }
+    
+      Int_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate,aod);
+      if(!fRDCutsAnalysis->GetIsSelectedCuts())continue;//filling loose cuts histos with no-pid informations
 
       Double_t ptCand = d->Pt();
-      Int_t iPtBin = fRDCutsProduction->PtBin(ptCand);
-      
-      Int_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate,aod);
+      Int_t iPtBin = fRDCutsAnalysis->PtBin(ptCand);     
+    
       Bool_t recVtx=kFALSE;
       AliAODVertex *origownvtx=0x0;
-      if(fRDCutsProduction->GetIsPrimaryWithoutDaughters()){
+      if(fRDCutsAnalysis->GetIsPrimaryWithoutDaughters()){
        if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());  
-       if(fRDCutsProduction->RecalcOwnPrimaryVtx(d,aod))recVtx=kTRUE;
-       else fRDCutsProduction->CleanOwnPrimaryVtx(d,aod,origownvtx);
+       if(fRDCutsAnalysis->RecalcOwnPrimaryVtx(d,aod))recVtx=kTRUE;
+       else fRDCutsAnalysis->CleanOwnPrimaryVtx(d,aod,origownvtx);
       }
-      
+    
       Int_t labDp=-1;
       Bool_t isPrimary=kTRUE;
       Float_t pdgCode=-2;
@@ -930,183 +930,158 @@ void AliAnalysisTaskSEDplus::UserExec(Option_t */*option*/)
        fPtVsMass->Fill(invMass,ptCand);
        if(passTightCuts) fPtVsMassTC->Fill(invMass,ptCand);
       }
-    
-      Double_t  dlen=d->DecayLength();
-      Double_t cosp=d->CosPointingAngle();
-      Double_t sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
-      Double_t maxdca=-9999.;
-      for(Int_t idau=0;idau<3;idau++) if(d->GetDCA(idau)>maxdca) maxdca=d->GetDCA(idau);
-
-      Double_t sigvert=d->GetSigmaVert();         
-      Double_t ptmax=0;
-      for(Int_t i=0;i<3;i++){
-       if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
+
+
+      Double_t  dlen=0,cosp=0,maxdca=0,sigvert=0,sumD02=0,ptmax=0,dlxy=0,cxy=0;
+      if(fCutsDistr||fFillNtuple){
+       dlen=d->DecayLength();
+       cosp=d->CosPointingAngle();
+       sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
+       maxdca=-9999.;
+       for(Int_t idau=0;idau<3;idau++) if(d->GetDCA(idau)>maxdca) maxdca=d->GetDCA(idau);
+       sigvert=d->GetSigmaVert();         
+       ptmax=0;
+       for(Int_t i=0;i<3;i++){
+         if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
+       }
+       dlxy=d->NormalizedDecayLengthXY();
+       cxy=d->CosPointingAngleXY();
       }
       Double_t impparXY=d->ImpParXY()*10000.;
-      Double_t arrayForSparse[3]={invMass,ptCand,impparXY};
-      Double_t arrayForSparseTrue[3]={invMass,ptCand,trueImpParXY};
-      Float_t tmp[26];    
+      Double_t arrayForSparse[6]={invMass,ptCand,impparXY,cosp,dlen,tracklets};
+      Double_t arrayForSparseTrue[6]={invMass,ptCand,trueImpParXY,cosp,dlen,tracklets};
+
+      //Ntuple
+      Float_t tmp[24];    
       if(fFillNtuple){
        tmp[0]=pdgCode;
        tmp[1]=d->Px();
        tmp[2]=d->Py();
        tmp[3]=d->Pz();
        tmp[4]=d->Pt();
-       tmp[5]=fRDCutsAnalysis->IsSelectedPID(d);         
+       tmp[5]=fRDCutsAnalysis->GetIsSelectedPID();       
        tmp[6]=d->PtProng(0);     
        tmp[7]=d->PtProng(1);     
        tmp[8]=d->PtProng(2);
-       tmp[9]=sumD02;
-       tmp[10]=ptmax;
-       tmp[11]=cosp;
-       tmp[12]=d->CosPointingAngleXY();
-       tmp[13]=dlen;
-       tmp[14]=d->NormalizedDecayLength();
-       tmp[15]=d->DecayLengthXY();
-       tmp[16]=d->NormalizedDecayLengthXY();
-       tmp[17]=d->InvMassDplus();
-       tmp[18]=sigvert;
-       tmp[19]=d->Getd0Prong(0);
-       tmp[20]=d->Getd0Prong(1);
-       tmp[21]=d->Getd0Prong(2);
-       tmp[22]=maxdca;
-       tmp[23]=ntracks;
-       tmp[24]=centrality;
-       tmp[25]=runNumber;
+       tmp[9]=cosp;
+       tmp[10]=cxy;
+       tmp[11]=dlen;
+       tmp[12]=d->NormalizedDecayLength();
+       tmp[13]=d->DecayLengthXY();
+       tmp[14]=dlxy;
+       tmp[15]=d->InvMassDplus();
+       tmp[16]=sigvert;
+       tmp[17]=d->Getd0Prong(0);
+       tmp[18]=d->Getd0Prong(1);
+       tmp[19]=d->Getd0Prong(2);
+       tmp[20]=maxdca;
+       tmp[21]=ntracks;
+       tmp[22]=fRDCutsAnalysis->GetCentrality(aod);
+       tmp[23]=runNumber;
        fNtupleDplus->Fill(tmp);
        PostData(4,fNtupleDplus);
       }
-      if(iPtBin>=0){
-       Float_t dlxy=d->NormalizedDecayLengthXY();
-       Float_t cxy=d->CosPointingAngleXY();
-       index=GetHistoIndex(iPtBin);
+
+      //Fill histos
+      index=GetHistoIndex(iPtBin);
+      if(isFidAcc){
+       fHistNEvents->Fill(9);
+       nSelectedloose++;
+       fMassHist[index]->Fill(invMass);
+       if(fCutsDistr){   
+         fCosPHist[index]->Fill(cosp);
+         fDLenHist[index]->Fill(dlen);
+         fSumd02Hist[index]->Fill(sumD02);
+         fSigVertHist[index]->Fill(sigvert);
+         fPtMaxHist[index]->Fill(ptmax);
+         fPtKHist[index]->Fill(d->PtProng(1));
+         fPtpi1Hist[index]->Fill(d->PtProng(0));
+         fPtpi2Hist[index]->Fill(d->PtProng(2));
+         fDCAHist[index]->Fill(maxdca);
+         fDLxy[index]->Fill(dlxy);
+         fCosxy[index]->Fill(cxy);
+         fCorreld0Kd0pi[0]->Fill(d->Getd0Prong(0)*d->Getd0Prong(1),
+                                 d->Getd0Prong(2)*d->Getd0Prong(1));
+       }
+       if(passTightCuts){ 
+         fHistNEvents->Fill(10);
+         nSelectedtight++;
+         fMassHistTC[index]->Fill(invMass);
+         if(fCutsDistr){  
+           fDLxyTC[index]->Fill(dlxy);
+           fCosxyTC[index]->Fill(cxy);
+         }
+         if(d->GetCharge()>0) fMassHistTCPlus[index]->Fill(invMass);
+         else if(d->GetCharge()<0) fMassHistTCMinus[index]->Fill(invMass);
+         if(fDoImpPar){
+           fHistMassPtImpParTC[0]->Fill(arrayForSparse);
+         }
+       }
+      }
+      
+      if(fReadMC){
        if(isFidAcc){
-         fHistNEvents->Fill(9);
-         nSelectedloose++;
+         Int_t correlIndex=0;
+         if(labDp>=0) {
+           index=GetSignalHistoIndex(iPtBin);
+           correlIndex=1;
+           if(passTightCuts&&fDoImpPar){
+             if(isPrimary) fHistMassPtImpParTC[1]->Fill(arrayForSparse);
+             else{
+               fHistMassPtImpParTC[2]->Fill(arrayForSparse);
+               fHistMassPtImpParTC[3]->Fill(arrayForSparseTrue);
+             }
+           }
+         }else{
+           index=GetBackgroundHistoIndex(iPtBin);
+           correlIndex=2;
+           if(passTightCuts&&fDoImpPar)fHistMassPtImpParTC[4]->Fill(arrayForSparse);
+         }
+         
          fMassHist[index]->Fill(invMass);
-         if(fCutsDistr){         
-           fCosPHist[index]->Fill(cosp);
-           fDLenHist[index]->Fill(dlen);
-           fSumd02Hist[index]->Fill(sumD02);
-           fSigVertHist[index]->Fill(sigvert);
-           fPtMaxHist[index]->Fill(ptmax);
-           fPtKHist[index]->Fill(d->PtProng(1));
-           fPtpi1Hist[index]->Fill(d->PtProng(0));
-           fPtpi2Hist[index]->Fill(d->PtProng(2));
-           fDCAHist[index]->Fill(maxdca);
+         if(fCutsDistr){
+           Float_t fact=1.;
+           Float_t factor[3];
+           if(fUseStrangeness) fact=GetStrangenessWeights(d,arrayMC,factor);
+           fCosPHist[index]->Fill(cosp,fact);
+           fDLenHist[index]->Fill(dlen,fact);
            fDLxy[index]->Fill(dlxy);
            fCosxy[index]->Fill(cxy);
-           fCorreld0Kd0pi[0]->Fill(d->Getd0Prong(0)*d->Getd0Prong(1),
+           
+           Float_t sumd02s=d->Getd0Prong(0)*d->Getd0Prong(0)*factor[0]*factor[0]+d->Getd0Prong(1)*d->Getd0Prong(1)*factor[1]*factor[1]+d->Getd0Prong(2)*d->Getd0Prong(2)*factor[2]*factor[2];
+           fSumd02Hist[index]->Fill(sumd02s);
+           fSigVertHist[index]->Fill(sigvert,fact);
+           fPtMaxHist[index]->Fill(ptmax,fact);
+           fPtKHist[index]->Fill(d->PtProng(1),fact);
+           fPtpi1Hist[index]->Fill(d->PtProng(0),fact);
+           fPtpi2Hist[index]->Fill(d->PtProng(2),fact);
+           fDCAHist[index]->Fill(maxdca,fact);
+           fCorreld0Kd0pi[1]->Fill(d->Getd0Prong(0)*d->Getd0Prong(1),
                                    d->Getd0Prong(2)*d->Getd0Prong(1));
          }
-         if(passTightCuts){ fHistNEvents->Fill(10);
-           nSelectedtight++;
-           fMassHistTC[index]->Fill(invMass);
-           if(fCutsDistr){  
+         if(passTightCuts){
+           fMassHistTC[index]->Fill(invMass);        
+           if(fCutsDistr){
              fDLxyTC[index]->Fill(dlxy);
              fCosxyTC[index]->Fill(cxy);
-           }
+           }         
            if(d->GetCharge()>0) fMassHistTCPlus[index]->Fill(invMass);
            else if(d->GetCharge()<0) fMassHistTCMinus[index]->Fill(invMass);
-           if(fDoImpPar){
-             fHistMassPtImpParTC[0]->Fill(arrayForSparse);
-           }
-         }
-       }
-      
-       if(fReadMC){
-         //  if(fCutsDistr){
-         if(labDp>=0) {
-           index=GetSignalHistoIndex(iPtBin);
-           if(isFidAcc){
-             fMassHist[index]->Fill(invMass);
-             if(fCutsDistr){
-               Float_t fact=1.;
-               Float_t factor[3];
-               if(fUseStrangeness) fact=GetStrangenessWeights(d,arrayMC,factor);
-               fCosPHist[index]->Fill(cosp,fact);
-               fDLenHist[index]->Fill(dlen,fact);
-               fDLxy[index]->Fill(dlxy);
-               fCosxy[index]->Fill(cxy);
-           
-               Float_t sumd02s=d->Getd0Prong(0)*d->Getd0Prong(0)*factor[0]*factor[0]+d->Getd0Prong(1)*d->Getd0Prong(1)*factor[1]*factor[1]+d->Getd0Prong(2)*d->Getd0Prong(2)*factor[2]*factor[2];
-               fSumd02Hist[index]->Fill(sumd02s);
-               fSigVertHist[index]->Fill(sigvert,fact);
-               fPtMaxHist[index]->Fill(ptmax,fact);
-               fPtKHist[index]->Fill(d->PtProng(1),fact);
-               fPtpi1Hist[index]->Fill(d->PtProng(0),fact);
-               fPtpi2Hist[index]->Fill(d->PtProng(2),fact);
-               fDCAHist[index]->Fill(maxdca,fact);
-               fCorreld0Kd0pi[1]->Fill(d->Getd0Prong(0)*d->Getd0Prong(1),
-                                       d->Getd0Prong(2)*d->Getd0Prong(1));
-             }
-             if(passTightCuts){
-               fMassHistTC[index]->Fill(invMass);            
-               if(fCutsDistr){
-                 fDLxyTC[index]->Fill(dlxy);
-                 fCosxyTC[index]->Fill(cxy);
-               }             
-               if(d->GetCharge()>0) fMassHistTCPlus[index]->Fill(invMass);
-               else if(d->GetCharge()<0) fMassHistTCMinus[index]->Fill(invMass);
-               if(fDoImpPar){
-                 if(isPrimary) fHistMassPtImpParTC[1]->Fill(arrayForSparse);
-                 else{
-                   fHistMassPtImpParTC[2]->Fill(arrayForSparse);
-                   fHistMassPtImpParTC[3]->Fill(arrayForSparseTrue);
-                 }
-               }
-             }
-           }       
+         }
+       }else{//outside fidAcc
+         if(labDp>=0){
            fYVsPtSig->Fill(ptCand,rapid);
-           if(passTightCuts) fYVsPtSigTC->Fill(ptCand,rapid);
-         }else{
-           index=GetBackgroundHistoIndex(iPtBin);
-           if(isFidAcc){
-             fMassHist[index]->Fill(invMass);
-             if(fCutsDistr){
-               Float_t fact=1.;
-               Float_t factor[3];
-               if(fUseStrangeness) fact=GetStrangenessWeights(d,arrayMC,factor);
-               fCosPHist[index]->Fill(cosp,fact);
-               fDLenHist[index]->Fill(dlen,fact);
-               fDLxy[index]->Fill(dlxy);
-               fCosxy[index]->Fill(cxy);
-           
-               Float_t sumd02s=d->Getd0Prong(0)*d->Getd0Prong(0)*factor[0]*factor[0]+d->Getd0Prong(1)*d->Getd0Prong(1)*factor[1]*factor[1]+d->Getd0Prong(2)*d->Getd0Prong(2)*factor[2]*factor[2];
-               fSumd02Hist[index]->Fill(sumd02s);
-               fSigVertHist[index]->Fill(sigvert,fact);
-               fPtMaxHist[index]->Fill(ptmax,fact);
-               fPtKHist[index]->Fill(d->PtProng(1),fact);
-               fPtpi1Hist[index]->Fill(d->PtProng(0),fact);
-               fPtpi2Hist[index]->Fill(d->PtProng(2),fact);
-               fDCAHist[index]->Fill(maxdca,fact);
-               fCorreld0Kd0pi[2]->Fill(d->Getd0Prong(0)*d->Getd0Prong(1),
-                                       d->Getd0Prong(2)*d->Getd0Prong(1));
-             }
-             if(passTightCuts){
-               fMassHistTC[index]->Fill(invMass);
-               if(fCutsDistr){
-                 fDLxyTC[index]->Fill(dlxy);
-                 fCosxyTC[index]->Fill(cxy);
-               }
-               if(d->GetCharge()>0) fMassHistTCPlus[index]->Fill(invMass);
-               else if(d->GetCharge()<0) fMassHistTCMinus[index]->Fill(invMass);
-               if(fDoImpPar){
-                 fHistMassPtImpParTC[4]->Fill(arrayForSparse);
-               }
-             }
-           }
+           if(passTightCuts)fYVsPtSigTC->Fill(ptCand,rapid);
          }
-         
        }
-      }
+      }//readmc
     
-      if(recVtx)fRDCutsProduction->CleanOwnPrimaryVtx(d,aod,origownvtx);
+      if(recVtx)fRDCutsAnalysis->CleanOwnPrimaryVtx(d,aod,origownvtx);
+      
+      if(unsetvtx) d->UnsetOwnPrimaryVtx();
     }
-    if(unsetvtx) d->UnsetOwnPrimaryVtx();
-  }
-  fCounter->StoreCandidates(aod,nSelectedloose,kTRUE);
-  fCounter->StoreCandidates(aod,nSelectedtight,kFALSE);
+    fCounter->StoreCandidates(aod,nSelectedloose,kTRUE);
+    fCounter->StoreCandidates(aod,nSelectedtight,kFALSE);
   }
   //start LS analysis
   if(fDoLS && arrayLikeSign) LSAnalysis(array3Prong,arrayLikeSign,aod,vtx1,nOS);
@@ -1250,26 +1225,25 @@ void AliAnalysisTaskSEDplus::CreateImpactParameterHistos(){
   // Histos for impact paramter study
 
   Int_t nmassbins=GetNBinsHistos();
-  Int_t nbins[3]={nmassbins,200,fNImpParBins};
-  Double_t xmin[3]={fLowmasslimit,0.,fLowerImpPar};
-  Double_t xmax[3]={fUpmasslimit,20.,fHigherImpPar};
+  Int_t nbins[6]={nmassbins,200,fNImpParBins,5,50,100};
+  Double_t xmin[6]={fLowmasslimit,0.,fLowerImpPar,0.95,0.,-0.5};
+  Double_t xmax[6]={fUpmasslimit,20.,fHigherImpPar,1.,1.,99.5};
 
   fHistMassPtImpParTC[0]=new THnSparseF("hMassPtImpParAll",
                                        "Mass vs. pt vs.imppar - All",
-                                       3,nbins,xmin,xmax);
+                                       6,nbins,xmin,xmax);
   fHistMassPtImpParTC[1]=new THnSparseF("hMassPtImpParPrompt",
                                        "Mass vs. pt vs.imppar - promptD",
-                                       3,nbins,xmin,xmax);
+                                       6,nbins,xmin,xmax);
   fHistMassPtImpParTC[2]=new THnSparseF("hMassPtImpParBfeed",
                                        "Mass vs. pt vs.imppar - DfromB",
-                                       3,nbins,xmin,xmax);
+                                       6,nbins,xmin,xmax);
   fHistMassPtImpParTC[3]=new THnSparseF("hMassPtImpParTrueBfeed",
                                        "Mass vs. pt vs.true imppar -DfromB",
-                                       3,nbins,xmin,xmax);
+                                       6,nbins,xmin,xmax);
   fHistMassPtImpParTC[4]=new THnSparseF("hMassPtImpParBkg",
                                        "Mass vs. pt vs.imppar - backgr.",
-                                       3,nbins,xmin,xmax);
-
+                                       6,nbins,xmin,xmax);
   for(Int_t i=0; i<5;i++){
     fOutput->Add(fHistMassPtImpParTC[i]);
   }
index 2a4c73d56826159c097a5ef77cd5a67227d0a979..25f58448ce4c93f4578416549fed2dcdb3de89d5 100644 (file)
@@ -36,7 +36,7 @@ class AliAnalysisTaskSEDplus : public AliAnalysisTaskSE
  public:
 
   AliAnalysisTaskSEDplus();
-  AliAnalysisTaskSEDplus(const char *name, AliRDHFCutsDplustoKpipi* analysiscuts,AliRDHFCutsDplustoKpipi* productioncuts,Bool_t fillNtuple=kFALSE);
+  AliAnalysisTaskSEDplus(const char *name, AliRDHFCutsDplustoKpipi* analysiscuts,Bool_t fillNtuple=kFALSE);
   virtual ~AliAnalysisTaskSEDplus();
 
   void SetReadMC(Bool_t readMC=kTRUE){fReadMC=readMC;}
@@ -118,19 +118,19 @@ class AliAnalysisTaskSEDplus : public AliAnalysisTaskSE
   TH2F *fCorreld0Kd0pi[3]; //!hist. for d0k*d0pi vs. d0k*d0pi (LC)
   TH1F *fHistCentrality[3];//!hist. for cent distr (all,sel ev, )
   THnSparseF *fHistMassPtImpParTC[5];//! histograms for impact paramter studies
-  TH2F *fPtVsMass;    //! hist. of pt vs. mass (prod. cuts)
+    TH2F *fPtVsMass;    //! hist. of pt vs. mass (prod. cuts)
   TH2F *fPtVsMassTC;  //! hist. of pt vs. mass (analysis cuts)
   TH2F *fYVsPt;       //! hist. of Y vs. Pt (prod. cuts)
   TH2F *fYVsPtTC;     //! hist. of Y vs. Pt (analysis cuts)
   TH2F *fYVsPtSig;    //! hist. of Y vs. Pt (MC, only sig, prod. cuts)
   TH2F *fYVsPtSigTC;    //! hist. of Y vs. Pt (MC, only sig, analysis cuts)
+  TH1F *fSPDMult;    //! hist. of spd mult
   TNtuple *fNtupleDplus; //! output ntuple
   Float_t fUpmasslimit;  //upper inv mass limit for histos
   Float_t fLowmasslimit; //lower inv mass limit for histos
   Int_t fNPtBins; //Number of Pt Bins
   Float_t fBinWidth;//width of one bin in output histos
   TList *fListCuts; //list of cuts
-  AliRDHFCutsDplustoKpipi *fRDCutsProduction; //Production D+ Cuts
   AliRDHFCutsDplustoKpipi *fRDCutsAnalysis; //Cuts for Analysis
   AliNormalizationCounter *fCounter;//!Counter for normalization
   Double_t fArrayBinLimits[kMaxPtBins+1]; //limits for the Pt bins
@@ -145,7 +145,7 @@ class AliAnalysisTaskSEDplus : public AliAnalysisTaskSE
   Float_t fHigherImpPar; // higher limit in impact parameter (um)
   Int_t  fDoLS;        // flag to do LS analysis
   
-  ClassDef(AliAnalysisTaskSEDplus,16); // AliAnalysisTaskSE for the MC association of heavy-flavour decay candidates
+  ClassDef(AliAnalysisTaskSEDplus,17); // AliAnalysisTaskSE for the MC association of heavy-flavour decay candidates
 };
 
 #endif
index 4dfc8c4e398b057a3a6f67c240faa76308cee7e9..47651d586b51c86c1d554e84036f8ea206bfe7e6 100644 (file)
@@ -28,6 +28,8 @@
 #include <TList.h>
 #include <TH1F.h>
 #include <TH2F.h>
+#include <TH3F.h>
+#include <TProfile2D.h>
 #include <TDatabasePDG.h>
 
 #include <AliAnalysisDataSlot.h>
 #include "AliRDHFCutsLctopKpi.h"
 #include "AliInputEventHandler.h"
 
+#include "AliFlowEvent.h"
+#include "AliFlowTrackCuts.h"
+#include "AliFlowTrackSimple.h"
+#include "AliFlowVector.h"
+
 #include "AliAnalysisTaskSEHFQA.h"
 
 ClassImp(AliAnalysisTaskSEHFQA)
@@ -70,8 +77,11 @@ AliAnalysisTaskSEHFQA::AliAnalysisTaskSEHFQA():AliAnalysisTaskSE(),
   fOutputCounters(0x0),
   fOutputCheckCentrality(0x0),
   fOutputEvSelection(0x0),
+  fOutputFlowObs(0x0),
   fDecayChannel(AliAnalysisTaskSEHFQA::kD0toKpi),
   fCuts(0x0),
+  fFlowEvent(0x0),
+  fRFPcuts(0x0),
   fEstimator(AliRDHFCuts::kCentTRK),
   fReadMC(kFALSE),
   fSimpleMode(kFALSE),
@@ -82,6 +92,7 @@ AliAnalysisTaskSEHFQA::AliAnalysisTaskSEHFQA():AliAnalysisTaskSE(),
   fOnOff[1]=kTRUE;
   fOnOff[2]=kTRUE;
   fOnOff[3]=kTRUE;
+  fOnOff[4]=kTRUE;
 }
 
 //____________________________________________________________________________
@@ -93,8 +104,11 @@ AliAnalysisTaskSEHFQA::AliAnalysisTaskSEHFQA(const char *name, AliAnalysisTaskSE
   fOutputCounters(0x0),
   fOutputCheckCentrality(0x0),
   fOutputEvSelection(0x0),
+  fOutputFlowObs(0x0),
   fDecayChannel(ch),
   fCuts(0x0),
+  fFlowEvent(0x0),
+  fRFPcuts(0x0),
   fEstimator(AliRDHFCuts::kCentTRK),
   fReadMC(kFALSE),
   fSimpleMode(kFALSE),
@@ -109,6 +123,7 @@ AliAnalysisTaskSEHFQA::AliAnalysisTaskSEHFQA(const char *name, AliAnalysisTaskSE
   fOnOff[1]=kTRUE;
   fOnOff[2]=kTRUE;
   fOnOff[3]=kTRUE;
+  fOnOff[4]=kTRUE;
 
   // Output slot #1 writes into a TH1F container (number of events)
   DefineOutput(1,TH1F::Class());  //My private output
@@ -145,6 +160,7 @@ AliAnalysisTaskSEHFQA::AliAnalysisTaskSEHFQA(const char *name, AliAnalysisTaskSE
   }
 
   if(fOnOff[3]) DefineOutput(7,TList::Class());  //My private output
+  if(fOnOff[4]) DefineOutput(8,TList::Class());  //My private output
 
 }
 
@@ -164,6 +180,10 @@ AliAnalysisTaskSEHFQA::~AliAnalysisTaskSEHFQA()
 
   delete fOutputEvSelection;
 
+  if(fOnOff[4]) {
+    delete fOutputFlowObs;
+    delete fFlowEvent;
+  }
 }
 
 //___________________________________________________________________________
@@ -536,17 +556,73 @@ void AliAnalysisTaskSEHFQA::UserCreateOutputObjects()
     fOutputEvSelection->Add(hTrigCentSel);
     fOutputEvSelection->Add(trigCounter);
   }
+  if(fOnOff[4]){ // FLOW OBSERVABLES
+    fOutputFlowObs=new TList();
+    fOutputFlowObs->SetOwner();
+    fOutputFlowObs->SetName(GetOutputSlot(8)->GetContainer()->GetName());
+
+    fFlowEvent = new AliFlowEvent(3000);
+    fRFPcuts = new AliFlowTrackCuts("rfpCuts");
+
+    TH1F *hFEvents = new TH1F("hFlowEvents","FlowEvent Selection",4,0,4);
+    hFEvents->GetXaxis()->SetBinLabel(1,"REACHED");
+    hFEvents->GetXaxis()->SetBinLabel(2,"TRIGGERED");
+    hFEvents->GetXaxis()->SetBinLabel(3,"-7<Zvtx<7 + CC(0-60)");
+    hFEvents->GetXaxis()->SetBinLabel(4,"UnexpectedBehaviour");
+    fOutputFlowObs->Add(hFEvents);
+
+    TProfile2D *hQ[3];
+    TH2F *hAngleQ[3];
+    TH3F *hPhiEta[3];
+    TString ref[3] = {"FB1","FB128","VZE"};
+    Int_t etabin[3] = {40,40,20};
+    Int_t etamax[3] = { 1, 1, 5};
+    for(Int_t i=0; i<3; ++i) {
+      hQ[i]= new TProfile2D( Form("h%s_Q",ref[i].Data()),
+                            Form("Q_{2} components for %s",ref[i].Data()),
+                            4,0,4,12,0,60,"s");
+      hQ[i]->GetXaxis()->SetBinLabel(1,"Qx^{-}");
+      hQ[i]->GetXaxis()->SetBinLabel(2,"Qy^{-}");
+      hQ[i]->GetXaxis()->SetBinLabel(3,"Qx^{+}");
+      hQ[i]->GetXaxis()->SetBinLabel(4,"Qy^{+}");
+      hQ[i]->GetYaxis()->SetTitle("Centrality");
+      fOutputFlowObs->Add(hQ[i]);
+
+      hAngleQ[i] = new TH2F( Form("h%s_AngleQ",ref[i].Data()),
+                            Form("#Psi_{2} for %s",ref[i].Data()),
+                            72,0,TMath::Pi(),12,0,60);
+      hAngleQ[i]->GetXaxis()->SetTitle( Form("#Psi_{2}^{%s}",ref[i].Data()) );
+      hAngleQ[i]->GetYaxis()->SetTitle("Centrality");
+      fOutputFlowObs->Add(hAngleQ[i]);
+
+      hPhiEta[i] = new TH3F( Form("h%s_PhiEta",ref[i].Data()),
+                            Form("Eta vs Phi for %s",ref[i].Data()),
+                            72,0,TMath::Pi(),etabin[i],-1.0*etamax[i],+1.0*etamax[i],12,0,60);
+      hPhiEta[i]->GetXaxis()->SetTitle("Phi");
+      hPhiEta[i]->GetYaxis()->SetTitle("Eta");
+      hPhiEta[i]->GetZaxis()->SetTitle("Centrality");
+      fOutputFlowObs->Add(hPhiEta[i]);
+
+    }
+    TH3F *hTPCVZE_AngleQ = new TH3F("hTPCVZE_AngleQ","#Psi_{2}^{VZERO} vs #Psi_{2}^{TPC}",   72,0,TMath::Pi(),72,0,TMath::Pi(),12,0,60);
+    hTPCVZE_AngleQ->GetXaxis()->SetTitle("#Psi_{2}^{TPC}");
+    hTPCVZE_AngleQ->GetYaxis()->SetTitle("#Psi_{2}^{VZE}");
+    hTPCVZE_AngleQ->GetZaxis()->SetTitle("Centrality");
+    fOutputFlowObs->Add(hTPCVZE_AngleQ);
+  }
 //  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
 //  AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
 //  AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
 //  fCuts->GetPidHF()->SetPidResponse(pidResp);
   // Post the data
   PostData(1,fNEntries);
+
   if(fOnOff[1]) PostData(2,fOutputPID);
   if(fOnOff[0]) PostData(3,fOutputTrack);
   PostData(4,fCuts);
   if(fOnOff[2]) PostData(5,fOutputCounters);
   if(fOnOff[3]) PostData(7,fOutputEvSelection);
+  if(fOnOff[4]) PostData(8,fOutputFlowObs);
 
   if(!fOnOff[0] && !fOnOff[1] && !fOnOff[2]) AliError("Nothing will be filled!");
 }
@@ -753,6 +829,10 @@ void AliAnalysisTaskSEHFQA::UserExec(Option_t */*option*/)
   Double_t centrality=fCuts->GetCentrality(aod);
   Double_t multiplicity=aod->GetHeader()->GetRefMultiplicity();
   Int_t runNumber = aod->GetRunNumber();
+  if(fOnOff[4]) {
+    FillFlowObs(aod);
+    PostData(8,fOutputFlowObs);
+  }
   if(fOnOff[3]){
     TH2F* hTrigC=(TH2F*)fOutputEvSelection->FindObject("hTrigCent");
     TH2F* hTrigM=(TH2F*)fOutputEvSelection->FindObject("hTrigMul");
@@ -1164,6 +1244,86 @@ void AliAnalysisTaskSEHFQA::UserExec(Option_t */*option*/)
 
 }
 
+//____________________________________________________________________________
+void AliAnalysisTaskSEHFQA::FillFlowObs(AliAODEvent *aod){
+  //fills the flow observables
+  ((TH1F*) fOutputFlowObs->FindObject("hFlowEvents"))->Fill(0);
+
+  UInt_t mask=((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
+  UInt_t trigger=AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
+  Double_t cc;
+  if(mask & trigger) {
+    ((TH1F*) fOutputFlowObs->FindObject("hFlowEvents"))->Fill(1); // fired
+    Bool_t rejected=false;
+    cc = fCuts->GetCentrality(aod);
+    if(cc<0 || cc>60) rejected=true;
+    const AliVVertex *vertex = aod->GetPrimaryVertex();
+    Double_t zvtx=vertex->GetZ();
+    if(TMath::Abs(zvtx)>7.) rejected=true;
+    if(rejected) return; //not interesting for flow QA
+  } else {
+    return;
+  }
+
+  // event accepted
+  ((TH1F*) fOutputFlowObs->FindObject("hFlowEvents"))->Fill(2);
+
+  fRFPcuts->SetParamType(AliFlowTrackCuts::kGlobal);
+  fRFPcuts->SetPtRange(0.2,5.);
+  fRFPcuts->SetEtaRange(-0.8,0.8);
+  fRFPcuts->SetMinNClustersTPC(70);
+  fRFPcuts->SetMinChi2PerClusterTPC(0.2);
+  fRFPcuts->SetMaxChi2PerClusterTPC(4.0);
+  fRFPcuts->SetAcceptKinkDaughters(kFALSE);
+  fRFPcuts->SetEvent(aod);
+
+  TString ref[3] = {"FB1","FB128","VZE"};
+  Double_t psi[3];
+  for(Int_t i=0; i!=3; ++i) {
+    if(i==0) { // switching to bit 1
+      fRFPcuts->SetMinimalTPCdedx(10.);
+      fRFPcuts->SetAODfilterBit(1);
+    } else { // switching to bit 128
+      fRFPcuts->SetMinimalTPCdedx(-1);
+      fRFPcuts->SetAODfilterBit(128);
+    }
+    if(i>1) {
+      fRFPcuts->SetParamType(AliFlowTrackCuts::kV0);
+      fRFPcuts->SetEtaRange(-5,+5);
+      fRFPcuts->SetPhiMin(0);
+      fRFPcuts->SetPhiMax(TMath::TwoPi());
+    }
+    fFlowEvent->Fill(fRFPcuts,fRFPcuts);
+    fFlowEvent->TagSubeventsInEta(-5,0,0,+5);
+    // getting information
+    AliFlowVector vQ, vQaQb[2];
+    fFlowEvent->Get2Qsub(vQaQb,2);
+    vQ = vQaQb[0]+vQaQb[1];
+    Double_t dMa=vQaQb[0].GetMult();
+    Double_t dMb=vQaQb[1].GetMult();
+    if( dMa<2 || dMb<2 ) {
+      ((TH1F*) fOutputFlowObs->FindObject("hFlowEvents"))->Fill(3); //???
+      continue;
+    }
+    psi[i] = vQ.Phi()/2;
+    // publishing
+    ((TProfile2D*) fOutputFlowObs->FindObject( Form("h%s_Q",ref[i].Data())))->Fill(0,cc,vQaQb[0].X()/dMa,dMa); // Qx-
+    ((TProfile2D*) fOutputFlowObs->FindObject( Form("h%s_Q",ref[i].Data())))->Fill(1,cc,vQaQb[0].Y()/dMa,dMa); // Qy-
+    ((TProfile2D*) fOutputFlowObs->FindObject( Form("h%s_Q",ref[i].Data())))->Fill(2,cc,vQaQb[1].X()/dMb,dMb); // Qx+
+    ((TProfile2D*) fOutputFlowObs->FindObject( Form("h%s_Q",ref[i].Data())))->Fill(3,cc,vQaQb[1].Y()/dMb,dMb); // Qy+
+    ((TH2F*) fOutputFlowObs->FindObject( Form("h%s_AngleQ",ref[i].Data()) ))->Fill(psi[i],cc); // Psi
+    AliFlowTrackSimple *track;
+    for(Int_t t=0; t!=fFlowEvent->NumberOfTracks(); ++t) {
+      track = (AliFlowTrackSimple*) fFlowEvent->GetTrack(t);
+      if(!track) continue;
+      if(!track->InRPSelection()) continue;
+      ((TH3F*) fOutputFlowObs->FindObject( Form("h%s_PhiEta",ref[i].Data()) ))->Fill(track->Phi(),track->Eta(),cc,track->Weight()); //PhiEta
+    }
+  }
+  // TPC vs VZERO
+  ((TH3F*) fOutputFlowObs->FindObject( "hTPCVZE_AngleQ" ))->Fill(psi[0],psi[2],cc);
+}
+
 //____________________________________________________________________________
 void AliAnalysisTaskSEHFQA::Terminate(Option_t */*option*/){
   //terminate analysis
index 746ad6877b998a411b8fafe288fcdaaf8aecc99d..f0f1b552c5bf734b6ad59787061c12ea00252105 100644 (file)
@@ -19,6 +19,9 @@
 
 class AliRDHFCuts;
 class TH1F;
+class AliAODEvent;
+class AliFlowEvent;
+class AliFlowTrackCuts;
 
 class AliAnalysisTaskSEHFQA : public AliAnalysisTaskSE
 {
@@ -45,6 +48,7 @@ class AliAnalysisTaskSEHFQA : public AliAnalysisTaskSE
   void SetPIDOn(Bool_t pidon=kTRUE){fOnOff[1]=pidon;}
   void SetCentralityOn(Bool_t centron=kTRUE){fOnOff[2]=centron;}
   void SetEvSelectionOn(Bool_t evselon=kTRUE){fOnOff[3]=evselon;}
+  void SetFlowObsOn(Bool_t flowobson=kTRUE){fOnOff[4]=flowobson;}
 
   //getters
   AliRDHFCuts* GetCutObject() const {return fCuts;}
@@ -53,10 +57,12 @@ class AliAnalysisTaskSEHFQA : public AliAnalysisTaskSE
   Bool_t GetPIDStatus() const {return fOnOff[1];}
   Bool_t GetCentralityStatus() const {return fOnOff[2];}
   Bool_t GetEvSelStatus() const {return fOnOff[3];}
+  Bool_t GetFlowObsStatus() const {return fOnOff[4];}
 
  private:
   AliAnalysisTaskSEHFQA(const AliAnalysisTaskSEHFQA &source);
   AliAnalysisTaskSEHFQA operator=(const AliAnalysisTaskSEHFQA &source);
+  void FillFlowObs(AliAODEvent *aod);
 
  TH1F*  fNEntries;         //! histogram with number of events on output slot 1
  TList* fOutputPID;        //! list sent on output slot 2
@@ -64,13 +70,16 @@ class AliAnalysisTaskSEHFQA : public AliAnalysisTaskSE
  TList* fOutputCounters;   //! list sent on output slot 5
  TList* fOutputCheckCentrality;   //! list sent on output slot 6
  TList* fOutputEvSelection; //! list sent on output slot 7
+ TList* fOutputFlowObs;    //! list sent on output slot 8
  DecChannel fDecayChannel; //identify the decay channel
- AliRDHFCuts* fCuts;       // object containing cuts
+ AliRDHFCuts* fCuts;       // object containing cuts 
+ AliFlowEvent *fFlowEvent; //! to handle the reusage of the flowEvent object
+ AliFlowTrackCuts *fRFPcuts; //! reference flow particle cuts
  AliRDHFCuts::ECentrality fEstimator; //2nd estimator for centrality
  Bool_t fReadMC;           // flag to read MC
  Bool_t fSimpleMode;       // if true, don't do candidates (much faster in PbPb)
- Bool_t fOnOff[4];         // on-off the QA on tracks (0), PID (1), centrality (2), event selection -- default is {kTRUE,kTRUE,kTRUE,kTRUE}
- ClassDef(AliAnalysisTaskSEHFQA,6); //AnalysisTaskSE for the quality assurance of HF in hadrons
+ Bool_t fOnOff[5];         // on-off the QA on tracks (0), PID (1), centrality (2), event selection -- default is {kTRUE,kTRUE,kTRUE,kTRUE}
+ ClassDef(AliAnalysisTaskSEHFQA,7); //AnalysisTaskSE for the quality assurance of HF in hadrons
 
 };
 
index 3ff8c7523ee741bee37a8612b407d570f531f0db..47399fc7db4cb39b70e788710964a8091e0c595f 100644 (file)
@@ -20,12 +20,12 @@ AliAnalysisTaskSEHFQA* AddTaskHFQA(AliAnalysisTaskSEHFQA::DecChannel ch,TString
       }
   }
 
-  Bool_t onoff[4]={kTRUE,kTRUE,kTRUE,kTRUE}; //tracks (0), PID (1), centrality (2), event selection(3) 
+  Bool_t onoff[5]={kTRUE,kTRUE,kTRUE,kTRUE,kTRUE}; //tracks (0), PID (1), centrality (2), event selection(3), flow observables(4)
   if(system==0) onoff[2]=kFALSE;
 
   AliRDHFCuts *analysiscuts=0x0;
 
-  TString filename="",out1name="nEntriesQA",out2name="outputPid",out3name="outputTrack",out4name="cuts",out5name="countersCentrality",out6name="outputCentrCheck",out7name="outputEvSel",inname="input",suffix="",cutsobjname="",centr="";
+  TString filename="",out1name="nEntriesQA",out2name="outputPid",out3name="outputTrack",out4name="cuts",out5name="countersCentrality",out6name="outputCentrCheck",out7name="outputEvSel",out8name="outputFlowObs",inname="input",suffix="",cutsobjname="",centr="";
   filename = AliAnalysisManager::GetCommonFileName();
   filename += ":PWG3_D2H_QA";
   filename += finDirname.Data();
@@ -101,6 +101,7 @@ AliAnalysisTaskSEHFQA* AddTaskHFQA(AliAnalysisTaskSEHFQA::DecChannel ch,TString
   out5name+=suffix;
   out6name+=suffix;
   out7name+=suffix;
+  out8name+=suffix;
 
   if(!analysiscuts && filecutsname!="none"){
     cout<<"Specific AliRDHFCuts not found"<<endl;
@@ -116,6 +117,7 @@ AliAnalysisTaskSEHFQA* AddTaskHFQA(AliAnalysisTaskSEHFQA::DecChannel ch,TString
   out5name+=centr;
   out6name+=centr;
   out7name+=centr;
+  out8name+=centr;
   inname+= finDirname.Data();
   out1name+= finDirname.Data();
   out2name+= finDirname.Data();
@@ -124,6 +126,7 @@ AliAnalysisTaskSEHFQA* AddTaskHFQA(AliAnalysisTaskSEHFQA::DecChannel ch,TString
   out5name+= finDirname.Data();
   out6name+= finDirname.Data();
   out7name+= finDirname.Data();
+  out8name+= finDirname.Data();
 
  
   AliAnalysisTaskSEHFQA* taskQA=new AliAnalysisTaskSEHFQA(Form("QA%s",suffix.Data()),ch,analysiscuts);
@@ -134,6 +137,7 @@ AliAnalysisTaskSEHFQA* AddTaskHFQA(AliAnalysisTaskSEHFQA::DecChannel ch,TString
   taskQA->SetPIDOn(onoff[1]);
   taskQA->SetCentralityOn(onoff[2]);
   taskQA->SetEvSelectionOn(onoff[3]);
+  taskQA->SetFlowObsOn(onoff[4]);
   mgr->AddTask(taskQA);
 
   //
@@ -162,6 +166,9 @@ AliAnalysisTaskSEHFQA* AddTaskHFQA(AliAnalysisTaskSEHFQA::DecChannel ch,TString
   AliAnalysisDataContainer *coutput7 = mgr->CreateContainer(out7name,TList::Class(),AliAnalysisManager::kOutputContainer, filename.Data()); //event selection
   if(onoff[3]) mgr->ConnectOutput(taskQA,7,coutput7);
 
+  AliAnalysisDataContainer *coutput8 = mgr->CreateContainer(out8name,TList::Class(),AliAnalysisManager::kOutputContainer, filename.Data()); //flow observables
+  if(onoff[4]) mgr->ConnectOutput(taskQA,8,coutput8);
+
  return taskQA;
 }