ROOT logo
//_____________________________________________________________________
/** 
 * 
 * 
 * @param d 
 * @param r 
 * @param vz 
 * @param nDead 
 * 
 * @return 
 *
 * @ingroup pwglf_forward_scripts_corr
 */
TH2D* MakeOneRing(UShort_t d, Char_t r, Double_t vz, Int_t& nDead)
{
  AliFMDGeometry*   geom = AliFMDGeometry::Instance();
  AliFMDParameters* pars = AliFMDParameters::Instance();

  UShort_t nS = (r == 'I' || r == 'i' ?  20 :  40);
  UShort_t nT = (r == 'I' || r == 'i' ? 512 : 256);
  
  // Make our two histograms 
  TH2D* hAll = new TH2D("all","All",200,-4,6,nS,0,2*TMath::Pi());
  hAll->SetXTitle("#eta");
  hAll->SetYTitle("#phi");
  hAll->Sumw2();
  hAll->SetDirectory(0);
  TH2D* hOK  = static_cast<TH2D*>(hAll->Clone());
  hOK->SetDirectory(0);
  
  // Loop over all sectors and strips in this ring 
  Int_t nOK  = 0;
  Int_t nAll = 0;
  Int_t nPhi = hAll->GetNbinsY();
  for (UShort_t s = 0; s < nS; s++) { 
    for (UShort_t t = 0; t < nT; t++) { 
      // Get eta,phi by quering the geometry (first for (x,y,z), then
      // correcting for the vertex position, and then calculating 
      // (eta, phi))
      Double_t x, y, z;
      geom->Detector2XYZ(d, r, s, t, x, y, z);
      z -= vz;
      Double_t q, eta, phi, theta;
      AliFMDGeometry::XYZ2REtaPhiTheta(x, y, z, q, eta, phi, theta);
      if (phi < 0) phi += 2*TMath::Pi();

      // Check if this is a dead channel or not 
      Bool_t isDead = pars->IsDead(d, r, s, t);

      // Special check for FMD2i
      Int_t VA = t/128;
      if(d==2 && r=='I' && VA>1 && (s==16 || s==17)) isDead =true;

      // Find the eta bin number and corresponding overflow bin
      Int_t etaBin = hAll->GetXaxis()->FindBin(eta);
      Int_t ovrBin = hAll->GetBin(etaBin, nPhi+1); 
      
      // Increment all histogram 
      hAll->Fill(eta, phi);
      hAll->AddBinContent(ovrBin);
      nAll++;

      // If not dead, increment OK histogram 
      if (!isDead) {
	hOK->Fill(eta, phi);
	hOK->AddBinContent(ovrBin);
	nOK++;
      }
      else         nDead++;
    }
  }
  // Divide out the efficiency. 
  // Note, that the overflow bins along eta now contains the ratio 
  // nOK/nAll Strips for a given eta bin. 
  hOK->Divide(hOK,hAll,1,1,"B");

  // Clean up
  delete hAll;

  Info("ExtractAcceptances","Made correction for FMD%d%c at vz=%f - "
       "%d strips out of %d OK", d, r, vz, nOK, nAll);

  // Return result 
  return hOK;
}

//_____________________________________________________________________
/** 
 * 
 * 
 * @param runNo 
 * @param system 
 * @param energy 
 * @param field 
 * @param nVtxBins 
 * @param vtxLow 
 * @param vtxHigh 
 *
 * @ingroup pwglf_forward_scripts_corr
 */
void ExtractAcceptance(Int_t   runNo=121526, 
		       Int_t   system = 1,
		       Float_t energy = 900,
		       Float_t field  = 5,
		       Int_t   nVtxBins=10, 
		       Float_t vtxLow=-10, 
		       Float_t vtxHigh=10)
{  
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libPWGLFforward2");
  
  // Float_t delta = (vtxHigh - vtxLow) / (Float_t)nVtxBins;
  
  Bool_t kGridOnline = kTRUE; 
  if(!(TGrid::Connect("alien://",0,0,"t")))
    kGridOnline = kFALSE;
  
  // --- Initialisations ------------------------------------------
  //Set up CDB manager
  Info("ExtractAcceptances","Setting up OCDB");
  
  AliCDBManager* cdb = AliCDBManager::Instance();
  if(kGridOnline)
    cdb->SetDefaultStorage("alien://Folder=/alice/data/2012/OCDB");
  else
    cdb->SetDefaultStorage("local://$(ALICE_ROOT)/OCDB");
  cdb->SetRun(runNo);
  
  // Get the geometry 
  Info("ExtractAcceptances","Loading geometry");
  AliGeomManager::LoadGeometry();

  // Get an initialize parameters 
  Info("ExtractAcceptances","Intialising parameters");
  AliFMDParameters* pars = AliFMDParameters::Instance();
  pars->Init();

  // Get an initialise geometry 
  Info("ExtractAcceptances","Initialising geomtry");
  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  geom->Init();
  geom->InitTransformations();

  // --- Output object -----------------------------------------------
  // Make our correction object 
  AliFMDCorrAcceptance* corr = new AliFMDCorrAcceptance();
  corr->SetVertexAxis(nVtxBins, vtxLow, vtxHigh);

  // --- Loop over verticies and rings -------------------------------
  Int_t nDead = 0;
  Float_t dV = (vtxHigh - vtxLow) / nVtxBins;
  for (Double_t v = vtxLow+dV/2; v < vtxHigh; v += dV) { 
    for(UShort_t d = 1; d <= 3;d++) { 
      UShort_t nR = (d == 1 ? 1 : 2);
      for (UShort_t q = 0; q < nR; q++) { 
	Char_t   r  = (q == 0 ? 'I' : 'O');

	// Delegate to other function 
	TH2D* ratio = MakeOneRing(d, r, v, nDead);
	if (!ratio) continue;

	// Set the correction 
	corr->SetCorrection(d, r, v, ratio);
      }
    }
  }

  // Write to a file 
  Info("ExtractAcceptances","Writing to disk");
  AliForwardCorrectionManager& cm = AliForwardCorrectionManager::Instance();
  TString fname = cm.GetFileName(AliForwardCorrectionManager::kAcceptance, 
				 system, energy, field, false);
  TFile* out = TFile::Open(fname.Data(), "RECREATE");
  corr->SetHasOverflow();
  corr->Write(cm.GetObjectName(AliForwardCorrectionManager::kAcceptance));
  out->Write();
  out->Close();

  std::ofstream f("Upload.C");
  if (!f) { 
    Error("ExtractELoss", "Failed to open Upload.C");
    return;
  }
  f << "// Generated by ExtractAcceptance.C\n"
    << "void Upload(const TUrl& url)\n"
    << "{\n"
    << "  if (TString(\"alien\").EqualTo(url.GetProtocol())) {\n"
    << "    if (!TGrid::Connect(\"alien://\")) {\n"
    << "      Error(\"Upload\", \"Failed to connect to AliEn\");\n"
    << "      return;\n"
    << "    }\n"
    << "  }\n\n";

  mgr.SetPrefix("");
  TString fef(mgr.GetFileName(AliForwardCorrectionManager::kAcceptance, 
			      sys, sNN, field, false));
  TString fep(mgr.GetFilePath(AliForwardCorrectionManager::kAcceptance, 
			      sys, sNN, field, false));
  f << "  TString src  = \"" << fef << "\";\n"
    << "  TString dest = \"" << fep << "\";\n"
    << "  TString out; out.Form(\"%s%s\",url.GetUrl(),dest.Data());\n\n"
    << "  TString dir(gSystem->DirName(out));\n"
    << "  if (gSystem->AccessPathName(dir)) {\n"
    << "    if (gSystem->mkdir(dir, true) < 0) {\n"
    << "      Warning(\"Upload\",\"Failed to make directory %s\","
    << "              dir.Data());\n"
    << "      return;\n"
    << "    }\n"
    << "  }\n"
    << "  if (!TFile::Cp(src,out)) \n"
    << "    Warning(\"Upload\",\"Failed to upload %s -> %s\",\n"
    << "            src.Data(), out.Data());\n"
    << "}\n"
    << "// EOF"
    << std::endl;
  f.close();
  
  Info("ExtracAcceptance", 
       "Run generated Upload.C(DEST) script to copy files in place");
}

//
// EOF
//

 MakeAcceptanceCorrection.C:1
 MakeAcceptanceCorrection.C:2
 MakeAcceptanceCorrection.C:3
 MakeAcceptanceCorrection.C:4
 MakeAcceptanceCorrection.C:5
 MakeAcceptanceCorrection.C:6
 MakeAcceptanceCorrection.C:7
 MakeAcceptanceCorrection.C:8
 MakeAcceptanceCorrection.C:9
 MakeAcceptanceCorrection.C:10
 MakeAcceptanceCorrection.C:11
 MakeAcceptanceCorrection.C:12
 MakeAcceptanceCorrection.C:13
 MakeAcceptanceCorrection.C:14
 MakeAcceptanceCorrection.C:15
 MakeAcceptanceCorrection.C:16
 MakeAcceptanceCorrection.C:17
 MakeAcceptanceCorrection.C:18
 MakeAcceptanceCorrection.C:19
 MakeAcceptanceCorrection.C:20
 MakeAcceptanceCorrection.C:21
 MakeAcceptanceCorrection.C:22
 MakeAcceptanceCorrection.C:23
 MakeAcceptanceCorrection.C:24
 MakeAcceptanceCorrection.C:25
 MakeAcceptanceCorrection.C:26
 MakeAcceptanceCorrection.C:27
 MakeAcceptanceCorrection.C:28
 MakeAcceptanceCorrection.C:29
 MakeAcceptanceCorrection.C:30
 MakeAcceptanceCorrection.C:31
 MakeAcceptanceCorrection.C:32
 MakeAcceptanceCorrection.C:33
 MakeAcceptanceCorrection.C:34
 MakeAcceptanceCorrection.C:35
 MakeAcceptanceCorrection.C:36
 MakeAcceptanceCorrection.C:37
 MakeAcceptanceCorrection.C:38
 MakeAcceptanceCorrection.C:39
 MakeAcceptanceCorrection.C:40
 MakeAcceptanceCorrection.C:41
 MakeAcceptanceCorrection.C:42
 MakeAcceptanceCorrection.C:43
 MakeAcceptanceCorrection.C:44
 MakeAcceptanceCorrection.C:45
 MakeAcceptanceCorrection.C:46
 MakeAcceptanceCorrection.C:47
 MakeAcceptanceCorrection.C:48
 MakeAcceptanceCorrection.C:49
 MakeAcceptanceCorrection.C:50
 MakeAcceptanceCorrection.C:51
 MakeAcceptanceCorrection.C:52
 MakeAcceptanceCorrection.C:53
 MakeAcceptanceCorrection.C:54
 MakeAcceptanceCorrection.C:55
 MakeAcceptanceCorrection.C:56
 MakeAcceptanceCorrection.C:57
 MakeAcceptanceCorrection.C:58
 MakeAcceptanceCorrection.C:59
 MakeAcceptanceCorrection.C:60
 MakeAcceptanceCorrection.C:61
 MakeAcceptanceCorrection.C:62
 MakeAcceptanceCorrection.C:63
 MakeAcceptanceCorrection.C:64
 MakeAcceptanceCorrection.C:65
 MakeAcceptanceCorrection.C:66
 MakeAcceptanceCorrection.C:67
 MakeAcceptanceCorrection.C:68
 MakeAcceptanceCorrection.C:69
 MakeAcceptanceCorrection.C:70
 MakeAcceptanceCorrection.C:71
 MakeAcceptanceCorrection.C:72
 MakeAcceptanceCorrection.C:73
 MakeAcceptanceCorrection.C:74
 MakeAcceptanceCorrection.C:75
 MakeAcceptanceCorrection.C:76
 MakeAcceptanceCorrection.C:77
 MakeAcceptanceCorrection.C:78
 MakeAcceptanceCorrection.C:79
 MakeAcceptanceCorrection.C:80
 MakeAcceptanceCorrection.C:81
 MakeAcceptanceCorrection.C:82
 MakeAcceptanceCorrection.C:83
 MakeAcceptanceCorrection.C:84
 MakeAcceptanceCorrection.C:85
 MakeAcceptanceCorrection.C:86
 MakeAcceptanceCorrection.C:87
 MakeAcceptanceCorrection.C:88
 MakeAcceptanceCorrection.C:89
 MakeAcceptanceCorrection.C:90
 MakeAcceptanceCorrection.C:91
 MakeAcceptanceCorrection.C:92
 MakeAcceptanceCorrection.C:93
 MakeAcceptanceCorrection.C:94
 MakeAcceptanceCorrection.C:95
 MakeAcceptanceCorrection.C:96
 MakeAcceptanceCorrection.C:97
 MakeAcceptanceCorrection.C:98
 MakeAcceptanceCorrection.C:99
 MakeAcceptanceCorrection.C:100
 MakeAcceptanceCorrection.C:101
 MakeAcceptanceCorrection.C:102
 MakeAcceptanceCorrection.C:103
 MakeAcceptanceCorrection.C:104
 MakeAcceptanceCorrection.C:105
 MakeAcceptanceCorrection.C:106
 MakeAcceptanceCorrection.C:107
 MakeAcceptanceCorrection.C:108
 MakeAcceptanceCorrection.C:109
 MakeAcceptanceCorrection.C:110
 MakeAcceptanceCorrection.C:111
 MakeAcceptanceCorrection.C:112
 MakeAcceptanceCorrection.C:113
 MakeAcceptanceCorrection.C:114
 MakeAcceptanceCorrection.C:115
 MakeAcceptanceCorrection.C:116
 MakeAcceptanceCorrection.C:117
 MakeAcceptanceCorrection.C:118
 MakeAcceptanceCorrection.C:119
 MakeAcceptanceCorrection.C:120
 MakeAcceptanceCorrection.C:121
 MakeAcceptanceCorrection.C:122
 MakeAcceptanceCorrection.C:123
 MakeAcceptanceCorrection.C:124
 MakeAcceptanceCorrection.C:125
 MakeAcceptanceCorrection.C:126
 MakeAcceptanceCorrection.C:127
 MakeAcceptanceCorrection.C:128
 MakeAcceptanceCorrection.C:129
 MakeAcceptanceCorrection.C:130
 MakeAcceptanceCorrection.C:131
 MakeAcceptanceCorrection.C:132
 MakeAcceptanceCorrection.C:133
 MakeAcceptanceCorrection.C:134
 MakeAcceptanceCorrection.C:135
 MakeAcceptanceCorrection.C:136
 MakeAcceptanceCorrection.C:137
 MakeAcceptanceCorrection.C:138
 MakeAcceptanceCorrection.C:139
 MakeAcceptanceCorrection.C:140
 MakeAcceptanceCorrection.C:141
 MakeAcceptanceCorrection.C:142
 MakeAcceptanceCorrection.C:143
 MakeAcceptanceCorrection.C:144
 MakeAcceptanceCorrection.C:145
 MakeAcceptanceCorrection.C:146
 MakeAcceptanceCorrection.C:147
 MakeAcceptanceCorrection.C:148
 MakeAcceptanceCorrection.C:149
 MakeAcceptanceCorrection.C:150
 MakeAcceptanceCorrection.C:151
 MakeAcceptanceCorrection.C:152
 MakeAcceptanceCorrection.C:153
 MakeAcceptanceCorrection.C:154
 MakeAcceptanceCorrection.C:155
 MakeAcceptanceCorrection.C:156
 MakeAcceptanceCorrection.C:157
 MakeAcceptanceCorrection.C:158
 MakeAcceptanceCorrection.C:159
 MakeAcceptanceCorrection.C:160
 MakeAcceptanceCorrection.C:161
 MakeAcceptanceCorrection.C:162
 MakeAcceptanceCorrection.C:163
 MakeAcceptanceCorrection.C:164
 MakeAcceptanceCorrection.C:165
 MakeAcceptanceCorrection.C:166
 MakeAcceptanceCorrection.C:167
 MakeAcceptanceCorrection.C:168
 MakeAcceptanceCorrection.C:169
 MakeAcceptanceCorrection.C:170
 MakeAcceptanceCorrection.C:171
 MakeAcceptanceCorrection.C:172
 MakeAcceptanceCorrection.C:173
 MakeAcceptanceCorrection.C:174
 MakeAcceptanceCorrection.C:175
 MakeAcceptanceCorrection.C:176
 MakeAcceptanceCorrection.C:177
 MakeAcceptanceCorrection.C:178
 MakeAcceptanceCorrection.C:179
 MakeAcceptanceCorrection.C:180
 MakeAcceptanceCorrection.C:181
 MakeAcceptanceCorrection.C:182
 MakeAcceptanceCorrection.C:183
 MakeAcceptanceCorrection.C:184
 MakeAcceptanceCorrection.C:185
 MakeAcceptanceCorrection.C:186
 MakeAcceptanceCorrection.C:187
 MakeAcceptanceCorrection.C:188
 MakeAcceptanceCorrection.C:189
 MakeAcceptanceCorrection.C:190
 MakeAcceptanceCorrection.C:191
 MakeAcceptanceCorrection.C:192
 MakeAcceptanceCorrection.C:193
 MakeAcceptanceCorrection.C:194
 MakeAcceptanceCorrection.C:195
 MakeAcceptanceCorrection.C:196
 MakeAcceptanceCorrection.C:197
 MakeAcceptanceCorrection.C:198
 MakeAcceptanceCorrection.C:199
 MakeAcceptanceCorrection.C:200
 MakeAcceptanceCorrection.C:201
 MakeAcceptanceCorrection.C:202
 MakeAcceptanceCorrection.C:203
 MakeAcceptanceCorrection.C:204
 MakeAcceptanceCorrection.C:205
 MakeAcceptanceCorrection.C:206
 MakeAcceptanceCorrection.C:207
 MakeAcceptanceCorrection.C:208
 MakeAcceptanceCorrection.C:209
 MakeAcceptanceCorrection.C:210
 MakeAcceptanceCorrection.C:211
 MakeAcceptanceCorrection.C:212
 MakeAcceptanceCorrection.C:213
 MakeAcceptanceCorrection.C:214
 MakeAcceptanceCorrection.C:215
 MakeAcceptanceCorrection.C:216
 MakeAcceptanceCorrection.C:217
 MakeAcceptanceCorrection.C:218
 MakeAcceptanceCorrection.C:219
 MakeAcceptanceCorrection.C:220
 MakeAcceptanceCorrection.C:221
 MakeAcceptanceCorrection.C:222
 MakeAcceptanceCorrection.C:223
 MakeAcceptanceCorrection.C:224
 MakeAcceptanceCorrection.C:225
 MakeAcceptanceCorrection.C:226
 MakeAcceptanceCorrection.C:227