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);
100 // use unique ID for track number
101 // this will be used in DistortTrack track to set the cluster label
102 tempTrack->SetUniqueID(iTrack);
104 Bool_t trackDist = DistortTrack(*tempTrack, time);
105 if(trackDist) retEvent->AddTrack(*tempTrack);
112 //________________________________________________________________
113 void AliToyMCEventGeneratorSimple::RunSimulation(const Int_t nevents/*=10*/, const Int_t ntracks/*=400*/)
116 // run simple simulation with equal event spacing
119 if (!ConnectOutputFile()) return;
120 //initialise the space charge. Should be done after the tree was set up
124 Double_t eventTime=0.;
125 const Double_t eventSpacing=1./50e3; //50kHz equally spaced
127 for (Int_t ievent=0; ievent<nevents; ++ievent){
128 printf("Generating event %3d (%.3g)\n",ievent,eventTime);
129 fEvent = Generate(eventTime);
133 eventTime+=eventSpacing;
141 //________________________________________________________________
142 AliToyMCEvent* AliToyMCEventGeneratorSimple::GenerateESD(AliESDEvent &esdEvent, Double_t time) {
145 AliToyMCEvent *retEvent = new AliToyMCEvent();
146 retEvent->SetT0(time);
147 retEvent->SetX(esdEvent.GetPrimaryVertex()->GetX());
148 retEvent->SetY(esdEvent.GetPrimaryVertex()->GetY());
149 retEvent->SetZ(esdEvent.GetPrimaryVertex()->GetZ());
153 if(!fNtracks) fNtracks = esdEvent.GetNumberOfTracks();
154 Int_t nUsedTracks = 0;
155 for(Int_t iTrack=0; iTrack<esdEvent.GetNumberOfTracks(); iTrack++){
157 AliESDtrack *part = esdEvent.GetTrack(iTrack);
159 if (!fESDCuts->AcceptTrack(/*(AliESDtrack*)*/part))continue;
160 if(part->Pt() < 0.3) continue; //avoid tracks that fail to propagate through entire volume
165 Double_t vertex[3]={retEvent->GetX(),retEvent->GetY(),retEvent->GetZ()};
168 Int_t sign = part->Charge();
169 AliToyMCTrack *tempTrack = new AliToyMCTrack(vertex,pxyz,cv,sign);
170 // use unique ID for track number
171 // this will be used in DistortTrack track to set the cluster label
172 tempTrack->SetUniqueID(iTrack);
175 Bool_t trackDist = DistortTrack(*tempTrack, time);
177 retEvent->AddTrack(*tempTrack);
183 if(nUsedTracks >= fNtracks) break;
188 //________________________________________________________________
189 void AliToyMCEventGeneratorSimple::RunSimulationESD(const Int_t nevents/*=10*/, const Int_t ntracks/*=400*/)
192 // run simulation using esd input with equal event spacing
195 if (!ConnectOutputFile()) return;
196 TFile f(Form("%s%s",fInputFileNameESD.Data(),"#AliESDs.root"));
198 std::cout << "file "<<fInputFileNameESD.Data() <<" could not be opened" << std::endl;
201 TTree* esdTree = (TTree*) f.Get("esdTree");
203 std::cout <<"no esdTree in file " << std::endl;
207 AliESDEvent* esdEvent = new AliESDEvent();
210 esdEvent->ReadFromTree(esdTree);
211 Double_t eventTime=0.;
212 const Double_t eventSpacing=1./50e3; //50kHz equally spaced
214 Int_t nEvents = nevents;
215 fESDCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE,1);
216 if(nevents>esdTree->GetEntries()) nEvents = esdTree->GetEntries();
217 Int_t nUsedEvents = 0;
218 for (Int_t ievent=0; ievent<esdTree->GetEntries(); ++ievent){
219 printf("Generating event %3d (%.3g)\n",nUsedEvents,eventTime);
220 esdTree->GetEvent(ievent);
221 if(esdEvent->GetNumberOfTracks()==0) {
222 std::cout << " tracks == 0" << std::endl;
226 fEvent = GenerateESD(*esdEvent, eventTime);
227 if(fEvent->GetNumberOfTracks() >=10) {
230 eventTime+=eventSpacing;
235 if(nUsedEvents>=nevents) break;
243 //________________________________________________________________
245 void AliToyMCEventGeneratorSimple::RunSimulationBunchTrain(const Int_t nevents/*=10*/, const Int_t ntracks/*=400*/)
248 // run simple simulation with equal event spacing
251 //Parameters for bunc
252 const Double_t abortGap = 3e-6; //
253 const Double_t collFreq = 50e3;
254 const Double_t bSpacing = 50e-9; //bunch spacing
255 const Int_t nTrainBunches = 48;
256 const Int_t nTrains = 12;
257 const Double_t revFreq = 1.11e4; //revolution frequency
258 const Double_t collProb = collFreq/(nTrainBunches*nTrains*revFreq);
259 const Double_t trainLength = bSpacing*(nTrainBunches-1);
260 const Double_t totTrainLength = nTrains*trainLength;
261 const Double_t trainSpacing = (1./revFreq - abortGap - totTrainLength)/(nTrains-1);
262 Bool_t equalSpacing = kFALSE;
264 TRandom3 *rand = new TRandom3();
267 if (!ConnectOutputFile()) return;
268 //initialise the space charge. Should be done after the tree was set up
272 Double_t eventTime=0.;
273 const Double_t eventSpacing=1./50e3; //50kHz equally spaced
275 Int_t nGeneratedEvents = 0;
276 Int_t bunchCounter = 0;
277 Int_t trainCounter = 0;
279 //for (Int_t ievent=0; ievent<nevents; ++ievent){
280 while (nGeneratedEvents<nevents){
281 // std::cout <<trainCounter << " " << bunchCounter << " "<< "eventTime " << eventTime << std::endl;
284 printf("Generating event %3d (%.3g)\n",nGeneratedEvents,eventTime);
285 fEvent = Generate(eventTime);
290 eventTime+=1./collFreq;
293 Int_t nCollsInCrossing = rand -> Poisson(collProb);
294 for(Int_t iColl = 0; iColl<nCollsInCrossing; iColl++){
295 printf("Generating event %3d (%.3g)\n",nGeneratedEvents,eventTime);
296 fEvent = Generate(eventTime);
305 if(bunchCounter>=nTrainBunches){
308 if(trainCounter>=nTrains){
312 else eventTime+=trainSpacing;
316 else eventTime+= bSpacing;