ROOT logo
// Script to create dead channel map and store them into CDB
//  - 4 sets of maps parameters can be created, with now dead channels 
// and 5%, 10%, 20% and 30% of dead channels 
//  - it reads the stored map in a given file. 
// Author: Gustavo Conesa

//.x $ALICE_ROOT/EMCAL/macros/CalibrationDB/AliEMCALSetTowerStatusCDB.C

#if !defined(__CINT__)
#include <TControlBar.h>
#include <TString.h>
#include <TRandom.h>
#include <TStyle.h>
#include <TH2.h>
#include <TF1.h>
#include <TCanvas.h>

#include "AliRun.h"
#include "AliCaloCalibPedestal.h"
#include "AliEMCALGeoParams.h"
#include "AliCDBMetaData.h"
#include "AliCDBId.h"
#include "AliCDBEntry.h"
#include "AliCDBManager.h"
#include "AliCDBStorage.h"
#endif


void AliEMCALPedestalCDB()
{
  TControlBar *menu = new TControlBar("vertical","EMCAL CDB");
  menu->AddButton("Help to run EMCAL CDB","Help()",
		  "Explains how to use EMCAL CDS menus");
  menu->AddButton("Equal Tower Status Map, all Alive","SetTowerStatusMap(0)",
		  "Set all channels to alive");
  menu->AddButton("Create Random Status Map, 5% dead","SetTowerStatusMap(5)",
		  "Set randomly 5% of the channels dead");
  menu->AddButton("Create Random Status Map, 10% dead","SetTowerStatusMap(10)",
					"Set randomly 10% of the channels dead");
  menu->AddButton("Create Random Status Map, 20% dead","SetTowerStatusMap(20)",
					"Set randomly 20% of the channels dead");
  menu->AddButton("Create Random Status Map, 30% dead","SetTowerStatusMap(30)",
					"Set randomly 30% of the channels dead");
  menu->AddButton("Set Map from txt file","SetTowerStatusMap(\"map.txt\")",
		  "Read bad channels from txt file and set them in root file");
  menu->AddButton("Read Tower Status Map","GetTowerStatusMap()",
		  "Read initial equal calibration coefficients");
  menu->Show();
}

//------------------------------------------------------------------------
void Help()
{
  char *string =
    "\nSet tower status map (dead, hot, alive) and write them into ALICE CDB. Press button \"Equal kAlive\" to set all channels alive. Press button \"Random, 5% dead\" to create random dead channel map at 5%\n";
  printf(string);
}

//------------------------------------------------------------------------
void SetTowerStatusMap(Int_t percent=0)
{
  // Writing status of all the channels in the OCDB with equal value
  // except a percent to be not alive. Right now only "alive" or "dead",
  // we need to implement the other cases like "hot"	

  TString sDBFolder ="local://PedestalsDB";
  Int_t firstRun   =  0; 
  Int_t lastRun    =  999999999;
  Int_t beamPeriod =  1;
  char* objFormat = Form("%d percent of bad channels", percent);
  
  AliCaloCalibPedestal *caloped=new AliCaloCalibPedestal(AliCaloCalibPedestal::kEmCal);
  caloped->Init();

  TObjArray map = caloped->GetDeadMap();
  printf("MAP entries %d\n",map.GetEntries());

  TRandom rn;
  //for(Int_t iSM = 0; iSM < AliEMCALGeoParams::fgkEMCALModules; iSM ++){
	for(Int_t iSM = 0; iSM < map.GetEntries(); iSM ++){
	  Int_t ndead = 0;
	  printf(" >>> SM %d <<< Entries %d, NbinsX %d, NbinsY %d\n",iSM,((TH2D*)map[iSM])->GetEntries(),((TH2D*)map[iSM])->GetNbinsX(),((TH2D*)map[iSM])->GetNbinsY());
		for(Int_t i = 0; i < ((TH2D*)map[iSM])->GetNbinsX() ; i++){
			for(Int_t j = 0; j < ((TH2D*)map[iSM])->GetNbinsY() ; j++){
				//printf("Bin (%d-%d) Content, before: %d ",i,j,((TH2D*)map[iSM])->GetBinContent(i, j));	
			    
				if(rn.Uniform(0,100) > percent)
				  caloped->SetChannelStatus(iSM, i, j, AliCaloCalibPedestal::kAlive);
				else{
					caloped->SetChannelStatus(iSM, i, j, AliCaloCalibPedestal::kDead);
					ndead++;
				}
				//printf("; after: %d \n",((TH2D*)map[iSM])->GetBinContent(i, j));	
			}	
		}
		caloped->SetDeadTowerCount(caloped->GetDeadTowerCount()+ndead);
		printf("--- dead %d\n",ndead);
  }

  printf("--- total dead %d\n",caloped->GetDeadTowerCount());

  //Store map into database
  
  AliCDBMetaData md;
  md.SetComment(objFormat);
  md.SetBeamPeriod(beamPeriod);
  md.SetResponsible("Gustavo Conesa");
  
  AliCDBId id("EMCAL/Calib/Pedestals",firstRun,lastRun); // create in EMCAL/Calib/Pedestal sDBFolder 

  AliCDBManager* man = AliCDBManager::Instance();  
  AliCDBStorage* loc = man->GetStorage(sDBFolder.Data());
  loc->Put(caloped, id, &md);

}

//____________________________________________




//------------------------------------------------------------------------
void SetTowerStatusMap(char * file = "map.txt")
{
  // Get the list of dead/hot channels from file and set them in OCDB
  
  TString sDBFolder ="local://PedestalsDB";
  Int_t firstRun   =  0; 
  Int_t lastRun    =  999999999;
  Int_t beamPeriod =  1;
  char* objFormat = Form("bad channels extracted from file %s", file);
  
  AliCaloCalibPedestal *caloped=new AliCaloCalibPedestal(AliCaloCalibPedestal::kEmCal);
  caloped->Init();

  // Read parameter file line-by-line  
  ifstream f;
  f.open(file);
  
  Int_t iSM=-1, icol=-1, irow=-1, istatus=-1, ndead=0 ;
  TString string;
  if (f.good()) {
    while(string.ReadLine(f, kFALSE) && !f.eof()) {
      
      sscanf(string.Data(), "%d %d %d %d",&iSM,&icol,&irow,&istatus);
      cout<<"SM= "<<iSM<<", col= "<<icol<<", row= "<<irow<<", status="<<istatus<<endl;
      if(iSM==-1) continue;
      caloped->SetChannelStatus(iSM, icol, irow, istatus);
      ndead++;
    }
  }
  caloped->SetDeadTowerCount(ndead-2);
  printf("--- dead %d\n",ndead-2);
  
  printf("--- total dead %d\n",caloped->GetDeadTowerCount());
  
  //Store map into database
  
  AliCDBMetaData md;
  md.SetComment(objFormat);
  md.SetBeamPeriod(beamPeriod);
  md.SetResponsible("Gustavo Conesa");
  
  AliCDBId id("EMCAL/Calib/Pedestals",firstRun,lastRun); // create in EMCAL/Calib/Pedestal sDBFolder 
  
  AliCDBManager* man = AliCDBManager::Instance();  
  AliCDBStorage* loc = man->GetStorage(sDBFolder.Data());
    loc->Put(caloped, id, &md);
    
}

  
//------------------------------------------------------------------------
void GetTowerStatusMap()
{
  // Read status map
 
  TString sDBFolder ="local://PedestalsDB";
  Int_t runNumber   =  0; 
  
  AliCaloCalibPedestal* caloped  = (AliCaloCalibPedestal*) 
	(AliCDBManager::Instance()
	 ->GetStorage(sDBFolder.Data())
	 ->Get("EMCAL/Calib/Pedestals", 
		   runNumber)->GetObject());

  cout<<endl;
  TObjArray map = caloped->GetDeadMap();
  printf("MAP entries %d\n",map.GetEntries());
  for(Int_t iSM = 0; iSM < map.GetEntries(); iSM ++){ 
	  TCanvas *cMap   = new TCanvas(Form("cMap%d",iSM),Form("SM %d dead map",iSM), 12,12,400,400);
	  cMap->Divide(1,1); 
 	  Int_t ndead = 0;
	  printf(" >>> SM %d <<< Entries %d, NbinsX %d, NbinsY %d\n",iSM,((TH2D*)map[iSM])->GetEntries(),((TH2D*)map[iSM])->GetNbinsX(),((TH2D*)map[iSM])->GetNbinsY());
	  for(Int_t i = 0; i < ((TH2D*)map[iSM])->GetNbinsX() ; i++){
	    for(Int_t j = 0; j < ((TH2D*)map[iSM])->GetNbinsY() ; j++){
	      if(((TH2D*)map[iSM])->GetBinContent(i, j)!=AliCaloCalibPedestal::kAlive)
		printf("Bin (%d-%d) Content: %d \n",i,j,((TH2D*)map[iSM])->GetBinContent(i, j));	
	      
	      if(((TH2D*)map[iSM])->GetBinContent(i, j)==AliCaloCalibPedestal::kDead ||
		 ((TH2D*)map[iSM])->GetBinContent(i, j)==AliCaloCalibPedestal::kHot)
		ndead++;
	    }	
	  }
	  printf("--- dead %d\n",ndead);  
	  cMap->cd(iSM);
	  (TH2D*)map[iSM])->Draw("lego2");
}

printf("Total DEAD %d\n", caloped->GetDeadTowerCount());

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