ROOT logo
///////////////////////////////////////////////
// Simple event display for channel spectra
// Input file should be raw DATE root tree file
///////////////////////////////////////////////

// for the readout: 1 FEE reads out LED ref. info for the whole SuperModule
// 1 CSP per StripModule
const int NSTRIPS = 24; // number of StripModules in SuperModule
const int TOTCHAN = NSTRIPS * 2;	// *2 since we have high gain and low gain
// we group the calibrations in 3 sets of 8 strips
const int NSETS = 3; 
const int NSTRIPS_IN_SET = 8;

// gamma2 fit function
double fitfun(double *x, double *par) {
  double Amp	= par[0];
  double Tmax	= par[1];
  double Tau	= par[2];
  double Ped	= par[3];
  double gammaN   = par[4];
  double t = 0;
  if(Tau) t = (x[0] - Tmax + Tau)/Tau;
  if(t<0) t = 0;
  
  // Since we have now set gammaN to 2, we replace the pow(t, 2) call in
  // double f = Amp * pow(t,gammaN) * exp(gammaN*(1-t)) + Ped;
  // with just t*t
  double f = Amp * t*t * exp(gammaN*(1-t)) + Ped;
  return f;
}

// main method
void LEDRef_evtdis(const int runno = 615,
		   const int gainv = 0,  /*0=low, 1=high*/
		   const int evtnum= -10,
		   int ymax=1023, // set the scale of plots
		   const int delay = 1)  // -1=no delay, wait for input, X>=0 => sleep aprox. X sec. after making plot
{
  // set ranges to plot
  const int strip_f = 0; // first
  const int strip_l = NSTRIPS - 1;
  
  const int nsamples = 65; // number of ADC time samples per channel and event
  
  const int saveplot = 0;
  const int numbering      = 1; // 0: no numbering, 1: nubering on each plot
  const int dofit = 0; // 0: no fit, 1: try to fit the spectra 
  const int debug    = 0;
  const float gammaN = 2;
  // end of setup    
  
  // Assume we are just interested in the 1st segment, _0.root below for fname*
  Char_t fname[256];
  sprintf(fname, "/local/data/Run_%09d.Seq_1A.Stream_0.root",runno);
  cout << "TOTCHAN " << TOTCHAN << endl;

  // set up a raw reader of the data
  AliRawReader *rawReader = NULL;
  rawReader = new AliRawReaderRoot(fname);
  AliCaloRawStream *in = NULL; 
  in = new AliCaloRawStream(rawReader,"EMCAL");

  // set up histograms
  TH1F *hfit[TOTCHAN];
  TF1 *f1[TOTCHAN];
  char ch_label[TOTCHAN][100];
  char buff1[100];
  char name[80];
  for(int i=0; i<TOTCHAN; i++) {
    sprintf(buff1,"hfit_%d",i);
    hfit[i] = new TH1F(buff1,"hfit", nsamples , -0.5, nsamples - 0.5);
    hfit[i]->SetDirectory(0);
    sprintf(name,"f1_%d",i);
    f1[i] = new TF1(name,fitfun,0,70,5);
    f1[i]->SetLineWidth(2);
    f1[i]->SetLineColor(2);

    //	int idx = istrip + NSTRIPS * gain; // encoding used later
    int gain = i / (NSTRIPS);
    int istrip = i % NSTRIPS;
    sprintf(ch_label[i], "Strip%02d", istrip);
  }
  
  TCanvas *cc1 = new TCanvas("cc1","3 columns of 8 strips each",600,800);
  int numcol = NSETS;
  int numrow = NSTRIPS_IN_SET;
  cc1->Divide(numcol, numrow);
  
  TText *t = new TText;
  t->SetTextSize(0.17);
  int clr[2] = {4,2}; // colors
  
  // figure out which events we should look at
  int firstevent = evtnum;
  int lastevent = evtnum;
  if (evtnum < 0) { // get a bunch of events
    firstevent = 0;
    lastevent = - evtnum;
  }
  if (evtnum == 0) { // get all events
    firstevent = 0;
    lastevent = 1000000;
  }
  
  Int_t iev =0;
  AliRawEventHeaderBase *aliHeader=NULL;    
  while ( rawReader->NextEvent() && iev < firstevent) {
    aliHeader = (AliRawEventHeaderBase*) rawReader->GetEventHeader();
    iev++;
  }
  
  // loop over selected events
  while ( rawReader->NextEvent() && iev <= lastevent) {
    aliHeader = (AliRawEventHeaderBase*) rawReader->GetEventHeader();
    int runNumber = aliHeader->Get("RunNb"); 
    
    cout << "Found run number " << runNumber << endl;
    
    // reset histograms
    for(int i=0; i<TOTCHAN; i++) {
      hfit[i]->Reset();
    }
    
    // get events (the "1" ensures that we actually select all events for now)
    if ( 1 || aliHeader->Get("Type") == AliRawEventHeaderBase::kPhysicsEvent ) {
      const UInt_t * evtId = aliHeader->GetP("Id");
      int evno_raw = (int) evtId[0];
      int timestamp = aliHeader->Get("Timestamp");
      
      cout << " evno " << evno_raw
	   << " size " << aliHeader->GetEventSize()
	   << " type " << aliHeader->Get("Type")
	   << " type name " << aliHeader->GetTypeName()
	   << " timestamp " << timestamp
	   << endl;
      
      /// process_event stream
      while ( in->Next() ) {
	
	int strip = in->GetColumn();
	int gain = in->GetRow();
	
	if (in->IsLEDMonData()) {
	  
	  int idx = strip + NSTRIPS*gain;
	  //cout << "hist idx " << idx << endl;
	  
	  if (idx < 0 || idx > TOTCHAN) { 
	    cout << "Hist idx out of range: " << idx << endl;
	  }
	  else { // reasonable range of idx
	    hfit[idx]->SetBinContent(in->GetTime(), in->GetSignal());
	  }

	} // LED Ref data only

      } // Raw data read
    
      // Next: let's actually plot the data..
      for (Int_t strip = strip_f; strip <= strip_l; strip++) {
	
	int idx = strip + NSTRIPS*gainv;
	
	// which set/column does the strip belong in
	int iset = strip / NSTRIPS_IN_SET; 	  
	int within_set = strip % NSTRIPS_IN_SET; 	  
	// on which pad should we plot it?
	int pad_id = (NSTRIPS_IN_SET-1-within_set)*NSETS + iset + 1;
	
	cout << "strip " << strip 
	     << ". set="<< iset << ", within_set=" << within_set
	     << ", pad=" << pad_id << endl;
	cc1->cd(pad_id);
	hfit[idx]->SetTitle("");
	hfit[idx]->SetFillColor(5);
	hfit[idx]->SetMaximum(ymax);
	hfit[idx]->SetMinimum(0);
	// we may or may not decide to fit the data
	if (dofit) {
	  f1[i]->SetParameter(0, 0); // initial guess; zero amplitude :=)
	  hfit[idx]->Fit(f1[i]);
	}
	hfit[idx]->Draw();
	if( numbering ) {
	  t->SetTextColor(clr[gainv]);
	  t->DrawTextNDC(0.65,0.65,ch_label[idx]);
	}
      }

      // add some extra text on the canvas
      // print a box showing run #, evt #, and timestamp
      cc1->cd();
      // first draw transparent pad
      TPad *trans = new TPad("trans","",0,0,1,1);
      trans->SetFillStyle(4000);
      trans->Draw();
      trans->cd();
      // then draw text
      TPaveText *label = new TPaveText(.2,.11,.8,.14,"NDC"); 
      //  label->Clear();
      label->SetBorderSize(1);
      label->SetFillColor(0);
      label->SetLineColor(clr[gainv]);
      label->SetTextColor(clr[gainv]);
      //label->SetFillStyle(0);
      TDatime d;
      d.Set(timestamp);
      sprintf(name,"Run %d, Event %d, Hist Max %d, %s",runno,iev,ymax,d.AsString());
      label->AddText(name);
      label->Draw();
      cc1->Update();
      cout << "Done" << endl;
      
      // some shenanigans to hold the plotting, if requested
      if (firstevent != lastevent) {
	if (delay == -1) {
	  // wait for character input before proceeding
	  cout << " enter y to proceed " << endl;
	  char dummy[2];
	  cin >> dummy;
	  cout << " read " << dummy << endl;
	  if (strcmp(dummy, "y")==0) {
	    cout << " ok, continuing with event " << iev+1 << endl;
	  }
	  else {
	    cout << " ok, exiting " << endl;
	    //exit(1);
	  }
	}
	else {
	  cout << "Sleeping for " << delay * 500 << endl;
	  gSystem->Sleep(delay * 500);
	}
      }

      // save plot, if setup/requested to do so
      char plotname[100];
      if (saveplot==1) {
	sprintf(plotname,"Run_%d_LEDRef_Ev%d_Gain%d_MaxHist%d.gif",
		runno,iev,gainv,ymax);  
	cout <<"SAVING plot:"<< plotname << endl;
	cc1->SaveAs(plotname);
      }

    } // event selection

  iev ++;
  } // event loop

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