]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/corrs/ExtractAcceptance.C
Mega commit of many changes to PWGLFforward
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / corrs / ExtractAcceptance.C
1 //_____________________________________________________________________
2 /** 
3  * 
4  * 
5  * @param d 
6  * @param r 
7  * @param vz 
8  * @param nDead 
9  * 
10  * @return 
11  *
12  * @ingroup pwglf_forward_scripts_corr
13  */
14 TH2D* MakeOneRing(UShort_t      d, 
15                   Char_t        r, 
16                   Double_t      vz, 
17                   Int_t&        nDead, 
18                   std::ostream* deadScript)
19 {
20   AliFMDGeometry*   geom = AliFMDGeometry::Instance();
21   AliFMDParameters* pars = AliFMDParameters::Instance();
22
23   UShort_t nS = (r == 'I' || r == 'i' ?  20 :  40);
24   UShort_t nT = (r == 'I' || r == 'i' ? 512 : 256);
25   
26   // Make our two histograms 
27   TH2D* hAll = new TH2D("all","All",200,-4,6,nS,0,2*TMath::Pi());
28   hAll->SetXTitle("#eta");
29   hAll->SetYTitle("#phi");
30   hAll->Sumw2();
31   hAll->SetDirectory(0);
32   TH2D* hOK  = static_cast<TH2D*>(hAll->Clone());
33   hOK->SetDirectory(0);
34   
35   if (deadScript)
36     *deadScript << "\n // FMD" << d << r << std::endl;
37   // Loop over all sectors and strips in this ring 
38   Int_t nOK  = 0;
39   Int_t nAll = 0;
40   Int_t nPhi = hAll->GetNbinsY();
41   for (UShort_t s = 0; s < nS; s++) { 
42     for (UShort_t t = 0; t < nT; t++) { 
43       // Get eta,phi by quering the geometry (first for (x,y,z), then
44       // correcting for the vertex position, and then calculating 
45       // (eta, phi))
46       Double_t x, y, z;
47       geom->Detector2XYZ(d, r, s, t, x, y, z);
48       z -= vz;
49       Double_t q, eta, phi, theta;
50       AliFMDGeometry::XYZ2REtaPhiTheta(x, y, z, q, eta, phi, theta);
51       if (phi < 0) phi += 2*TMath::Pi();
52
53       // Check if this is a dead channel or not 
54       Bool_t isDead = pars->IsDead(d, r, s, t);
55
56       // Special check for FMD2i - upper part of sectors 16/17 have 
57       // have anomalous gains and/or noise - common sources are 
58       // power regulartors for bias currents and the like 
59       Int_t VA = t/128;
60       if(d==2 && r=='I' && VA>1 && (s==16 || s==17)) isDead =true;
61
62       // Find the eta bin number and corresponding overflow bin
63       Int_t etaBin = hAll->GetXaxis()->FindBin(eta);
64       Int_t ovrBin = hAll->GetBin(etaBin, nPhi+1); 
65       
66       // Increment all histogram 
67       hAll->Fill(eta, phi);
68       hAll->AddBinContent(ovrBin);
69       nAll++;
70
71       // If not dead, increment OK histogram 
72       if (!isDead) {
73         hOK->Fill(eta, phi);
74         hOK->AddBinContent(ovrBin);
75         nOK++;
76       }
77       else {
78         nDead++;
79         if (deadScript)
80           *deadScript << "  filter->AddDead(" << d << ",'" << r << "'," 
81                       << s << ',' << t << ");" << std::endl;
82       }
83     }
84   }
85   // Divide out the efficiency. 
86   // Note, that the overflow bins along eta now contains the ratio 
87   // nOK/nAll Strips for a given eta bin. 
88   hOK->Divide(hOK,hAll,1,1,"B");
89
90   // Invert overflow bin
91   for (Int_t etaBin = 1; etaBin <= hOK->GetNbinsX(); etaBin++) { 
92     Double_t ovr    = hOK->GetBinContent(etaBin, nPhi+1);
93     Double_t novr   = (ovr < 1e-12 ? 0 : 1./ovr);
94     hOK->SetBinContent(etaBin, nPhi+1, novr);
95 #if 0
96     if (ovr > 0 && ovr != 1)
97       Info("", "Setting overflow bin (%3d,%3d) to 1/%f=%f", etaBin, nPhi+1, 
98            ovr, hOK->GetBinContent(etaBin, nPhi+1));
99 #endif
100   }
101   // Clean up
102   delete hAll;
103
104   Printf("=== FMD%d%c at vz=%+5.1f - %d/%d=%3d%% OK (w/overflow)", 
105          d, r, vz, nOK, nAll, (100*nOK)/nAll);
106
107   // Return result 
108   return hOK;
109 }
110
111 //_____________________________________________________________________
112 /** 
113  * 
114  * 
115  * @param runNo 
116  * @param system 
117  * @param energy 
118  * @param field 
119  * @param nVtxBins 
120  * @param vtxLow 
121  * @param vtxHigh 
122  *
123  * @ingroup pwglf_forward_scripts_corr
124  */
125 void ExtractAcceptance(Int_t   runNo=121526, 
126                        Int_t   nVtxBins=10, 
127                        Float_t vtxLow=-10, 
128                        Float_t vtxHigh=10)
129 {  
130   const char* fwd = "$ALICE_ROOT/../trunk/PWGLF/FORWARD/analysis2";
131   gSystem->AddIncludePath(Form("-I%s", fwd));
132   gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));
133
134   // gSystem->Load("libANALYSIS");
135   // gSystem->Load("libANALYSISalice");
136   // gSystem->Load("libPWGLFforward2");
137   // Float_t delta = (vtxHigh - vtxLow) / (Float_t)nVtxBins;
138   
139   Bool_t gridOnline = kTRUE; 
140   if(!(TGrid::Connect("alien://",0,0,"t")))
141     gridOnline = kFALSE;
142
143   // --- Figure out the year --------------------------------------
144   UShort_t year = 0;
145   if      (runNo <= 99999)  year = 2009;
146   else if (runNo <= 139667) year = 2010;
147   else if (runNo <= 170718) year = 2011;
148   else if (runNo <= 194306) year = 2012;
149   else if (runNo <= 197709) year = 2013;
150   if (year <= 0) { 
151     Error("", "Couldn't deduce the year from the run number");
152     return;
153   }
154
155   // --- Initialisations ------------------------------------------
156   //Set up CDB manager
157   Printf("=== Setting up OCDB");
158   
159   AliCDBManager* cdb = AliCDBManager::Instance();
160   if(gridOnline)
161     cdb->SetDefaultStorage(Form("alien://Folder=/alice/data/%4d/OCDB", year));
162   else
163     cdb->SetDefaultStorage("local://$(ALICE_ROOT)/OCDB");
164   cdb->SetRun(runNo);
165   
166   // Get the geometry 
167   Printf("=== Loading geometry");
168   AliGeomManager::LoadGeometry();
169
170   // Get an initialize parameters 
171   Printf("=== Intialising parameters");
172   AliFMDParameters* pars = AliFMDParameters::Instance();
173   pars->Init();
174
175   // Get an initialise geometry 
176   Printf("=== Initialising geomtry");
177   AliFMDGeometry* geom = AliFMDGeometry::Instance();
178   geom->Init();
179   geom->InitTransformations();
180
181   // --- Get the general run parameters ------------------------------
182   AliCDBEntry* grpE = cdb->Get("GRP/GRP/Data");
183   if (!grpE) { 
184     AliWarningF("No GRP entry found for run %d", runNo);
185     return;
186   }
187   AliGRPObject* grp = static_cast<AliGRPObject*>(grpE->GetObject());
188   if (!grp) { 
189     AliWarningF("No GRP object found for run %d", runNo);
190     return;
191   }
192   Float_t  beamE = grp->GetBeamEnergy();
193   TString  beamT = grp->GetBeamType();
194 # if 0 
195   // This isn't really needed as the acceptance map is indifferent to
196   // the field settings.
197   Float_t  l3cur = grp->GetL3Current(AliGRPObject::kMean);
198   Char_t   l3pol = grp->GetL3Polarity();
199   Bool_t   l3lhc = grp->IsPolarityConventionLHC();
200   Bool_t   l3uni = grp->IsUniformBMap();
201   AliMagF* fldM  = 
202     AliMagF::CreateFieldMap(TMath::Abs(l3cur) * (l3pol ? -1:1), 0, 
203                             (l3lhc ? 0 : 1), l3uni, beamE, beamT.Data());
204   Float_t  l3fld = fldM->SolenoidField();
205 #endif
206   
207   UShort_t sys = AliForwardUtil::ParseCollisionSystem(beamT);
208   UShort_t sNN = AliForwardUtil::ParseCenterOfMassEnergy(sys, 2 * beamE);
209   Short_t  fld = 0; // AliForwardUtil::ParseMagneticField(l3fld);
210   Printf("=== Run=%d, year=%d, sys=%d, sNN=%d, fld=%d", 
211          runNo, year, sys, sNN, fld);
212
213   // --- Output object -----------------------------------------------
214   // Make our correction object 
215   AliFMDCorrAcceptance* corr = new AliFMDCorrAcceptance();
216   corr->SetVertexAxis(nVtxBins, vtxLow, vtxHigh);
217
218   // --- Output script -----------------------------------------------
219   std::ofstream deadScript("deadstrips.C");
220   deadScript << "// Automatically generaeted by ExtractAcceptance.C\n"
221              << "// Add additional dead strips to sharing filter\n"
222              << "// Information taken from OCDB entry for\n" 
223              << "//\n"
224              << "//    run       = " << runNo << "\n"
225              << "//    year      = " << year << "\n"
226              << "//    system    = " << sys << "\n"
227              << "//    sqrt{sNN} = " << sNN << "GeV\n"
228              << "//    L3 field  = " << fld << "kG\n"
229              << "void deadstrips(AliFMDSharingFilter* filter)\n"
230              << "{" << std::endl;
231   
232   // --- Loop over verticies and rings -------------------------------
233   Int_t  nDead   = 0;
234   Bool_t gotDead = false;
235   Float_t dV     = (vtxHigh - vtxLow) / nVtxBins;
236   Printf("=== Looping over vertices: %d bins from %+6.2f to %+6.2f "
237          "in steps of %+6.2f", 
238          nVtxBins, vtxLow, vtxHigh, dV);
239   for (Double_t v = vtxLow+dV/2; v < vtxHigh; v += dV) { 
240     for(UShort_t d = 1; d <= 3;d++) { 
241       UShort_t nR = (d == 1 ? 1 : 2);
242       for (UShort_t q = 0; q < nR; q++) { 
243         Char_t   r  = (q == 0 ? 'I' : 'O');
244
245         // Delegate to other function 
246         Int_t nLocal = 0;
247         TH2D* ratio = MakeOneRing(d, r, v, nLocal, 
248                                   !gotDead ? &deadScript : 0);
249         nDead += nLocal;
250         if (!ratio) {
251           Warning("ExtractAcceptance", "Didn't get correction from "
252                   "FMD%d%c @ vz=%+6.2fcm", d, r, v);
253           continue;
254         }
255         // Printf("v=%+6.2f FMD%d%c, got %d dead strips", v, d, r, nLocal);
256
257         // Set the correction 
258         corr->SetCorrection(d, r, v, ratio);
259       }
260     }
261     gotDead = true;
262   }
263   corr->SetHasOverflow();
264   corr->Print();
265   // corr->ls();
266
267   deadScript << "}\n"
268              << "// EOF" << std::endl;
269   deadScript.close();
270
271   // Write to a file 
272   Printf("=== Writing to disk");
273   AliForwardCorrectionManager& cm = AliForwardCorrectionManager::Instance();
274   if (!cm.Store(corr, runNo, sys, sNN, fld, false, false, 
275                 "fmd_corrections.root")) { 
276     Error("", "Failed to store acceptance correction in local file");
277     return;
278   }
279
280   std::ofstream f("Upload.C");
281   f << "// Generated by ExtractELoss.C\n"
282     << "TString MakeDest(const TString& dest, const TString& fname)\n"
283     << "{\n"
284     << "  TString tmp(dest);\n"
285     << "  if (!tmp.IsNull()) {\n"
286     << "    if (!tmp.EndsWith(\"/\")) tmp.Append(\"/\");\n"
287     << "    tmp.Append(fname);\n"
288     << "  }\n"
289     << "  return tmp;\n"
290     << "}\n\n"
291     << "void Upload(const TString& dest=\"\")\n"
292     << "{\n"
293     << "  gROOT->Macro(\"" << fwd << "/scripts/LoadLibs.C\");\n"
294     << "  \n"
295     << "  const char* fmdFile = \"fmd_corrections.root\";\n"
296     << "  TString fdest = MakeDest(dest, fmdFile);\n"
297     << "  \n"
298     << "  AliForwardCorrectionManager::Instance().Append(fmdFile, fdest);\n"
299     << "}\n"
300     << "// EOF\n"
301     << std::endl;
302   f.close();
303   
304   Info("ExtracAcceptance", 
305        "Run generated Upload.C(DEST) script to copy files in place");
306 }
307
308 //
309 // EOF
310 //
311