ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <Riostream.h>
#include <TFile.h>
#include <TTree.h>
#include <TMath.h>
#include <TParticle.h>
#include <TPDGCode.h>
#include <TDatabasePDG.h>
#include <TRandom3.h>
#include <TChain.h>
#include <TFolder.h>
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliHeader.h"
#include "AliStack.h"
#include "AliPDG.h"
#include "AliGenAmpt.h"
#include "TAmpt.h"
#endif

class MyHeader
{
public:
  MyHeader() : fNATT(0), fEATT(0),fJATT(0),fNT(0),fNP(0),fN0(0),fN01(0),fN10(0),fN11(0),fBB(0),fRP(0) {;}
  virtual ~MyHeader() {;}
  Int_t       fNATT;
  Float_t     fEATT;
  Int_t       fJATT;
  Int_t       fNT;
  Int_t       fNP;
  Int_t       fN0;
  Int_t       fN01;
  Int_t       fN10;
  Int_t       fN11;
  Float_t     fBB;
  Float_t     fRP;
  ClassDef(MyHeader,1) // My header class
};

class MyNuc : public TObject
{
public:
  MyNuc(Int_t pid=0, Int_t st=0, Int_t type=0, Double_t x=0, Double_t y=0, Double_t z=0) :
    TObject(), fPid(pid), fSt(st), fType(type), fX(x), fY(y), fZ(z) {;}
  Double_t    X()    const { return fX; }
  Double_t    Y()    const { return fY; }
  Double_t    Z()    const { return fZ; }
  Int_t       Pid()  const { return fPid; }
  Int_t       St()   const { return fSt; }
  Int_t       Type() const { return fType; }
protected:
  Int_t       fPid;
  Int_t       fSt;
  Int_t       fType;
  Double32_t  fX;
  Double32_t  fY;
  Double32_t  fZ;
  ClassDef(MyNuc,1) // My nucleon class in cartesian coordinates
};

class MyPart : public TObject
{
public:
  MyPart(Int_t pid=0, Int_t st=0, Int_t type=0, Double_t pt=0, Double_t eta=0, Double_t phi=0) :
    TObject(), fPid(pid), fSt(st), fType(type), fPt(pt), fEta(eta), fPhi(phi) {;}
  Double_t    Px()   const { return fPt*TMath::Cos(fPhi);  }
  Double_t    Py()   const { return fPt*TMath::Sin(fPhi);  }
  Double_t    Pz()   const { return fPt*TMath::SinH(fEta); }
  Double_t    Pt()   const { return fPt;  }
  Double_t    Eta()  const { return fEta; }
  Double_t    Phi()  const { return fPhi; }
  Int_t       Pid()  const { return fPid; }
  Int_t       St()   const { return fSt; }
  Int_t       Type() const { return fType; }
protected:
  Int_t       fPid;
  Int_t       fSt;
  Int_t       fType;
  Double32_t  fPt;
  Double32_t  fEta;
  Double32_t  fPhi;
  ClassDef(MyPart,1) // My particle class in cylindrical coordinates
};

void createAmptMC(Int_t nEvents,
                  const char *outFileName = "amptout.root");

void anaAmptMC(Int_t nEvents,
               const char *inFileNames = "/eliza6/alice/loizides/ampt/run_1/ampt*.root");

//-----------------------------------------------------------------------------------------------------

void createAmptMC(Int_t nEvents,
                  const char *outFileName) 
{
  TClass::GetClass("MyNuc")->IgnoreTObjectStreamer();
  TClass::GetClass("MyPart")->IgnoreTObjectStreamer();

  AliPDG::AddParticlesToPdgDataBase();
  TDatabasePDG::Instance();

  // Run loader
  TFolder *folder = new TFolder("myfolder","myfolder");
  AliRunLoader* rl = new AliRunLoader(folder);
  rl->MakeHeader();
  rl->MakeStack();
  AliStack* stack = rl->Stack();
  //AliHeader* rheader = rl->GetHeader();

  AliGenAmpt *genHi = new AliGenAmpt(-1);
  genHi->SetStack(stack);
  genHi->SetEnergyCMS(2760);
  genHi->SetReferenceFrame("CMS");
  genHi->SetProjectile("A", 208, 82);
  genHi->SetTarget    ("A", 208, 82);
  genHi->SetPtHardMin (2);
  genHi->SetImpactParameterRange(0,30);
  genHi->SetJetQuenching(0); // enable jet quenching
  genHi->SetShadowing(1);    // enable shadowing
  genHi->SetDecaysOff(1);    // neutral pion and heavy particle decays switched off
  genHi->SetSpectators(0);   // track spectators 
  genHi->SetIsoft(4);        // 4=string melting, 1=standard AMPT
  genHi->SetXmu(3.2264);     // parton xsection
  genHi->SetNtMax(150);      // time bins
  if (0) { //RHIC settings
    genHi->SetAlpha(0.47140452);
    genHi->SetStringFrag(2.2,0.5);
  }
  genHi->Init();

  TClonesArray *inucs = new TClonesArray("TParticle",10000);
  TClonesArray *parts = new TClonesArray("MyPart",10000);
  TClonesArray *nucs  = new TClonesArray("MyNuc",500);
  MyHeader *myheader = new MyHeader;

  TFile *outFile = TFile::Open(outFileName, "RECREATE");
  outFile->SetCompressionLevel(5);
  TDirectory::TContext context(outFile);

  TTree *tree = new TTree("ampt", "AMPT tree");
  tree->Branch("parts",&parts, 256*1024, 99);
  tree->Branch("nucs",&nucs, 64*1024, 99);
  tree->Branch("info",&myheader, 32*1024, 99);

  // create events and fill them
  for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {

    cout << "Event " << iEvent+1 << "/" << nEvents << endl;;
    stack->Reset();
    genHi->Generate();
    parts->Clear();
    const TClonesArray *iarr = genHi->GetParticles();
    if (iarr) {
      for(Int_t i=0;i<iarr->GetEntriesFast();++i) {
        TParticle *p = (TParticle*)iarr->At(i);
        new((*parts)[i]) MyPart(p->GetPdgCode(),
                                p->GetStatusCode(),
                                p->GetUniqueID(),
                                p->Pt(),
                                p->Eta(),
                                p->Phi());
      }
    }
    TAmpt *ampt = genHi->Ampt();
    if (ampt) {
      ampt->ImportNucleons(inucs);
      nucs->Clear();
      for(Int_t i=0;i<inucs->GetEntriesFast();++i) {
        TParticle *p = (TParticle*)inucs->At(i);
        new((*nucs)[i]) MyNuc(p->GetPdgCode(),
                              p->GetStatusCode(),
                              p->GetUniqueID(),
                              p->Vx(),
                              p->Vy(),
                              p->Vz());
      }

      myheader->fNATT=ampt->GetNATT();
      myheader->fEATT=ampt->GetEATT();
      myheader->fJATT=ampt->GetJATT();
      myheader->fNT=ampt->GetNT();
      myheader->fNP=ampt->GetNP();
      myheader->fN0=ampt->GetN0();
      myheader->fN01=ampt->GetN01();
      myheader->fN10=ampt->GetN10();
      myheader->fN11=ampt->GetN11();
      myheader->fBB=ampt->GetBB();
      myheader->fRP=ampt->GetPhi();
    }
    tree->Fill();
  } // end of event loop
  tree->Write();
  outFile->Close();
}

//-----------------------------------------------------------------------------------------------------

void anaAmptMC(Int_t nEvents,
               const char *inFileNames)
{

  TChain *c = new TChain("ampt");
  c->Add(inFileNames);


  TClonesArray *parts = 0;
  TClonesArray *nucs  = 0;
  MyHeader *info = 0;

  c->SetBranchAddress("info",&info);
  c->SetBranchAddress("nucs",&nucs);
  c->SetBranchAddress("parts",&parts);

  Int_t nRead = nEvents;
  if (nRead<0)
    nRead = c->GetEntries();
  else if (0 && (nRead>c->GetEntries()))
    nRead = c->GetEntries();

   for (Int_t ev=0;ev<nRead;++ev) {
      c->GetEntry(ev);

      Int_t fAN=0, fBN=0, fAStat[250], fBStat[250];
      Double_t fXA[250], fXB[250], fYA[250], fYB[250];
      for (Int_t k=0;k<nucs->GetEntries();++k) {
        MyNuc *n = (MyNuc*)nucs->At(k);
        if (n->Type()>0) {
          fAStat[fAN] =0;
          fXA[fAN] = n->X();
          fYA[fAN] = n->Y();
          ++fAN;
        } else {
          fBStat[fBN] =0;
          fXB[fBN] = n->X();
          fYB[fBN] = n->Y();
          ++fBN;
        }
      }

      // Glauber calculation
      Double_t fXSect = 65; //mbarn
      Double_t d2 = (Double_t)fXSect/(TMath::Pi()*10); // in fm^2

      // For each of the A nucleons in nucleus B
      for (Int_t i = 0; i<fBN; i++) {
        for (Int_t j = 0 ; j < fAN ;j++) {
          Double_t dx = fXB[i]-fXA[j];
          Double_t dy = fYB[i]-fYA[j];
          Double_t dij = dx*dx+dy*dy;
          if (dij < d2) {
            fBStat[i]++;
            fAStat[j]++;
          }
        }
      }
      // Calculate npart
      Int_t npart=0;
      for (Int_t i = 0; i<fAN; i++) {
        if (fAStat[i]>0) {
          npart++;
        }
      }
      for (Int_t i = 0; i<fBN; i++) {
        if (fBStat[i]>0) {
          npart++;
        }
      }
      cout << ev << " : "  << info->fBB << " np " << npart << " vs " << info->fNP+info->fNT << endl;
   }
}
 createAmptMC.C:1
 createAmptMC.C:2
 createAmptMC.C:3
 createAmptMC.C:4
 createAmptMC.C:5
 createAmptMC.C:6
 createAmptMC.C:7
 createAmptMC.C:8
 createAmptMC.C:9
 createAmptMC.C:10
 createAmptMC.C:11
 createAmptMC.C:12
 createAmptMC.C:13
 createAmptMC.C:14
 createAmptMC.C:15
 createAmptMC.C:16
 createAmptMC.C:17
 createAmptMC.C:18
 createAmptMC.C:19
 createAmptMC.C:20
 createAmptMC.C:21
 createAmptMC.C:22
 createAmptMC.C:23
 createAmptMC.C:24
 createAmptMC.C:25
 createAmptMC.C:26
 createAmptMC.C:27
 createAmptMC.C:28
 createAmptMC.C:29
 createAmptMC.C:30
 createAmptMC.C:31
 createAmptMC.C:32
 createAmptMC.C:33
 createAmptMC.C:34
 createAmptMC.C:35
 createAmptMC.C:36
 createAmptMC.C:37
 createAmptMC.C:38
 createAmptMC.C:39
 createAmptMC.C:40
 createAmptMC.C:41
 createAmptMC.C:42
 createAmptMC.C:43
 createAmptMC.C:44
 createAmptMC.C:45
 createAmptMC.C:46
 createAmptMC.C:47
 createAmptMC.C:48
 createAmptMC.C:49
 createAmptMC.C:50
 createAmptMC.C:51
 createAmptMC.C:52
 createAmptMC.C:53
 createAmptMC.C:54
 createAmptMC.C:55
 createAmptMC.C:56
 createAmptMC.C:57
 createAmptMC.C:58
 createAmptMC.C:59
 createAmptMC.C:60
 createAmptMC.C:61
 createAmptMC.C:62
 createAmptMC.C:63
 createAmptMC.C:64
 createAmptMC.C:65
 createAmptMC.C:66
 createAmptMC.C:67
 createAmptMC.C:68
 createAmptMC.C:69
 createAmptMC.C:70
 createAmptMC.C:71
 createAmptMC.C:72
 createAmptMC.C:73
 createAmptMC.C:74
 createAmptMC.C:75
 createAmptMC.C:76
 createAmptMC.C:77
 createAmptMC.C:78
 createAmptMC.C:79
 createAmptMC.C:80
 createAmptMC.C:81
 createAmptMC.C:82
 createAmptMC.C:83
 createAmptMC.C:84
 createAmptMC.C:85
 createAmptMC.C:86
 createAmptMC.C:87
 createAmptMC.C:88
 createAmptMC.C:89
 createAmptMC.C:90
 createAmptMC.C:91
 createAmptMC.C:92
 createAmptMC.C:93
 createAmptMC.C:94
 createAmptMC.C:95
 createAmptMC.C:96
 createAmptMC.C:97
 createAmptMC.C:98
 createAmptMC.C:99
 createAmptMC.C:100
 createAmptMC.C:101
 createAmptMC.C:102
 createAmptMC.C:103
 createAmptMC.C:104
 createAmptMC.C:105
 createAmptMC.C:106
 createAmptMC.C:107
 createAmptMC.C:108
 createAmptMC.C:109
 createAmptMC.C:110
 createAmptMC.C:111
 createAmptMC.C:112
 createAmptMC.C:113
 createAmptMC.C:114
 createAmptMC.C:115
 createAmptMC.C:116
 createAmptMC.C:117
 createAmptMC.C:118
 createAmptMC.C:119
 createAmptMC.C:120
 createAmptMC.C:121
 createAmptMC.C:122
 createAmptMC.C:123
 createAmptMC.C:124
 createAmptMC.C:125
 createAmptMC.C:126
 createAmptMC.C:127
 createAmptMC.C:128
 createAmptMC.C:129
 createAmptMC.C:130
 createAmptMC.C:131
 createAmptMC.C:132
 createAmptMC.C:133
 createAmptMC.C:134
 createAmptMC.C:135
 createAmptMC.C:136
 createAmptMC.C:137
 createAmptMC.C:138
 createAmptMC.C:139
 createAmptMC.C:140
 createAmptMC.C:141
 createAmptMC.C:142
 createAmptMC.C:143
 createAmptMC.C:144
 createAmptMC.C:145
 createAmptMC.C:146
 createAmptMC.C:147
 createAmptMC.C:148
 createAmptMC.C:149
 createAmptMC.C:150
 createAmptMC.C:151
 createAmptMC.C:152
 createAmptMC.C:153
 createAmptMC.C:154
 createAmptMC.C:155
 createAmptMC.C:156
 createAmptMC.C:157
 createAmptMC.C:158
 createAmptMC.C:159
 createAmptMC.C:160
 createAmptMC.C:161
 createAmptMC.C:162
 createAmptMC.C:163
 createAmptMC.C:164
 createAmptMC.C:165
 createAmptMC.C:166
 createAmptMC.C:167
 createAmptMC.C:168
 createAmptMC.C:169
 createAmptMC.C:170
 createAmptMC.C:171
 createAmptMC.C:172
 createAmptMC.C:173
 createAmptMC.C:174
 createAmptMC.C:175
 createAmptMC.C:176
 createAmptMC.C:177
 createAmptMC.C:178
 createAmptMC.C:179
 createAmptMC.C:180
 createAmptMC.C:181
 createAmptMC.C:182
 createAmptMC.C:183
 createAmptMC.C:184
 createAmptMC.C:185
 createAmptMC.C:186
 createAmptMC.C:187
 createAmptMC.C:188
 createAmptMC.C:189
 createAmptMC.C:190
 createAmptMC.C:191
 createAmptMC.C:192
 createAmptMC.C:193
 createAmptMC.C:194
 createAmptMC.C:195
 createAmptMC.C:196
 createAmptMC.C:197
 createAmptMC.C:198
 createAmptMC.C:199
 createAmptMC.C:200
 createAmptMC.C:201
 createAmptMC.C:202
 createAmptMC.C:203
 createAmptMC.C:204
 createAmptMC.C:205
 createAmptMC.C:206
 createAmptMC.C:207
 createAmptMC.C:208
 createAmptMC.C:209
 createAmptMC.C:210
 createAmptMC.C:211
 createAmptMC.C:212
 createAmptMC.C:213
 createAmptMC.C:214
 createAmptMC.C:215
 createAmptMC.C:216
 createAmptMC.C:217
 createAmptMC.C:218
 createAmptMC.C:219
 createAmptMC.C:220
 createAmptMC.C:221
 createAmptMC.C:222
 createAmptMC.C:223
 createAmptMC.C:224
 createAmptMC.C:225
 createAmptMC.C:226
 createAmptMC.C:227
 createAmptMC.C:228
 createAmptMC.C:229
 createAmptMC.C:230
 createAmptMC.C:231
 createAmptMC.C:232
 createAmptMC.C:233
 createAmptMC.C:234
 createAmptMC.C:235
 createAmptMC.C:236
 createAmptMC.C:237
 createAmptMC.C:238
 createAmptMC.C:239
 createAmptMC.C:240
 createAmptMC.C:241
 createAmptMC.C:242
 createAmptMC.C:243
 createAmptMC.C:244
 createAmptMC.C:245
 createAmptMC.C:246
 createAmptMC.C:247
 createAmptMC.C:248
 createAmptMC.C:249
 createAmptMC.C:250
 createAmptMC.C:251
 createAmptMC.C:252
 createAmptMC.C:253
 createAmptMC.C:254
 createAmptMC.C:255
 createAmptMC.C:256
 createAmptMC.C:257
 createAmptMC.C:258
 createAmptMC.C:259
 createAmptMC.C:260
 createAmptMC.C:261
 createAmptMC.C:262
 createAmptMC.C:263
 createAmptMC.C:264
 createAmptMC.C:265
 createAmptMC.C:266
 createAmptMC.C:267
 createAmptMC.C:268
 createAmptMC.C:269
 createAmptMC.C:270
 createAmptMC.C:271