ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TH1F.h>
#include <TH1I.h>
#include <TH2D.h>
#include <TFile.h>
#include <Riostream.h>
#include <TParticle.h>
#include <TCanvas.h>
#include <TLegend.h>
#include <TSystem.h>
#include <TROOT.h>
#include <TClonesArray.h>
#include <TTree.h>
#include <TArrayF.h>
#include <TStyle.h>
#include <TString.h>
#include <TStopwatch.h>
#include <TParticlePDG.h>
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliMultiplicity.h"
#include "AliESDtrackCuts.h"
#include "AliStack.h"
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliITSRecPointContainer.h"
#include "AliITSgeomTGeo.h"
#include "AliITSRecPoint.h"
#include "AliCDBManager.h"
#include "AliHeader.h"
#include "AliGenEventHeader.h"
//

#include "../HLT/ITS/trackingSAP/AliITSSAPAux.h"
#include "../HLT/ITS/trackingSAP/AliITSSAPLayer.h"
#include "../HLT/ITS/trackingSAP/AliITSSAPTracker.h"
#include "TProfile.h"
#include "TStopwatch.h"
#endif


AliITSSAPTracker* tracker=0;

TTree* treeInp = 0;
AliRunLoader* runLoader = 0;
AliESDEvent* esd=0;
typedef struct {
  Bool_t  validSPD;
  Bool_t  validTrc;
  Bool_t  isPrim;
  Char_t  ntlC;
  Char_t  ntlF;
  Char_t  mtlC;
  Char_t  mtlF;
  Char_t  ntrC;
  Char_t  ntrF;
  Int_t   pdg;
  Int_t   evID;
  Int_t   mult;
  Float_t pt;
  Float_t eta;
  Float_t phi;
  Float_t zv;
  //
  Float_t spdDPhi;
  Float_t spdDTht;
  Float_t spdChi2;
} tres_t;

tres_t tres;
TFile* flOut = 0;
TTree* trOut = 0;


void ProcessEvent(int iev);
void Process(const char* path);
void ProcChunk(const char* path);
void TestTracker(TTree* tRP, const AliESDVertex* vtx);
void LoadClusters(TTree* tRP);
Double_t* DefLogAx(double xMn,double xMx, int nbin);
void CheckRecStatus();
void InitOutTree(const char* fname="rcInfo.root");
void SaveOutTree();
void InitTracker(int runNumber);



#ifdef _TIMING_
TProfile* hTiming[AliITSSAPTracker::kNSW];
#endif

void Process(const char* inpData)
{
  //
  InitOutTree();
  TString inpDtStr = inpData;
  if (inpDtStr.EndsWith(".root") || inpDtStr.EndsWith(".zip#")) {
    ProcChunk(inpDtStr.Data());
  }
  else {
    ifstream inpf(inpData);
    if (!inpf.good()) {
      printf("Failed on input filename %s\n",inpData);
      return;
    }
    //
    inpDtStr.ReadLine(inpf);
    while ( !inpDtStr.IsNull() ) {
      inpDtStr = inpDtStr.Strip(TString::kBoth,' ');
      if (inpDtStr.BeginsWith("//") || inpDtStr.BeginsWith("#")) {inpDtStr.ReadLine(inpf); continue;}
      inpDtStr = inpDtStr.Strip(TString::kBoth,',');
      inpDtStr = inpDtStr.Strip(TString::kBoth,'"');
      ProcChunk(inpDtStr.Data());
      inpDtStr.ReadLine(inpf);
    }
  }
#ifdef _CONTROLH_
  tracker->SaveHistos();
#endif
  SaveOutTree();
}

void ProcChunk(const char* path)
{
  //
  TString dir=path;
  //
  printf("Processing %s\n",dir.Data());
  //
  if (dir.EndsWith("AliESDs.root")) {
    dir.ReplaceAll("AliESDs.root","");
  }
  //
  esd = new AliESDEvent();
  //
  runLoader = AliRunLoader::Open(Form("%sgalice.root",dir.Data()));
  if (!runLoader) {
    printf("galice not found\n");
    return;
  }
  runLoader->LoadgAlice();
  gAlice = runLoader->GetAliRun();
  runLoader->LoadHeader();
  runLoader->LoadKinematics();
  runLoader->LoadRecPoints("ITS");
  // ESD
  TFile* esdFile = TFile::Open(Form("%sAliESDs.root",dir.Data()));
  if (!esdFile || !esdFile->IsOpen()) {
    printf("Error in opening ESD file\n");
    runLoader->UnloadKinematics();
    runLoader->UnloadHeader();
    runLoader->UnloadgAlice();
    delete runLoader;
    return;
  }
  treeInp = (TTree*) esdFile->Get("esdTree");
  if (!treeInp) {
    printf("Error: no ESD tree found\n");
    runLoader->UnloadKinematics();
    runLoader->UnloadHeader();
    runLoader->UnloadgAlice();
    delete runLoader;
    return;
  }
  esd->ReadFromTree(treeInp);
  //
  for (int iEv=0;iEv<runLoader->GetNumberOfEvents(); iEv++) {
    printf("ev %d\n",iEv);
    ProcessEvent(iEv);
  }
  runLoader->UnloadRecPoints("all");
  runLoader->UnloadKinematics();
  runLoader->UnloadHeader();
  runLoader->UnloadgAlice();
  delete runLoader; 
  runLoader = 0;
  esdFile->Close();
  delete esdFile;
}

//_______________________________________________
void ProcessEvent(int iEv)
{
  runLoader->GetEvent(iEv);
  treeInp->GetEvent(iEv);
  //
  if (!tracker) InitTracker(esd->GetRunNumber());
  //
  AliStack *stack = runLoader->Stack(); 
  Int_t nParticles = stack ? stack->GetNtrack() : 0;
  Int_t nTracks= esd->GetNumberOfTracks();
  printf("Ntr: %d NPartMC: %d\n",nTracks,nParticles);
  const AliESDVertex* vtx = esd->GetPrimaryVertexSPD();
  if (!vtx || !vtx->GetStatus()) return;
  //
  TTree* treeITSRP = runLoader->GetTreeR("ITS",kFALSE);
  if (!treeITSRP) {
    printf("Failed to fetch ITS recpoints\n");
    exit(1);
  }
  //
#ifdef _TIMING_
  static Double_t cpuTime[AliITSSAPTracker::kNSW] = {0};
#endif
  printf("\n\n\nEvent: %d\n",iEv);
  TestTracker(treeITSRP, vtx);
  //
#ifdef _TIMING_
  if (vtx->GetStatus()==1) {
    double mlt = esd->GetMultiplicity()->GetNumberOfTracklets();
    for (int i=0;i<AliITSSAPTracker::kNSW;i++) {
      TStopwatch& sw = (TStopwatch&)tracker->GetStopwatch(i);
      double tm = sw.CpuTime();
      hTiming[i]->Fill(mlt, tm - cpuTime[i]);
      cpuTime[i] = tm;
    }
  }
#endif
  //
  CheckRecStatus();
  //esd->Reset();
  //
}

//_________________________________________________
void TestTracker(TTree* tRP, const AliESDVertex* vtx)
{
  tracker->Clear(); 
  LoadClusters(tRP); 
  tracker->SetSPDVertex(vtx);
  tracker->SetBz(esd->GetMagneticField());
  tracker->ProcessEvent();
  //
  tracker->PrintTracklets();
  tracker->PrintTracks();  
  //
  //
  //  vtx->Print();
  //  esd->GetMultiplicity()->Print("t");
  //
  /*
  AliHeader* hd = runLoader->GetHeader();
  AliGenEventHeader* hdmc;
  if (tracker->GetTrackVertex().GetStatus()==1 && hd && (hdmc=hd->GenEventHeader()) ) {
    TArrayF vtxMC;
    hdmc->PrimaryVertex(vtxMC);
    printf("MCvtx: %f %f %f\n",vtxMC[0],vtxMC[1],vtxMC[2]);
  }
  */
}

//_________________________________________________
void LoadClusters(TTree* tRP)
{
  //  AliITSRecPointContainer* rpcont = AliITSRecPointContainer::Instance();
  //  TClonesArray* itsClusters = rpcont->FetchClusters(0,tRP);
  //  if(!rpcont->IsSPDActive()){
  //    printf("No SPD rec points found, multiplicity not calculated\n");
  //    tRP->Print();
  //    return;
  //  }
  //  else printf("NSP0: %d\n",itsClusters->GetEntriesFast());
  static TClonesArray* itsModAdd[2198] = {0};
  static Bool_t first = kTRUE;
  if (first) {
    first = 0;
    for (int i=0;i<2198;i++) itsModAdd[i] = new TClonesArray("AliITSRecPoint");
  }
  int nMod = AliITSgeomTGeo::GetNModules();
  for (int imd=0;imd<nMod;imd++) {
    TClonesArray* itsClusters = itsModAdd[imd];
    tRP->SetBranchAddress("ITSRecPoints",&itsClusters);    
    tRP->GetEntry(imd);
    //    itsClusters = rpcont->UncheckedGetClusters(imd);
    
    int nClusters = itsClusters->GetEntriesFast();
    if (!nClusters) continue;
    while(nClusters--) {
      AliITSRecPoint* cluster = (AliITSRecPoint*)itsClusters->UncheckedAt(nClusters);
      if (!cluster) continue;
      tracker->AddCluster(cluster);
    }
  }
  //
}

//______________________________________________
Double_t* DefLogAx(double xMn,double xMx, int nbin)
{
  // get array for log axis
  if (xMn<=0 || xMx<=xMn || nbin<2) {
    printf("Wrong axis request: %f %f %d\n",xMn,xMx,nbin);
    return 0;
  }
  double dx = log(xMx/xMn)/nbin;
  double *xax = new Double_t[nbin+1];
  for (int i=0;i<=nbin;i++) xax[i]= xMn*exp(dx*i);
  return xax;
}
//______________________________________________
void CheckRecStatus()
{
  //
  static int nev = -1;
  static TBits patternMC;
  static vector<char> ntrCorr;
  static vector<char> ntrFake;
  static vector<char> mtlCorr;
  static vector<char> mtlFake;
  static vector<char> ntlCorr;
  static vector<char> ntlFake;
  static vector<float> spdDPhi;
  static vector<float> spdDTht;
  static vector<float> spdChi2;
  //
  AliStack* stack = 0;
  AliRunLoader* rl = AliRunLoader::Instance();
  if (!rl || !(stack=rl->Stack())) return;
  nev++;
  //
  enum {kIsPrim=AliITSSAPTracker::kNLrActive,kValidTracklet,kValidTrack,kRecDone,kBitPerTrack};
  int nTrkMC = stack->GetNtrack();
  patternMC.SetBitNumber(nTrkMC*kBitPerTrack,0);
  patternMC.ResetAllBits();
  //
  ntrCorr.clear();
  ntrFake.clear();
  ntlCorr.clear();
  ntlFake.clear();
  mtlCorr.clear();
  mtlFake.clear();
  //
  spdDPhi.clear();
  spdDTht.clear();
  spdChi2.clear();
  //  
  ntrCorr.resize(nTrkMC,0);
  ntrFake.resize(nTrkMC,0);
  ntlCorr.resize(nTrkMC,0);
  ntlFake.resize(nTrkMC,0);
  mtlCorr.resize(nTrkMC,0);
  mtlFake.resize(nTrkMC,0);
  spdDPhi.resize(nTrkMC,0);
  spdDTht.resize(nTrkMC,0);
  spdChi2.resize(nTrkMC,0);
  
  //
  // fill MC track patterns
  for (int ilr=6;ilr--;) {
    AliITSSAPLayer *lr = tracker->GetLayer(ilr);
    int ncl = lr->GetNClusters();
    for (int icl=ncl;icl--;) {
      AliITSRecPoint* cl = lr->GetClusterUnSorted(icl);
      for (int j=0;j<3;j++) {
	int lb = cl->GetLabel(j);
	if (lb<0 || lb>=nTrkMC) break;
	patternMC.SetBitNumber(lb*kBitPerTrack+ilr,kTRUE);
      }
    }
  }
  //
  int nTrk = tracker->GetNTracklets();
  if (!nTrk) return;
  for (int itr=0;itr<nTrk;itr++) {
    const AliITSSAPTracker::SPDtracklet_t& trlet = tracker->GetTracklet(itr);
    //    PrintTracklet(itr);
    //
    int lbl = trlet.label;
    if (lbl==-3141593) continue;
    int lblA = TMath::Abs(lbl);
    if (lblA==lbl) ntlCorr[lblA]++;
    else           ntlFake[lblA]++;
    //
    if (spdChi2[lblA]==0 || spdChi2[lblA]<trlet.chi2) {
      spdChi2[lblA] = trlet.chi2;
      spdDPhi[lblA] = trlet.dphi;
      spdDTht[lblA] = trlet.dtht;
    }
  }
  //
  AliITSSAPLayer* lr0 = tracker->GetLayer(0);
  AliITSSAPLayer* lr1 = tracker->GetLayer(1);
  for (int itrm=0;itrm<nTrkMC;itrm++) {
    if (ntlCorr[itrm]+ntlFake[itrm]<2) continue;
    printf("\nExtra for tr %d nC:%d nF:%d\n",itrm,ntlCorr[itrm],ntlFake[itrm]);
    //
    int cnt = 0;
    for (int itr=0;itr<nTrk;itr++) {
      const AliITSSAPTracker::SPDtracklet_t& trlet = tracker->GetTracklet(itr);
      if (TMath::Abs(trlet.label)!=itrm) continue;
      AliITSSAPLayer::ClsInfo_t* clinf0 = lr0->GetClusterInfo(trlet.id1);
      AliITSSAPLayer::ClsInfo_t* clinf1 = lr1->GetClusterInfo(trlet.id2);
      printf("#%2d%s%4d chi:%.2f [%4d/%3d] [%4d/%3d]\n",cnt++,trlet.label<0 ? "-":"+",itr,trlet.chi2,
             trlet.id1,clinf0->detid,
             trlet.id2,clinf1->detid);
    }
  }
  //
  const AliMultiplicity* mltESD = esd->GetMultiplicity();
  nTrk = mltESD->GetNumberOfTracklets();
  for (int itr=0;itr<nTrk;itr++) {
    int lb0 = mltESD->GetLabel(itr,0);
    int lb1 = mltESD->GetLabel(itr,1);    
    if (lb0==lb1) mtlCorr[lb1]++;
    else          mtlFake[lb1]++;
  }
  //
  nTrk = tracker->GetNTracks();
  for (int itr=0;itr<nTrk;itr++) {
    const AliITSSAPTracker::ITStrack_t &track = tracker->GetTrack(itr);
    //
    int lbl = track.label;
    if (lbl==-3141593) continue;
    int lblA = TMath::Abs(lbl);
    if (lblA==lbl) ntrCorr[lblA]++;
    else           ntrFake[lblA]++;
  }
  //
  // set reconstructability
  for (int itr=nTrkMC;itr--;) {
    int bitoffs = itr*kBitPerTrack;
    //
    tres.validSPD = patternMC.TestBitNumber(bitoffs+AliITSSAPTracker::kALrSPD1) && 
      patternMC.TestBitNumber(bitoffs+AliITSSAPTracker::kALrSPD2);
    int nmiss = 0;
    for (int il=AliITSSAPTracker::kALrSDD1;il<=AliITSSAPTracker::kALrSSD2;il++) 
      if (tracker->IsObligatoryLayer(il) && !patternMC.TestBitNumber(bitoffs+il)) nmiss++;
    tres.validTrc = tres.validSPD && (nmiss<=tracker->GetMaxMissedLayers());
    //
    if ( !tres.validSPD && !tres.validTrc && 
	 (ntlCorr[itr]+ntlFake[itr])==0 && 
	 (ntrCorr[itr]+ntrFake[itr])==0 &&
	 (mtlCorr[itr]+mtlFake[itr])==0 ) continue;
    //
    TParticle* mctr = stack->Particle(itr);
    tres.isPrim = stack->IsPhysicalPrimary(itr);
    tres.pdg = mctr->GetPdgCode();
    tres.pt =  mctr->Pt();
    tres.eta = mctr->Eta();
    tres.phi = mctr->Phi();
    //
    tres.ntlC = ntlCorr[itr];
    tres.ntlF = ntlFake[itr];
    tres.ntrC = ntrCorr[itr];
    tres.ntrF = ntrFake[itr];
    //
    tres.mtlC = mtlCorr[itr];
    tres.mtlF = mtlFake[itr];
    //
    tres.evID = nev;
    tres.mult = tracker->GetNTracklets();
    tres.zv = tracker->GetSPDVertex()->GetZ();
    //
    tres.spdDPhi = spdDPhi[itr];
    tres.spdDTht = spdDTht[itr];
    tres.spdChi2 = spdChi2[itr];
    //
    trOut->Fill();
  }
  //
}

//___________________________________________________
void InitOutTree(const char* fname)
{
  // output tree
  flOut = TFile::Open(fname,"recreate");
  trOut = new TTree("rcinfo","rcinfo");
  trOut->Branch("res",&tres);
}

//___________________________________________________
void SaveOutTree()
{
  if (!trOut) return;
  flOut->cd();
  trOut->Write();
  delete trOut;
  flOut->Close();
  delete flOut;
  trOut = 0;
  flOut = 0;
}


//______________________________________________
void InitTracker(int runNumber)
{
  AliCDBManager* man = AliCDBManager::Instance();
  man->SetRun(runNumber);
  tracker = new AliITSSAPTracker(); 
  tracker->Init();
  //
  //
#ifdef _TIMING_
  int nbMlt = 100;
  double *mltAx = DefLogAx(1,6000,nbMlt);
  for (int i=0;i<AliITSSAPTracker::kNSW;i++) {
    hTiming[i] = new TProfile(tracker->GetStopwatchName(i),tracker->GetStopwatchName(i),nbMlt,mltAx);
  }
#endif
  //  
}
 Process.C:1
 Process.C:2
 Process.C:3
 Process.C:4
 Process.C:5
 Process.C:6
 Process.C:7
 Process.C:8
 Process.C:9
 Process.C:10
 Process.C:11
 Process.C:12
 Process.C:13
 Process.C:14
 Process.C:15
 Process.C:16
 Process.C:17
 Process.C:18
 Process.C:19
 Process.C:20
 Process.C:21
 Process.C:22
 Process.C:23
 Process.C:24
 Process.C:25
 Process.C:26
 Process.C:27
 Process.C:28
 Process.C:29
 Process.C:30
 Process.C:31
 Process.C:32
 Process.C:33
 Process.C:34
 Process.C:35
 Process.C:36
 Process.C:37
 Process.C:38
 Process.C:39
 Process.C:40
 Process.C:41
 Process.C:42
 Process.C:43
 Process.C:44
 Process.C:45
 Process.C:46
 Process.C:47
 Process.C:48
 Process.C:49
 Process.C:50
 Process.C:51
 Process.C:52
 Process.C:53
 Process.C:54
 Process.C:55
 Process.C:56
 Process.C:57
 Process.C:58
 Process.C:59
 Process.C:60
 Process.C:61
 Process.C:62
 Process.C:63
 Process.C:64
 Process.C:65
 Process.C:66
 Process.C:67
 Process.C:68
 Process.C:69
 Process.C:70
 Process.C:71
 Process.C:72
 Process.C:73
 Process.C:74
 Process.C:75
 Process.C:76
 Process.C:77
 Process.C:78
 Process.C:79
 Process.C:80
 Process.C:81
 Process.C:82
 Process.C:83
 Process.C:84
 Process.C:85
 Process.C:86
 Process.C:87
 Process.C:88
 Process.C:89
 Process.C:90
 Process.C:91
 Process.C:92
 Process.C:93
 Process.C:94
 Process.C:95
 Process.C:96
 Process.C:97
 Process.C:98
 Process.C:99
 Process.C:100
 Process.C:101
 Process.C:102
 Process.C:103
 Process.C:104
 Process.C:105
 Process.C:106
 Process.C:107
 Process.C:108
 Process.C:109
 Process.C:110
 Process.C:111
 Process.C:112
 Process.C:113
 Process.C:114
 Process.C:115
 Process.C:116
 Process.C:117
 Process.C:118
 Process.C:119
 Process.C:120
 Process.C:121
 Process.C:122
 Process.C:123
 Process.C:124
 Process.C:125
 Process.C:126
 Process.C:127
 Process.C:128
 Process.C:129
 Process.C:130
 Process.C:131
 Process.C:132
 Process.C:133
 Process.C:134
 Process.C:135
 Process.C:136
 Process.C:137
 Process.C:138
 Process.C:139
 Process.C:140
 Process.C:141
 Process.C:142
 Process.C:143
 Process.C:144
 Process.C:145
 Process.C:146
 Process.C:147
 Process.C:148
 Process.C:149
 Process.C:150
 Process.C:151
 Process.C:152
 Process.C:153
 Process.C:154
 Process.C:155
 Process.C:156
 Process.C:157
 Process.C:158
 Process.C:159
 Process.C:160
 Process.C:161
 Process.C:162
 Process.C:163
 Process.C:164
 Process.C:165
 Process.C:166
 Process.C:167
 Process.C:168
 Process.C:169
 Process.C:170
 Process.C:171
 Process.C:172
 Process.C:173
 Process.C:174
 Process.C:175
 Process.C:176
 Process.C:177
 Process.C:178
 Process.C:179
 Process.C:180
 Process.C:181
 Process.C:182
 Process.C:183
 Process.C:184
 Process.C:185
 Process.C:186
 Process.C:187
 Process.C:188
 Process.C:189
 Process.C:190
 Process.C:191
 Process.C:192
 Process.C:193
 Process.C:194
 Process.C:195
 Process.C:196
 Process.C:197
 Process.C:198
 Process.C:199
 Process.C:200
 Process.C:201
 Process.C:202
 Process.C:203
 Process.C:204
 Process.C:205
 Process.C:206
 Process.C:207
 Process.C:208
 Process.C:209
 Process.C:210
 Process.C:211
 Process.C:212
 Process.C:213
 Process.C:214
 Process.C:215
 Process.C:216
 Process.C:217
 Process.C:218
 Process.C:219
 Process.C:220
 Process.C:221
 Process.C:222
 Process.C:223
 Process.C:224
 Process.C:225
 Process.C:226
 Process.C:227
 Process.C:228
 Process.C:229
 Process.C:230
 Process.C:231
 Process.C:232
 Process.C:233
 Process.C:234
 Process.C:235
 Process.C:236
 Process.C:237
 Process.C:238
 Process.C:239
 Process.C:240
 Process.C:241
 Process.C:242
 Process.C:243
 Process.C:244
 Process.C:245
 Process.C:246
 Process.C:247
 Process.C:248
 Process.C:249
 Process.C:250
 Process.C:251
 Process.C:252
 Process.C:253
 Process.C:254
 Process.C:255
 Process.C:256
 Process.C:257
 Process.C:258
 Process.C:259
 Process.C:260
 Process.C:261
 Process.C:262
 Process.C:263
 Process.C:264
 Process.C:265
 Process.C:266
 Process.C:267
 Process.C:268
 Process.C:269
 Process.C:270
 Process.C:271
 Process.C:272
 Process.C:273
 Process.C:274
 Process.C:275
 Process.C:276
 Process.C:277
 Process.C:278
 Process.C:279
 Process.C:280
 Process.C:281
 Process.C:282
 Process.C:283
 Process.C:284
 Process.C:285
 Process.C:286
 Process.C:287
 Process.C:288
 Process.C:289
 Process.C:290
 Process.C:291
 Process.C:292
 Process.C:293
 Process.C:294
 Process.C:295
 Process.C:296
 Process.C:297
 Process.C:298
 Process.C:299
 Process.C:300
 Process.C:301
 Process.C:302
 Process.C:303
 Process.C:304
 Process.C:305
 Process.C:306
 Process.C:307
 Process.C:308
 Process.C:309
 Process.C:310
 Process.C:311
 Process.C:312
 Process.C:313
 Process.C:314
 Process.C:315
 Process.C:316
 Process.C:317
 Process.C:318
 Process.C:319
 Process.C:320
 Process.C:321
 Process.C:322
 Process.C:323
 Process.C:324
 Process.C:325
 Process.C:326
 Process.C:327
 Process.C:328
 Process.C:329
 Process.C:330
 Process.C:331
 Process.C:332
 Process.C:333
 Process.C:334
 Process.C:335
 Process.C:336
 Process.C:337
 Process.C:338
 Process.C:339
 Process.C:340
 Process.C:341
 Process.C:342
 Process.C:343
 Process.C:344
 Process.C:345
 Process.C:346
 Process.C:347
 Process.C:348
 Process.C:349
 Process.C:350
 Process.C:351
 Process.C:352
 Process.C:353
 Process.C:354
 Process.C:355
 Process.C:356
 Process.C:357
 Process.C:358
 Process.C:359
 Process.C:360
 Process.C:361
 Process.C:362
 Process.C:363
 Process.C:364
 Process.C:365
 Process.C:366
 Process.C:367
 Process.C:368
 Process.C:369
 Process.C:370
 Process.C:371
 Process.C:372
 Process.C:373
 Process.C:374
 Process.C:375
 Process.C:376
 Process.C:377
 Process.C:378
 Process.C:379
 Process.C:380
 Process.C:381
 Process.C:382
 Process.C:383
 Process.C:384
 Process.C:385
 Process.C:386
 Process.C:387
 Process.C:388
 Process.C:389
 Process.C:390
 Process.C:391
 Process.C:392
 Process.C:393
 Process.C:394
 Process.C:395
 Process.C:396
 Process.C:397
 Process.C:398
 Process.C:399
 Process.C:400
 Process.C:401
 Process.C:402
 Process.C:403
 Process.C:404
 Process.C:405
 Process.C:406
 Process.C:407
 Process.C:408
 Process.C:409
 Process.C:410
 Process.C:411
 Process.C:412
 Process.C:413
 Process.C:414
 Process.C:415
 Process.C:416
 Process.C:417
 Process.C:418
 Process.C:419
 Process.C:420
 Process.C:421
 Process.C:422
 Process.C:423
 Process.C:424
 Process.C:425
 Process.C:426
 Process.C:427
 Process.C:428
 Process.C:429
 Process.C:430
 Process.C:431
 Process.C:432
 Process.C:433
 Process.C:434
 Process.C:435
 Process.C:436
 Process.C:437
 Process.C:438
 Process.C:439
 Process.C:440
 Process.C:441
 Process.C:442
 Process.C:443
 Process.C:444
 Process.C:445
 Process.C:446
 Process.C:447
 Process.C:448
 Process.C:449
 Process.C:450
 Process.C:451
 Process.C:452
 Process.C:453
 Process.C:454
 Process.C:455
 Process.C:456
 Process.C:457
 Process.C:458
 Process.C:459
 Process.C:460
 Process.C:461
 Process.C:462
 Process.C:463
 Process.C:464
 Process.C:465
 Process.C:466
 Process.C:467
 Process.C:468
 Process.C:469
 Process.C:470
 Process.C:471
 Process.C:472
 Process.C:473
 Process.C:474
 Process.C:475
 Process.C:476
 Process.C:477
 Process.C:478
 Process.C:479
 Process.C:480
 Process.C:481
 Process.C:482
 Process.C:483
 Process.C:484
 Process.C:485
 Process.C:486
 Process.C:487
 Process.C:488
 Process.C:489
 Process.C:490
 Process.C:491
 Process.C:492
 Process.C:493
 Process.C:494
 Process.C:495
 Process.C:496
 Process.C:497
 Process.C:498
 Process.C:499
 Process.C:500
 Process.C:501
 Process.C:502
 Process.C:503
 Process.C:504