Various updates:
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / sim / BaseConfig.C
1 /**
2  * @file   BaseConfig.C
3  * @author Christian Holm Christensen <cholm@nbi.dk>
4  * @date   Wed Oct 15 12:52:58 2014
5  * 
6  * @brief  Base classes for configurations shared amoung steps. 
7  * 
8  * 
9  */
10 /** 
11  * Base class for detector configuration. By default, everything is on
12  * except ACORDE.
13  */
14 struct VirtualDetCfg 
15 {
16   virtual Bool_t UseABSO()   const { return true;  }
17   virtual Bool_t UseACORDE() const { return false; }
18   virtual Bool_t UseDIPO()   const { return true;  }
19   virtual Bool_t UseEMCAL()  const { return true;  }
20   virtual Bool_t UseFMD()    const { return true;  }
21   virtual Bool_t UseFRAME()  const { return true;  }
22   virtual Bool_t UseHALL()   const { return true;  }
23   virtual Bool_t UseITS()    const { return true;  }
24   virtual Bool_t UseMAG()    const { return true;  }
25   virtual Bool_t UseMUON()   const { return true;  }
26   virtual Bool_t UsePHOS()   const { return true;  }
27   virtual Bool_t UsePIPE()   const { return true;  }
28   virtual Bool_t UsePMD()    const { return true;  }
29   virtual Bool_t UseHMPID()  const { return true;  }
30   virtual Bool_t UseSHIL()   const { return true;  }
31   virtual Bool_t UseT0()     const { return true;  }
32   virtual Bool_t UseTOF()    const { return true;  }
33   virtual Bool_t UseTPC()    const { return true;  }
34   virtual Bool_t UseTRD()    const { return true;  }
35   virtual Bool_t UseVZERO()  const { return true;  }
36   virtual Bool_t UseZDC()    const { return true;  }
37   virtual void Print() 
38   {
39     Printf("ABSO:   %3s", UseABSO()    ? "yes" : "no");
40     Printf("ACORDE: %3s", UseACORDE()  ? "yes" : "no");
41     Printf("DIPO:   %3s", UseDIPO()    ? "yes" : "no");
42     Printf("EMCAL:  %3s", UseEMCAL()   ? "yes" : "no");
43     Printf("FMD:    %3s", UseFMD()     ? "yes" : "no");
44     Printf("FRAME:  %3s", UseFRAME()   ? "yes" : "no");
45     Printf("HALL:   %3s", UseHALL()    ? "yes" : "no");
46     Printf("ITS:    %3s", UseITS()     ? "yes" : "no");
47     Printf("MAG:    %3s", UseMAG()     ? "yes" : "no");
48     Printf("MUON:   %3s", UseMUON()    ? "yes" : "no");
49     Printf("PHOS:   %3s", UsePHOS()    ? "yes" : "no");
50     Printf("PIPE:   %3s", UsePIPE()    ? "yes" : "no");
51     Printf("PMD:    %3s", UsePMD()     ? "yes" : "no");
52     Printf("HMPID:  %3s", UseHMPID()   ? "yes" : "no");
53     Printf("SHIL:   %3s", UseSHIL()    ? "yes" : "no");
54     Printf("T0:     %3s", UseT0()      ? "yes" : "no");
55     Printf("TOF:    %3s", UseTOF()     ? "yes" : "no");
56     Printf("TPC:    %3s", UseTPC()     ? "yes" : "no");
57     Printf("TRD:    %3s", UseTRD()     ? "yes" : "no");
58     Printf("VZERO:  %3s", UseVZERO()   ? "yes" : "no");
59     Printf("ZDC:    %3s", UseZDC()     ? "yes" : "no");
60   }
61   /** 
62    * Get the string of enabled detectors for local reconstruction.
63    * 
64    * @param enable On return, contains string of enable detectors
65    */
66   void GetRecoString(TString& enable) const
67   {
68     if (UseITS())       Append2Str(enable, "ITS"); 
69     if (UseTPC())       Append2Str(enable, "TPC"); 
70     if (UseTRD())       Append2Str(enable, "TRD"); 
71     if (UseTOF())       Append2Str(enable, "TOF"); 
72     if (UsePHOS())      Append2Str(enable, "PHOS"); 
73     if (UseHMPID())     Append2Str(enable, "HMPID"); 
74     if (UseEMCAL())     Append2Str(enable, "EMCAL"); 
75     if (UseMUON())      Append2Str(enable, "MUON"); 
76     if (UseFMD())       Append2Str(enable, "FMD"); 
77     if (UseZDC())       Append2Str(enable, "ZDC"); 
78     if (UsePMD())       Append2Str(enable, "PMD"); 
79     if (UseT0())        Append2Str(enable, "T0"); 
80     if (UseVZERO())     Append2Str(enable, "VZERO");
81   }
82   /** 
83    * Get the string of detectors for which we should make Summable
84    * Digits
85    * 
86    * @param sDigits On returm contains the string of enable detectors
87    */
88   void GetSDigitString(TString& sDigits) const 
89   {
90     if (UseTRD())       Append2Str(sDigits, "TRD"); 
91     if (UseTOF())       Append2Str(sDigits, "TOF"); 
92     if (UsePHOS())      Append2Str(sDigits, "PHOS"); 
93     if (UseHMPID())     Append2Str(sDigits, "HMPID"); 
94     if (UseEMCAL())     Append2Str(sDigits, "EMCAL"); 
95     if (UseMUON())      Append2Str(sDigits, "MUON"); 
96     if (UseFMD())       Append2Str(sDigits, "FMD"); 
97     if (UseZDC())       Append2Str(sDigits, "ZDC"); 
98     if (UsePMD())       Append2Str(sDigits, "PMD"); 
99     if (UseT0())        Append2Str(sDigits, "T0"); 
100     if (UseVZERO())     Append2Str(sDigits, "VZERO");
101   }
102   /** 
103    * Get the sting of detectors for which we should do the hit to
104    * digit conversion directly.
105    * 
106    * @param fromHits On returm contains the string of enable detectors
107    */
108   void GetHits2DigitsString(TString& fromHits) const
109   {
110     if (UseITS())       Append2Str(fromHits, "ITS");
111     if (UseTPC())       Append2Str(fromHits, "TPC");
112   }
113   /** 
114    * Append a C style string to a string, possibly adding a space before
115    * 
116    * @param str     Where to append
117    * @param append  What to append
118    */
119   static void Append2Str(TString& str, const char* append)
120   {
121     if (!str.IsNull()) str.Append(" ");
122     str.Append(append);
123   }
124   
125 };
126 /** Global variable */
127 VirtualDetCfg* detCfg = 0;
128
129 /**
130  * Base class for the OCDG configration 
131  */
132 struct VirtualOCDBCfg
133 {
134   /** 
135    * This member function must return the default prefix. 
136    * 
137    * @return Prefix of OCDB specific storages
138    */
139   virtual const char* Prefix() const { return ""; }
140   /** 
141    * This member function should define the real setup. 
142    * 
143    * @param forSim Whether we're setting up for simulations or not 
144    */
145   virtual void Init(Bool_t forSim) 
146   {
147     ::Fatal("VirtualOCDBConfig", "Dummy init called - redefine!");
148   }
149   /** 
150    * Set the specific storage for a given key (possibly wild-carded). 
151    * 
152    * @param key    Key 
153    * @param ideal  Whether it is residual or ideal
154    */
155   void AddStore(const char*    key, 
156                 Bool_t         ideal)
157   {
158     AliCDBManager* cdb = AliCDBManager::Instance();
159     const char* prefix = Prefix();
160     TString     path   = Form("alien://Folder=/alice/simulation/%s/%s",
161                               prefix, !ideal ? "Residual" : "Ideal");
162     ::Info("AddStore", "%s -> %s", key, path.Data());
163     cdb->SetSpecificStorage(key, path);
164   }
165 };
166
167 /** Global variable */
168 VirtualOCDBCfg* ocdbCfg = 0;
169
170 struct VirtualEGCfg 
171 {
172   TString runType;
173   VirtualEGCfg() : runType("") {}
174   virtual ~VirtualEGCfg() {}
175   /**
176    * Load the general libraries needed
177    *
178    */
179   static void LoadGen(const TString& runType) {
180     if (!gROOT->GetClass("AliStructFuncType"))
181       gSystem->Load("liblhapdf");      // Parton density functions
182     if (!gROOT->GetClass("TPythia6"))
183       gSystem->Load("libEGPythia6");   // TGenerator interface
184     if (!runType.EqualTo("hydjet", TString::kIgnoreCase))
185       LoadPythia(false);
186   }
187
188   /**
189    * Load the pythia libraries
190    *
191    * @param vers Optional version post-fix
192    */
193   static void LoadPythia(Bool_t gen=true, const char* vers="6.4.21")
194   {
195     if (gen) LoadGen("");
196     char m = vers[0];
197     if (gROOT->GetClass(Form("AliPythia6%c", m))) return;
198     gSystem->Load(Form("libpythia%s", vers));
199     gSystem->Load(Form("libAliPythia%c", m));
200   }
201   /**
202    * Load HIJING libraries
203    */
204   static void LoadHijing()
205   {
206     LoadPythia();
207     if (gROOT->GetClass("THijing")) return;
208     gSystem->Load("libhijing");
209     gSystem->Load("libTHijing");
210     AliPDG::AddParticlesToPdgDataBase();
211   }
212   /**
213    * Load HydJet libraries
214    */
215   static void LoadHydjet()
216   {
217     if (gROOT->GetClass("TUHKMgen")) return;
218     gSystem->Load("libTUHKMgen");
219   }
220   /**
221    * Load DPMJet libraries
222    */
223   static void LoadDpmjet()
224   {
225     LoadPythia();
226     if (gROOT->GetClass("TDPMjet")) return;
227     gSystem->Load("libdpmjet");
228     gSystem->Load("libTDPMjet");
229   }
230   /**
231    * Load AMPT libraries
232    */
233   static void LoadAmpt()
234   {
235     LoadPythia();
236     if (gROOT->GetClass("TAmpt")) return;
237     gSystem->Load("libampt");
238     gSystem->Load("libTAmpt");
239   }
240   /**
241    * Make the generator
242    *
243    * @param rt    Event generator identifier 
244    * @param b1    Least impact parameter 
245    * @param b2    Largest impact parameter 
246    * @param smear If true, smear interaction per event 
247    *
248    * @return Point to newly allocated generator or null
249    * 
250    */
251   AliGenerator* MakeGenerator(const TString& rt, 
252                               Float_t b1, 
253                               Float_t b2, 
254                               Bool_t smear=true)
255   {
256     if (rt.IsNull()) { 
257       ::Fatal("MakeGenerator", "No EG spec given");
258       return 0;
259     }
260
261     TString runType = rt;
262     runType.ToLower();
263
264     AliGenerator* g = CreateGenerator(runType,b1,b2);
265     if (g && smear) g->SetVertexSmear(AliGenerator::kPerEvent);
266
267     return g;
268   }
269   /**
270    * Make our decayer
271    *
272    * @param rt The EG to use 
273    *
274    * @return Newly allocated decayer or null
275    */
276   TVirtualMCDecayer* MakeDecayer(const TString& rt)
277   {
278     if (rt.IsNull()) { 
279       ::Fatal("MakeGenerator", "No EG spec given");
280       return 0;
281     }
282
283     TString runType = rt;
284     rt.ToLower();
285
286     TVirtualMCDecayer* decayer = CreateDecayer(runType);
287
288     if (decayer) decayer->Init();
289     return decayer;
290   }
291 protected:
292   /** 
293    * Create the generator.  This function must be defined in a derived class. 
294    * 
295    * @param runType The generator ID (all lower case)
296    * @param b1      Least impact parameter 
297    * @param b2      Largest impact parameter 
298    * 
299    * @return Must return a pointer to a new AliGenerator or null
300    */
301   virtual AliGenerator* CreateGenerator(const TString& runType, 
302                                         Float_t b1, 
303                                         Float_t b2) = 0;
304   /** 
305    * Create the decayer.  This function must be defined in a derived class. 
306    * 
307    * @param runType The generator ID (all lower case)
308    * 
309    * @return Must return a pointer to a new TVirtualMCDecayer or null
310    */
311   virtual TVirtualMCDecayer* CreateDecayer(const TString& runType) = 0;
312
313 };
314 /** Global variable */
315 VirtualEGCfg* egCfg = 0;
316
317
318
319 /**
320  * A function so that we can do TROOT::Macro.  Does nothing but print a message.
321  *
322  */
323 void BaseConfig()
324 {
325   Info("", "Defined base classes for configuration");
326 }
327 //
328 // EOF
329 //
330