ROOT logo
void ITSSDDQAMaker(char *iFile, Int_t MaxEvts=1000000, Int_t FirstEvt=0) {

  //To have Baseline Histos uncomment parts with " // BL!!! " comment

cout << "SDD Quality Assurance Prototype Macro" << endl; 

const Int_t nSDDmodules= 260;
const Int_t imodoffset = 240;
const Int_t modtotSDD  = nSDDmodules*2;
const Int_t anode = 256;

Float_t xi = -0.5;
Float_t xf = xi + nSDDmodules;
TH1F *hModulePattern = new TH1F("hModulePattern","Modules pattern",nSDDmodules,xi,xf);
xf = xi + modtotSDD;
TH1F *hModuleSidePattern = new TH1F("hModuleSidePattern","Modules/Side pattern",modtotSDD,xi,xf);

TH2F *hModuleChargeMap[modtotSDD];  //260 dx e 260 sx  with A, T, Q
TH2F *hModuleCountsMap[modtotSDD];  //260 dx e 260 sx  with A, T, Ncounts
TH2I *hModuleCarlos = new TH2I("hModuleCarlos","hModuleCarlos",modtotSDD,xi,xf,101,-0.5,100.5);
/*
  TH1F *hModuleSideBL[modtotSDD][anode];                                // BL!!!
*/ 


//-------histograms definition 
Char_t *hisnam = new Char_t[50];
Char_t *histit = new Char_t[50];  
Char_t *hisnam2 = new Char_t[50];
Char_t *histit2 = new Char_t[50];    
Char_t *hisnam3 = new Char_t[50];
 for(Int_t imod=0; imod<nSDDmodules;imod++){
   for(Int_t isid=0;isid<2;isid++){
     Int_t index=2*imod+isid;       //260*2 position

     sprintf(hisnam,"chargeMap%d",index);
     sprintf(histit,"Total Charge, module number %d",index);
     hModuleChargeMap[index]=new TH2F(hisnam,histit,256,-0.5,255.5,256,-0.5,255.5);  

     sprintf(hisnam2,"countsMap%d",index);
     sprintf(histit2,"Number of Counts, module number %d",index);
     hModuleCountsMap[index] = new TH2F(hisnam2,histit2,256,-0.5,255.5,256,-0.5,255.5);
     /*
       for(Int_t ianode=0; ianode<anode; ianode++){                         // BL!!!
       sprintf(hisnam3,"BL_module_%d_%d",index,ianode); 
       //cout<<hisnam3 <<endl;
       hModuleSideBL[index][ianode] = new TH1F(hisnam3,hisnam3,256,0.,1024.);
     }
     */
   }
 }

  TString strFile = iFile;
  strFile += "?EventType=7";
  AliRawReader *rd = new AliRawReaderDate(strFile.Data(),FirstEvt);  // open run
  Int_t evCounter = 0;
  do{                       // start loop on events
    if(++evCounter > MaxEvts) { cout << MaxEvts << " events read, stop" << endl; evCounter--; break; }  
    cout << "Read Event: " << evCounter+FirstEvt-1 << endl;

    rd->RequireHeader(kFALSE);             
    rd->Reset();                           // reset the current position to the beginning of the event
 
    Int_t nSkip = 0;                     // number of skipped signals
    AliITSRawStreamSDD s(rd);            //This class provides access to ITS SDD digits in raw data.
    Int_t iddl;
    Int_t isddmod;
    Int_t moduleSDD;
    gStyle->SetPalette(1);
    while(s.Next()){                     //read the next raw digit; returns kFALSE if there is no digit left
      if(s.IsCompletedModule()) continue;
      if(s.IsCompletedDDL()) continue;
      iddl=rd->GetDDLID()-2; // -2 is temporary for test raw data

	isddmod=s.GetModuleNumber(iddl,s.GetCarlosId());        //this is the FEE Carlos
       	//cout<<"DDLID= "<<iddl <<"; Module number= " <<isddmod  <<endl;
	if(isddmod >= imodoffset) { 
	  hModulePattern->Fill(isddmod-imodoffset);             // 0 to 259    so  240 to 499
	  moduleSDD=2*(isddmod-imodoffset)+s.GetChannel();
          hModuleSidePattern->Fill(moduleSDD);                  // 0 to 519
	  hModuleCarlos->Fill(isddmod-imodoffset,s.GetCarlosId());
          //cout << "anode " << s.GetCoord1() << ", time bin: " << s.GetCoord2() << ", charge: " << s.GetSignal() << endl;	  
	  Int_t coord1 = s.GetCoord1();
 	  Int_t coord2 = s.GetCoord2();
 	  Int_t signal = s.GetSignal();
	  hModuleChargeMap[moduleSDD]->Fill(coord2, coord1,signal);
          hModuleCountsMap[moduleSDD]->Fill(coord2, coord1 );   
	  //hModuleSideBL[moduleSDD][coord1]->Fill(signal);             // BL  !!!
	} else {
	  nSkip++;
	}
    }    
    cout << "End of Event " << evCounter+FirstEvt-1 << ", " << nSkip << " wrong module numbers" << endl;
  } while(rd->NextEvent()); // end loop on events
  delete rd;

  cout << "end after " << evCounter << " events" << endl;
  /*
  TNtuple *Baseline = new TNtuple("Baseline","Baseline","HalfModule:Anode:Mean:RMS");      // BL!!!
  Float_t meanBL;
  Float_t rmsBL;  
  */
  for(Int_t i=0; i<modtotSDD; i++){   
    if(hModuleSidePattern->GetBinContent(i+1)){              //check if they're not empty
      hModuleChargeMap[i]->GetXaxis()->SetTitle("Time Bin");
      hModuleChargeMap[i]->GetYaxis()->SetTitle("Anode"); 
      hModuleCountsMap[i]->GetXaxis()->SetTitle("Time Bin");
      hModuleCountsMap[i]->GetYaxis()->SetTitle("Anode");  
      /*
      for(Int_t ianode=0; ianode<anode; ianode++ ){                                      // BL!!!
	hModuleSideBL[i][ianode]->GetXaxis()->SetTitle("ADC counts");
	hModuleSideBL[i][ianode]->GetYaxis()->SetTitle("#"); 
	meanBL = hModuleSideBL[i][ianode]->GetMean();
	rmsBL = hModuleSideBL[i][ianode]->GetRMS();
	gaussfitBL = hModuleSideBL[i][ianode]->Fit("gaus");	
	Baseline->Fill(i,ianode,meanBL,rmsBL);
      }
      */
    }
  }  
  
  hModuleSidePattern->GetXaxis()->SetTitle("2*(Module Number-1)+Side");
  hModuleSidePattern->GetYaxis()->SetTitle("Counts");  
  hModulePattern->GetXaxis()->SetTitle("Module Number");  
  hModulePattern->GetYaxis()->SetTitle("Counts");  


  //-------store Histograms
  cout << "Store Histograms" << endl;
  TString oFileName(iFile);
  oFileName.Append(".root");
  TFile *oFile = TFile::Open(oFileName,"recreate");
  hModulePattern->Write();
  hModuleSidePattern->Write();
  hModuleCarlos->Write();
  for(Int_t i=0; i<modtotSDD; i++){ 
      if(hModuleSidePattern->GetBinContent(i+1)){            //check if they're not empty
	hModuleChargeMap[i]->Write();
	hModuleCountsMap[i]->Write();     
	/* 
	for(Int_t ianode=0; ianode<anode; ianode++ ){                           // BL!!!
 	  hModuleSideBL[i][ianode]->Write();
	  Baseline->Write();
 	}
	*/
      }
  }
  
  oFile->Close();
  cout << "Clear memory" << endl;
  for(Int_t imod=0; imod<nSDDmodules;imod++){
    for(Int_t isid=0;isid<2;isid++){
      Int_t index=2*imod+isid;       //260*2 position
      delete hModuleChargeMap[index];
      delete hModuleCountsMap[index];       
      /*
      for(Int_t ianode=0; ianode<anode; ianode++ ){                              // BL!!!
	delete hModuleSideBL[index][ianode]; 
	delete Baseline;
      }
      */
    }
  }
  delete hModulePattern;
  delete hModuleSidePattern;
  delete hModuleCarlos;

}
 ITSSDDQAMaker.C:1
 ITSSDDQAMaker.C:2
 ITSSDDQAMaker.C:3
 ITSSDDQAMaker.C:4
 ITSSDDQAMaker.C:5
 ITSSDDQAMaker.C:6
 ITSSDDQAMaker.C:7
 ITSSDDQAMaker.C:8
 ITSSDDQAMaker.C:9
 ITSSDDQAMaker.C:10
 ITSSDDQAMaker.C:11
 ITSSDDQAMaker.C:12
 ITSSDDQAMaker.C:13
 ITSSDDQAMaker.C:14
 ITSSDDQAMaker.C:15
 ITSSDDQAMaker.C:16
 ITSSDDQAMaker.C:17
 ITSSDDQAMaker.C:18
 ITSSDDQAMaker.C:19
 ITSSDDQAMaker.C:20
 ITSSDDQAMaker.C:21
 ITSSDDQAMaker.C:22
 ITSSDDQAMaker.C:23
 ITSSDDQAMaker.C:24
 ITSSDDQAMaker.C:25
 ITSSDDQAMaker.C:26
 ITSSDDQAMaker.C:27
 ITSSDDQAMaker.C:28
 ITSSDDQAMaker.C:29
 ITSSDDQAMaker.C:30
 ITSSDDQAMaker.C:31
 ITSSDDQAMaker.C:32
 ITSSDDQAMaker.C:33
 ITSSDDQAMaker.C:34
 ITSSDDQAMaker.C:35
 ITSSDDQAMaker.C:36
 ITSSDDQAMaker.C:37
 ITSSDDQAMaker.C:38
 ITSSDDQAMaker.C:39
 ITSSDDQAMaker.C:40
 ITSSDDQAMaker.C:41
 ITSSDDQAMaker.C:42
 ITSSDDQAMaker.C:43
 ITSSDDQAMaker.C:44
 ITSSDDQAMaker.C:45
 ITSSDDQAMaker.C:46
 ITSSDDQAMaker.C:47
 ITSSDDQAMaker.C:48
 ITSSDDQAMaker.C:49
 ITSSDDQAMaker.C:50
 ITSSDDQAMaker.C:51
 ITSSDDQAMaker.C:52
 ITSSDDQAMaker.C:53
 ITSSDDQAMaker.C:54
 ITSSDDQAMaker.C:55
 ITSSDDQAMaker.C:56
 ITSSDDQAMaker.C:57
 ITSSDDQAMaker.C:58
 ITSSDDQAMaker.C:59
 ITSSDDQAMaker.C:60
 ITSSDDQAMaker.C:61
 ITSSDDQAMaker.C:62
 ITSSDDQAMaker.C:63
 ITSSDDQAMaker.C:64
 ITSSDDQAMaker.C:65
 ITSSDDQAMaker.C:66
 ITSSDDQAMaker.C:67
 ITSSDDQAMaker.C:68
 ITSSDDQAMaker.C:69
 ITSSDDQAMaker.C:70
 ITSSDDQAMaker.C:71
 ITSSDDQAMaker.C:72
 ITSSDDQAMaker.C:73
 ITSSDDQAMaker.C:74
 ITSSDDQAMaker.C:75
 ITSSDDQAMaker.C:76
 ITSSDDQAMaker.C:77
 ITSSDDQAMaker.C:78
 ITSSDDQAMaker.C:79
 ITSSDDQAMaker.C:80
 ITSSDDQAMaker.C:81
 ITSSDDQAMaker.C:82
 ITSSDDQAMaker.C:83
 ITSSDDQAMaker.C:84
 ITSSDDQAMaker.C:85
 ITSSDDQAMaker.C:86
 ITSSDDQAMaker.C:87
 ITSSDDQAMaker.C:88
 ITSSDDQAMaker.C:89
 ITSSDDQAMaker.C:90
 ITSSDDQAMaker.C:91
 ITSSDDQAMaker.C:92
 ITSSDDQAMaker.C:93
 ITSSDDQAMaker.C:94
 ITSSDDQAMaker.C:95
 ITSSDDQAMaker.C:96
 ITSSDDQAMaker.C:97
 ITSSDDQAMaker.C:98
 ITSSDDQAMaker.C:99
 ITSSDDQAMaker.C:100
 ITSSDDQAMaker.C:101
 ITSSDDQAMaker.C:102
 ITSSDDQAMaker.C:103
 ITSSDDQAMaker.C:104
 ITSSDDQAMaker.C:105
 ITSSDDQAMaker.C:106
 ITSSDDQAMaker.C:107
 ITSSDDQAMaker.C:108
 ITSSDDQAMaker.C:109
 ITSSDDQAMaker.C:110
 ITSSDDQAMaker.C:111
 ITSSDDQAMaker.C:112
 ITSSDDQAMaker.C:113
 ITSSDDQAMaker.C:114
 ITSSDDQAMaker.C:115
 ITSSDDQAMaker.C:116
 ITSSDDQAMaker.C:117
 ITSSDDQAMaker.C:118
 ITSSDDQAMaker.C:119
 ITSSDDQAMaker.C:120
 ITSSDDQAMaker.C:121
 ITSSDDQAMaker.C:122
 ITSSDDQAMaker.C:123
 ITSSDDQAMaker.C:124
 ITSSDDQAMaker.C:125
 ITSSDDQAMaker.C:126
 ITSSDDQAMaker.C:127
 ITSSDDQAMaker.C:128
 ITSSDDQAMaker.C:129
 ITSSDDQAMaker.C:130
 ITSSDDQAMaker.C:131
 ITSSDDQAMaker.C:132
 ITSSDDQAMaker.C:133
 ITSSDDQAMaker.C:134
 ITSSDDQAMaker.C:135
 ITSSDDQAMaker.C:136
 ITSSDDQAMaker.C:137
 ITSSDDQAMaker.C:138
 ITSSDDQAMaker.C:139
 ITSSDDQAMaker.C:140
 ITSSDDQAMaker.C:141
 ITSSDDQAMaker.C:142
 ITSSDDQAMaker.C:143
 ITSSDDQAMaker.C:144
 ITSSDDQAMaker.C:145
 ITSSDDQAMaker.C:146
 ITSSDDQAMaker.C:147
 ITSSDDQAMaker.C:148
 ITSSDDQAMaker.C:149
 ITSSDDQAMaker.C:150
 ITSSDDQAMaker.C:151
 ITSSDDQAMaker.C:152
 ITSSDDQAMaker.C:153
 ITSSDDQAMaker.C:154
 ITSSDDQAMaker.C:155
 ITSSDDQAMaker.C:156
 ITSSDDQAMaker.C:157
 ITSSDDQAMaker.C:158
 ITSSDDQAMaker.C:159
 ITSSDDQAMaker.C:160
 ITSSDDQAMaker.C:161
 ITSSDDQAMaker.C:162
 ITSSDDQAMaker.C:163
 ITSSDDQAMaker.C:164
 ITSSDDQAMaker.C:165
 ITSSDDQAMaker.C:166
 ITSSDDQAMaker.C:167
 ITSSDDQAMaker.C:168
 ITSSDDQAMaker.C:169