ROOT logo
//_____________________________________________________________________
/** 
 * 
 * 
 * @param d      Detector
 * @param r      Ring 
 * @param vz     Z--coordinate of interaction point
 * @param nDead  On returm the number of dead strips
 * @param deadScript  Output stream for dead strips 
 * 
 * @return 
 *
 * @ingroup pwglf_forward_scripts_corr
 */
TH2D* MakeOneRing(UShort_t      d, 
		  Char_t        r, 
		  Double_t      vz, 
		  Int_t&        nDead, 
		  std::ostream* deadScript)
{
  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);
  
  if (deadScript)
    *deadScript << "\n // FMD" << d << r << std::endl;
  // 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 - upper part of sectors 16/17 have 
      // have anomalous gains and/or noise - common sources are 
      // power regulartors for bias currents and the like 
      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++;
	if (deadScript)
	  *deadScript << "  filter->AddDead(" << d << ",'" << r << "'," 
		      << s << ',' << t << ");" << std::endl;
      }
    }
  }
  // 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");

  // Invert overflow bin
  for (Int_t etaBin = 1; etaBin <= hOK->GetNbinsX(); etaBin++) { 
    Double_t ovr    = hOK->GetBinContent(etaBin, nPhi+1);
    Double_t novr   = (ovr < 1e-12 ? 0 : 1./ovr);
    hOK->SetBinContent(etaBin, nPhi+1, novr);
#if 0
    if (ovr > 0 && ovr != 1)
      Info("", "Setting overflow bin (%3d,%3d) to 1/%f=%f", etaBin, nPhi+1, 
	   ovr, hOK->GetBinContent(etaBin, nPhi+1));
#endif
  }
  // Clean up
  delete hAll;

  Printf("=== FMD%d%c at vz=%+5.1f - %d/%d=%3d%% OK (w/overflow)", 
	 d, r, vz, nOK, nAll, (100*nOK)/nAll);

  // Return result 
  return hOK;
}

//_____________________________________________________________________
/** 
 * 
 * 
 * @param runNo     Run number
 * @param nVtxBins  Number of @f$IP_{z}@f$ bins
 * @param vtxLow    Least @f$IP_{z}@f$
 * @param vtxHigh   Largest @f$IP_{z}@f$
 *
 * @ingroup pwglf_forward_scripts_corr
 */
void ExtractAcceptance(Int_t   runNo=121526, 
		       Int_t   nVtxBins=10, 
		       Float_t vtxLow=-10, 
		       Float_t vtxHigh=10)
{  
  const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
  gSystem->AddIncludePath(Form("-I%s", fwd));
  gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));

  // gSystem->Load("libANALYSIS");
  // gSystem->Load("libANALYSISalice");
  // gSystem->Load("libPWGLFforward2");
  // Float_t delta = (vtxHigh - vtxLow) / (Float_t)nVtxBins;
  
  Bool_t gridOnline = kTRUE; 
  if(!(TGrid::Connect("alien://",0,0,"t")))
    gridOnline = kFALSE;

  // --- Figure out the year --------------------------------------
  UShort_t year = 0;
  if      (runNo <= 99999)  year = 2009;
  else if (runNo <= 139667) year = 2010;
  else if (runNo <= 170718) year = 2011;
  else if (runNo <= 194306) year = 2012;
  else if (runNo <= 197709) year = 2013;
  if (year <= 0) { 
    Error("", "Couldn't deduce the year from the run number");
    return;
  }

  // --- Initialisations ------------------------------------------
  //Set up CDB manager
  Printf("=== Setting up OCDB");
  
  AliCDBManager* cdb = AliCDBManager::Instance();
  if(gridOnline) {
    cdb->SetDefaultStorageFromRun(runNo);
    // cdb->SetDefaultStorage(Form("alien://Folder=/alice/data/%4d/OCDB", year));
  }
  else
    cdb->SetDefaultStorage("local://$(ALICE_ROOT)/OCDB");
  cdb->SetRun(runNo);
  
  // Get the geometry 
  Printf("=== Loading geometry");
  AliGeomManager::LoadGeometry();

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

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

  // --- Get the general run parameters ------------------------------
  AliCDBEntry* grpE = cdb->Get("GRP/GRP/Data");
  if (!grpE) { 
    AliWarningF("No GRP entry found for run %d", runNo);
    return;
  }
  AliGRPObject* grp = static_cast<AliGRPObject*>(grpE->GetObject());
  if (!grp) { 
    AliWarningF("No GRP object found for run %d", runNo);
    return;
  }
  Float_t  beamE = grp->GetBeamEnergy();
  TString  beamT = grp->GetBeamType();
# if 0 
  // This isn't really needed as the acceptance map is indifferent to
  // the field settings.
  Float_t  l3cur = grp->GetL3Current(AliGRPObject::kMean);
  Char_t   l3pol = grp->GetL3Polarity();
  Bool_t   l3lhc = grp->IsPolarityConventionLHC();
  Bool_t   l3uni = grp->IsUniformBMap();
  AliMagF* fldM  = 
    AliMagF::CreateFieldMap(TMath::Abs(l3cur) * (l3pol ? -1:1), 0, 
			    (l3lhc ? 0 : 1), l3uni, beamE, beamT.Data());
  Float_t  l3fld = fldM->SolenoidField();
#endif
  
  UShort_t sys = AliForwardUtil::ParseCollisionSystem(beamT);
  UShort_t sNN = AliForwardUtil::ParseCenterOfMassEnergy(sys, 2 * beamE);
  Short_t  fld = 0; // AliForwardUtil::ParseMagneticField(l3fld);
  Printf("=== Run=%d, year=%d, sys=%d, sNN=%d, fld=%d", 
	 runNo, year, sys, sNN, fld);

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

  // --- Output script -----------------------------------------------
  std::ofstream deadScript("deadstrips.C");
  deadScript << "// Automatically generaeted by ExtractAcceptance.C\n"
	     << "// Add additional dead strips to sharing filter\n"
	     << "// Information taken from OCDB entry for\n" 
	     << "//\n"
	     << "//    run       = " << runNo << "\n"
	     << "//    year      = " << year << "\n"
	     << "//    system    = " << sys << "\n"
	     << "//    sqrt{sNN} = " << sNN << "GeV\n"
	     << "//    L3 field  = " << fld << "kG\n"
	     << "void deadstrips(AliFMDSharingFilter* filter)\n"
	     << "{" << std::endl;
  
  // --- Loop over verticies and rings -------------------------------
  Int_t  nDead   = 0;
  Bool_t gotDead = false;
  Float_t dV     = (vtxHigh - vtxLow) / nVtxBins;
  Printf("=== Looping over vertices: %d bins from %+6.2f to %+6.2f "
	 "in steps of %+6.2f", 
	 nVtxBins, vtxLow, vtxHigh, dV);
  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 
	Int_t nLocal = 0;
	TH2D* ratio = MakeOneRing(d, r, v, nLocal, 
				  !gotDead ? &deadScript : 0);
	nDead += nLocal;
	if (!ratio) {
	  Warning("ExtractAcceptance", "Didn't get correction from "
		  "FMD%d%c @ vz=%+6.2fcm", d, r, v);
	  continue;
	}
	// Printf("v=%+6.2f FMD%d%c, got %d dead strips", v, d, r, nLocal);

	// Set the correction 
	corr->SetCorrection(d, r, v, ratio);
      }
    }
    gotDead = true;
  }
  corr->SetHasOverflow();
  corr->Print();
  // corr->ls();

  deadScript << "}\n"
	     << "// EOF" << std::endl;
  deadScript.close();

  // Write to a file 
  Printf("=== Writing to disk");
  AliForwardCorrectionManager& cm = AliForwardCorrectionManager::Instance();
  if (!cm.Store(corr, runNo, sys, sNN, fld, false, false, 
		"fmd_corrections.root")) { 
    Error("", "Failed to store acceptance correction in local file");
    return;
  }

  std::ofstream f("Upload.C");
  f << "// Generated by ExtractELoss.C\n"
    << "TString MakeDest(const TString& dest, const TString& fname)\n"
    << "{\n"
    << "  TString tmp(dest);\n"
    << "  if (!tmp.IsNull()) {\n"
    << "    if (!tmp.EndsWith(\"/\")) tmp.Append(\"/\");\n"
    << "    tmp.Append(fname);\n"
    << "  }\n"
    << "  return tmp;\n"
    << "}\n\n"
    << "void Upload(const TString& dest=\"\")\n"
    << "{\n"
    << "  gROOT->Macro(\"" << fwd << "/scripts/LoadLibs.C\");\n"
    << "  \n"
    << "  const char* fmdFile = \"fmd_corrections.root\";\n"
    << "  TString fdest = MakeDest(dest, fmdFile);\n"
    << "  \n"
    << "  AliForwardCorrectionManager::Instance().Append(fmdFile, fdest);\n"
    << "}\n"
    << "// EOF\n"
    << std::endl;
  f.close();
  
  Info("ExtracAcceptance", 
       "Run generated Upload.C(DEST) script to copy files in place");
}

//
// EOF
//

  
 ExtractAcceptance.C:1
 ExtractAcceptance.C:2
 ExtractAcceptance.C:3
 ExtractAcceptance.C:4
 ExtractAcceptance.C:5
 ExtractAcceptance.C:6
 ExtractAcceptance.C:7
 ExtractAcceptance.C:8
 ExtractAcceptance.C:9
 ExtractAcceptance.C:10
 ExtractAcceptance.C:11
 ExtractAcceptance.C:12
 ExtractAcceptance.C:13
 ExtractAcceptance.C:14
 ExtractAcceptance.C:15
 ExtractAcceptance.C:16
 ExtractAcceptance.C:17
 ExtractAcceptance.C:18
 ExtractAcceptance.C:19
 ExtractAcceptance.C:20
 ExtractAcceptance.C:21
 ExtractAcceptance.C:22
 ExtractAcceptance.C:23
 ExtractAcceptance.C:24
 ExtractAcceptance.C:25
 ExtractAcceptance.C:26
 ExtractAcceptance.C:27
 ExtractAcceptance.C:28
 ExtractAcceptance.C:29
 ExtractAcceptance.C:30
 ExtractAcceptance.C:31
 ExtractAcceptance.C:32
 ExtractAcceptance.C:33
 ExtractAcceptance.C:34
 ExtractAcceptance.C:35
 ExtractAcceptance.C:36
 ExtractAcceptance.C:37
 ExtractAcceptance.C:38
 ExtractAcceptance.C:39
 ExtractAcceptance.C:40
 ExtractAcceptance.C:41
 ExtractAcceptance.C:42
 ExtractAcceptance.C:43
 ExtractAcceptance.C:44
 ExtractAcceptance.C:45
 ExtractAcceptance.C:46
 ExtractAcceptance.C:47
 ExtractAcceptance.C:48
 ExtractAcceptance.C:49
 ExtractAcceptance.C:50
 ExtractAcceptance.C:51
 ExtractAcceptance.C:52
 ExtractAcceptance.C:53
 ExtractAcceptance.C:54
 ExtractAcceptance.C:55
 ExtractAcceptance.C:56
 ExtractAcceptance.C:57
 ExtractAcceptance.C:58
 ExtractAcceptance.C:59
 ExtractAcceptance.C:60
 ExtractAcceptance.C:61
 ExtractAcceptance.C:62
 ExtractAcceptance.C:63
 ExtractAcceptance.C:64
 ExtractAcceptance.C:65
 ExtractAcceptance.C:66
 ExtractAcceptance.C:67
 ExtractAcceptance.C:68
 ExtractAcceptance.C:69
 ExtractAcceptance.C:70
 ExtractAcceptance.C:71
 ExtractAcceptance.C:72
 ExtractAcceptance.C:73
 ExtractAcceptance.C:74
 ExtractAcceptance.C:75
 ExtractAcceptance.C:76
 ExtractAcceptance.C:77
 ExtractAcceptance.C:78
 ExtractAcceptance.C:79
 ExtractAcceptance.C:80
 ExtractAcceptance.C:81
 ExtractAcceptance.C:82
 ExtractAcceptance.C:83
 ExtractAcceptance.C:84
 ExtractAcceptance.C:85
 ExtractAcceptance.C:86
 ExtractAcceptance.C:87
 ExtractAcceptance.C:88
 ExtractAcceptance.C:89
 ExtractAcceptance.C:90
 ExtractAcceptance.C:91
 ExtractAcceptance.C:92
 ExtractAcceptance.C:93
 ExtractAcceptance.C:94
 ExtractAcceptance.C:95
 ExtractAcceptance.C:96
 ExtractAcceptance.C:97
 ExtractAcceptance.C:98
 ExtractAcceptance.C:99
 ExtractAcceptance.C:100
 ExtractAcceptance.C:101
 ExtractAcceptance.C:102
 ExtractAcceptance.C:103
 ExtractAcceptance.C:104
 ExtractAcceptance.C:105
 ExtractAcceptance.C:106
 ExtractAcceptance.C:107
 ExtractAcceptance.C:108
 ExtractAcceptance.C:109
 ExtractAcceptance.C:110
 ExtractAcceptance.C:111
 ExtractAcceptance.C:112
 ExtractAcceptance.C:113
 ExtractAcceptance.C:114
 ExtractAcceptance.C:115
 ExtractAcceptance.C:116
 ExtractAcceptance.C:117
 ExtractAcceptance.C:118
 ExtractAcceptance.C:119
 ExtractAcceptance.C:120
 ExtractAcceptance.C:121
 ExtractAcceptance.C:122
 ExtractAcceptance.C:123
 ExtractAcceptance.C:124
 ExtractAcceptance.C:125
 ExtractAcceptance.C:126
 ExtractAcceptance.C:127
 ExtractAcceptance.C:128
 ExtractAcceptance.C:129
 ExtractAcceptance.C:130
 ExtractAcceptance.C:131
 ExtractAcceptance.C:132
 ExtractAcceptance.C:133
 ExtractAcceptance.C:134
 ExtractAcceptance.C:135
 ExtractAcceptance.C:136
 ExtractAcceptance.C:137
 ExtractAcceptance.C:138
 ExtractAcceptance.C:139
 ExtractAcceptance.C:140
 ExtractAcceptance.C:141
 ExtractAcceptance.C:142
 ExtractAcceptance.C:143
 ExtractAcceptance.C:144
 ExtractAcceptance.C:145
 ExtractAcceptance.C:146
 ExtractAcceptance.C:147
 ExtractAcceptance.C:148
 ExtractAcceptance.C:149
 ExtractAcceptance.C:150
 ExtractAcceptance.C:151
 ExtractAcceptance.C:152
 ExtractAcceptance.C:153
 ExtractAcceptance.C:154
 ExtractAcceptance.C:155
 ExtractAcceptance.C:156
 ExtractAcceptance.C:157
 ExtractAcceptance.C:158
 ExtractAcceptance.C:159
 ExtractAcceptance.C:160
 ExtractAcceptance.C:161
 ExtractAcceptance.C:162
 ExtractAcceptance.C:163
 ExtractAcceptance.C:164
 ExtractAcceptance.C:165
 ExtractAcceptance.C:166
 ExtractAcceptance.C:167
 ExtractAcceptance.C:168
 ExtractAcceptance.C:169
 ExtractAcceptance.C:170
 ExtractAcceptance.C:171
 ExtractAcceptance.C:172
 ExtractAcceptance.C:173
 ExtractAcceptance.C:174
 ExtractAcceptance.C:175
 ExtractAcceptance.C:176
 ExtractAcceptance.C:177
 ExtractAcceptance.C:178
 ExtractAcceptance.C:179
 ExtractAcceptance.C:180
 ExtractAcceptance.C:181
 ExtractAcceptance.C:182
 ExtractAcceptance.C:183
 ExtractAcceptance.C:184
 ExtractAcceptance.C:185
 ExtractAcceptance.C:186
 ExtractAcceptance.C:187
 ExtractAcceptance.C:188
 ExtractAcceptance.C:189
 ExtractAcceptance.C:190
 ExtractAcceptance.C:191
 ExtractAcceptance.C:192
 ExtractAcceptance.C:193
 ExtractAcceptance.C:194
 ExtractAcceptance.C:195
 ExtractAcceptance.C:196
 ExtractAcceptance.C:197
 ExtractAcceptance.C:198
 ExtractAcceptance.C:199
 ExtractAcceptance.C:200
 ExtractAcceptance.C:201
 ExtractAcceptance.C:202
 ExtractAcceptance.C:203
 ExtractAcceptance.C:204
 ExtractAcceptance.C:205
 ExtractAcceptance.C:206
 ExtractAcceptance.C:207
 ExtractAcceptance.C:208
 ExtractAcceptance.C:209
 ExtractAcceptance.C:210
 ExtractAcceptance.C:211
 ExtractAcceptance.C:212
 ExtractAcceptance.C:213
 ExtractAcceptance.C:214
 ExtractAcceptance.C:215
 ExtractAcceptance.C:216
 ExtractAcceptance.C:217
 ExtractAcceptance.C:218
 ExtractAcceptance.C:219
 ExtractAcceptance.C:220
 ExtractAcceptance.C:221
 ExtractAcceptance.C:222
 ExtractAcceptance.C:223
 ExtractAcceptance.C:224
 ExtractAcceptance.C:225
 ExtractAcceptance.C:226
 ExtractAcceptance.C:227
 ExtractAcceptance.C:228
 ExtractAcceptance.C:229
 ExtractAcceptance.C:230
 ExtractAcceptance.C:231
 ExtractAcceptance.C:232
 ExtractAcceptance.C:233
 ExtractAcceptance.C:234
 ExtractAcceptance.C:235
 ExtractAcceptance.C:236
 ExtractAcceptance.C:237
 ExtractAcceptance.C:238
 ExtractAcceptance.C:239
 ExtractAcceptance.C:240
 ExtractAcceptance.C:241
 ExtractAcceptance.C:242
 ExtractAcceptance.C:243
 ExtractAcceptance.C:244
 ExtractAcceptance.C:245
 ExtractAcceptance.C:246
 ExtractAcceptance.C:247
 ExtractAcceptance.C:248
 ExtractAcceptance.C:249
 ExtractAcceptance.C:250
 ExtractAcceptance.C:251
 ExtractAcceptance.C:252
 ExtractAcceptance.C:253
 ExtractAcceptance.C:254
 ExtractAcceptance.C:255
 ExtractAcceptance.C:256
 ExtractAcceptance.C:257
 ExtractAcceptance.C:258
 ExtractAcceptance.C:259
 ExtractAcceptance.C:260
 ExtractAcceptance.C:261
 ExtractAcceptance.C:262
 ExtractAcceptance.C:263
 ExtractAcceptance.C:264
 ExtractAcceptance.C:265
 ExtractAcceptance.C:266
 ExtractAcceptance.C:267
 ExtractAcceptance.C:268
 ExtractAcceptance.C:269
 ExtractAcceptance.C:270
 ExtractAcceptance.C:271
 ExtractAcceptance.C:272
 ExtractAcceptance.C:273
 ExtractAcceptance.C:274
 ExtractAcceptance.C:275
 ExtractAcceptance.C:276
 ExtractAcceptance.C:277
 ExtractAcceptance.C:278
 ExtractAcceptance.C:279
 ExtractAcceptance.C:280
 ExtractAcceptance.C:281
 ExtractAcceptance.C:282
 ExtractAcceptance.C:283
 ExtractAcceptance.C:284
 ExtractAcceptance.C:285
 ExtractAcceptance.C:286
 ExtractAcceptance.C:287
 ExtractAcceptance.C:288
 ExtractAcceptance.C:289
 ExtractAcceptance.C:290
 ExtractAcceptance.C:291
 ExtractAcceptance.C:292
 ExtractAcceptance.C:293
 ExtractAcceptance.C:294
 ExtractAcceptance.C:295
 ExtractAcceptance.C:296
 ExtractAcceptance.C:297
 ExtractAcceptance.C:298
 ExtractAcceptance.C:299
 ExtractAcceptance.C:300
 ExtractAcceptance.C:301
 ExtractAcceptance.C:302
 ExtractAcceptance.C:303
 ExtractAcceptance.C:304
 ExtractAcceptance.C:305
 ExtractAcceptance.C:306
 ExtractAcceptance.C:307
 ExtractAcceptance.C:308
 ExtractAcceptance.C:309
 ExtractAcceptance.C:310
 ExtractAcceptance.C:311
 ExtractAcceptance.C:312
 ExtractAcceptance.C:313