3 #include <TDatabasePDG.h>
6 #include <TStopwatch.h>
7 #include <AliESDtrackCuts.h>
8 #include <AliESDtrack.h>
13 #include "AliToyMCEvent.h"
15 #include "AliToyMCEventGeneratorSimple.h"
18 ClassImp(AliToyMCEventGeneratorSimple);
21 AliToyMCEventGeneratorSimple::AliToyMCEventGeneratorSimple()
22 :AliToyMCEventGenerator()
26 ,fInputFileNameESD("")
32 //________________________________________________________________
33 AliToyMCEventGeneratorSimple::AliToyMCEventGeneratorSimple(const AliToyMCEventGeneratorSimple &gen)
34 :AliToyMCEventGenerator(gen)
35 ,fVertexMean(gen.fVertexMean)
36 ,fVertexSigma(gen.fVertexSigma)
37 ,fNtracks(gen.fNtracks)
38 ,fInputFileNameESD(gen.fInputFileNameESD)
39 ,fESDCuts(gen.fESDCuts)
42 //________________________________________________________________
43 AliToyMCEventGeneratorSimple::~AliToyMCEventGeneratorSimple()
46 //________________________________________________________________
47 AliToyMCEventGeneratorSimple& AliToyMCEventGeneratorSimple::operator = (const AliToyMCEventGeneratorSimple &gen)
50 if (&gen == this) return *this;
51 new (this) AliToyMCEventGeneratorSimple(gen);
55 //________________________________________________________________
56 void AliToyMCEventGeneratorSimple::SetParametersSimple(Double_t vertexMean, Double_t vertexSigma) {
57 fVertexMean = vertexMean;
58 fVertexSigma = vertexSigma;
60 //________________________________________________________________
61 AliToyMCEvent* AliToyMCEventGeneratorSimple::Generate(Double_t time)
67 AliToyMCEvent *retEvent = new AliToyMCEvent();
68 retEvent->SetT0(time);
71 retEvent->SetZ(gRandom->Gaus(fVertexMean,fVertexSigma));
74 Double_t mass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass();
75 TF1 fpt("fpt",Form("x*(1+(sqrt(x*x+%f^2)-%f)/([0]*[1]))^(-[0])",mass,mass),0.4,10);
76 fpt.SetParameters(7.24,0.120);
78 // Int_t nTracks = 400; //TODO: draw from experim dist
79 // Int_t nTracks = 20; //TODO: draw from experim dist
81 for(Int_t iTrack=0; iTrack<fNtracks; iTrack++){
82 Double_t phi = gRandom->Uniform(0.0, 2*TMath::Pi());
83 Double_t eta = gRandom->Uniform(-etaCuts, etaCuts);
84 Double_t pt = fpt.GetRandom(); // momentum for f1
86 if(gRandom->Rndm() < 0.5){
92 Double_t theta = 2*TMath::ATan(TMath::Exp(-eta))-TMath::Pi()/2.;
94 pxyz[0]=pt*TMath::Cos(phi);
95 pxyz[1]=pt*TMath::Sin(phi);
96 pxyz[2]=pt*TMath::Tan(theta);
97 Double_t vertex[3]={0,0,retEvent->GetZ()};
99 AliToyMCTrack *tempTrack = new AliToyMCTrack(vertex,pxyz,cv,sign);
101 Bool_t trackDist = DistortTrack(*tempTrack, time);
102 if(trackDist) retEvent->AddTrack(*tempTrack);
109 //________________________________________________________________
110 void AliToyMCEventGeneratorSimple::RunSimulation(const Int_t nevents/*=10*/, const Int_t ntracks/*=400*/)
113 // run simple simulation with equal event spacing
116 if (!ConnectOutputFile()) return;
117 //initialise the space charge. Should be done after the tree was set up
121 Double_t eventTime=0.;
122 const Double_t eventSpacing=1./50e3; //50kHz equally spaced
124 for (Int_t ievent=0; ievent<nevents; ++ievent){
125 printf("Generating event %3d (%.3g)\n",ievent,eventTime);
126 fEvent = Generate(eventTime);
130 eventTime+=eventSpacing;
138 //________________________________________________________________
139 AliToyMCEvent* AliToyMCEventGeneratorSimple::GenerateESD(AliESDEvent &esdEvent, Double_t time) {
142 AliToyMCEvent *retEvent = new AliToyMCEvent();
143 retEvent->SetT0(time);
144 retEvent->SetX(esdEvent.GetPrimaryVertex()->GetX());
145 retEvent->SetY(esdEvent.GetPrimaryVertex()->GetY());
146 retEvent->SetZ(esdEvent.GetPrimaryVertex()->GetZ());
150 if(!fNtracks) fNtracks = esdEvent.GetNumberOfTracks();
151 Int_t nUsedTracks = 0;
152 for(Int_t iTrack=0; iTrack<esdEvent.GetNumberOfTracks(); iTrack++){
154 AliESDtrack *part = esdEvent.GetTrack(iTrack);
156 if (!fESDCuts->AcceptTrack(/*(AliESDtrack*)*/part))continue;
157 if(part->Pt() < 0.3) continue; //avoid tracks that fail to propagate through entire volume
162 Double_t vertex[3]={retEvent->GetX(),retEvent->GetY(),retEvent->GetZ()};
165 Int_t sign = part->Charge();
166 AliToyMCTrack *tempTrack = new AliToyMCTrack(vertex,pxyz,cv,sign);
168 Bool_t trackDist = DistortTrack(*tempTrack, time);
170 retEvent->AddTrack(*tempTrack);
176 if(nUsedTracks >= fNtracks) break;
181 //________________________________________________________________
182 void AliToyMCEventGeneratorSimple::RunSimulationESD(const Int_t nevents/*=10*/, const Int_t ntracks/*=400*/)
185 // run simulation using esd input with equal event spacing
188 if (!ConnectOutputFile()) return;
189 TFile f(Form("%s%s",fInputFileNameESD.Data(),"#AliESDs.root"));
191 std::cout << "file "<<fInputFileNameESD.Data() <<" could not be opened" << std::endl;
194 TTree* esdTree = (TTree*) f.Get("esdTree");
196 std::cout <<"no esdTree in file " << std::endl;
200 AliESDEvent* esdEvent = new AliESDEvent();
203 esdEvent->ReadFromTree(esdTree);
204 Double_t eventTime=0.;
205 const Double_t eventSpacing=1./50e3; //50kHz equally spaced
207 Int_t nEvents = nevents;
208 fESDCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE,1);
209 if(nevents>esdTree->GetEntries()) nEvents = esdTree->GetEntries();
210 Int_t nUsedEvents = 0;
211 for (Int_t ievent=0; ievent<esdTree->GetEntries(); ++ievent){
212 printf("Generating event %3d (%.3g)\n",nUsedEvents,eventTime);
213 esdTree->GetEvent(ievent);
214 if(esdEvent->GetNumberOfTracks()==0) {
215 std::cout << " tracks == 0" << std::endl;
219 fEvent = GenerateESD(*esdEvent, eventTime);
220 if(fEvent->GetNumberOfTracks() >=10) {
223 eventTime+=eventSpacing;
228 if(nUsedEvents>=nevents) break;
236 //________________________________________________________________
238 void AliToyMCEventGeneratorSimple::RunSimulationBunchTrain(const Int_t nevents/*=10*/, const Int_t ntracks/*=400*/)
241 // run simple simulation with equal event spacing
244 //Parameters for bunc
245 const Double_t abortGap = 3e-6; //
246 const Double_t collFreq = 50e3;
247 const Double_t bSpacing = 50e-9; //bunch spacing
248 const Int_t nTrainBunches = 48;
249 const Int_t nTrains = 12;
250 const Double_t revFreq = 1.11e4; //revolution frequency
251 const Double_t collProb = collFreq/(nTrainBunches*nTrains*revFreq);
252 const Double_t trainLength = bSpacing*(nTrainBunches-1);
253 const Double_t totTrainLength = nTrains*trainLength;
254 const Double_t trainSpacing = (1./revFreq - abortGap - totTrainLength)/(nTrains-1);
255 Bool_t equalSpacing = kFALSE;
257 TRandom3 *rand = new TRandom3();
260 if (!ConnectOutputFile()) return;
261 //initialise the space charge. Should be done after the tree was set up
265 Double_t eventTime=0.;
266 const Double_t eventSpacing=1./50e3; //50kHz equally spaced
268 Int_t nGeneratedEvents = 0;
269 Int_t bunchCounter = 0;
270 Int_t trainCounter = 0;
272 //for (Int_t ievent=0; ievent<nevents; ++ievent){
273 while (nGeneratedEvents<nevents){
274 // std::cout <<trainCounter << " " << bunchCounter << " "<< "eventTime " << eventTime << std::endl;
277 printf("Generating event %3d (%.3g)\n",nGeneratedEvents,eventTime);
278 fEvent = Generate(eventTime);
283 eventTime+=1./collFreq;
286 Int_t nCollsInCrossing = rand -> Poisson(collProb);
287 for(Int_t iColl = 0; iColl<nCollsInCrossing; iColl++){
288 printf("Generating event %3d (%.3g)\n",nGeneratedEvents,eventTime);
289 fEvent = Generate(eventTime);
298 if(bunchCounter>=nTrainBunches){
301 if(trainCounter>=nTrains){
305 else eventTime+=trainSpacing;
309 else eventTime+= bSpacing;