ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TCanvas.h>
#include <TString.h>
#include <TROOT.h>
#include <TSystem.h>
#include <TFile.h>
#include <TObjArray.h>
#include <TH1.h>
#include <TH2.h>
#include <TF1.h>
#include "KMCDetector.h"
#endif

TObjArray* CreateTrackConditions(const char* nm);
TObjArray  summary;


TObject* gDet=0;

// ptBins to generate
//double pts[] = {0.15,0.175,0.2,0.225,0.25,0.3,0.4,0.5,0.8,1.1,1.6,2,4,8,13,20};
double pts[] = {0.2};
//double pts[] = {0.2, 1., 10.};

void testDetKMC(int nev=1000,  // n events to generate per bin
		int setVer=0,   // optional version to pass for detector building
		double mass=0.14,  // particle mass to generate
		double eta=0.45,   // eta to test
		Bool_t aliceNew=kFALSE,
		Bool_t tpc=kTRUE, Double_t eff=0.95,  // detector settings
		Double_t vtxConstr=-1., // use vertex constraint in the fit
		const char* sumOut="trsumDef.root" // output file name
		)
{
  if (!gROOT->GetClass("KMCDetector")) gROOT->LoadMacro("KMCDetector.cxx+");
  //
  // Detector, tracking initialization >>>
  //
  if (vtxConstr>0) KMCDetector::SetVtxConstraint(vtxConstr,vtxConstr);
  KMCLayer::SetDefEff(eff);
  //
  KMCDetector *itsdet = new KMCDetector((char*)"ALICE",(char*)"ITS");
  gDet = itsdet;
  KMCDetector &its = *itsdet;
  its.SetAvgRapidity(eta);
  if (aliceNew)     its.MakeAliceAllNew(tpc,1, setVer); // its sa
  else              its.MakeAliceCurrent(tpc,0); // its sa  
  //its.MakeAliceCurrent(0,1); // with tpc
  its.SetMaxSeedToPropagate(300);
  its.SetUseBackground();
  //
  // min hits per track to validate it
  its.RequireMinITSHits( its.GetNActiveITSLayers() - 3 );//(int)TMath::Max(4.0,(3./4.)*its.GetNActiveITSLayers()));
  printf("Min number of hits requested: %d\n",its.GetMinITSHits());
  //
  // max cluster-track chi2 
  its.RequireMaxChi2Cl(16.);
  // max chi2/NDF of the Kalman fit
  its.RequireMaxNormChi2NDF(5.);
  // penalty to chi2 from missing hit
  KMCProbe::SetMissingHitPenalty(6);
  //
  // Detector, tracking initialization <<<

  its.InitMCWatchHistos();
  summary.Clear();
  //
  int npt = sizeof(pts)/sizeof(double);
  printf("NPt bins = %d\n",npt);
  double ptMin = pts[0];
  double ptMax = pts[npt-1];
  //
  for (int ip=npt;ip--;) {
    //
    int nevR = nev;
    double pt = pts[ip];//1./(ptminI+dpt*ip);  // ptmin+ip*(ptmax-ptmin)/npt;

    double chi2Cl = 16.;
    if (npt>1) chi2Cl -= (16.-9.)*(1./pt-1./ptMax)/(1./ptMin-1./ptMax);
    //    if (pt<0.3) nevR = int(0.25*nevR);
    //    else if (pt<0.5) nevR = int(0.7*nevR);
    printf("Doing pt(%d)=%.3f for mass %.3f, %d ev | chi2Cl=%.2f\n",ip,pt,mass,nevR,chi2Cl);
    TString smn = Form("pt%d",ip);
    TObjArray* trSum = CreateTrackConditions(smn.Data());
    if (trSum) summary.AddLast(trSum);
    //
    its.SolveSingleTrack(mass, pt, eta, trSum, nevR);
  }
  //
  TString smout = sumOut;
  if (!smout.IsNull()) {
    gSystem->ExpandPathName(smout);
    TFile* fl = TFile::Open(smout.Data(),"recreate");
    if (!fl) {printf("Failed to open %s file\n",smout.Data()); return;}
    fl->WriteObject(&summary,"trSum","kSingleKey");
    fl->Close();
    delete fl;
  }
}

//_____________________________________________________________
TObjArray* CreateTrackConditions(const char* nm)
{
  // create set of track criteria to extract the summary
  KMCTrackSummary *sm = 0;
  TObjArray* arr = new TObjArray();
  //
  int nlr = KMCProbe::GetNITSLayers();
  //-------------------- put here user code -------------------
  // summary for ideal correct tracks
  sm = new KMCTrackSummary("corrAll","corrAll",nlr);
  sm->SetMinMaxClITS(nlr);
  sm->SetMinMaxClITSFake(0,0);
  sm->SetNamePrefix(nm);
  sm->AddPatternITSCorr( sm->Bits(1,0));    // the innermost 2 layers must have correct cluster
  sm->AddPatternITSCorr( sm->Bits(0,1));
  arr->AddLast(sm);
  //
  sm = new KMCTrackSummary("any","any",nlr);
  sm->SetMinMaxClITS(0);
  sm->SetMinMaxClITSFake(0,999);
  sm->SetNamePrefix(nm);
  arr->AddLast(sm);
  //
  // summary for good correct tracks
  sm = new KMCTrackSummary("corr3hSPD","corr3hSPD",nlr);
  sm->SetMinMaxClITS(3);
  sm->SetMinMaxClITSFake(0,0);
  sm->SetNamePrefix(nm);
  arr->AddLast(sm);
  //
  // summary for good correct tracks
  sm = new KMCTrackSummary("corr4h","corr4h",nlr);
  sm->SetMinMaxClITS(4);
  sm->SetMinMaxClITSFake(0,0);
  sm->SetNamePrefix(nm);
  arr->AddLast(sm);
  //
  // summary for good correct tracks with enough points at inner single layers
  sm = new KMCTrackSummary("corr4hs2in","corr4hs2in",nlr);
  sm->SetMinMaxClITS(4);
  sm->SetMinMaxClITSFake(0,0);
  sm->SetNamePrefix(nm);
  sm->AddPatternITSCorr( sm->Bits(1,0));    // the innermost 2 layers must have correct cluster
  sm->AddPatternITSCorr( sm->Bits(0,1));   
  arr->AddLast(sm);
  //
  // summary for good correct tracks with enough points at inner double layers
  sm = new KMCTrackSummary("corr4hd2in","corr5hd2in",nlr);
  sm->SetMinMaxClITS(4);
  sm->SetMinMaxClITSFake(0,0);
  sm->SetNamePrefix(nm);
  sm->AddPatternITSCorr( sm->Bits(1));    // the innermost 2 double layers must have correct cluster
  sm->AddPatternITSCorr( sm->Bits(0,1,1));   
  arr->AddLast(sm);
  //
  //
  // summary for golden tracks with AllNew RS setup: good pattern for offset and pt measurement
  sm = new KMCTrackSummary("corr4hdGoodPatt","corr4hdGoodPatt",nlr);
  sm->SetMinMaxClITS(4);
  sm->SetMinMaxClITSFake(0,0);
  sm->SetNamePrefix(nm);
  sm->AddPatternITSCorr( sm->Bits(1,1));    // the innermost 2 double layers must have correct cluster
  sm->AddPatternITSCorr( sm->Bits(0,0,1)); 
  //
  sm->AddPatternITSCorr( sm->Bits(0,0,0,1,1)); // measurement in the middle (would be prefereable 2 points!)
  //
  sm->AddPatternITSCorr( sm->Bits(0,0,0, 0,0, 1,1)); // measurement at large radius
  //
  arr->AddLast(sm);
  //
  // summary for golden tracks with curr setup: good pattern for offset and pt measurement
  sm = new KMCTrackSummary("corr4hdGoodPatt","corr4hdGoodPatt",nlr);
  sm->SetMinMaxClITS(4);
  sm->SetMinMaxClITSFake(0,0);
  sm->SetNamePrefix(nm);
  sm->AddPatternITSCorr( sm->Bits(1,0));    // the innermost 2 double layers must have correct cluster
  sm->AddPatternITSCorr( sm->Bits(0,1)); 
  //
  sm->AddPatternITSCorr( sm->Bits(0,0,1,1)); // measurement in the middle (would be prefereable 2 points!)
  //
  sm->AddPatternITSCorr( sm->Bits(0,0, 0,0, 1,1)); // measurement at large radius
  //
  arr->AddLast(sm);
  //
  // summary for tracks with at least 1 fake cluster
  sm = new KMCTrackSummary("fakeAny","fakeAny",nlr);
  sm->SetMinMaxClITS(4);
  sm->SetMinMaxClITSFake(1);
  sm->SetNamePrefix(nm);
  arr->AddLast(sm);
  //  
  // // summary for tracks with at least 1 fake cluster (but still acceptable?)
  // sm = new KMCTrackSummary("corrF","corrF",nlr);
  // sm->SetMinMaxClITS(4);
  // sm->SetMinMaxClITSCorr(3);              // at least 3 correct clusters
  // sm->SetMinMaxClITSFake(1);              // at least 1 fake clusters
  // //  /*
  // sm->AddPatternITSCorr( sm->Bits(1));    // the innermost 2 layers must have correct cluster
  // sm->AddPatternITSCorr( sm->Bits(0,1,1));   
  // //  */
  // //  sm->AddPatternITSCorr( sm->Bits(1,1));    // 
  // // sm->AddPatternITSCorr( sm->Bits(0,0,1,1,1,1));   

  // //  sm->AddPatternITSFakeExcl( sm->Bits(1,1,1)); // no fakes in innermost 3 layers
  // sm->SetNamePrefix(nm);
  // arr->AddLast(sm);
  //  
  //-----------------------------------------------------------
  return arr->GetEntries()>0 ? arr : 0;
}
 testDetKMC.C:1
 testDetKMC.C:2
 testDetKMC.C:3
 testDetKMC.C:4
 testDetKMC.C:5
 testDetKMC.C:6
 testDetKMC.C:7
 testDetKMC.C:8
 testDetKMC.C:9
 testDetKMC.C:10
 testDetKMC.C:11
 testDetKMC.C:12
 testDetKMC.C:13
 testDetKMC.C:14
 testDetKMC.C:15
 testDetKMC.C:16
 testDetKMC.C:17
 testDetKMC.C:18
 testDetKMC.C:19
 testDetKMC.C:20
 testDetKMC.C:21
 testDetKMC.C:22
 testDetKMC.C:23
 testDetKMC.C:24
 testDetKMC.C:25
 testDetKMC.C:26
 testDetKMC.C:27
 testDetKMC.C:28
 testDetKMC.C:29
 testDetKMC.C:30
 testDetKMC.C:31
 testDetKMC.C:32
 testDetKMC.C:33
 testDetKMC.C:34
 testDetKMC.C:35
 testDetKMC.C:36
 testDetKMC.C:37
 testDetKMC.C:38
 testDetKMC.C:39
 testDetKMC.C:40
 testDetKMC.C:41
 testDetKMC.C:42
 testDetKMC.C:43
 testDetKMC.C:44
 testDetKMC.C:45
 testDetKMC.C:46
 testDetKMC.C:47
 testDetKMC.C:48
 testDetKMC.C:49
 testDetKMC.C:50
 testDetKMC.C:51
 testDetKMC.C:52
 testDetKMC.C:53
 testDetKMC.C:54
 testDetKMC.C:55
 testDetKMC.C:56
 testDetKMC.C:57
 testDetKMC.C:58
 testDetKMC.C:59
 testDetKMC.C:60
 testDetKMC.C:61
 testDetKMC.C:62
 testDetKMC.C:63
 testDetKMC.C:64
 testDetKMC.C:65
 testDetKMC.C:66
 testDetKMC.C:67
 testDetKMC.C:68
 testDetKMC.C:69
 testDetKMC.C:70
 testDetKMC.C:71
 testDetKMC.C:72
 testDetKMC.C:73
 testDetKMC.C:74
 testDetKMC.C:75
 testDetKMC.C:76
 testDetKMC.C:77
 testDetKMC.C:78
 testDetKMC.C:79
 testDetKMC.C:80
 testDetKMC.C:81
 testDetKMC.C:82
 testDetKMC.C:83
 testDetKMC.C:84
 testDetKMC.C:85
 testDetKMC.C:86
 testDetKMC.C:87
 testDetKMC.C:88
 testDetKMC.C:89
 testDetKMC.C:90
 testDetKMC.C:91
 testDetKMC.C:92
 testDetKMC.C:93
 testDetKMC.C:94
 testDetKMC.C:95
 testDetKMC.C:96
 testDetKMC.C:97
 testDetKMC.C:98
 testDetKMC.C:99
 testDetKMC.C:100
 testDetKMC.C:101
 testDetKMC.C:102
 testDetKMC.C:103
 testDetKMC.C:104
 testDetKMC.C:105
 testDetKMC.C:106
 testDetKMC.C:107
 testDetKMC.C:108
 testDetKMC.C:109
 testDetKMC.C:110
 testDetKMC.C:111
 testDetKMC.C:112
 testDetKMC.C:113
 testDetKMC.C:114
 testDetKMC.C:115
 testDetKMC.C:116
 testDetKMC.C:117
 testDetKMC.C:118
 testDetKMC.C:119
 testDetKMC.C:120
 testDetKMC.C:121
 testDetKMC.C:122
 testDetKMC.C:123
 testDetKMC.C:124
 testDetKMC.C:125
 testDetKMC.C:126
 testDetKMC.C:127
 testDetKMC.C:128
 testDetKMC.C:129
 testDetKMC.C:130
 testDetKMC.C:131
 testDetKMC.C:132
 testDetKMC.C:133
 testDetKMC.C:134
 testDetKMC.C:135
 testDetKMC.C:136
 testDetKMC.C:137
 testDetKMC.C:138
 testDetKMC.C:139
 testDetKMC.C:140
 testDetKMC.C:141
 testDetKMC.C:142
 testDetKMC.C:143
 testDetKMC.C:144
 testDetKMC.C:145
 testDetKMC.C:146
 testDetKMC.C:147
 testDetKMC.C:148
 testDetKMC.C:149
 testDetKMC.C:150
 testDetKMC.C:151
 testDetKMC.C:152
 testDetKMC.C:153
 testDetKMC.C:154
 testDetKMC.C:155
 testDetKMC.C:156
 testDetKMC.C:157
 testDetKMC.C:158
 testDetKMC.C:159
 testDetKMC.C:160
 testDetKMC.C:161
 testDetKMC.C:162
 testDetKMC.C:163
 testDetKMC.C:164
 testDetKMC.C:165
 testDetKMC.C:166
 testDetKMC.C:167
 testDetKMC.C:168
 testDetKMC.C:169
 testDetKMC.C:170
 testDetKMC.C:171
 testDetKMC.C:172
 testDetKMC.C:173
 testDetKMC.C:174
 testDetKMC.C:175
 testDetKMC.C:176
 testDetKMC.C:177
 testDetKMC.C:178
 testDetKMC.C:179
 testDetKMC.C:180
 testDetKMC.C:181
 testDetKMC.C:182
 testDetKMC.C:183
 testDetKMC.C:184
 testDetKMC.C:185
 testDetKMC.C:186
 testDetKMC.C:187
 testDetKMC.C:188
 testDetKMC.C:189
 testDetKMC.C:190
 testDetKMC.C:191
 testDetKMC.C:192
 testDetKMC.C:193
 testDetKMC.C:194
 testDetKMC.C:195
 testDetKMC.C:196
 testDetKMC.C:197
 testDetKMC.C:198
 testDetKMC.C:199
 testDetKMC.C:200
 testDetKMC.C:201
 testDetKMC.C:202
 testDetKMC.C:203
 testDetKMC.C:204
 testDetKMC.C:205
 testDetKMC.C:206
 testDetKMC.C:207
 testDetKMC.C:208
 testDetKMC.C:209
 testDetKMC.C:210
 testDetKMC.C:211
 testDetKMC.C:212