AliPhysics  fb6b143 (fb6b143)
AliEmcalESDTrackCutsGenerator.cxx
Go to the documentation of this file.
1 /************************************************************************************
2  * Copyright (C) 2017, Copyright Holders of the ALICE Collaboration *
3  * All rights reserved. *
4  * *
5  * Redistribution and use in source and binary forms, with or without *
6  * modification, are permitted provided that the following conditions are met: *
7  * * Redistributions of source code must retain the above copyright *
8  * notice, this list of conditions and the following disclaimer. *
9  * * Redistributions in binary form must reproduce the above copyright *
10  * notice, this list of conditions and the following disclaimer in the *
11  * documentation and/or other materials provided with the distribution. *
12  * * Neither the name of the <organization> nor the *
13  * names of its contributors may be used to endorse or promote products *
14  * derived from this software without specific prior written permission. *
15  * *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
19  * DISCLAIMED. IN NO EVENT SHALL ALICE COLLABORATION BE LIABLE FOR ANY *
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
26  ************************************************************************************/
27 
28 #include <TString.h>
29 #include <TFormula.h>
30 
32 #include "AliEmcalTrackSelection.h"
34 
35 #include "AliESDtrackCuts.h"
36 
37 #include "TError.h"
38 
39 using namespace PWG::EMCAL;
40 
42 
54 {
55  //Get standard cuts: last 4 digits of cutMode
56  Int_t stdCutMode = cutMode % fgkAddCutFactor;
57 
58  //Get additional cut mode: first 4 digits of cutMode
59  Int_t addCutMode = (int)((float)cutMode/(float)fgkAddCutFactor);
60 
61  return CreateTrackCutsPWGJE(stdCutMode, addCutMode);
62 }
63 
73 AliESDtrackCuts* AliEmcalESDTrackCutsGenerator::CreateTrackCutsPWGJE(Int_t stdCutMode, Int_t addCutMode)
74 {
75  AliESDtrackCuts* trackCuts = 0;
76 
77  TString tag;
78 
79  tag = SetStandardCuts(trackCuts, stdCutMode);
80  tag += SetAdditionalCuts(trackCuts, addCutMode);
81 
82  ::Info("AliEmcalESDTrackCutsGenerator::CreateTrackCutsPWGJE", "Created track cuts for: %s", tag.Data());
83 
84  return trackCuts;
85 }
86 
97 AliESDtrackCuts* AliEmcalESDTrackCutsGenerator::CreateTrackCutsPWGJE(Int_t stdCutMode, Int_t addCutMode1, Int_t addCutMode2)
98 {
99  AliESDtrackCuts* trackCuts = 0;
100 
101  TString tag;
102 
103  tag = SetStandardCuts(trackCuts, stdCutMode);
104  tag += SetAdditionalCuts(trackCuts, addCutMode1);
105  tag += SetAdditionalCuts(trackCuts, addCutMode2);
106 
107  ::Info("AliEmcalESDTrackCutsGenerator::CreateTrackCutsPWGJE", "Created track cuts for: %s", tag.Data());
108 
109  return trackCuts;
110 }
111 
121 TString AliEmcalESDTrackCutsGenerator::SetStandardCuts(AliESDtrackCuts*& trackCuts, Int_t stdCutMode)
122 {
123  TString tag;
124 
125  if (trackCuts) {
126  delete trackCuts;
127  trackCuts = 0;
128  }
129 
130  switch (stdCutMode) {
131  case kRAA2011:
132  {
133  trackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE,1);
134  trackCuts->SetMinNCrossedRowsTPC(120);
135  trackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
136  trackCuts->SetMaxChi2PerClusterITS(36);
137  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
138  trackCuts->SetMaxChi2TPCConstrainedGlobal(36);
139 
140  trackCuts->SetEtaRange(-0.9,0.9);
141  trackCuts->SetPtRange(0.15, 1e10);
142 
143  tag = "Global track RAA analysis QM2011 + Chi2ITS<36";
144 
145  break;
146  }
147 
149  {
150  trackCuts = new AliESDtrackCuts("AliESDtrackCuts");
151  // TPC
152  trackCuts->SetMinNClustersTPC(90);
153  trackCuts->SetMaxChi2PerClusterTPC(4);
154  trackCuts->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
155  trackCuts->SetAcceptKinkDaughters(kFALSE);
156  trackCuts->SetRequireTPCRefit(kTRUE);
157  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
158  // ITS
159  trackCuts->SetRequireITSRefit(kTRUE);
160  //accept secondaries
161  trackCuts->SetMaxDCAToVertexXY(2.4);
162  trackCuts->SetMaxDCAToVertexZ(3.2);
163  trackCuts->SetDCAToVertex2D(kTRUE);
164  //reject fakes
165  trackCuts->SetMaxChi2PerClusterITS(36);
166 
167  trackCuts->SetRequireSigmaToVertex(kFALSE);
168 
169  trackCuts->SetEtaRange(-0.9,0.9);
170  trackCuts->SetPtRange(0.15, 100.);
171 
172  tag = "Global tracks jet analysis with ITSrefit and NclsIter1=90, noSPD requirement";
173 
174  break;
175  }
176 
178  {
179  trackCuts = new AliESDtrackCuts("AliESDtrackCuts");
180  // TPC
181  trackCuts->SetMinNClustersTPC(80);
182  trackCuts->SetMaxChi2PerClusterTPC(4);
183  trackCuts->SetAcceptKinkDaughters(kFALSE);
184  trackCuts->SetRequireTPCRefit(kTRUE);
185  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
186  // ITS
187  trackCuts->SetRequireITSRefit(kTRUE);
188  //accept secondaries
189  trackCuts->SetMaxDCAToVertexXY(2.4);
190  trackCuts->SetMaxDCAToVertexZ(3.2);
191  trackCuts->SetDCAToVertex2D(kTRUE);
192  //reject fakes
193  trackCuts->SetMaxChi2PerClusterITS(36);
194 
195  trackCuts->SetRequireSigmaToVertex(kFALSE);
196 
197  trackCuts->SetEtaRange(-0.9,0.9);
198  trackCuts->SetPtRange(0.15, 100.);
199 
200  tag = "Global tracks jet analysis with ITSrefit and Ncls=80, noSPD requirement";
201 
202  break;
203  }
204 
206  {
207  trackCuts = new AliESDtrackCuts("AliESDtrackCuts");
208  // tight global tracks
209  trackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kFALSE,1);
210  trackCuts->SetMinNClustersTPC(0);
211  trackCuts->SetMinNCrossedRowsTPC(120);
212  trackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.1);// essentially switches it off
213  trackCuts->SetMaxDCAToVertexXY(2.4);
214  trackCuts->SetMaxDCAToVertexZ(3.2);
215  trackCuts->SetDCAToVertex2D(kTRUE);
216  trackCuts->SetMaxChi2PerClusterITS(36);
217  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
218 
219  tag = "Global tracks ITSTPC2010 + NCrossedRows + loose ITS";
220 
221  break;
222  }
223 
225  {
226  trackCuts = new AliESDtrackCuts("AliESDtrackCuts");
227  // TPC
228  trackCuts->SetMinNClustersTPC(70);
229  trackCuts->SetMaxChi2PerClusterTPC(4);
230  trackCuts->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
231  trackCuts->SetAcceptKinkDaughters(kFALSE);
232  trackCuts->SetRequireTPCRefit(kTRUE);
233  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
234  // ITS
235  trackCuts->SetRequireITSRefit(kTRUE);
236  //accept secondaries
237  trackCuts->SetMaxDCAToVertexXY(2.4);
238  trackCuts->SetMaxDCAToVertexZ(3.2);
239  trackCuts->SetDCAToVertex2D(kTRUE);
240  //reject fakes
241  trackCuts->SetMaxChi2PerClusterITS(36);
242 
243  trackCuts->SetRequireSigmaToVertex(kFALSE);
244 
245  trackCuts->SetEtaRange(-0.9,0.9);
246  trackCuts->SetPtRange(0.15, 100.);
247 
248  tag = "Global tracks jet analysis with ITSrefit and NclsIter1=70, noSPD requirement";
249 
250  break;
251  }
252 
254  {
255  trackCuts = new AliESDtrackCuts("AliESDtrackCuts");
256  // TPC
257  trackCuts->SetMinNClustersTPC(70);
258  trackCuts->SetMaxChi2PerClusterTPC(4);
259  trackCuts->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
260  trackCuts->SetAcceptKinkDaughters(kFALSE);
261  trackCuts->SetRequireTPCRefit(kTRUE);
262  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
263  // ITS
264  trackCuts->SetRequireITSRefit(kTRUE);
265  //accept secondaries
266  trackCuts->SetMaxDCAToVertexXY(2.4);
267  trackCuts->SetMaxDCAToVertexZ(3.2);
268  trackCuts->SetDCAToVertex2D(kTRUE);
269  //reject fakes
270  trackCuts->SetMaxChi2PerClusterITS(36);
271 
272  trackCuts->SetRequireSigmaToVertex(kFALSE);
273 
274  trackCuts->SetEtaRange(-0.9,0.9);
275  trackCuts->SetPtRange(0.15, 1E+15);
276 
277  tag = "Global tracks jet analysis with ITSrefit and NclsIter1=70, noSPD requirement, no upper pt cut";
278 
279  break;
280  }
281 
283  {
284  trackCuts = new AliESDtrackCuts("AliESDtrackCuts");
285  // TPC
286  TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
287  trackCuts->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep,20.);
288  trackCuts->SetMinNClustersTPC(70);
289  trackCuts->SetMaxChi2PerClusterTPC(4);
290  trackCuts->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
291  trackCuts->SetAcceptKinkDaughters(kFALSE);
292  trackCuts->SetRequireTPCRefit(kTRUE);
293  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
294  // ITS
295  trackCuts->SetRequireITSRefit(kTRUE);
296  //accept secondaries
297  trackCuts->SetMaxDCAToVertexXY(2.4);
298  trackCuts->SetMaxDCAToVertexZ(3.2);
299  trackCuts->SetDCAToVertex2D(kTRUE);
300  //reject fakes
301  trackCuts->SetMaxChi2PerClusterITS(36);
302  trackCuts->SetMaxChi2TPCConstrainedGlobal(36);
303 
304  trackCuts->SetRequireSigmaToVertex(kFALSE);
305 
306  trackCuts->SetEtaRange(-0.9,0.9);
307  trackCuts->SetPtRange(0.15, 1E+15);
308 
309  tag = "Global tracks jet analysis with ITSrefit and NclsIter1=PtDep, noSPD requirement, no upper pt cut, golden chi2";
310 
311  break;
312  }
313 
314  case kGlobalTracks2011:
315  {
316  trackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE,1);
317  //accept secondaries
318  trackCuts->SetMaxDCAToVertexXY(2.4);
319  trackCuts->SetMaxDCAToVertexZ(3.2);
320  trackCuts->SetDCAToVertex2D(kTRUE);
321 
322  trackCuts->SetMaxChi2TPCConstrainedGlobal(36);
323 
324  trackCuts->SetEtaRange(-0.9,0.9);
325  trackCuts->SetPtRange(0.15, 1E+15);
326 
327  tag = "Global tracks with AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE)";
328 
329  break;
330  }
331 
333  {
334  trackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE,1);
335  //accept secondaries
336  trackCuts->SetMaxDCAToVertexXY(2.4);
337  trackCuts->SetMaxDCAToVertexZ(3.2);
338  trackCuts->SetDCAToVertex2D(kTRUE);
339 
340  trackCuts->SetMaxChi2TPCConstrainedGlobal(36);
341  trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
342 
343  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
344 
345  tag = "Global tracks 2011 with AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE) and no SPD requirement";
346 
347  break;
348  }
349 
351  {
352  trackCuts = new AliESDtrackCuts("AliESDtrackCuts");
353  // TPC
354  trackCuts->SetMinNClustersTPC(90);
355  trackCuts->SetMaxChi2PerClusterTPC(4);
356  trackCuts->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
357  trackCuts->SetAcceptKinkDaughters(kFALSE);
358  trackCuts->SetRequireTPCRefit(kTRUE);
359  trackCuts->SetMaxFractionSharedTPCClusters(0.4);
360  //accept secondaries
361  trackCuts->SetMaxDCAToVertexXY(2.4);
362  trackCuts->SetMaxDCAToVertexZ(3.2);
363  trackCuts->SetDCAToVertex2D(kTRUE);
364 
365  trackCuts->SetRequireSigmaToVertex(kFALSE);
366 
367  trackCuts->SetEtaRange(-0.9,0.9);
368  trackCuts->SetPtRange(0.15, 100.);
369 
370  tag = "Global tracks jet analysis, loose cuts, NClsIter1=90, no ITS requirements";
371 
372  break;
373  }
374 
376  {
377  trackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
378  // trackCuts->SetRequireTPCRefit(kTRUE);
379  trackCuts->SetMinNClustersTPC(70);
380 
381  trackCuts->SetEtaRange(-0.9,0.9);
382  trackCuts->SetPtRange(0.15, 100.);
383 
384 
385  tag = "TPConly track cuts, loose cuts, NCls=70, no ITS requirements";
386 
387  break;
388  }
389 
391  {
392  trackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
393  trackCuts->SetMinNClustersTPC(0);
394  trackCuts->SetMinNCrossedRowsTPC(120);
395  trackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.1);// essentially switches it off
396 
397  trackCuts->SetEtaRange(-0.9,0.9);
398  trackCuts->SetPtRange(0.15, 100.);
399 
400  tag = "TPConly track cuts, loose cuts, NCrossRows=120, no ITS requirements";
401 
402  break;
403  }
404 
405  default:
406  {
407  Printf("AliEmcalESDTrackCutsGenerator: standard cuts not recognized.");
408  break;
409  }
410  }
411 
412  return tag;
413 }
414 
424 TString AliEmcalESDTrackCutsGenerator::SetAdditionalCuts(AliESDtrackCuts*& trackCuts, Int_t addCutMode)
425 {
426  TString tag;
427 
428  switch (addCutMode) {
429  case kSPDAny:
430  {
431  trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
432 
433  tag += " + additonal: SPD any requirement";
434 
435  break;
436  }
437 
438  case kSPDNone:
439  {
440  trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
441 
442  tag += " + additional: w/o hits in SPD";
443 
444  break;
445  }
446 
447  case kNoITSChi2:
448  {
449  trackCuts->SetMaxChi2PerClusterITS(1E10);
450 
451  tag += " + additional: maxITSChi2=1e10";
452 
453  break;
454  }
455 
456  case kNoMinTPCCls:
457  {
458  trackCuts->SetMinNClustersTPC(0);
459  trackCuts->SetMinNCrossedRowsTPC(0);
460  trackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.);
461 
462  tag += " + additional: minClusters=0 minCrossedRows=0 minCrossedRowsOverFindable=0";
463 
464  break;
465  }
466 
467  case kNoITSRefit:
468  {
469  trackCuts->SetRequireITSRefit(kFALSE);
470 
471  tag += " + additional: ITSrefit=kFALSE";
472 
473  break;
474  }
475 
476  case kSPDOff:
477  {
478  trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
479 
480  tag += " + additional: no SPD requirement (kOff)";
481 
482  break;
483  }
484  }
485 
486  return tag;
487 }
488 
497 {
498  EDataSet_t dataSet = kUnknown;
499 
500  TString strPeriod(period);
501  strPeriod.ToLower();
502 
503  if (strPeriod == "lhc10h") {
504  dataSet = kLHC10h;
505  } else if (strPeriod == "lhc11a" || strPeriod == "lhc12a15a") {
506  dataSet = kLHC11a;
507  } else if (strPeriod == "lhc10b" || strPeriod == "lhc10c" ||
508  strPeriod == "lhc10d" || strPeriod == "lhc10e") {
509  dataSet = kLHC10bcde;
510  } else if (strPeriod == "lhc11a1a" || strPeriod == "lhc11a1b" ||
511  strPeriod == "lhc11a1c" || strPeriod == "lhc11a1d" ||
512  strPeriod == "lhc11a1e" || strPeriod == "lhc11a1f" ||
513  strPeriod == "lhc11a1g" || strPeriod == "lhc11a1h" ||
514  strPeriod == "lhc11a1i" || strPeriod == "lhc11a1j") {
515  dataSet = kLHC11a;
516  } else if (strPeriod == "lhc11c") {
517  dataSet = kLHC11c;
518  } else if (strPeriod == "lhc11d") {
519  dataSet = kLHC11d;
520  } else if (strPeriod == "lhc11h" || strPeriod == "lhc12a15e") {
521  dataSet = kLHC11h;
522  } else if (strPeriod == "lhc12g") {
523  dataSet = kLHC11h;
524  } else if (strPeriod == "lhc12") {
525  dataSet = kLHC11h;
526  } else if (strPeriod == "lhc13b") {
527  dataSet = kLHC11h;
528  } else if (strPeriod == "lhc13c") {
529  dataSet = kLHC11h;
530  } else if (strPeriod == "lhc13d") {
531  dataSet = kLHC11h;
532  } else if (strPeriod == "lhc13e") {
533  dataSet = kLHC11h;
534  } else if (strPeriod == "lhc13f") {
535  dataSet = kLHC11h;
536  } else if (strPeriod == "lhc13g") {
537  dataSet = kLHC11h;
538  } else if (strPeriod == "lhc16q") {
539  dataSet = kLHC11h;
540  } else if (strPeriod == "lhc16r") {
541  dataSet = kLHC11h;
542  } else if (strPeriod == "lhc16s") {
543  dataSet = kLHC11h;
544  } else if (strPeriod == "lhc16t") {
545  dataSet = kLHC11h;
546  } else if (strPeriod == "lhc12a15f") {
547  dataSet = kLHC11h;
548  } else if (strPeriod == "lhc13b4") {
549  dataSet = kLHC11h;
550  } else if (strPeriod == "lhc12a15g") {
551  dataSet = kLHC11d;
552  } else if (strPeriod == "lhc12f2a") {
553  dataSet = kLHC11d;
554  } else if (strPeriod.BeginsWith("lhc12a17")) {
555  dataSet = kLHC11h;
556  } else if (strPeriod == "lhc14a1") {
557  dataSet = kLHC11h;
558  } else if (strPeriod.BeginsWith("lhc15g6")) {
559  dataSet = kLHC10bcde;
560  } else if (strPeriod.BeginsWith("lhc15i2")) {
561  dataSet = kLHC10bcde;
562  } else if (strPeriod.BeginsWith("lhc14j4")) {
563  dataSet = kLHC10bcde;
564  } else {
565  ::Error("AliEmcalESDTrackCutsGenerator::SteerDataSetFromString", "Dataset %s not recognized!", period.Data());
566  }
567 
568  return dataSet;
569 }
570 
578 {
579  switch (period) {
580  case kLHC11c:
581  case kLHC11d:
582  case kLHC11h:
583  {
584  auto hybridcuts2011 = new AliEmcalESDHybridTrackCuts("hybridcuts2011NoSPD", AliEmcalESDHybridTrackCuts::kDef2011);
585  hybridcuts2011->SetUseNoITSrefitTracks(kFALSE);
586  trkSel->AddTrackCuts(hybridcuts2011);
587  break;
588  }
589  case kLHC10h:
590  case kLHC11a:
591  case kLHC10bcde:
592  {
593  /* hybrid track cuts*/
594  auto hybridcuts2010 = new AliEmcalESDHybridTrackCuts("hybridcuts2010wSPD", AliEmcalESDHybridTrackCuts::kDef2010);
595  hybridcuts2010->SetUseNoITSrefitTracks(kTRUE);
596  trkSel->AddTrackCuts(hybridcuts2010);
597  break;
598  }
599  default:
600  {
601  ::Error("AliEmcalESDTrackCutsGenerator::AddHybridTrackCuts", "Hybrid track cuts not available for dataset %d", period);
602  break;
603  }
604  }
605 }
606 
614 {
615  switch (period) {
616  case kLHC11c:
617  case kLHC11d:
618  case kLHC11h:
619  {
620  AliESDtrackCuts *cutsp = CreateTrackCutsPWGJE(kTPCOnlyTracksNCls70);
621  trkSel->AddTrackCuts(cutsp);
622  break;
623  }
624  default:
625  {
626  Printf("AliEmcalESDTrackCutsGenerator::AddTPCOnlyTrackCuts: TPC only track cuts not available for dataset %d", period);
627  break;
628  }
629  }
630 }
Interface for virtual track selection.
static void AddTPCOnlyTrackCuts(AliEmcalTrackSelection *trkSel, TString period)
static AliESDtrackCuts * CreateTrackCutsPWGJE(Int_t cutMode)
static EDataSet_t SteerDataSetFromString(TString period)
static TString SetStandardCuts(AliESDtrackCuts *&trackCuts, Int_t stdCutMode)
int Int_t
Definition: External.C:63
Declaration of class AliEmcalESDTrackCutsGenerator.
void AddTrackCuts(AliVCuts *cuts)
Add new track cuts to the list of cuts.
static void AddHybridTrackCuts(AliEmcalTrackSelection *trkSel, TString period)
static TString SetAdditionalCuts(AliESDtrackCuts *&trackCuts, Int_t addCutMode)