]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/RESONANCES/macros/mini/ConfigTOFanalysisKStar.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / macros / mini / ConfigTOFanalysisKStar.C
1 /***************************************************************************
2               fbellini@cern.ch - last modified on 28/11/2013
3
4 // *** Configuration script for K*, anti-K* analysis with 2010 PbPb runs ***
5 // *** Configuration script for K*, anti-K* analysis with 2013 pPb runs ***
6 // 
7 // A configuration script for RSN package needs to define the followings:
8 //
9 // (1) decay tree of each resonance to be studied, which is needed to select
10 //     true pairs and to assign the right mass to all candidate daughters
11 // (2) cuts at all levels: single daughters, tracks, events
12 // (3) output objects: histograms or trees
13 ****************************************************************************/
14 Bool_t ConfigTOFanalysisKStar
15 (  
16     AliRsnMiniAnalysisTask *task, 
17     Bool_t                 isMC, 
18     Bool_t                 isPP,
19     const char             *suffix,
20     AliRsnCutSet           *cutsPair,
21     Int_t                  aodFilterBit = 5,
22     Int_t                  customQualityCutsID = AliRsnCutSetDaughterParticle::kDisableCustom,
23     AliRsnCutSetDaughterParticle::ERsnDaughterCutSet cutPiCandidate = AliRsnCutSetDaughterParticle::kTOFpidKstarPbPb2010,
24     AliRsnCutSetDaughterParticle::ERsnDaughterCutSet cutKaCandidate = AliRsnCutSetDaughterParticle::kTOFpidKstarPbPb2010,
25     Float_t                nsigmaPi = 2.0,
26     Float_t                nsigmaKa = 2.0,
27     Bool_t                 enableMonitor = kTRUE,
28     Bool_t                 IsMcTrueOnly = kFALSE,
29     Bool_t                 useMixLS = 0,
30     Int_t                  signedPdg = 313,
31     TString                monitorOpt = "",
32     AliRsnMiniValue::EType yaxisVar = AliRsnMiniValue::kPt
33 )
34 {
35   // manage suffix
36   if (strlen(suffix) > 0) suffix = Form("_%s", suffix);
37   
38   // set daughter cuts
39   AliRsnCutSetDaughterParticle * cutSetQ;
40   AliRsnCutSetDaughterParticle * cutSetPi;
41   AliRsnCutSetDaughterParticle * cutSetK;
42   
43   AliRsnCutTrackQuality * trkQualityCut =  new AliRsnCutTrackQuality("myQualityCut");
44   if (SetCustomQualityCut(trkQualityCut, customQualityCutsID, aodFilterBit)) {
45     //Set custom quality cuts for systematic checks
46     cutSetQ  = new AliRsnCutSetDaughterParticle(Form("cutQ_bit%i",aodFilterBit), trkQualityCut, AliRsnCutSetDaughterParticle::kQualityStd2011, AliPID::kPion, -1.0);
47     cutSetPi = new AliRsnCutSetDaughterParticle(Form("cutPi%i_%2.1fsigma",cutPiCandidate, nsigmaPi), trkQualityCut, cutPiCandidate, AliPID::kPion, nsigmaPi);
48     cutSetK  = new AliRsnCutSetDaughterParticle(Form("cutK%i_%2.1fsigma",cutPiCandidate, nsigmaKa), trkQualityCut, cutKaCandidate, AliPID::kKaon, nsigmaKa);
49   } else {
50     //use defult quality cuts (std 2010 or 2011)
51     cutSetQ  = new AliRsnCutSetDaughterParticle(Form("cutQ_bit%i",aodFilterBit), AliRsnCutSetDaughterParticle::kQualityStd2011, AliPID::kPion, -1.0, aodFilterBit);
52     cutSetQ->SetUse2011StdQualityCuts(kTRUE);
53     cutSetPi = new AliRsnCutSetDaughterParticle(Form("cutPi%i_%2.1fsigma",cutPiCandidate, nsigmaPi), cutPiCandidate, AliPID::kPion, nsigmaPi, aodFilterBit);
54     cutSetPi->SetUse2011StdQualityCuts(kTRUE);
55     cutSetK  = new AliRsnCutSetDaughterParticle(Form("cutK%i_%2.1fsigma",cutPiCandidate, nsigmaKa), cutKaCandidate, AliPID::kKaon, nsigmaKa, aodFilterBit);
56     cutSetK->SetUse2011StdQualityCuts(kTRUE);
57    }
58   
59   Int_t iCutQ = task->AddTrackCuts(cutSetQ);
60   Int_t iCutPi = task->AddTrackCuts(cutSetPi);
61   Int_t iCutK = task->AddTrackCuts(cutSetK);
62   
63   if (enableMonitor){
64     Printf("======== Cut monitoring enabled");
65     gROOT->LoadMacro("$ALICE_ROOT/PWGLF/RESONANCES/macros/mini/AddMonitorOutput.C");
66     AddMonitorOutput(isMC, cutSetQ->GetMonitorOutput(), monitorOpt.Data());
67     AddMonitorOutput(isMC, cutSetPi->GetMonitorOutput(), monitorOpt.Data());
68     AddMonitorOutput(isMC, cutSetK->GetMonitorOutput()), monitorOpt.Data();
69   }  
70   
71   // -- Values ------------------------------------------------------------------------------------
72   /* invariant mass   */ Int_t imID   = task->CreateValue(AliRsnMiniValue::kInvMass, kFALSE);
73   /* IM resolution    */ Int_t resID  = task->CreateValue(AliRsnMiniValue::kInvMassRes, kTRUE);
74   /* transv. momentum */ Int_t ptID   = task->CreateValue(AliRsnMiniValue::kPt, kFALSE);
75   /* centrality       */ Int_t centID = task->CreateValue(AliRsnMiniValue::kMult, kFALSE);
76   /* pseudorapidity   */ Int_t etaID  = task->CreateValue(AliRsnMiniValue::kEta, kFALSE);
77   /* rapidity         */ Int_t yID    = task->CreateValue(AliRsnMiniValue::kY, kFALSE);
78   /* 1st daughter pt  */ Int_t fdpt   = task->CreateValue(AliRsnMiniValue::kFirstDaughterPt, kFALSE);
79   /* 2nd daughter pt  */ Int_t sdpt   = task->CreateValue(AliRsnMiniValue::kSecondDaughterPt, kFALSE);
80   /* 1st daughter p   */ Int_t fdp    = task->CreateValue(AliRsnMiniValue::kFirstDaughterP, kFALSE);
81   /* 2nd daughter p   */ Int_t sdp    = task->CreateValue(AliRsnMiniValue::kSecondDaughterP, kFALSE);
82   
83   // -- Create all needed outputs -----------------------------------------------------------------
84   // use an array for more compact writing, which are different on mixing and charges
85   // [0] = unlike
86   // [1] = mixing
87   // [2] = like ++
88   // [3] = like --
89
90   Bool_t  use     [12] = { !IsMcTrueOnly,  !IsMcTrueOnly,  !IsMcTrueOnly,  !IsMcTrueOnly ,  !IsMcTrueOnly, !IsMcTrueOnly,  isMC   ,   isMC   ,  isMC   ,   isMC , useMixLS, useMixLS  };
91   Bool_t  useIM   [12] = { 1       ,  1       ,  1       ,  1       ,  1      ,  1      ,  1      ,   1      ,  0      ,   0 , 1    , 1     };
92   TString name    [12] = {"UnlikePM", "UnlikeMP", "MixingPM", "MixingMP", "LikePP", "LikeMM", "TruesPM",  "TruesMP", "ResPM"  ,  "ResMP",  "MixingPP",  "MixingMM"  };
93   TString comp    [12] = {"PAIR"   , "PAIR"   , "MIX"    , "MIX"    , "PAIR"  , "PAIR"  , "TRUE"  ,  "TRUE"  , "TRUE"  ,  "TRUE", "MIX","MIX"};
94   //TString output  [10] = {"HIST"   , "HIST"   , "HIST"   , "HIST"   , "HIST"  , "HIST"  , "HIST"  ,  "HIST"  , "HIST"  ,  "HIST"  };
95   TString output  [12] = {"SPARSE"   , "SPARSE"   , "SPARSE"   , "SPARSE"   , "SPARSE"  , "SPARSE"  , "SPARSE"  ,  "SPARSE"  , "SPARSE"  ,  "SPARSE", "SPARSE"  ,  "SPARSE"};
96   Char_t  charge1 [12] = {'+'      , '-'      , '+'      , '-'      , '+'     , '-'     , '+'     ,  '-'     , '+'     ,  '-'  , '+' , '-'};
97   Char_t  charge2 [12] = {'-'      , '+'      , '-'      , '+'      , '+'     , '-'     , '-'     ,  '+'     , '-'     ,  '+'  ,'+' , '-'   };
98   Int_t   cutID1  [12] = { iCutK   ,  iCutK   ,  iCutK   ,  iCutK   ,  iCutK  ,  iCutK  ,  iCutK  ,   iCutK  ,  iCutK  ,   iCutK , iCutK, iCutK };
99   Int_t   cutID2  [12] = { iCutPi  ,  iCutPi  ,  iCutPi  ,  iCutPi  ,  iCutPi ,  iCutPi ,  iCutPi ,   iCutPi ,  iCutPi ,   iCutPi, iCutPi, iCutPi };
100   
101   for (Int_t i = 0; i < 12; i++) {
102     if (!use[i]) continue;
103     AliRsnMiniOutput *out = task->CreateOutput(Form("kstar_%s%s", name[i].Data(), suffix), output[i].Data(), comp[i].Data());
104     out->SetCutID(0, cutID1[i]);
105     out->SetCutID(1, cutID2[i]);
106     out->SetDaughter(0, AliRsnDaughter::kKaon);
107     out->SetDaughter(1, AliRsnDaughter::kPion);
108     out->SetCharge(0, charge1[i]);
109     out->SetCharge(1, charge2[i]);
110     out->SetMotherPDG(signedPdg);
111     out->SetMotherMass(0.89594);
112     out->SetPairCuts(cutsPair);
113
114     // axis X: invmass (or resolution)
115     if (useIM[i]) 
116       out->AddAxis(imID, 90, 0.6, 1.5);
117     else
118       out->AddAxis(resID, 200, -0.02, 0.02);
119     
120     // axis Y: transverse momentum of pair as default - else chosen value
121     if (yaxisVar==AliRsnMiniValue::kFirstDaughterPt)
122       out->AddAxis(fdpt, 100, 0.0, 10.0);
123     else
124       if (yaxisVar==AliRsnMiniValue::kSecondDaughterPt)
125         out->AddAxis(sdpt, 100, 0.0, 10.0);
126       else
127         if (yaxisVar==AliRsnMiniValue::kFirstDaughterP)
128           out->AddAxis(fdp, 100, 0.0, 10.0);
129         else
130           if (yaxisVar==AliRsnMiniValue::kSecondDaughterP)
131             out->AddAxis(sdp, 100, 0.0, 10.0);
132           else 
133             out->AddAxis(ptID, 100, 0.0, 10.0); //default use mother pt
134
135     // axis Z: centrality-multiplicity
136     if (!isPP)
137       out->AddAxis(centID, 100, 0.0, 100.0);
138     else 
139       out->AddAxis(centID, 400, 0.0, 400.0);
140     
141     // axis W: pseudorapidity
142     // out->AddAxis(etaID, 20, -1.0, 1.0);
143     // axis J: rapidity
144     // out->AddAxis(yID, 10, -0.5, 0.5);
145     
146   }   
147   
148   if (isMC){   
149     // create output
150     AliRsnMiniOutput *outm = task->CreateOutput(Form("kstar_Mother%s", suffix), "SPARSE", "MOTHER");
151     outm->SetDaughter(0, AliRsnDaughter::kKaon);
152     outm->SetDaughter(1, AliRsnDaughter::kPion);
153     outm->SetMotherPDG(signedPdg);
154     outm->SetMotherMass(0.89594);
155     // pair cuts
156     outm->SetPairCuts(cutsPair);
157     // binnings
158     outm->AddAxis(imID, 90, 0.6, 1.5);
159     outm->AddAxis(ptID, 100, 0.0, 10.0);
160     if (!isPP){
161       outm->AddAxis(centID, 100, 0.0, 100.0);
162     }   else    { 
163       outm->AddAxis(centID, 400, 0.0, 400.0);
164     }
165   }
166   return kTRUE;
167 }
168
169 //-------------------------------------------------------  
170 Bool_t SetCustomQualityCut(AliRsnCutTrackQuality * trkQualityCut, Int_t customQualityCutsID = 0, Int_t customFilterBit = 0)
171 {
172   //Sets configuration for track quality object different from std quality cuts.
173   //Returns kTRUE if track quality cut object is successfully defined,
174   //returns kFALSE if an invalid set of cuts (customQualityCutsID) is chosen or if the
175   //object to be configured does not exist.
176   
177   /* NOTES FROM PRODUCTION LHC13b pass3 - AOD filtered with v5-03-Rev-20
178   //(http://svnweb.cern.ch/world/wsvn/AliRoot/tags/v5-03-Rev-20/ANALYSIS/macros/AddTaskESDFilter.C)
179
180   //filter bit 0: Cuts on primary tracks
181   // AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
182
183   //filter bit 4: std but looser dca cut
184   // AliESDtrackCuts* esdTrackCutsH = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
185   // esdTrackCutsH->SetMaxDCAToVertexXY(2.4);
186   // esdTrackCutsH->SetMaxDCAToVertexZ(3.2);
187   // esdTrackCutsH->SetDCAToVertex2D(kTRUE);
188
189   //filter bit 5:  AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
190
191    //filter bit 10: standard cuts with tight DCA cut, using cluster cut instead of crossed rows (a la 2010 default)
192    //AliESDtrackCuts* esdTrackCutsH2Cluster = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE, 0);
193    */
194
195   if ((!trkQualityCut) || (customQualityCutsID<=0) || (customQualityCutsID>=AliRsnCutSetDaughterParticle::kNcustomQualityCuts)){
196     Printf("::::: SetCustomQualityCut:: use default quality cuts specified in task configuration.");
197     return kFALSE;
198   }
199   //for pA 2013
200   //trkQualityCut->SetDefaults2011();//with filter bit=10
201   //reset filter bit to very loose cuts 
202   trkQualityCut->SetAODTestFilterBit(customFilterBit); 
203   //apply all other cuts "by hand"
204   trkQualityCut->SetCheckOnlyFilterBit(kFALSE);
205   trkQualityCut->SetMinNCrossedRowsTPC(70);
206   trkQualityCut->SetMinNCrossedRowsOverFindableClsTPC(0.8);
207   trkQualityCut->SetMaxChi2TPCConstrainedGlobal(36);//used for ESD only - for AOD does not correspond to any cut
208   trkQualityCut->SetTPCmaxChi2(4.0); //already in filter bit 0
209   trkQualityCut->SetRejectKinkDaughters(kTRUE); //already in filter bit 0
210   trkQualityCut->SetSPDminNClusters(AliESDtrackCuts::kAny);
211   trkQualityCut->SetITSmaxChi2(36);
212   trkQualityCut->AddStatusFlag(AliESDtrack::kTPCin   , kTRUE);//already in defaults 2011
213   trkQualityCut->AddStatusFlag(AliESDtrack::kTPCrefit, kTRUE);//already in defaults 2011
214   trkQualityCut->AddStatusFlag(AliESDtrack::kITSrefit, kTRUE);//already in defaults 2011
215
216   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kFilterBitCustom) {
217     trkQualityCut->SetCheckOnlyFilterBit(kTRUE);
218   } 
219   
220   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdLooserDCAXY){
221     trkQualityCut->SetDCARmax(2.4);
222   } else {
223     trkQualityCut->SetDCARPtFormula("0.0105+0.0350/pt^1.1");
224   }
225   
226   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdLooserDCAZ){
227     trkQualityCut->SetDCAZmax(3.2);
228   } else {
229     trkQualityCut->SetDCAZmax(2.0); 
230   }
231   
232   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdCrossedRows60){
233     trkQualityCut->SetMinNCrossedRowsTPC(60);
234   }
235   
236   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdCrossedRows80){
237     trkQualityCut->SetMinNCrossedRowsTPC(80);
238   }
239   
240   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdRowsToCls075){
241     trkQualityCut->SetMinNCrossedRowsOverFindableClsTPC(0.75);
242   }
243   
244   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdRowsToCls085){
245     trkQualityCut->SetMinNCrossedRowsOverFindableClsTPC(0.85);
246   }
247   
248   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdCls70){
249     trkQualityCut->SetAODTestFilterBit(10);
250     trkQualityCut->SetTPCminNClusters(70);
251   }
252   
253   if (customQualityCutsID==AliRsnCutSetDaughterParticle::kStdChi2TPCCls35){
254     trkQualityCut->SetTPCmaxChi2(3.5);
255   }
256   
257   trkQualityCut->SetPtRange(0.15, 20.0);
258   trkQualityCut->SetEtaRange(-0.8, 0.8);
259   
260   Printf(Form("::::: SetCustomQualityCut:: using custom track quality cuts #%i",customQualityCutsID));
261   trkQualityCut->Print();
262   return kTRUE;
263 }