ROOT logo
/*
 author: Ionut-Cristian Arsene
 email: i.c.arsene@cern.ch
 
 Macro to process the TRD QA output for a given run and obtain:
 1. Detailed QA plots
 2. QA trending values
 3. Trending values for calibration extracted from OCDB
 4. Other OCDB parameters (e.g. beam intensity)
 */

AliCDBEntry* GetCDBentry(TString path, Bool_t owner);

//_________________________________________________________________________________
void ProcessTRDRunQA(TString qaFile, Int_t runNumber, TString dataType, 
		     Int_t year, TString period, TString pass, 
		     TString ocdbStorage) {
  //
  // Process run level QA
  // Create standard QA plots and trending tree in the current directory
  
  // Load needed libraries
  gSystem->SetIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS -I$ALICE_ROOT -I$ALICE_ROOT/TRD");
  gSystem->Load("libSTEERBase");
  gSystem->Load("libSTAT");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libTENDER");
  gSystem->Load("libTENDERSupplies");
  gSystem->Load("libCORRFW");
  gSystem->Load("libPWGPP");
  
  // Initialize a tree streamer
  TTreeSRedirector *treeStreamer = new TTreeSRedirector("trending.root","RECREATE");
  (*treeStreamer)<< "trending"
          << "run=" << runNumber;
  
  // connect to grid if its the case
  if(qaFile.Contains("alien://") || ocdbStorage.Contains("alien://") || ocdbStorage[0]=='\0')
    TGrid::Connect("alien://");
  
  // trending values from the ESD task ------------------------------------------------
  gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TRD/macros/makeResults.C");
  Double_t esdTrendValues[100]; 
  for(Int_t i=0;i<100;i++) esdTrendValues[i]=0.0;
  makeSummaryESD(qaFile.Data(), esdTrendValues, 1);
  const Int_t kNESDtrends = 24;
  const TString kESDTrendNames[kNESDtrends] = {
    "TPCTRDmatchEffPosAll","TPCTRDmatchEffPosAllErr",
    "TPCTRDmatchEffNegAll","TPCTRDmatchEffNegAllErr",					      
    "TRDTOFmatchEffPosAll","TRDTOFmatchEffPosAllErr",					      
    "TRDTOFmatchEffNegAll","TRDTOFmatchEffNegAllErr",						     
    "AvTRDtrkltsPerTrackAll", "AvTRDtrkltsPerTrackAllErr",						      
    "AvNclsPerTrackAll", "AvNclsPerTrackAllErr",						      
    "PHplateauHeight", "PHplateauHeightErr",						
    "PHplateauSlope", "PHplateauSlopeErr",						
    "QtotLandauMPV1GeVAll", "QtotLandauWidth1GeVAll",
    "PHplateauHeightAbsolute", "PHplateauHeightErrAbsolute",
    "PHplateauSlopeAbsolute", "PHplateauSlopeErrAbsolute",						
    "QtotLandauMPV1GeVAllAbsolute", "QtotLandauWidth1GeVAllAbsolute"
  };
  for(Int_t i=0; i<kNESDtrends; ++i)
    (*treeStreamer)<< "trending" << Form("%s=",kESDTrendNames[i].Data()) << esdTrendValues[i];
  
  // process the QA output from the other tasks----------------------------------------
  if(dataType.Contains("sim"))
    makeResults("PID DET", qaFile.Data());
  else  
    makeResults("NOMC PID DET", qaFile.Data());
  
  TFile *trendFile = new TFile("TRD.Trend.root","READ");
  if(!trendFile || !trendFile->IsOpen() ){
    printf("E-Couldn't open the TRD.Trend.root file. No tree.\n");
    if(trendFile)delete trendFile;trendFile=0;
    return;
  }
  TKey *tk(NULL); AliTRDtrendValue *tv(NULL); Int_t itv(0);
  Double_t trendValues[100]={0.0};
  TIterator *it(trendFile->GetListOfKeys()->MakeIterator());
  while((tk = (TKey*)it->Next()) && itv < 5000){
    if(!(tv = (AliTRDtrendValue*)trendFile->Get(tk->GetName()))) continue;
    trendValues[itv] = tv->GetVal();
    TString trendName = tv->GetName();
    (*treeStreamer)<< "trending" << Form("%s=", trendName.Data()) << trendValues[itv];
    itv++;
  }
  
  // get OCDB information---------------------------------------------------------------
  // switch off grid infos to reduce output and logfilesize                                               
  AliLog::SetGlobalLogLevel(AliLog::kFatal);
  AliCDBManager* man=AliCDBManager::Instance();
  if(ocdbStorage[0]=='\0')
    man->SetDefaultStorage(Form("alien://folder=/alice/data/%d/OCDB/", year));
  else
    man->SetDefaultStorage(ocdbStorage.Data());
  man->SetRun(runNumber);
  
  AliCDBEntry* entryExB = 0x0;
  AliCDBEntry* entryGainFactor = 0x0;
  AliCDBEntry* entryT0 = 0x0;
  AliCDBEntry* entryVdrift = 0x0;
  entryExB = man->Get("TRD/Calib/ChamberExB");
  entryGainFactor = man->Get("TRD/Calib/ChamberGainFactor");
  entryT0 = man->Get("TRD/Calib/ChamberT0");
  entryVdrift = man->Get("TRD/Calib/ChamberVdrift");
  AliTRDCalDet *caldetExB=0x0;
  AliTRDCalDet *caldetGainFactor=0x0;
  AliTRDCalDet *caldetT0=0x0;
  AliTRDCalDet *caldetVdrift=0x0;
  if(entryExB)        caldetExB        = (AliTRDCalDet*)entryExB->GetObject();
  if(entryGainFactor) caldetGainFactor = (AliTRDCalDet*)entryGainFactor->GetObject();
  if(entryT0)         caldetT0         = (AliTRDCalDet*)entryT0->GetObject();
  if(entryVdrift)     caldetVdrift     = (AliTRDCalDet*)entryVdrift->GetObject();
  // get the values
  Double_t meanExB        = (caldetExB ? caldetExB->CalcMean(1) : 0.0);
  Double_t rmsExB         = (caldetExB ? caldetExB->CalcRMS(1) : 0.0);
  Double_t meanGainFactor = (caldetGainFactor ? caldetGainFactor->CalcMean(1) : 0.0);
  Double_t rmsGainFactor  = (caldetGainFactor ? caldetGainFactor->CalcRMS(1) : 0.0);
  Double_t meanT0         = (caldetT0 ? caldetT0->CalcMean(1) : 0.0);
  Double_t rmsT0          = (caldetT0 ? caldetT0->CalcRMS(1) : 0.0);
  Double_t meanVdrift     = (caldetVdrift ? caldetVdrift->CalcMean(1) : 0.0);
  Double_t rmsVdrift      = (caldetVdrift ? caldetVdrift->CalcRMS(1) : 0.0);
  (*treeStreamer)<< "trending"
                 << "meanExB=" << meanExB
                 << "rmsExB=" << rmsExB
                 << "meanGainFactor=" << meanGainFactor
                 << "rmsGainFactor=" << rmsGainFactor
                 << "meanT0=" << meanT0
                 << "rmsT0=" << rmsT0
                 << "meanVdrift=" << meanVdrift
                 << "rmsVdrift=" << rmsVdrift;
  
  // Get the beam luminosity
  AliCDBEntry *entryLHCData = man->Get("GRP/GRP/LHCData");		 
  AliLHCData *lhcData = (entryLHCData ? (AliLHCData*)entryLHCData->GetObject() : 0x0);
  Double_t beamIntensityA=0.0;
  Double_t beamIntensityC=0.0;
  if(lhcData) {
    Int_t nLumiMeasA=lhcData->GetNLuminosityTotal(0); Int_t nA=0;
    Int_t nLumiMeasC=lhcData->GetNLuminosityTotal(1); Int_t nC=0;
    // Sum up the measurements
    AliLHCDipValF *dipVal0,*dipVal1;
    for(Int_t iLumiMeas=0;iLumiMeas<nLumiMeasA;iLumiMeas++){
      dipVal0 = lhcData->GetLuminosityTotal(0,iLumiMeas);
      if(dipVal0) {
	beamIntensityA += dipVal0->GetValue();
	++nA;
      }
    }
    beamIntensityA /= Double_t(nA);
    for(Int_t iLumiMeas=0;iLumiMeas<nLumiMeasC;iLumiMeas++){
      dipVal1 = lhcData->GetLuminosityTotal(1,iLumiMeas);
      if(dipVal1) {
	beamIntensityC += dipVal1->GetValue();
	++nC;
      }
    }
    beamIntensityC /= Double_t(nC);
  }
  (*treeStreamer)<< "trending"
                 << "beamIntensityA=" << beamIntensityA
                 << "beamIntensityC=" << beamIntensityC;
		 
  (*treeStreamer)<< "trending"
                 << "\n";
  delete treeStreamer;		 
}
 ProcessTRDRunQA.C:1
 ProcessTRDRunQA.C:2
 ProcessTRDRunQA.C:3
 ProcessTRDRunQA.C:4
 ProcessTRDRunQA.C:5
 ProcessTRDRunQA.C:6
 ProcessTRDRunQA.C:7
 ProcessTRDRunQA.C:8
 ProcessTRDRunQA.C:9
 ProcessTRDRunQA.C:10
 ProcessTRDRunQA.C:11
 ProcessTRDRunQA.C:12
 ProcessTRDRunQA.C:13
 ProcessTRDRunQA.C:14
 ProcessTRDRunQA.C:15
 ProcessTRDRunQA.C:16
 ProcessTRDRunQA.C:17
 ProcessTRDRunQA.C:18
 ProcessTRDRunQA.C:19
 ProcessTRDRunQA.C:20
 ProcessTRDRunQA.C:21
 ProcessTRDRunQA.C:22
 ProcessTRDRunQA.C:23
 ProcessTRDRunQA.C:24
 ProcessTRDRunQA.C:25
 ProcessTRDRunQA.C:26
 ProcessTRDRunQA.C:27
 ProcessTRDRunQA.C:28
 ProcessTRDRunQA.C:29
 ProcessTRDRunQA.C:30
 ProcessTRDRunQA.C:31
 ProcessTRDRunQA.C:32
 ProcessTRDRunQA.C:33
 ProcessTRDRunQA.C:34
 ProcessTRDRunQA.C:35
 ProcessTRDRunQA.C:36
 ProcessTRDRunQA.C:37
 ProcessTRDRunQA.C:38
 ProcessTRDRunQA.C:39
 ProcessTRDRunQA.C:40
 ProcessTRDRunQA.C:41
 ProcessTRDRunQA.C:42
 ProcessTRDRunQA.C:43
 ProcessTRDRunQA.C:44
 ProcessTRDRunQA.C:45
 ProcessTRDRunQA.C:46
 ProcessTRDRunQA.C:47
 ProcessTRDRunQA.C:48
 ProcessTRDRunQA.C:49
 ProcessTRDRunQA.C:50
 ProcessTRDRunQA.C:51
 ProcessTRDRunQA.C:52
 ProcessTRDRunQA.C:53
 ProcessTRDRunQA.C:54
 ProcessTRDRunQA.C:55
 ProcessTRDRunQA.C:56
 ProcessTRDRunQA.C:57
 ProcessTRDRunQA.C:58
 ProcessTRDRunQA.C:59
 ProcessTRDRunQA.C:60
 ProcessTRDRunQA.C:61
 ProcessTRDRunQA.C:62
 ProcessTRDRunQA.C:63
 ProcessTRDRunQA.C:64
 ProcessTRDRunQA.C:65
 ProcessTRDRunQA.C:66
 ProcessTRDRunQA.C:67
 ProcessTRDRunQA.C:68
 ProcessTRDRunQA.C:69
 ProcessTRDRunQA.C:70
 ProcessTRDRunQA.C:71
 ProcessTRDRunQA.C:72
 ProcessTRDRunQA.C:73
 ProcessTRDRunQA.C:74
 ProcessTRDRunQA.C:75
 ProcessTRDRunQA.C:76
 ProcessTRDRunQA.C:77
 ProcessTRDRunQA.C:78
 ProcessTRDRunQA.C:79
 ProcessTRDRunQA.C:80
 ProcessTRDRunQA.C:81
 ProcessTRDRunQA.C:82
 ProcessTRDRunQA.C:83
 ProcessTRDRunQA.C:84
 ProcessTRDRunQA.C:85
 ProcessTRDRunQA.C:86
 ProcessTRDRunQA.C:87
 ProcessTRDRunQA.C:88
 ProcessTRDRunQA.C:89
 ProcessTRDRunQA.C:90
 ProcessTRDRunQA.C:91
 ProcessTRDRunQA.C:92
 ProcessTRDRunQA.C:93
 ProcessTRDRunQA.C:94
 ProcessTRDRunQA.C:95
 ProcessTRDRunQA.C:96
 ProcessTRDRunQA.C:97
 ProcessTRDRunQA.C:98
 ProcessTRDRunQA.C:99
 ProcessTRDRunQA.C:100
 ProcessTRDRunQA.C:101
 ProcessTRDRunQA.C:102
 ProcessTRDRunQA.C:103
 ProcessTRDRunQA.C:104
 ProcessTRDRunQA.C:105
 ProcessTRDRunQA.C:106
 ProcessTRDRunQA.C:107
 ProcessTRDRunQA.C:108
 ProcessTRDRunQA.C:109
 ProcessTRDRunQA.C:110
 ProcessTRDRunQA.C:111
 ProcessTRDRunQA.C:112
 ProcessTRDRunQA.C:113
 ProcessTRDRunQA.C:114
 ProcessTRDRunQA.C:115
 ProcessTRDRunQA.C:116
 ProcessTRDRunQA.C:117
 ProcessTRDRunQA.C:118
 ProcessTRDRunQA.C:119
 ProcessTRDRunQA.C:120
 ProcessTRDRunQA.C:121
 ProcessTRDRunQA.C:122
 ProcessTRDRunQA.C:123
 ProcessTRDRunQA.C:124
 ProcessTRDRunQA.C:125
 ProcessTRDRunQA.C:126
 ProcessTRDRunQA.C:127
 ProcessTRDRunQA.C:128
 ProcessTRDRunQA.C:129
 ProcessTRDRunQA.C:130
 ProcessTRDRunQA.C:131
 ProcessTRDRunQA.C:132
 ProcessTRDRunQA.C:133
 ProcessTRDRunQA.C:134
 ProcessTRDRunQA.C:135
 ProcessTRDRunQA.C:136
 ProcessTRDRunQA.C:137
 ProcessTRDRunQA.C:138
 ProcessTRDRunQA.C:139
 ProcessTRDRunQA.C:140
 ProcessTRDRunQA.C:141
 ProcessTRDRunQA.C:142
 ProcessTRDRunQA.C:143
 ProcessTRDRunQA.C:144
 ProcessTRDRunQA.C:145
 ProcessTRDRunQA.C:146
 ProcessTRDRunQA.C:147
 ProcessTRDRunQA.C:148
 ProcessTRDRunQA.C:149
 ProcessTRDRunQA.C:150
 ProcessTRDRunQA.C:151
 ProcessTRDRunQA.C:152
 ProcessTRDRunQA.C:153
 ProcessTRDRunQA.C:154
 ProcessTRDRunQA.C:155
 ProcessTRDRunQA.C:156
 ProcessTRDRunQA.C:157
 ProcessTRDRunQA.C:158
 ProcessTRDRunQA.C:159
 ProcessTRDRunQA.C:160
 ProcessTRDRunQA.C:161
 ProcessTRDRunQA.C:162
 ProcessTRDRunQA.C:163
 ProcessTRDRunQA.C:164
 ProcessTRDRunQA.C:165
 ProcessTRDRunQA.C:166
 ProcessTRDRunQA.C:167
 ProcessTRDRunQA.C:168