Added class AliMFTRecoParam.cxx/h
[u/mrichter/AliRoot.git] / MFT / Config.C
1 #if !defined(__CINT__) || defined(__MAKECINT__)
2 #include <Riostream.h>
3 #include <TRandom.h>
4 #include <TDatime.h>
5 #include <TSystem.h>
6 #include <TVirtualMC.h>
7 #include <TGeant3TGeo.h>
8 #include "AliRunLoader.h"
9 #include "AliRun.h"
10 #include "AliConfig.h"
11 #include "AliDecayerPythia.h"
12 #include "AliGenPythia.h"
13 #include "AliGenDPMjet.h"
14 #include "AliMagFCheb.h"
15 #include "AliBODY.h"
16 #include "AliMAG.h"
17 #include "AliABSOv3.h"
18 #include "AliDIPOv3.h"
19 #include "AliHALLv3.h"
20 #include "AliFRAMEv2.h"
21 #include "AliSHILv3.h"
22 #include "AliPIPEv3.h"
23 #include "AliPIPEv4.h"
24 #include "AliITSv11.h"
25 #include "AliTPCv2.h"
26 #include "AliTOFv6T0.h"
27 #include "AliHMPIDv3.h"
28 #include "AliZDCv3.h"
29 #include "AliTRDv1.h"
30 #include "AliTRDgeometry.h"
31 #include "AliFMDv1.h"
32 #include "AliMUONv1.h"
33 #include "AliPHOSv1.h"
34 #include "AliPHOSSimParam.h"
35 #include "AliPMDv1.h"
36 #include "AliT0v1.h"
37 #include "AliEMCALv2.h"
38 #include "AliACORDEv1.h"
39 #include "AliVZEROv7.h"
40 #include "AliMFT.h"
41 #endif
42
43 enum PDCProc_t {kGenBox,
44                 kGenMuonLMR,
45                 kGenParamJpsi,
46                 kGenPionKaon,
47                 kGenCorrHF,
48                 kPythia6,
49                 kPythiaPerugia0, 
50                 kPythiaPerugia0Jpsi2e, 
51                 kPythiaPerugia0BtoJpsi2e, 
52                 kHijing, 
53                 kHijing2500,
54                 kHijing2500Cocktail};
55
56 const Char_t* pprRunName[] = {"kGenBox",
57                               "kGenMuonLMR",
58                               "kGenParamJpsi",
59                               "kGenPionKaon",
60                               "kGenCorrHF",
61                               "kPythia6",
62                               "kPythiaPerugia0", 
63                               "kPythiaPerugia0Jpsi2e", 
64                               "kPythiaPerugia0BtoJpsi2e", 
65                               "kHijing", 
66                               "kHijing2500", 
67                               "kHijing2500Cocktail"};
68
69 enum Mag_t { kNoField, k5kG, kFieldMax };
70
71 const Char_t* pprField[] = { "kNoField", "k5kG", "kFieldMax" };
72
73 void LoadLibs();
74
75 // ----------------------- Generator, field, beam energy,... ------------------------------------------------------------
76 static PDCProc_t     proc     = kGenBox;
77 static PDCProc_t     signal   = kGenBox;    // only in case kHijing2500Cocktail is the proc
78 static Mag_t         mag      = k5kG;
79 static Float_t       energy   = 14000.; // energy in CMS
80 static Float_t       bMin     = 0.;
81 static Float_t       bMax =   = 5.; // 0-5 fm corresponds to around 0-10% (see https://twiki.cern.ch/twiki/bin/viewauth/ALICE/CentStudies#Tables_with_centrality_bins_for)
82 static Double_t      JpsiPol  = 0; // Jpsi polarisation
83 static Bool_t        JpsiHarderPt = kFALSE; // Jpsi harder pt spectrum (8.8 TeV)
84 // ----------------------------------------------------------------------------------------------------------------------
85
86 static TString comment;
87
88 //====================================================================================================================================================
89
90 void Config() {
91
92   //  AliLog::SetClassDebugLevel("AliMFT", 1);
93
94   LoadLibs();
95
96   new TGeant3TGeo("C++ Interface to Geant3");
97
98   // Create the output file
99
100   AliRunLoader* rl=0x0;
101
102   cout<<"Config.C: Creating Run Loader ..."<<endl;
103   rl = AliRunLoader::Open("galice.root", AliConfig::GetDefaultEventFolderName(), "recreate");
104   if (rl == 0x0) {
105     gAlice->Fatal("Config.C","Can not instatiate the Run Loader");
106     return;
107   }
108   rl->SetCompressionLevel(2);
109   rl->SetNumberOfEventsPerFile(1000);
110   gAlice->SetRunLoader(rl);
111
112   // ************* STEERING parameters FOR ALICE SIMULATION **************
113   // --- Specify event type to be tracked through the ALICE setup
114   // --- All positions are in cm, angles in degrees, and P and E in GeV
115   
116   gMC->SetProcess("DCAY",1);
117   gMC->SetProcess("PAIR",1);
118   gMC->SetProcess("COMP",1);
119   gMC->SetProcess("PHOT",1);
120   gMC->SetProcess("PFIS",0);
121   gMC->SetProcess("DRAY",0);
122   gMC->SetProcess("ANNI",1);
123   gMC->SetProcess("BREM",1);
124   gMC->SetProcess("MUNU",1);
125   gMC->SetProcess("CKOV",1);
126   gMC->SetProcess("HADR",1);
127   gMC->SetProcess("LOSS",2);
128   gMC->SetProcess("MULS",1);
129   gMC->SetProcess("RAYL",1);
130   
131   Float_t cut = 1.e-3;        // 1MeV cut by default
132   Float_t tofmax = 1.e10;
133   
134   gMC->SetCut("CUTGAM", cut);
135   gMC->SetCut("CUTELE", cut);
136   gMC->SetCut("CUTNEU", cut);
137   gMC->SetCut("CUTHAD", cut);
138   gMC->SetCut("CUTMUO", cut);
139   gMC->SetCut("BCUTE",  cut); 
140   gMC->SetCut("BCUTM",  cut); 
141   gMC->SetCut("DCUTE",  cut); 
142   gMC->SetCut("DCUTM",  cut); 
143   gMC->SetCut("PPCUTM", cut);
144   gMC->SetCut("TOFMAX", tofmax); 
145   
146   TVirtualMCDecayer *decayer = new AliDecayerPythia();
147   decayer->SetForceDecay(kAll);
148   decayer->Init();
149   gMC->SetExternalDecayer(decayer);
150   
151   // Generator
152   AliGenerator* gener = 0x0;
153   if (proc == kPythia6)                   gener = MbPythia(); 
154   else if (proc == kPythiaPerugia0)       gener = MbPythiaTunePerugia0();
155   else if (proc == kHijing)               gener = Hijing();     
156   else if (proc == kHijing2500)           gener = Hijing2500(); 
157   else if (proc == kHijing2500Cocktail)   gener = Hijing2500Cocktail();
158   else if (proc == kGenBox)               gener = GenBox();
159   else if (proc == kGenMuonLMR)           gener = GenMuonLMR();
160   else if (proc == kGenParamJpsi)         gener = GenParamJpsi();
161   else if (proc == kGenCorrHF)            gener = GenCorrHF();
162   else if (proc == kGenPionKaon)          gener = GenParamPionKaon();
163
164   // Size of the interaction diamond
165   Float_t sigmaz  = 5.4 / TMath::Sqrt(2.);     // [cm]
166   Float_t betast  = 3.5;                       // beta* [m]
167   Float_t eps     = 3.75e-6;                   // emittance [m]
168   Float_t gamma   = energy / 2.0 / 0.938272;   // relativistic gamma [1]
169   Float_t sigmaxy = TMath::Sqrt(eps * betast / gamma) / TMath::Sqrt(2.) * 100.;  // [cm]
170
171   printf("\n \n Diamond size x-y: %10.3e z: %10.3e\n \n", sigmaxy, sigmaz);
172     
173 //   gener->SetSigma(sigmaxy, sigmaxy, sigmaz);      // Sigma in (X,Y,Z) (cm) on IP position
174 //   gener->SetVertexSmear(kPerEvent);
175   gener->Init();
176
177   printf("\n \n Comment: %s \n \n", comment.Data());
178
179   //  TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., AliMagF::k5kG, AliMagF::kBeamTypeAA, 2750.));
180   TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., AliMagF::k5kG, AliMagF::kBeamTypepp, 7000.));
181
182   rl->CdGAFile();
183   
184   // Detector Setup
185
186   Int_t iABSO  = 1;
187   Int_t iDIPO  = 1;
188   Int_t iHALL  = 1;
189   Int_t iMUON  = 1;
190   Int_t iPIPE  = 1;
191   Int_t iSHIL  = 1;
192   Int_t iT0    = 0;
193   Int_t iVZERO = 1;
194   Int_t iMFT   = 1;
195   Int_t iACORDE= 0;
196   Int_t iEMCAL = 0;
197   Int_t iFMD   = 0;
198   Int_t iFRAME = 0;
199   Int_t iITS   = 0;
200   Int_t iMAG   = 0;
201   Int_t iPHOS  = 0;
202   Int_t iPMD   = 0;
203   Int_t iHMPID = 0;
204   Int_t iTOF   = 0;
205   Int_t iTPC   = 0;
206   Int_t iTRD   = 0;
207   Int_t iZDC   = 0;
208   
209
210   AliBODY *BODY = new AliBODY("BODY", "Alice envelop");
211
212   if (iMAG)       AliMAG    *MAG    = new AliMAG("MAG", "Magnet");
213   if (iABSO)      AliABSO   *ABSO   = new AliABSOv3("ABSO", "Muon Absorber");
214   if (iDIPO)      AliDIPO   *DIPO   = new AliDIPOv3("DIPO", "Dipole version 3");
215   if (iHALL)      AliHALL   *HALL   = new AliHALLv3("HALL", "Alice Hall");
216   if (iSHIL)      AliSHIL   *SHIL   = new AliSHILv3("SHIL", "Shielding Version 3");
217   if (iITS)       AliITS    *ITS    = new AliITSv11("ITS","ITS v11");
218   if (iTPC)       AliTPC    *TPC    = new AliTPCv2("TPC", "Default");
219   if (iTOF)       AliTOF    *TOF    = new AliTOFv6T0("TOF", "normal TOF");
220   if (iHMPID)     AliHMPID  *HMPID  = new AliHMPIDv3("HMPID", "normal HMPID");
221   if (iFMD)       AliFMD    *FMD    = new AliFMDv1("FMD", "normal FMD");
222   if (iPHOS)      AliPHOS   *PHOS   = new AliPHOSv1("PHOS", "noCPV_Modules123");
223   if (iPMD)       AliPMD    *PMD    = new AliPMDv1("PMD", "normal PMD");
224   if (iT0)        AliT0     *T0     = new AliT0v1("T0", "T0 Detector");
225   if (iEMCAL)     AliEMCAL  *EMCAL  = new AliEMCALv2("EMCAL", "EMCAL_FIRSTYEARV1");
226   if (iACORDE)    AliACORDE *ACORDE = new AliACORDEv1("ACORDE", "normal ACORDE");
227   if (iVZERO)     AliVZERO  *VZERO  = new AliVZEROv7("VZERO", "normal VZERO");
228   if (iFRAME) {
229     AliFRAMEv2 *FRAME = new AliFRAMEv2("FRAME", "Space Frame");
230     FRAME->SetHoles(1);
231   }
232   if (iPIPE) {
233     //    AliPIPE *PIPE = new AliPIPEv3("PIPE", "Beam Pipe");
234     AliPIPE *PIPE = new AliPIPEv4("PIPE", "Beam Pipe", 1.98, 0.08);
235   }
236   if (iZDC) {
237     AliZDC *ZDC = new AliZDCv3("ZDC", "normal ZDC");
238     ZDC->SetSpectatorsTrack();  
239     ZDC->SetLumiLength(0.);
240   }
241   if (iTRD) {
242     AliTRD *TRD = new AliTRDv1("TRD", "TRD slow simulator");
243   }
244   if (iMUON) {
245     AliMUON *MUON = new AliMUONv1("MUON", "default");
246     MUON->SetTriggerEffCells(1); // not needed if raw masks 
247     Char_t* digitstore="AliMUONDigitStoreV2S";    
248     MUON->SetDigitStoreClassName(digitstore);
249   }
250   if (iMFT) {
251     AliMFT *MFT = new AliMFT("MFT", "normal MFT");
252     MFT->SetNSlices(1);
253     MFT->SetChargeDispersion(20.e-4);
254     MFT->SetNStepForChargeDispersion(4);
255   }
256
257   TIter next(gAlice->Modules());
258   AliModule *detector;
259   printf("gAlice->Modules:\n");
260   while((detector = (AliModule*)next())) printf("%s\n",detector->GetName());
261
262 }
263
264 //====================================================================================================================================================
265
266 AliGenerator* GenBox() {
267
268   AliGenBox *gener = new AliGenBox(2);
269   gener->SetMomentumRange(10.0, 10.1);
270   gener->SetPhiRange(0., 360.);         
271   gener->SetThetaRange(171.0,178.0);
272   gener->SetPart(kMuonMinus);           // Muons
273   gener->SetOrigin(0., 0., 0.);         // vertex position
274   
275   return gener;
276   
277 }
278
279 //====================================================================================================================================================
280
281 AliGenerator* GenMuonLMR() {
282   
283   AliGenMUONLMR *gener = new AliGenMUONLMR();
284   gener->SetMomentumRange(0,999);
285   gener->SetPtRange(0,100.);
286   gener->SetYRange(-4.0, -2.5);
287   gener->SetChildThetaRange(171.0,177.0);
288   gener->SetChildMomentumRange(5.0, 999.);
289   gener->SetOrigin(0.0, 0.0, 0.0);             // vertex position
290   gener->SetSigma(0.0, 0.0, 0.0);              // vertex position smearing
291   enum {kEta2Body, kEtaDalitz, kRho2Body, kOmega2Body, kOmegaDalitz, kPhi2Body, kEtaPrimeDalitz, kPionLMR, kKaonLMR}; 
292   gener->GenerateSingleProcess(kPhi2Body, 10);
293   gener->SetCutOnChild(1);
294
295   return gener;
296
297 }
298
299 //====================================================================================================================================================
300
301 AliGenerator* GenParamJpsi() {
302
303   AliGenParam *gener = new AliGenParam(5, AliGenMUONlib::kJpsi);
304   gener->SetMomentumRange(0,999);
305   gener->SetPtRange(0,100.);
306   gener->SetYRange(-4.0, -2.5);
307   gener->SetPhiRange(0., 360.);
308   gener->SetChildThetaRange(171.0,177.0);
309   gener->SetChildMomentumRange(5.0, 999.);
310   gener->SetOrigin(0.0, 0.0, 0.0);          // vertex position
311   gener->SetSigma(0.0, 0.0, 0.0);           // Sigma in (X,Y,Z) (cm) on IP position
312   gener->SetForceDecay(kDiMuon);
313   gener->SetTrackingFlag(1);
314   gener->SetCutOnChild(1);
315
316   return gener;
317
318 }
319
320 //====================================================================================================================================================
321
322 AliGenerator* GenParamPionKaon() {
323   
324   AliGenParamPionsKaons *gener = new AliGenParamPionsKaons(100,"$ALICE_ROOT/MFT/PionKaonKinematics.root");
325   gener->SetPtRange(0, 5.);
326   gener->SetPhiRange(0., 360.);
327   gener->SetYRange(-10., 0.);
328   gener->SetOrigin(0.0, 0.0, 0.0);  // vertex position
329   gener->SetSigma(0.0, 0.0, 0.0);   // vertex position smearing
330   //  gener->SetCutOnChild(1);
331
332   return gener;
333
334 }
335
336 //====================================================================================================================================================
337
338 AliGenerator* GenCorrHF() {
339   
340   AliGenCorrHF *gener = new AliGenCorrHF(1, 4, 14);  // for charm, 1 pair per event
341   // AliGenCorrHF *gener = new AliGenCorrHF(1, 5, 14);  // for beauty, 1 pair per event
342   
343   gener->SetMomentumRange(0,9999);
344   gener->SetCutOnChild(1);          // 1/0 means cuts on children enable/disable
345   gener->SetChildThetaRange(170.0,179.0);
346   gener->SetOrigin(0,0,0);          //vertex position    
347   gener->SetForceDecay(kSemiMuonic);
348   gener->SetTrackingFlag(1);
349   gener->Init();
350   
351   return gener;
352   
353 }
354
355 //====================================================================================================================================================
356
357 AliGenerator* MbPythia() {
358   
359   comment = comment.Append(" pp: Pythia low-pt");
360   
361   //    Pythia
362   AliGenPythia* pythia = new AliGenPythia(-1); 
363   pythia->SetMomentumRange(0, 999999.);
364   //  pythia->SetThetaRange(0., 180.);
365   //  pythia->SetChildYRange(-12.,0.);
366   //  pythia->SetPtRange(0,1000.);
367   //  pythia->SetCutOnChild(1);
368   pythia->SetProcess(kPyMb);
369   pythia->SetEnergyCMS(energy);
370   pythia->SetForceDecay(kSemiMuonic);
371   
372   return pythia;
373 }
374
375 //====================================================================================================================================================
376
377 AliGenerator* MbPythiaTunePerugia0() {
378   
379   comment = comment.Append(" pp: Pythia low-pt (Perugia0)");
380   
381   //    Pythia
382   AliGenPythia* pythia = new AliGenPythia(-1); 
383   pythia->SetMomentumRange(0, 999999.);
384   pythia->SetThetaRange(0., 180.);
385   pythia->SetYRange(-12.,12.);
386   pythia->SetPtRange(0,1000.);
387   pythia->SetProcess(kPyMb);
388   pythia->SetEnergyCMS(energy);
389   //    Tune
390   //    320     Perugia 0
391   pythia->SetTune(320); 
392   pythia->UseNewMultipleInteractionsScenario();
393   
394   return pythia;
395 }
396
397 //====================================================================================================================================================
398
399 AliGenerator* MbPythiaTunePerugia0Jpsi2e() {
400   
401   comment = comment.Append("Jpsi forced to dielectrons");
402   AliGenParam *jpsi=0x0;
403   if(JpsiHarderPt) jpsi = new AliGenParam(1, AliGenMUONlib::kJpsi, "CDF pp 8.8", "Jpsi");  // 8.8 TeV
404   else jpsi = new AliGenParam(1, AliGenMUONlib::kJpsi, "CDF pp 7", "Jpsi");  // 7 TeV
405   jpsi->SetPtRange(0.,999.);
406   jpsi->SetYRange(-1.0, 1.0);
407   jpsi->SetPhiRange(0.,360.);
408   jpsi->SetForceDecay(kDiElectron);
409   return jpsi;
410
411 }
412
413 //====================================================================================================================================================
414
415 AliGenerator* MbPythiaTunePerugia0BtoJpsi2e() {
416
417   comment = comment.Append(" pp: Pythia (Perugia0) BtoJpsi (1 bbbar per event, 1 b-hadron in |y|<2, 1 J/psi in |y|<2");
418   
419   //    Pythia
420   AliGenPythia* pythia = new AliGenPythia(-1);
421   pythia->SetMomentumRange(0, 999999.);
422   pythia->SetThetaRange(0., 180.);
423   pythia->SetYRange(-2.,2.);
424   pythia->SetPtRange(0,1000.);
425   pythia->SetProcess(kPyBeautyppMNRwmi);
426   pythia->SetEnergyCMS(energy);
427   //    Tune
428   //    320     Perugia 0
429   pythia->SetTune(320);
430   pythia->UseNewMultipleInteractionsScenario();
431   //
432   //    decays
433   pythia->SetCutOnChild(1);
434   pythia->SetPdgCodeParticleforAcceptanceCut(443);
435   pythia->SetChildYRange(-2,2);
436   pythia->SetChildPtRange(0,10000.);
437   //
438   //    decays
439   pythia->SetForceDecay(kBJpsiDiElectron);
440   
441   return pythia;
442 }
443
444 //====================================================================================================================================================
445
446 AliGenerator* HijingParam() {
447
448   AliGenHIJINGpara *gener = new AliGenHIJINGpara(2000);
449   gener->SetMomentumRange(0,999);
450   gener->SetPhiRange(0,360);
451   gener->SetThetaRange(171, 179);
452   gener->SetOrigin(0,0,0);        // vertex position
453   gener->SetSigma(0,0,0);         // Sigma in (X,Y,Z) (cm) on IP position
454   gGener = gener;
455   
456   return gener;
457
458 }
459
460 //====================================================================================================================================================
461
462 AliGenerator* Hijing() {
463   
464   AliGenHijing *gener = new AliGenHijing(-1);
465   // centre of mass energy 
466   gener->SetEnergyCMS(energy);
467   gener->SetImpactParameterRange(bMin, bMax);   
468   // reference frame
469   gener->SetReferenceFrame("CMS");
470   // projectile
471   gener->SetProjectile("A", 208, 82);
472   gener->SetTarget    ("A", 208, 82);
473   // tell hijing to keep the full parent child chain
474   gener->KeepFullEvent();
475   // enable jet quenching
476   gener->SetJetQuenching(1);
477   // enable shadowing
478   gener->SetShadowing(1);
479   // Don't track spectators
480   gener->SetSpectators(0);
481   // kinematic selection
482   gener->SetSelectAll(0);
483   return gener;
484 }
485
486 //====================================================================================================================================================
487
488 AliGenerator* Hijing2500() {
489   
490   AliGenHijing *gener = (AliGenHijing*) Hijing();
491   gener->SetJetQuenching(0);    
492   gener->SetPtHardMin (4.5);
493   return gener;
494   
495 }
496
497 //====================================================================================================================================================
498
499 AliGenerator* Hijing2500Cocktail() {
500   
501   comment = comment.Append(" PbPb: Hjing2500 at 5.5 + muon signals");
502
503   AliGenCocktail *cocktail = new AliGenCocktail();
504   cocktail->SetProjectile("A", 208, 82);
505   cocktail->SetTarget    ("A", 208, 82);
506   cocktail->SetEnergyCMS(energy);
507
508   // 1 Hijing event: provides underlying event and collision geometry 
509   AliGenHijing *hijing = Hijing2500();
510   cocktail->AddGenerator(hijing,"hijing",1);
511
512   // generator for the custom signal
513   AliGenerator* signalGen = 0x0;      
514   switch (signal) {
515   case 0:
516     signalGen = GenBox();
517     break;
518   case 1:
519     signalGen = GenMuonLMR(); 
520     break;
521   case 2:
522     signalGen = GenCorrHF();
523     break;
524   default:
525     signalGen = GenBox();
526     break;
527   }
528   cocktail->AddGenerator(signalGen, "signal", 1);
529
530   cocktail->SetTrackingFlag(1);
531
532   return cocktail;
533
534 }
535
536 //====================================================================================================================================================
537
538 void LoadLibs() {
539
540 #if defined(__CINT__)
541
542   gSystem->Load("liblhapdf");      // Parton density functions
543   gSystem->Load("libEGPythia6");   // TGenerator interface
544   if (proc == kPythia6) {
545     gSystem->Load("libpythia6");        // Pythia 6.2
546     gSystem->Load("libAliPythia6");     // ALICE specific implementations
547   } 
548   else {
549     gSystem->Load("libpythia6.4.21");   // Pythia 6.4
550     gSystem->Load("libAliPythia6");     // ALICE specific implementations       
551   }
552   
553   if (proc == kHijing || proc == kHijing2500 || proc == kHijing2500Cocktail) {
554     gSystem->Load("libhijing"); 
555     gSystem->Load("libTHijing");
556   } 
557   
558   gSystem->Load("libgeant321");
559   
560 #endif
561
562 }
563
564 //====================================================================================================================================================
565