fDebug(kFALSE),\r
fUseEventSelection(kTRUE),\r
fDoQA(kFALSE),\r
+ fDoExtraQA(kFALSE),\r
+ fRunOnpA(kFALSE),\r
+ fRunOnpp(kFALSE),\r
+ fCalib(NULL),\r
fPsi2(0.0),\r
fSpecie(0),\r
fMCmatch(-1),\r
fDebug(kFALSE),\r
fUseEventSelection(kTRUE),\r
fDoQA(kFALSE),\r
+ fDoExtraQA(kFALSE),\r
+ fRunOnpA(kFALSE),\r
+ fRunOnpp(kFALSE),\r
+ fCalib(NULL),\r
fPsi2(0.0),\r
fSpecie(0),\r
fMCmatch(-1),\r
if (fCutsPOI) delete fCutsPOI;\r
if (fCutsRFPTPC) delete fCutsRFPTPC;\r
if (fCutsRFPVZE) delete fCutsRFPVZE;\r
+ if (fCalib) delete fCalib;\r
}\r
//=======================================================================\r
void AliAnalysisTaskFlowStrange::UserCreateOutputObjects()\r
void AliAnalysisTaskFlowStrange::UserExec(Option_t *option)\r
{\r
// dummy user exec\r
+ if(fRunOnpA) { // temporal extra cuts for pA (2BE REMOVED!)\r
+ AliAODEvent *aod=dynamic_cast<AliAODEvent*>(InputEvent());\r
+ if(!aod) return;\r
+ if(aod->GetHeader()->GetEventNumberESDFile() == 0) return; //rejecting first chunk\r
+ // https://twiki.cern.ch/twiki/bin/viewauth/ALICE/PAVertexSelectionStudies\r
+ const AliAODVertex* trkVtx = aod->GetPrimaryVertex();\r
+ if (!trkVtx || trkVtx->GetNContributors()<=0) return;\r
+ TString vtxTtl = trkVtx->GetTitle();\r
+ if (!vtxTtl.Contains("VertexerTracks")) return;\r
+ Float_t zvtx = trkVtx->GetZ();\r
+ const AliAODVertex* spdVtx = aod->GetPrimaryVertexSPD();\r
+ if (spdVtx->GetNContributors()<=0) return;\r
+ TString vtxTyp = spdVtx->GetTitle();\r
+ Double_t cov[6]={0};\r
+ spdVtx->GetCovarianceMatrix(cov);\r
+ Double_t zRes = TMath::Sqrt(cov[5]);\r
+ if (vtxTyp.Contains("vertexer:Z") && (zRes>0.25)) return;\r
+ if (TMath::Abs(spdVtx->GetZ() - trkVtx->GetZ())>0.5) return;\r
+ if (TMath::Abs(zvtx) > 10) return;\r
+ }\r
+\r
AliAnalysisTaskFlowStrange::MyUserExec(option);\r
}\r
//=======================================================================\r
tEvent->GetXaxis()->SetBinLabel(2,"selected");\r
tEvent->GetXaxis()->SetBinLabel(3,"unexpected");\r
\r
- TH1D *tTPCRFP = new TH1D("RFPTPC","TPC Reference Flow Particles;multiplicity",100,0,3000); tQAEvents->Add(tTPCRFP);\r
- TH1D *tVZERFP = new TH1D("RFPVZE","VZERO Reference Flow Particles;multiplicity",100,0,30000); tQAEvents->Add(tVZERFP);\r
+ TH2D *tH2D;\r
+ TH1D *tTPCRFP = new TH1D("RFPTPC","TPC Reference Flow Particles;multiplicity",3000,0,3000); tQAEvents->Add(tTPCRFP);\r
+ TH1D *tVZERFP = new TH1D("RFPVZE","VZERO Reference Flow Particles;multiplicity",3000,0,30000); tQAEvents->Add(tVZERFP);\r
+ tH2D = new TH2D("TPCPhiEta","TPC RFP;Phi;Eta",100,0,TMath::TwoPi(),100,-1.0,+1.0); tQAEvents->Add( tH2D );\r
+ tH2D = new TH2D("VZEPhiEta","VZE RFP;Phi;Eta",20,0,TMath::TwoPi(),40,-4.0,+6.0); tQAEvents->Add( tH2D );\r
TH1D *tPOI = new TH1D("POI","POIs;multiplicity",500,0,500); tQAEvents->Add( tPOI );\r
if(fDoQA) {\r
- TH2D *tH2D = new TH2D("VTXZ","VTXZ;Global||SPD;SPD",60,-15,+15,60,-15,+15); tQAEvents->Add( tH2D );\r
+ printf("QA enabled\n");\r
+ tH2D = new TH2D("VTXZ","VTXZ;Global||SPD;SPD",60,-25,+25,60,-25,+25); tQAEvents->Add( tH2D );\r
TH3D *tH3D = new TH3D("EVPLANE","EVPLANE;TPC;V0A;V0C",72,0,TMath::Pi(),72,0,TMath::Pi(),72,0,TMath::Pi()); tQAEvents->Add( tH3D );\r
tH2D = new TH2D("VTXZSEL","VTXZ SEL;Global||SPD;SPD",40,-10,+10,40,-10,+10); tQAEvents->Add( tH2D );\r
+ tH3D = new TH3D("PRIMVERTEX","PRIMVERTEX;#sigma_{x};#sigma_{y};#sigma_{z}",100,0,5e-3,100,0,5e-3,100,0,8e-3); tQAEvents->Add( tH3D );\r
+ double dArrayPt[25] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,\r
+ 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,\r
+ 2.5, 3.0, 3.5, 4.0, 5.0 };\r
+ tH2D = new TH2D("TPCPtQx","TPCPtQx;pT;Qx/M",24,dArrayPt,100,-0.2,+0.2); tQAEvents->Add( tH2D );\r
+ tH2D = new TH2D("TPCPtQy","TPCPtQy;pT;Qy/M",24,dArrayPt,100,-0.2,+0.2); tQAEvents->Add( tH2D );\r
+ tH2D = new TH2D("TPCPtEta","TPCPtEta;pT;Eta/M",24,dArrayPt,100,-0.3,+0.3); tQAEvents->Add( tH2D );\r
+ tH2D = new TH2D("TPCQxQy","TPCQxQy;Qx/M;Qy/M",100,-0.3,+0.3,100,-0.3,+0.3); tQAEvents->Add( tH2D );\r
+ tH2D = new TH2D("VZEQxQy","VZEQxQy;Qx/M;Qy/M",100,-0.3,+0.3,100,-0.3,+0.3); tQAEvents->Add( tH2D );\r
}\r
TProfile *tCuts = new TProfile("Cuts","Analysis Cuts",11,0,11);\r
tCuts->Fill(0.5,fV0Cuts[0],1); tCuts->GetXaxis()->SetBinLabel(1,"dl");\r
dMaxMass = 1.0;\r
break;\r
}\r
-\r
- if(fDoQA) {\r
+ double dArrayPt[29] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,\r
+ 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,\r
+ 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 8.0, 10., 12. };\r
+ tList=new TList();\r
+ tList->SetName("Candidates");\r
+ tList->SetOwner();\r
+ tH2D = new TH2D("V0MASS","V0MASS;pT;Mass",28,dArrayPt,nMass,dMinMass,dMaxMass); tList->Add(tH2D);\r
+ tH2D = new TH2D("V0PhiEta","V0PhiEta;Phi;Eta",100,0,TMath::TwoPi(),100,-1.0,+1.0); tList->Add(tH2D);\r
+ fQAList->Add(tList);\r
+\r
+ if(fDoExtraQA) {\r
+ printf("Extra QA enabled\n");\r
tList = new TList(); tList->SetOwner(); tList->SetName("QACutsBefore_IP");\r
tH3D = new TH3D("BefVOL", "VOLUME;Phi;Eta;Pt [GeV]", 63, 0.0,+6.3, 40,-1.0,+1.0, 60,0,12); tList->Add( tH3D );\r
tH3D = new TH3D("BefRAP", "RAPIDITY;y;Pt [GeV]", 40,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );\r
}\r
\r
if(fMCmatch>0) { // only for MCanalysis\r
+ printf("MC mode enabled\n");\r
tList = new TList(); tList->SetOwner(); tList->SetName("QAMC");\r
tH3D = new TH3D("MCPDG","MC PDGm;p_{T} (GeV);Mass [GeV]",24,0,12,nMass,dMinMass,dMaxMass,30,0,30); tList->Add( tH3D );\r
tH3D->GetZaxis()->SetBinLabel( 1,"NONE");\r
fFlowEventTPC->Fill(fCutsRFPTPC,fCutsPOI);\r
fFlowEventVZE->Fill(fCutsRFPVZE,fCutsPOI);\r
fPsi2 = (fFlowEventVZE->GetQ()).Phi()/2;\r
+\r
+ for(Int_t i=0; i!=fFlowEventTPC->NumberOfTracks(); i++) {\r
+ AliFlowTrackSimple *pTrack = (AliFlowTrackSimple*) fFlowEventTPC->GetTrack(i);\r
+ if(!pTrack) continue;\r
+ if(!pTrack->InRPSelection()) continue;\r
+ ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPhiEta"))->Fill( pTrack->Phi(), pTrack->Eta(), pTrack->Weight() );\r
+ }\r
+ for(Int_t i=0; i!=fFlowEventVZE->NumberOfTracks(); i++) {\r
+ AliFlowTrackSimple *pTrack = (AliFlowTrackSimple*) fFlowEventVZE->GetTrack(i);\r
+ if(!pTrack) continue;\r
+ if(!pTrack->InRPSelection()) continue;\r
+ ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("VZEPhiEta"))->Fill( pTrack->Phi(), pTrack->Eta(), pTrack->Weight() );\r
+ }\r
+\r
if(fDoQA) {\r
AliFlowVector Qs[2];\r
fFlowEventVZE->TagSubeventsInEta(-5,1,1,+5);\r
Double_t dEPV0A = Qs[0].Phi()/2;\r
Double_t dEPTPC = (fFlowEventTPC->GetQ()).Phi()/2;\r
((TH3D*)((TList*)fQAList->FindObject("Event"))->FindObject("EVPLANE"))->Fill( dEPTPC, dEPV0A, dEPV0C );\r
+ Double_t dVZEQx = (fFlowEventVZE->GetQ(2)).Px() / (fFlowEventVZE->GetQ(2)).GetMult();\r
+ Double_t dVZEQy = (fFlowEventVZE->GetQ(2)).Py() / (fFlowEventVZE->GetQ(2)).GetMult();\r
+ ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("VZEQxQy"))->Fill( dVZEQx, dVZEQy );\r
+ ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCQxQy"))->Fill( (fFlowEventTPC->GetQ(2)).Px() / (fFlowEventTPC->GetQ(2)).GetMult(),\r
+ (fFlowEventTPC->GetQ(2)).Py() / (fFlowEventTPC->GetQ(2)).GetMult() );\r
+ // TPC Q\r
+ const int ngr=24;\r
+ double dArrayPt[25] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,\r
+ 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,\r
+ 2.5, 3.0, 3.5, 4.0, 5.0 };\r
+ double dTPCPt[ngr];\r
+ double dTPCQx[ngr];\r
+ double dTPCQy[ngr];\r
+ double dTPCEta[ngr];\r
+ double dTPCM[ngr];\r
+ for(int i=0; i!=ngr; ++i) {\r
+ dTPCPt[i] = 0;\r
+ dTPCQx[i] = 0;\r
+ dTPCQy[i] = 0;\r
+ dTPCEta[i] = 0;\r
+ dTPCM[i] = 0;\r
+ }\r
+ for(Int_t i=0; i!=fFlowEventTPC->NumberOfTracks(); i++) {\r
+ AliFlowTrackSimple *pTrack = (AliFlowTrackSimple*) fFlowEventTPC->GetTrack(i);\r
+ if(!pTrack) continue;\r
+ if(!pTrack->InRPSelection()) continue;\r
+ Double_t dPt = pTrack->Pt();\r
+ int npt=-1;\r
+ for(int pt=0; pt!=ngr; ++pt)\r
+ if( (dPt > dArrayPt[pt])&&(dPt < dArrayPt[pt+1]) ) {\r
+ npt = pt;\r
+ break;\r
+ }\r
+ if(npt<0) continue;\r
+ Double_t dPhi = pTrack->Phi();\r
+ Double_t dWeight = pTrack->Weight();\r
+ dTPCPt[npt] += dWeight*dPt;\r
+ dTPCQx[npt] += dWeight*TMath::Cos(2*dPhi);\r
+ dTPCQy[npt] += dWeight*TMath::Sin(2*dPhi);\r
+ dTPCEta[npt] += dWeight*pTrack->Eta();\r
+ dTPCM[npt] += dWeight;\r
+ }\r
+ for(int i=0; i!=ngr; ++i)\r
+ if( dTPCM[i]>0 ) {\r
+ ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPtQx"))->Fill( dTPCPt[i]/dTPCM[i], dTPCQx[i]/dTPCM[i] );\r
+ ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPtQy"))->Fill( dTPCPt[i]/dTPCM[i], dTPCQy[i]/dTPCM[i] );\r
+ ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPtEta"))->Fill( dTPCPt[i]/dTPCM[i], dTPCEta[i]/dTPCM[i] );\r
+ }\r
+ // End of TPC Q\r
+ const AliAODVertex* trkVtx = tAOD->GetPrimaryVertex();\r
+ Double_t cov[6]={0};\r
+ trkVtx->GetCovarianceMatrix(cov);\r
+ ((TH3D*)((TList*)fQAList->FindObject("Event"))->FindObject("PRIMVERTEX"))->Fill( TMath::Sqrt( cov[0] ),\r
+ TMath::Sqrt( cov[2] ),\r
+ TMath::Sqrt( cov[5] ) );\r
}\r
\r
if(fSpecie>80) {\r
TString sIPOP = "IP";\r
if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) )\r
sIPOP = "OP";\r
- if(fDoQA) {\r
+ if(fDoExtraQA) {\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefRAP")) ->Fill(dRAP, dPT, dMASS);\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefDLZ")) ->Fill(dDLZ, dPT, dMASS);\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefDLXY"))->Fill(dDLXY, dPT, dMASS);\r
passes=mcpasses;\r
}\r
// <<=== MATCHED TO MC ===\r
- if(passes&&fDoQA) {\r
+ if(passes&&fDoExtraQA) {\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftRAP")) ->Fill(dRAP, dPT, dMASS);\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftDLZ")) ->Fill(dDLZ, dPT, dMASS);\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftDLXY"))->Fill(dDLXY, dPT, dMASS);\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftAP")) ->Fill(dALPHA,dQT,dPT);\r
((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftVOL")) ->Fill(dPHI, dETA,dPT);\r
}\r
+ if(passes&&fDoQA) {\r
+ ((TH2D*)((TList*)fQAList->FindObject("Candidates"))->FindObject("V0MASS"))->Fill( dPT, dMASS );\r
+ ((TH2D*)((TList*)fQAList->FindObject("Candidates"))->FindObject("V0PhiEta"))->Fill( dPHI, dETA );\r
+ }\r
return passes;\r
}\r
//=======================================================================\r
// ONE PRECONF WAGON\r
void AddTaskFlowStrange(int trigger, float centrMin, float centrMax, int set, TString folderName="myFolder", TString suffixName="mySuffix", \r
int specie=0, char* MULT="V0M", int harmonic=2, int matchMC=-1, bool doQC=true, bool doSPTPC=true, bool doSPVZE=true,\r
- bool doQA=false, bool useFlowEventCuts=true) {\r
+ bool doQA=false, bool useFlowEventCuts=true,\r
+ bool runpp=false, bool runpA=false, bool doExtraQA=false, TString calibfile="alien:///alice/cern.ch/user/c/cperez/calib/calibPbPb2010.root") {\r
Double_t c[11];\r
switch(set) {\r
case(0): // Filtering cuts //\r
}\r
AddTaskFlowStrange(trigger, centrMin, centrMax, folderName, suffixName, specie,\r
c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],\r
- MULT, harmonic, matchMC, doQC, doSPTPC, doSPVZE, doQA, useFlowEventCuts);\r
+ MULT, harmonic, matchMC, doQC, doSPTPC, doSPVZE, doQA, useFlowEventCuts,\r
+ runpp, runpA, doExtraQA, calibfile);\r
}\r
// ALL CENTRALITIES\r
void AddTaskFlowStrange(int trigger, TString folderName="myFolder", TString suffix="mySuffix", int specie=0,\r
double cut0, double cut1, double cut2, double cut3, double cut4, double cut5, double cut6, double cut7, double cut8,\r
double cut9, double cut10, char* MULT="V0M", int harmonic=2, int matchMC=-1,\r
- bool doQC=true, bool doSPTPC=true, bool doSPVZE=true, bool doQA=false, bool useFlowEventCuts=true ) {\r
+ bool doQC=true, bool doSPTPC=true, bool doSPVZE=true, bool doQA=false, bool useFlowEventCuts=true,\r
+ bool runpp=false, bool runpA=false, bool doExtraQA=false, TString calibfile="alien:///alice/cern.ch/user/c/cperez/calib/calibPbPb2010.root") {\r
int centMin[8] = {00,05,10,20,30,40,50,60};\r
int centMax[8] = {05,10,20,30,40,50,60,80};\r
TString particle="none";\r
name = Form("%s%02d%02d%s",particle.Data(),centMin[i],centMax[i],suffix.Data());\r
AddTaskFlowStrange(trigger, centMin[i], centMax[i], folderName, name, specie,\r
cut0, cut1, cut2, cut3, cut4, cut5, cut6, cut7, cut8, cut9, cut10, MULT, harmonic, matchMC,\r
- doQC, doSPTPC, doSPVZE, doQA, useFlowEventCuts);\r
+ doQC, doSPTPC, doSPVZE, doQA, useFlowEventCuts,\r
+ runpp, runpA, doExtraQA, calibfile);\r
}\r
}\r
// ONE WAGON\r
void AddTaskFlowStrange(int trigger, float centrMin, float centrMax, TString folderName="myFolder", TString suffixName="mySuffix", int specie=0, \r
double cut0, double cut1, double cut2, double cut3, double cut4, double cut5, double cut6, double cut7, double cut8,\r
double cut9, double cut10, char* MULT="V0M", int harmonic=2, int matchMC=-1, \r
- bool doQC=true, bool doSPTPC=true, bool doSPVZE=true, bool doQA=false, bool useFlowEventCuts=true) {\r
+ bool doQC=true, bool doSPTPC=true, bool doSPVZE=true, bool doQA=false, bool useFlowEventCuts=true, \r
+ bool runpp=false, bool runpA=false, bool doExtraQA=false, TString calibfile="alien:///alice/cern.ch/user/c/cperez/calib/calibPbPb2010.root") {\r
TString fileName = AliAnalysisManager::GetCommonFileName();\r
fileName.ReplaceAll(".root","");\r
\r
cutsEvent->SetRefMultMethod(AliFlowEventCuts::kSPDtracklets);\r
cutsEvent->SetNContributorsRange(2);\r
cutsEvent->SetPrimaryVertexZrange(-10.0,+10.0);\r
+ cutsEvent->SetCutTPCmultiplicityOutliers();\r
\r
//-R-P---c-u-t-s--------------------------------------------------------------\r
AliFlowTrackCuts *cutsRPTPC = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts();\r
taskSel->SetMCmatch(matchMC);\r
taskSel->SetUseEventSelection(useFlowEventCuts);\r
taskSel->SetCommonConstants( SFT_MassBins(specie), SFT_MinMass(specie), SFT_MaxMass(specie) );\r
+ taskSel->SetExtraQA( doExtraQA );\r
+ taskSel->Setpp( runpp );\r
+ taskSel->SetpA( runpA );\r
+ TFile *filecal = TFile::Open( calibfile.Data() );\r
+ if( (!filecal) || ( filecal && !filecal->IsOpen()) ){\r
+ printf("AddTaskStrange -> no complementary calibration file needed? Very good.\n");\r
+ } else {\r
+ TList *myCalib = (TList*)filecal->Get("calibration");\r
+ if(myCalib) taskSel->SetCalib(myCalib);\r
+ }\r
AliAnalysisDataContainer *cOutHist = mgr->CreateContainer(Form("OutHistos_%s",suffixName.Data()),\r
TList::Class(),\r
AliAnalysisManager::kOutputContainer,\r