/*
 * Reposition the device to file, block
 *
 * Returns: false on failure
 *          true  on success
 */
bool generic_tape_device::reposition(DCR *dcr, uint32_t rfile, uint32_t rblock)
{
   Dmsg4(100, "reposition from %u:%u to %u:%u\n", file, block_num, rfile, rblock);
   if (rfile < file) {
      Dmsg0(100, "Rewind\n");
      if (!rewind(NULL)) {
         return false;
      }
   }

   if (rfile > file) {
      Dmsg1(100, "fsf %d\n", rfile-file);
      if (!fsf(rfile-file)) {
         Dmsg1(100, "fsf failed! ERR=%s\n", bstrerror());
         return false;
      }
      Dmsg2(100, "wanted_file=%d at_file=%d\n", rfile, file);
   }

   if (rblock < block_num) {
      Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
      Dmsg0(100, "bsf 1\n");
      bsf(1);
      Dmsg0(100, "fsf 1\n");
      fsf(1);
      Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
   }

   if (has_cap(CAP_POSITIONBLOCKS) && rblock > block_num) {
      /*
       * Ignore errors as Bareos can read to the correct block.
       */
      Dmsg1(100, "fsr %d\n", rblock-block_num);
      return fsr(rblock-block_num);
   } else {
      while (rblock > block_num) {
         if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) {
            berrno be;
            dev_errno = errno;
            Dmsg2(30, "Failed to find requested block on %s: ERR=%s", prt_name, be.bstrerror());
            return false;
         }
         Dmsg2(300, "moving forward wanted_blk=%d at_blk=%d\n", rblock, block_num);
      }
   }

   return true;
}
// Read samples from the soundcard, filter it and then output it to the same
// soundcard
int main(int argc, const char **argv)
{
  Async::CppApplication app;

  Async::AudioIO::setSampleRate(16000);
  Async::AudioIO audio_io("alsa:plughw:0", 0);
  Async::AudioSource *prev_src = &audio_io;

    // A bandpass filter centered at 1000Hz with an approximate passband
    // bandwidth of 400Hz and a stopband attenuation of about 40dB.
  const size_t N = 128;   // N/fs=125Hz binwidth
  float coeff[N/2+1];
  std::memset(coeff, 0, sizeof(coeff));
  coeff[6] = 0.39811024;  // 750Hz
  coeff[7] = 1.0;         // 875Hz
  coeff[8] = 1.0;         // 1000Hz
  coeff[9] = 1.0;         // 1125Hz
  coeff[10] = 0.39811024; // 1250Hz
  Async::AudioFsf fsf(N, coeff);
  prev_src->registerSink(&fsf, true);
  prev_src = &fsf;

  prev_src->registerSink(&audio_io);
  prev_src = 0;

  if (!audio_io.open(Async::AudioIO::MODE_RDWR))
  {
    std::cout << "*** ERROR: Could not open audio device" << std::endl;
    exit(1);
  }

  app.exec();

  return 0;
}
Exemple #3
0
int main(int argc, char *argv[])
{
	movie *head, *left, *right;
	FILE *fp;

	head = creat ();

	left = head->next;
	right = head->pro;

	quicksort (left, right);
	print (head);
	insert (head);
	del_same (head);
	fpf (head, fp);
	fsf (head, fp);
	print (head);
	seek (head);

	return EXIT_SUCCESS;
}
Exemple #4
0
int vtape::tape_op(struct mtop *mt_com)
{
   int result=0;
   int count = mt_com->mt_count;

   if (!online) {
      errno = ENOMEDIUM;
      return -1;
   }

   switch (mt_com->mt_op)
   {
   case MTRESET:
   case MTNOP:
   case MTSETDRVBUFFER:
      break;

   default:
   case MTRAS1:
   case MTRAS2:
   case MTRAS3:
   case MTSETDENSITY:
      errno = ENOTTY;
      result = -1;
      break;

   case MTFSF:                  /* Forward space over mt_count filemarks. */
      do {
         result = fsf();
      } while (--count > 0 && result == 0);
      break;

   case MTBSF:                  /* Backward space over mt_count filemarks. */
      do {
         result = bsf();
      } while (--count > 0 && result == 0);
      break;

   case MTFSR:      /* Forward space over mt_count records (tape blocks). */
/*
    file number = 1
    block number = 0

    file number = 1
    block number = 1

    mt: /dev/lto2: Erreur d'entree/sortie

    file number = 2
    block number = 0
*/
      /* tester si on se trouve a la fin du fichier */
      result = fsr(mt_com->mt_count);
      break;

   case MTBSR:      /* Backward space over mt_count records (tape blocks). */
      result = bsr(mt_com->mt_count);
      break;

   case MTWEOF:                 /* Write mt_count filemarks. */
      do {
         result = weof();
      } while (result == 0 && --count > 0);
      break;

   case MTREW:                  /* Rewind. */
      Dmsg0(dbglevel, "rewind vtape\n");
      check_eof();
      atEOF = atEOD = false;
      atBOT = true;
      current_file = 0;
      current_block = 0;
      lseek(fd, 0, SEEK_SET);
      result = !read_fm(VT_READ_EOF);
      break;

   case MTOFFL:                 /* put tape offline */
      result = offline();
      break;

   case MTRETEN:                /* Re-tension tape. */
      result = 0;
      break;

   case MTBSFM:                 /* not used by bareos */
      errno = EIO;
      result = -1;
      break;

   case MTFSFM:                 /* not used by bareos */
      errno = EIO;
      result = -1;
      break;

   case MTEOM:/* Go to the end of the recorded media (for appending files). */
      while (next_FM) {
         lseek(fd, next_FM, SEEK_SET);
         if (read_fm(VT_READ_EOF)) {
            current_file++;
         }
      }
      boffset_t l;
      while (::read(fd, &l, sizeof(l)) > 0) {
         if (l) {
            lseek(fd, l, SEEK_CUR);
         } else {
            ASSERT(0);
         }
         Dmsg0(dbglevel, "skip 1 block\n");
      }
      current_block = -1;
      atEOF = false;
      atEOD = true;

/*
   file number = 3
   block number = -1
*/
      /* Can be at EOM */
      break;

   case MTERASE:                /* not used by bareos */
      atEOD = true;
      atEOF = false;
      atEOT = false;

      current_file = 0;
      current_block = -1;
      lseek(fd, 0, SEEK_SET);
      read_fm(VT_READ_EOF);
      truncate_file();
      break;

   case MTSETBLK:
      break;

   case MTSEEK:
      break;

   case MTTELL:
      break;

   case MTFSS:
      break;

   case MTBSS:
      break;

   case MTWSM:
      break;

   case MTLOCK:
      break;

   case MTUNLOCK:
      break;

   case MTLOAD:
      break;

   case MTUNLOAD:
      break;

   case MTCOMPRESSION:
      break;

   case MTSETPART:
      break;

   case MTMKPART:
      break;
   }

   return result == 0 ? 0 : -1;
}
Exemple #5
0
void combine()
{
   gROOT->SetBatch(1);

   SetPlotStyle();

   std::string tag = "CSVM";
   std::string tagName = "CSVv2M";
//   std::string tag = "CMVAT";
//   std::string tagName = "cMVAv2T";

//   const int nPT = 15;
/*   const int nPT = 14;
   std::string pt[nPT] = 
     {
	"pt20t30",
	"pt30t40",
	"pt40t50",
	"pt50t60",
	"pt60t70",
	"pt70t80",
	"pt80t100",
	"pt100t120",
	"pt120t160",
	"pt160t210",
	"pt210t260",
	"pt260t320",
	"pt320t400",
	"pt400t500"
//	"pt500t670"
     };*/
   
/*   const int nPT = 7;
   std::string pt[nPT] =
     {
	"pt30t50",
	"pt50t70",
	"pt70t100",
	"pt100t140",
	"pt140t200",
	"pt200t300",
	"pt300t670"
     };*/

/*   const int nPT = 5;
   std::string pt[nPT] =
     {
	"pt200t220",
	"pt220t250",
	"pt250t300",
	"pt300t400",
	"pt400t650"
     };*/

   const int nPT = 5;
   std::string pt[nPT] =
     {
	"pt30t80",
	"pt80t140",
	"pt140t180",
	"pt180t240",
	"pt240t420"
     };

/*   int ptb[nPT+1] =
     {
	30,50,70,100,140,200,300,670
     };*/

/*   int ptb[nPT+1] =
     {
	200,220,250,300,400,650
     };*/

   int ptb[nPT+1] =
     {
	30,80,140,180,240,420
     };
   
   float xbins[nPT];
   for(int j=0;j<=nPT;j++)
     {
	xbins[j] = ptb[j]/1000.;
     }
   
   TH1F *h_SF = new TH1F("h_SF","h_SF",nPT,xbins);
   TH1F *h_SF_TOTAL_UP = new TH1F("h_SF_TOTAL_UP","h_SF_TOTAL_UP",nPT,xbins);
   TH1F *h_SF_TOTAL_DOWN = new TH1F("h_SF_TOTAL_DOWN","h_SF_TOTAL_DOWN",nPT,xbins);
   
   TH1F *h_frb = new TH1F("h_frb","h_frb",nPT,xbins);
   TH1F *h_frb_TOTAL_UP = new TH1F("h_frb_TOTAL_UP","h_frb_TOTAL_UP",nPT,xbins);
   TH1F *h_frb_TOTAL_DOWN = new TH1F("h_frb_TOTAL_DOWN","h_frb_TOTAL_DOWN",nPT,xbins);
   TH1F *h_frc = new TH1F("h_frc","h_frc",nPT,xbins);
   TH1F *h_frc_TOTAL_UP = new TH1F("h_frc_TOTAL_UP","h_frc_TOTAL_UP",nPT,xbins);
   TH1F *h_frc_TOTAL_DOWN = new TH1F("h_frc_TOTAL_DOWN","h_frc_TOTAL_DOWN",nPT,xbins);
   TH1F *h_frl = new TH1F("h_frl","h_frl",nPT,xbins);
   TH1F *h_frl_TOTAL_UP = new TH1F("h_frl_TOTAL_UP","h_frl_TOTAL_UP",nPT,xbins);
   TH1F *h_frl_TOTAL_DOWN = new TH1F("h_frl_TOTAL_DOWN","h_frl_TOTAL_DOWN",nPT,xbins);
   
   TH1F *h_frb_tag = new TH1F("h_frb_tag","h_frb_tag",nPT,xbins);
   TH1F *h_frb_tag_TOTAL_UP = new TH1F("h_frb_tag_TOTAL_UP","h_frb_tag_TOTAL_UP",nPT,xbins);
   TH1F *h_frb_tag_TOTAL_DOWN = new TH1F("h_frb_tag_TOTAL_DOWN","h_frb_tag_TOTAL_DOWN",nPT,xbins);
   TH1F *h_frc_tag = new TH1F("h_frc_tag","h_frc_tag",nPT,xbins);
   TH1F *h_frc_tag_TOTAL_UP = new TH1F("h_frc_tag_TOTAL_UP","h_frc_tag_TOTAL_UP",nPT,xbins);
   TH1F *h_frc_tag_TOTAL_DOWN = new TH1F("h_frc_tag_TOTAL_DOWN","h_frc_tag_TOTAL_DOWN",nPT,xbins);
   TH1F *h_frl_tag = new TH1F("h_frl_tag","h_frl_tag",nPT,xbins);
   TH1F *h_frl_tag_TOTAL_UP = new TH1F("h_frl_tag_TOTAL_UP","h_frl_tag_TOTAL_UP",nPT,xbins);
   TH1F *h_frl_tag_TOTAL_DOWN = new TH1F("h_frl_tag_TOTAL_DOWN","h_frl_tag_TOTAL_DOWN",nPT,xbins);
   
   std::string head = "CSV;OperatingPoint,measurementType,sysType,jetFlavor,etaMin,etaMax,ptMin,ptMax,discrMin,discrMax,formula";
   std::string fname = "results/CSV_13TEV_"+SFver+"_"+tagName+"_LT.csv";
   std::ofstream sfComb(fname.c_str());
   sfComb << head << std::endl;

   std::vector<std::vector<float> > Comb_sigma_syst;
   std::vector<std::vector<std::string> > Comb_sigma_syst_name;
   std::vector<float> Comb_sf;
   std::vector<int> Comb_op;
   std::vector<std::string> Comb_type;
   std::vector<int> Comb_flav;
   std::vector<float> Comb_etaMin;
   std::vector<float> Comb_etaMax;
   std::vector<float> Comb_discMin;
   std::vector<float> Comb_discMax;
   std::vector<int> Comb_ptMin;
   std::vector<int> Comb_ptMax;
   
   for(int ipt=0;ipt<nPT;ipt++)
     {
	if( tag == "CSVL" || tag == "CMVAL" ) Comb_op.push_back(0);
	else if( tag == "CSVM" || tag == "CMVAM" ) Comb_op.push_back(1);
	else if( tag == "CSVT" || tag == "CMVAT" ) Comb_op.push_back(2);
	
	Comb_type.push_back("lt");
	Comb_flav.push_back(0);
	Comb_etaMin.push_back(0.0);
	Comb_etaMax.push_back(2.4);
	Comb_discMin.push_back(0.0);
	Comb_discMax.push_back(1.0);
	
	std::vector<int> run;
	std::vector<float> sf;
	std::vector<float> frb;
	std::vector<float> frbTag;
	std::vector<float> frc;
	std::vector<float> frcTag;
	std::vector<float> frl;
	std::vector<float> frlTag;
	
	int idxNom = -666;

	for(int is=0;is<=2;is++) // FIXME !!!
	  {
	     std::string prefix;
	     if( is == 0 ) prefix = "results_"+tag+"_MJBOOSTS1_SUB/";
	     else if( is == 1 ) prefix = "results_"+tag+"_MJBOOSTS2_SUB/";
//	     if( is == 0 ) prefix = "results/";
//	     if( is == 0 ) prefix = "results_"+tag+"_MJ/";
//	     else if( is == 1 ) prefix = "results_"+tag+"_MJAWAY/";
//	     else if( is == 2 ) prefix = "results_"+tag+"_MJ1/";
//	     else if( is == 2 ) prefix = "results_"+tag+"_MJIAWAY/";
	     else continue;
	     
	     // read result files
	     std::string fname = prefix+pt[ipt]+"_"+tag+".csv";
	     std::ifstream f(fname.c_str());
	     if( !f.is_open() ) continue;
	     std::cout << fname << std::endl;
	     
	     int iline = 0;
	     while( !f.eof() )
	       {	     
		  std::string line;
		  f >> line;
		  if( iline == 0 ) {iline++; continue;}
		  std::stringstream ss(line);
		  std::string item;
		  int idx = 0;
		  while( std::getline(ss,item,',') )
		    {
		       int run_v = -1;
		       if( idx == 3 ) run_v = atoi(item.c_str());
		       
		       if( is == 0 && idx == 3 && run_v == 0 ) idxNom = iline-1;

		       if( (iline == 1 && is == 1) || 
			   (iline == 1 && is == 2) ||
			   (iline == 1 && is == 3) ||
			   is == 0 )
			 {			    
			    if( is == 1 ) run_v = 200;
			    if( is == 2 ) run_v = 201;
			    if( is == 3 ) run_v = 202;
			    
			    if( idx == 3 ) run.push_back(run_v);
			    
			    if( idx == 24 ) 
			      {
				 sf.push_back(atof(item.c_str())); // FIXME IF FORMAT CHANGES
			      }

			    if( idx == 14 ) frb.push_back(atof(item.c_str()));
			    if( idx == 15 ) frbTag.push_back(atof(item.c_str()));
			    if( idx == 16 ) frc.push_back(atof(item.c_str()));
			    if( idx == 17 ) frcTag.push_back(atof(item.c_str()));
			    if( idx == 18 ) frl.push_back(atof(item.c_str()));
			    if( idx == 19 ) frlTag.push_back(atof(item.c_str()));
			    
			    if( iline == 1 && is == 0 && (run_v < 100 || run_v >= 666) )
			      {
				 if( idx == 0 ) Comb_ptMin.push_back(atoi(item.c_str()));
				 if( idx == 1 ) Comb_ptMax.push_back(atoi(item.c_str()));
			      }		  
			 }		       
		       
		       idx++;
		    }
		  
		  iline++;
	       }
	     
	     f.close();
	  }	
	
	// do calculations
	int nRES = run.size();
	
	float sigma_syst_up = 0.;
	float sigma_syst_down = 0.;
	float sigma_total_up = 0.;
	float sigma_total_down = 0.;
	float sigma_stat = 0.;
	float sf_stat_sum = 0.;
	float istat = 0;

	float frb_sigma_total_up = 0.;
	float frb_sigma_total_down = 0.;
	float frc_sigma_total_up = 0.;
	float frc_sigma_total_down = 0.;
	float frl_sigma_total_up = 0.;
	float frl_sigma_total_down = 0.;
	
	float frb_sigma_syst_up = 0.;
	float frb_sigma_syst_down = 0.;
	float frc_sigma_syst_up = 0.;
	float frc_sigma_syst_down = 0.;
	float frl_sigma_syst_up = 0.;
	float frl_sigma_syst_down = 0.;

	float frb_tag_sigma_total_up = 0.;
	float frb_tag_sigma_total_down = 0.;
	float frc_tag_sigma_total_up = 0.;
	float frc_tag_sigma_total_down = 0.;
	float frl_tag_sigma_total_up = 0.;
	float frl_tag_sigma_total_down = 0.;
	
	float frb_tag_sigma_syst_up = 0.;
	float frb_tag_sigma_syst_down = 0.;
	float frc_tag_sigma_syst_up = 0.;
	float frc_tag_sigma_syst_down = 0.;
	float frl_tag_sigma_syst_up = 0.;
	float frl_tag_sigma_syst_down = 0.;
	
	float frb_stat_sum = 0.;
	float sigma_frb_stat = 0.;
	float frc_stat_sum = 0.;
	float sigma_frc_stat = 0.;
	float frl_stat_sum = 0.;
	float sigma_frl_stat = 0.;

	float frbTag_stat_sum = 0.;
	float sigma_frbTag_stat = 0.;
	float frcTag_stat_sum = 0.;
	float sigma_frcTag_stat = 0.;
	float frlTag_stat_sum = 0.;
	float sigma_frlTag_stat = 0.;
	
	std::vector<float> sigma_syst_sep;
	std::vector<std::string> sigma_syst_name;
	float sigma_syst_add = 0.;
	float frb_sigma_syst_add = 0.;
	float frc_sigma_syst_add = 0.;
	float frl_sigma_syst_add = 0.;

	float frb_tag_sigma_syst_add = 0.;
	float frc_tag_sigma_syst_add = 0.;
	float frl_tag_sigma_syst_add = 0.;
	
	std::vector<float> frb_sigma_syst_sep;
	std::vector<float> frc_sigma_syst_sep;
	std::vector<float> frl_sigma_syst_sep;

	std::vector<float> frb_tag_sigma_syst_sep;
	std::vector<float> frc_tag_sigma_syst_sep;
	std::vector<float> frl_tag_sigma_syst_sep;
	
	std::vector<std::string> frb_sigma_syst_name;
	std::vector<std::string> frc_sigma_syst_name;
	std::vector<std::string> frl_sigma_syst_name;

	std::vector<std::string> frb_tag_sigma_syst_name;
	std::vector<std::string> frc_tag_sigma_syst_name;
	std::vector<std::string> frl_tag_sigma_syst_name;
	
	for(int i=0;i<nRES;i++)
	  {
	     if( i == idxNom )
	       {
		  sigma_syst_sep.push_back(sf[idxNom]);
		  sigma_syst_name.push_back(getSysName(run[i]));
		  continue;
	       }	     
	     
	     if( run[i] < 666 )
	       {	
		  float delta = sf[idxNom]-sf[i];
		  bool isUp = (delta < 0);
		  float err = delta*delta;
		  if( run[i] < 100 )
		    {		       
		       if( isUp ) sigma_syst_up += err;		  
		       else sigma_syst_down += err;
		    }
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       sigma_syst_up += pow(delta,2);
		       sigma_syst_down += pow(delta,2);
		    }		  

		  if( run[i] < 100 )
		    {		       
		       if( isUp ) sigma_syst_sep.push_back(sf[idxNom]+sqrt(err));
		       else sigma_syst_sep.push_back(sf[idxNom]-sqrt(err));
		       sigma_syst_name.push_back(getSysName(run[i]));
		    }		  		  
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       sigma_syst_add += pow(delta,2);
		    }	
		  
		  // frb
		  float delta_frb = frb[idxNom]-frb[i];
		  bool isUp_frb = (delta_frb < 0);
		  float err_frb = delta_frb*delta_frb;
		  if( isUp_frb ) frb_sigma_syst_up += err_frb;
		  else frb_sigma_syst_down += err_frb;
		  if( run[i] < 100 )
		    {		       
		       if( isUp_frb ) frb_sigma_syst_sep.push_back(frb[idxNom]+sqrt(err_frb));
		       else frb_sigma_syst_sep.push_back(frb[idxNom]-sqrt(err_frb));
		       frb_sigma_syst_name.push_back(getSysName(run[i]));
		    }		  		  
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       frb_sigma_syst_add += pow(delta_frb,2);
		    }	

		  // frbTag
		  float delta_frb_tag = frbTag[idxNom]-frbTag[i];
		  bool isUp_frb_tag = (delta_frb_tag < 0);
		  float err_frb_tag = delta_frb_tag*delta_frb_tag;
		  if( isUp_frb_tag ) frb_tag_sigma_syst_up += err_frb_tag;
		  else frb_tag_sigma_syst_down += err_frb_tag;
		  if( run[i] < 100 )
		    {		       
		       if( isUp_frb_tag ) frb_tag_sigma_syst_sep.push_back(frbTag[idxNom]+sqrt(err_frb_tag));
		       else frb_tag_sigma_syst_sep.push_back(frbTag[idxNom]-sqrt(err_frb_tag));
		       frb_tag_sigma_syst_name.push_back(getSysName(run[i]));
		    }		  		  
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       frb_tag_sigma_syst_add += pow(delta_frb_tag,2);
		    }	
		  
		  // frc
		  float delta_frc = frc[idxNom]-frc[i];
		  bool isUp_frc = (delta_frc < 0);
		  float err_frc = delta_frc*delta_frc;
		  if( isUp_frc ) frc_sigma_syst_up += err_frc;
		  else frc_sigma_syst_down += err_frc;
		  if( run[i] < 100 )
		    {		       
		       if( isUp_frc ) frc_sigma_syst_sep.push_back(frc[idxNom]+sqrt(err_frc));
		       else frc_sigma_syst_sep.push_back(frc[idxNom]-sqrt(err_frc));
		       frc_sigma_syst_name.push_back(getSysName(run[i]));
		    }		  		  
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       frc_sigma_syst_add += pow(delta_frc,2);
		    }	

		  // frcTag
		  float delta_frc_tag = frcTag[idxNom]-frcTag[i];
		  bool isUp_frc_tag = (delta_frc_tag < 0);
		  float err_frc_tag = delta_frc_tag*delta_frc_tag;
		  if( isUp_frc_tag ) frc_tag_sigma_syst_up += err_frc_tag;
		  else frc_tag_sigma_syst_down += err_frc_tag;
		  if( run[i] < 100 )
		    {		       
		       if( isUp_frc_tag ) frc_tag_sigma_syst_sep.push_back(frcTag[idxNom]+sqrt(err_frc_tag));
		       else frc_tag_sigma_syst_sep.push_back(frcTag[idxNom]-sqrt(err_frc_tag));
		       frc_tag_sigma_syst_name.push_back(getSysName(run[i]));
		    }		  		  
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       frc_tag_sigma_syst_add += pow(delta_frc_tag,2);
		    }	
		  
		  // frl
		  float delta_frl = frl[idxNom]-frl[i];
		  bool isUp_frl = (delta_frl < 0);
		  float err_frl = delta_frl*delta_frl;
		  if( isUp_frl ) frl_sigma_syst_up += err_frl;
		  else frl_sigma_syst_down += err_frl;
		  if( run[i] < 100 )
		    {		       
		       if( isUp_frl ) frl_sigma_syst_sep.push_back(frl[idxNom]+sqrt(err_frl));
		       else frl_sigma_syst_sep.push_back(frl[idxNom]-sqrt(err_frl));
		       frl_sigma_syst_name.push_back(getSysName(run[i]));
		    }		  		  
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       frl_sigma_syst_add += pow(delta_frl,2);
		    }	

		  // frlTag
		  float delta_frl_tag = frlTag[idxNom]-frlTag[i];
		  bool isUp_frl_tag = (delta_frl_tag < 0);
		  float err_frl_tag = delta_frl_tag*delta_frl_tag;
		  if( isUp_frl_tag ) frl_tag_sigma_syst_up += err_frl_tag;
		  else frl_tag_sigma_syst_down += err_frl_tag;
		  if( run[i] < 100 )
		    {		       
		       if( isUp_frl_tag ) frl_tag_sigma_syst_sep.push_back(frlTag[idxNom]+sqrt(err_frl_tag));
		       else frl_tag_sigma_syst_sep.push_back(frlTag[idxNom]-sqrt(err_frl_tag));
		       frl_tag_sigma_syst_name.push_back(getSysName(run[i]));
		    }		  		  
		  if( run[i] >= 100 && run[i] <= 202 )
		    {
		       frl_tag_sigma_syst_add += pow(delta_frl_tag,2);
		    }	
	       }
	     else
	       {
		  sf_stat_sum += sf[i];
		  frb_stat_sum += frb[i];
		  frc_stat_sum += frc[i];
		  frl_stat_sum += frl[i];
		  frbTag_stat_sum += frbTag[i];
		  frcTag_stat_sum += frcTag[i];
		  frlTag_stat_sum += frlTag[i];
		  istat++;
	       }	     
	  }
	sigma_syst_add = sqrt(sigma_syst_add);
	frb_sigma_syst_add = sqrt(frb_sigma_syst_add);
	frc_sigma_syst_add = sqrt(frc_sigma_syst_add);
	frl_sigma_syst_add = sqrt(frl_sigma_syst_add);

	frb_tag_sigma_syst_add = sqrt(frb_tag_sigma_syst_add);
	frc_tag_sigma_syst_add = sqrt(frc_tag_sigma_syst_add);
	frl_tag_sigma_syst_add = sqrt(frl_tag_sigma_syst_add);
	
	Comb_sf.push_back(sf[idxNom]);
	
	sf_stat_sum /= istat;	
	frb_stat_sum /= istat;
	frc_stat_sum /= istat;
	frl_stat_sum /= istat;
	frbTag_stat_sum /= istat;
	frcTag_stat_sum /= istat;
	frlTag_stat_sum /= istat;

	float sfcbsys = 0.;
	// add Cb systematics
	if( inclCB )
	  {	     
	     float cb = getCb(tag,"bjet",ipt+1);
//	     float cb = getCb(tag,"bjet",ipt+1+1); //FIXME if include 20-30 bin
	     float cbsys = (1-cb)*0.5/cb;
	     sfcbsys = pow(cbsys*sf[idxNom],2);
	     
	     sigma_syst_up += sfcbsys;
	     sigma_syst_down += sfcbsys;
	  }
	
	// add add
//	sigma_syst_up += sigma_syst_add*sigma_syst_add;
//	sigma_syst_down += sigma_syst_add*sigma_syst_add;
	
	for(int i=0;i<istat;i++)
	  {	     
	     sigma_stat += pow(sf_stat_sum-sf[i],2)/istat;
	     sigma_frb_stat += pow(frb_stat_sum-frb[i],2)/istat;
	     sigma_frc_stat += pow(frc_stat_sum-frc[i],2)/istat;
	     sigma_frl_stat += pow(frl_stat_sum-frl[i],2)/istat;
	     sigma_frbTag_stat += pow(frbTag_stat_sum-frbTag[i],2)/istat;
	     sigma_frcTag_stat += pow(frcTag_stat_sum-frcTag[i],2)/istat;
	     sigma_frlTag_stat += pow(frlTag_stat_sum-frlTag[i],2)/istat;
	  }
	sigma_stat = sqrt(sigma_stat);
	sigma_frb_stat = sqrt(sigma_frb_stat);
	sigma_frc_stat = sqrt(sigma_frc_stat);
	sigma_frl_stat = sqrt(sigma_frl_stat);
	sigma_frbTag_stat = sqrt(sigma_frbTag_stat);
	sigma_frcTag_stat = sqrt(sigma_frcTag_stat);
	sigma_frlTag_stat = sqrt(sigma_frlTag_stat);
	
	sigma_syst_up = sqrt(sigma_syst_up);
	sigma_syst_down = sqrt(sigma_syst_down);

	frb_sigma_syst_up = sqrt(frb_sigma_syst_up);
	frb_sigma_syst_down = sqrt(frb_sigma_syst_down);
	frc_sigma_syst_up = sqrt(frc_sigma_syst_up);
	frc_sigma_syst_down = sqrt(frc_sigma_syst_down);
	frl_sigma_syst_up = sqrt(frl_sigma_syst_up);
	frl_sigma_syst_down = sqrt(frl_sigma_syst_down);

	frb_tag_sigma_syst_up = sqrt(frb_tag_sigma_syst_up);
	frb_tag_sigma_syst_down = sqrt(frb_tag_sigma_syst_down);
	frc_tag_sigma_syst_up = sqrt(frc_tag_sigma_syst_up);
	frc_tag_sigma_syst_down = sqrt(frc_tag_sigma_syst_down);
	frl_tag_sigma_syst_up = sqrt(frl_tag_sigma_syst_up);
	frl_tag_sigma_syst_down = sqrt(frl_tag_sigma_syst_down);
	
	sigma_total_up = sqrt(sigma_stat*sigma_stat+sigma_syst_up*sigma_syst_up);
	sigma_total_down = sqrt(sigma_stat*sigma_stat+sigma_syst_down*sigma_syst_down);

	frb_sigma_total_up = sqrt(sigma_frb_stat*sigma_frb_stat+frb_sigma_syst_up*frb_sigma_syst_up);
	frb_sigma_total_down = sqrt(sigma_frb_stat*sigma_frb_stat+frb_sigma_syst_down*frb_sigma_syst_down);
	frc_sigma_total_up = sqrt(sigma_frc_stat*sigma_frc_stat+frc_sigma_syst_up*frc_sigma_syst_up);
	frc_sigma_total_down = sqrt(sigma_frc_stat*sigma_frc_stat+frc_sigma_syst_down*frc_sigma_syst_down);
	frl_sigma_total_up = sqrt(sigma_frl_stat*sigma_frl_stat+frl_sigma_syst_up*frl_sigma_syst_up);
	frl_sigma_total_down = sqrt(sigma_frl_stat*sigma_frl_stat+frl_sigma_syst_down*frl_sigma_syst_down);

	frb_tag_sigma_total_up = sqrt(sigma_frbTag_stat*sigma_frbTag_stat+frb_tag_sigma_syst_up*frb_tag_sigma_syst_up);
	frb_tag_sigma_total_down = sqrt(sigma_frbTag_stat*sigma_frbTag_stat+frb_tag_sigma_syst_down*frb_tag_sigma_syst_down);
	frc_tag_sigma_total_up = sqrt(sigma_frcTag_stat*sigma_frcTag_stat+frc_tag_sigma_syst_up*frc_tag_sigma_syst_up);
	frc_tag_sigma_total_down = sqrt(sigma_frcTag_stat*sigma_frcTag_stat+frc_tag_sigma_syst_down*frc_tag_sigma_syst_down);
	frl_tag_sigma_total_up = sqrt(sigma_frlTag_stat*sigma_frlTag_stat+frl_tag_sigma_syst_up*frl_tag_sigma_syst_up);
	frl_tag_sigma_total_down = sqrt(sigma_frlTag_stat*sigma_frlTag_stat+frl_tag_sigma_syst_down*frl_tag_sigma_syst_down);
	
	float SF = sf[idxNom];
	float SF_STAT = SF+sigma_stat;
	float SF_SYST_UP = SF+sigma_syst_up;
	float SF_SYST_DOWN = SF-sigma_syst_down;
	float SF_TOTAL_UP = SF+sigma_total_up;
	float SF_TOTAL_DOWN = SF-sigma_total_down;
	
	h_SF->SetBinContent(ipt+1,SF);
	h_SF->SetBinError(ipt+1,sigma_stat);
	
	h_SF_TOTAL_UP->SetBinContent(ipt+1,SF_TOTAL_UP);
	h_SF_TOTAL_DOWN->SetBinContent(ipt+1,SF_TOTAL_DOWN);

	float FRB = frb[idxNom];
	float FRB_STAT = FRB+sigma_frb_stat;
	float FRB_SYST_UP = FRB+frb_sigma_syst_up;
	float FRB_SYST_DOWN = FRB-frb_sigma_syst_down;
	float FRB_TOTAL_UP = FRB+frb_sigma_total_up;
	float FRB_TOTAL_DOWN = FRB-frb_sigma_total_down;
	
	h_frb->SetBinContent(ipt+1,FRB);
	h_frb->SetBinError(ipt+1,sigma_frb_stat);
	h_frb_TOTAL_UP->SetBinContent(ipt+1,FRB_TOTAL_UP);
	h_frb_TOTAL_DOWN->SetBinContent(ipt+1,FRB_TOTAL_DOWN);

	float FRC = frc[idxNom];
	float FRC_STAT = FRC+sigma_frc_stat;
	float FRC_SYST_UP = FRC+frc_sigma_syst_up;
	float FRC_SYST_DOWN = FRC-frc_sigma_syst_down;
	float FRC_TOTAL_UP = FRC+frc_sigma_total_up;
	float FRC_TOTAL_DOWN = FRC-frc_sigma_total_down;
	
	h_frc->SetBinContent(ipt+1,FRC);
	h_frc->SetBinError(ipt+1,sigma_frc_stat);
	h_frc_TOTAL_UP->SetBinContent(ipt+1,FRC_TOTAL_UP);
	h_frc_TOTAL_DOWN->SetBinContent(ipt+1,FRC_TOTAL_DOWN);

	float FRL = frl[idxNom];
	float FRL_STAT = FRL+sigma_frl_stat;
	float FRL_SYST_UP = FRL+frl_sigma_syst_up;
	float FRL_SYST_DOWN = FRL-frl_sigma_syst_down;
	float FRL_TOTAL_UP = FRL+frl_sigma_total_up;
	float FRL_TOTAL_DOWN = FRL-frl_sigma_total_down;
	
	h_frl->SetBinContent(ipt+1,FRL);
	h_frl->SetBinError(ipt+1,sigma_frl_stat);
	h_frl_TOTAL_UP->SetBinContent(ipt+1,FRL_TOTAL_UP);
	h_frl_TOTAL_DOWN->SetBinContent(ipt+1,FRL_TOTAL_DOWN);

	float FRB_TAG = frbTag[idxNom];
	float FRB_TAG_STAT = FRB_TAG+sigma_frbTag_stat;
	float FRB_TAG_SYST_UP = FRB_TAG+frb_tag_sigma_syst_up;
	float FRB_TAG_SYST_DOWN = FRB_TAG-frb_tag_sigma_syst_down;
	float FRB_TAG_TOTAL_UP = FRB_TAG+frb_tag_sigma_total_up;
	float FRB_TAG_TOTAL_DOWN = FRB_TAG-frb_tag_sigma_total_down;
	
	h_frb_tag->SetBinContent(ipt+1,FRB_TAG);
	h_frb_tag->SetBinError(ipt+1,sigma_frbTag_stat);
	h_frb_tag_TOTAL_UP->SetBinContent(ipt+1,FRB_TAG_TOTAL_UP);
	h_frb_tag_TOTAL_DOWN->SetBinContent(ipt+1,FRB_TAG_TOTAL_DOWN);

	float FRC_TAG = frcTag[idxNom];
	float FRC_TAG_STAT = FRC_TAG+sigma_frcTag_stat;
	float FRC_TAG_SYST_UP = FRC_TAG+frc_tag_sigma_syst_up;
	float FRC_TAG_SYST_DOWN = FRC_TAG-frc_tag_sigma_syst_down;
	float FRC_TAG_TOTAL_UP = FRC_TAG+frc_tag_sigma_total_up;
	float FRC_TAG_TOTAL_DOWN = FRC_TAG-frc_tag_sigma_total_down;
	
	h_frc_tag->SetBinContent(ipt+1,FRC_TAG);
	h_frc_tag->SetBinError(ipt+1,sigma_frcTag_stat);
	h_frc_tag_TOTAL_UP->SetBinContent(ipt+1,FRC_TAG_TOTAL_UP);
	h_frc_tag_TOTAL_DOWN->SetBinContent(ipt+1,FRC_TAG_TOTAL_DOWN);

	float FRL_TAG = frlTag[idxNom];
	float FRL_TAG_STAT = FRL_TAG+sigma_frlTag_stat;
	float FRL_TAG_SYST_UP = FRL_TAG+frl_tag_sigma_syst_up;
	float FRL_TAG_SYST_DOWN = FRL_TAG-frl_tag_sigma_syst_down;
	float FRL_TAG_TOTAL_UP = FRL_TAG+frl_tag_sigma_total_up;
	float FRL_TAG_TOTAL_DOWN = FRL_TAG-frl_tag_sigma_total_down;
	
	h_frl_tag->SetBinContent(ipt+1,FRL_TAG);
	h_frl_tag->SetBinError(ipt+1,sigma_frlTag_stat);
	h_frl_tag_TOTAL_UP->SetBinContent(ipt+1,FRL_TAG_TOTAL_UP);
	h_frl_tag_TOTAL_DOWN->SetBinContent(ipt+1,FRL_TAG_TOTAL_DOWN);
	
	// additional uncertainties
	
	// stat
	sigma_syst_name.push_back("up_statistic");
	sigma_syst_sep.push_back(SF+sigma_stat);
	sigma_syst_name.push_back("down_statistic");
	sigma_syst_sep.push_back(SF-sigma_stat);
	
	// cb
	sigma_syst_name.push_back("up_cb");
	sigma_syst_sep.push_back(SF+sqrt(sfcbsys));
	sigma_syst_name.push_back("down_cb");
	sigma_syst_sep.push_back(SF-sqrt(sfcbsys));

	// add
	sigma_syst_name.push_back("up_add");
	sigma_syst_sep.push_back(SF+sigma_syst_add);
	sigma_syst_name.push_back("down_add");
	sigma_syst_sep.push_back(SF-sigma_syst_add);

	// total
	sigma_syst_name.push_back("up");
	sigma_syst_sep.push_back(SF_TOTAL_UP);
	sigma_syst_name.push_back("down");
	sigma_syst_sep.push_back(SF_TOTAL_DOWN);
	
	Comb_sigma_syst.push_back(sigma_syst_sep);
	Comb_sigma_syst_name.push_back(sigma_syst_name);
     }
   
   // draw SF
   TCanvas *c1 = new TCanvas("c1","c1",0,0,600,500);
   c1->SetGrid(1);
   
   std::string csv = "#bf{"+tagName+"}";
   
   const int np = 2*(nPT+2)+1;
   double xp_sysTot_SF[np];
   double yp_sysTot_SF[np];
   for(int k=0;k<nPT+2;k++)
     {
	float addw = h_SF->GetBinWidth(k)/2.0;
	if( k == 0 ) addw = 0.0;
	if( k == nPT+1 ) addw = h_SF->GetBinWidth(k-1);
	
	int ib = k+1;
	if( k > 0 ) ib--;
	if( k == nPT+1 ) ib--;
	
	xp_sysTot_SF[k] = addw + h_SF->GetXaxis()->GetBinLowEdge(ib);
	yp_sysTot_SF[k] = h_SF_TOTAL_UP->GetBinContent(ib);
	yp_sysTot_SF[nPT+2+k] = h_SF_TOTAL_DOWN->GetBinContent(nPT-(ib-1));
     }      
   for(int k=0;k<nPT+2;k++)
     {
	xp_sysTot_SF[nPT+2+k] = xp_sysTot_SF[nPT+2-k-1];
     }	
   xp_sysTot_SF[np-1] = xp_sysTot_SF[0];   
   yp_sysTot_SF[np-1] = yp_sysTot_SF[0];
   
   TPolyLine *sysTot_SF = new TPolyLine(np,xp_sysTot_SF,yp_sysTot_SF);
   sysTot_SF->SetFillColor(kYellow);
	
   if( !doSFc ) h_SF->GetYaxis()->SetTitle("SF_{b}");
   else h_SF->GetYaxis()->SetTitle("SF_{c}");
   h_SF->GetXaxis()->SetTitle("p_{T} [TeV]");
   h_SF->SetMarkerSize(0.8);

   h_SF->Draw("e1p");
	
   h_SF->GetXaxis()->SetMoreLogLabels();
   h_SF->GetXaxis()->SetNoExponent();
   h_SF->GetYaxis()->SetRangeUser(0.40,1.30);
	
   sysTot_SF->Draw("fSAME");
   h_SF->Draw("e1p same");
   
   TLegend *leg;
   leg = new TLegend(0.35,0.45,0.70,0.20);
   leg->SetFillColor(253);
   leg->SetBorderSize(0);
   
   TLatex *legl = new TLatex();
   legl->SetNDC();
   legl->SetTextAlign(22);
   legl->SetTextFont(63);
   legl->SetTextSizePixels(30);
   legl->DrawLatex(0.55,0.82,csv.c_str());
   
   leg->AddEntry(h_SF,"Scale factor","p");
   leg->AddEntry(h_SF,"stat","l");
   leg->AddEntry(sysTot_SF,"stat #oplus syst","f");
   
   c1->RedrawAxis("g");
   
   leg->Draw();
   
//   c1->SetLogx(1);
//   TLatex *lab = CMSLABEL();
//   lab->Draw("same");
   
   TLatex *tex = new TLatex(0.1969,0.906825,"CMS");
   tex->SetNDC();
   tex->SetTextAlign(13);
   tex->SetTextFont(61);
   tex->SetTextSize(0.07475);
   tex->SetLineWidth(2);
   tex->Draw();

   TLatex *tex2 = new TLatex(0.1969,0.817125,"Preliminary");
   tex2->SetNDC();
   tex2->SetTextAlign(13);
   tex2->SetTextFont(52);
   tex2->SetTextSize(0.05681);
   tex2->SetLineWidth(2);
   tex2->Draw();

   TLatex *text1 = new TLatex(0.98,0.95125,"#sqrt{s} = 13 TeV, 25 ns");
   text1->SetNDC();
   text1->SetTextAlign(31);
   text1->SetTextFont(42);
   text1->SetTextSize(0.04875);
   text1->SetLineWidth(2);
   text1->Draw();
   
   std::string picname = "pics/SF_"+tag+".eps";
   c1->Print(picname.c_str());
   c1->Clear();
   
   delete sysTot_SF;
   
   delete c1;
   delete leg;
   delete legl;

   // draw fractions noTag
   TCanvas *c2 = new TCanvas("c2","c2",0,0,600,500);
   c2->SetGrid(1);

   // frb
   double xp_sysTot_FRB[np];
   double yp_sysTot_FRB[np];
   for(int k=0;k<nPT+2;k++)
     {
	float addw = h_frb->GetBinWidth(k)/2.0;
	if( k == 0 ) addw = 0.0;
	if( k == nPT+1 ) addw = h_frb->GetBinWidth(k-1);
	
	int ib = k+1;
	if( k > 0 ) ib--;
	if( k == nPT+1 ) ib--;
	
	xp_sysTot_FRB[k] = addw + h_frb->GetXaxis()->GetBinLowEdge(ib);
	yp_sysTot_FRB[k] = h_frb_TOTAL_UP->GetBinContent(ib);
	yp_sysTot_FRB[nPT+2+k] = h_frb_TOTAL_DOWN->GetBinContent(nPT-(ib-1));
     }      
   for(int k=0;k<nPT+2;k++)
     {
	xp_sysTot_FRB[nPT+2+k] = xp_sysTot_FRB[nPT+2-k-1];
     }	
   xp_sysTot_FRB[np-1] = xp_sysTot_FRB[0];
   yp_sysTot_FRB[np-1] = yp_sysTot_FRB[0];
   
   TPolyLine *sysTot_FRB = new TPolyLine(np,xp_sysTot_FRB,yp_sysTot_FRB);
   sysTot_FRB->SetFillColor(kRed);
   sysTot_FRB->SetLineColor(kRed);
//   sysTot_FRB->SetFillStyle(0);
   
   // frc
   double xp_sysTot_FRC[np];
   double yp_sysTot_FRC[np];
   for(int k=0;k<nPT+2;k++)
     {
	float addw = h_frc->GetBinWidth(k)/2.0;
	if( k == 0 ) addw = 0.0;
	if( k == nPT+1 ) addw = h_frc->GetBinWidth(k-1);
	
	int ib = k+1;
	if( k > 0 ) ib--;
	if( k == nPT+1 ) ib--;
	
	xp_sysTot_FRC[k] = addw + h_frc->GetXaxis()->GetBinLowEdge(ib);
	yp_sysTot_FRC[k] = h_frc_TOTAL_UP->GetBinContent(ib);
	yp_sysTot_FRC[nPT+2+k] = h_frc_TOTAL_DOWN->GetBinContent(nPT-(ib-1));
     }      
   for(int k=0;k<nPT+2;k++)
     {
	xp_sysTot_FRC[nPT+2+k] = xp_sysTot_FRC[nPT+2-k-1];
     }	
   xp_sysTot_FRC[np-1] = xp_sysTot_FRC[0];
   yp_sysTot_FRC[np-1] = yp_sysTot_FRC[0];
   
   TPolyLine *sysTot_FRC = new TPolyLine(np,xp_sysTot_FRC,yp_sysTot_FRC);
   sysTot_FRC->SetFillColor(kGreen);
   sysTot_FRC->SetLineColor(kGreen);
//   sysTot_FRC->SetFillStyle(0);

   // frl
   double xp_sysTot_FRL[np];
   double yp_sysTot_FRL[np];
   for(int k=0;k<nPT+2;k++)
     {
	float addw = h_frl->GetBinWidth(k)/2.0;
	if( k == 0 ) addw = 0.0;
	if( k == nPT+1 ) addw = h_frl->GetBinWidth(k-1);
	
	int ib = k+1;
	if( k > 0 ) ib--;
	if( k == nPT+1 ) ib--;
	
	xp_sysTot_FRL[k] = addw + h_frl->GetXaxis()->GetBinLowEdge(ib);
	yp_sysTot_FRL[k] = h_frl_TOTAL_UP->GetBinContent(ib);
	yp_sysTot_FRL[nPT+2+k] = h_frl_TOTAL_DOWN->GetBinContent(nPT-(ib-1));
     }      
   for(int k=0;k<nPT+2;k++)
     {
	xp_sysTot_FRL[nPT+2+k] = xp_sysTot_FRL[nPT+2-k-1];
     }	
   xp_sysTot_FRL[np-1] = xp_sysTot_FRL[0];
   yp_sysTot_FRL[np-1] = yp_sysTot_FRL[0];
   
   TPolyLine *sysTot_FRL = new TPolyLine(np,xp_sysTot_FRL,yp_sysTot_FRL);
   sysTot_FRL->SetFillColor(kBlue);
   sysTot_FRL->SetLineColor(kBlue);
   
   h_frb->GetYaxis()->SetTitle("Fit fraction");
   h_frb->GetXaxis()->SetTitle("p_{T} [TeV]");
   
   h_frb->SetMarkerSize(1.0);
   h_frc->SetMarkerSize(1.0);
   h_frl->SetMarkerSize(1.0);

   h_frb->SetMarkerStyle(20);
   h_frc->SetMarkerStyle(22);
   h_frl->SetMarkerStyle(24);
   
   h_frb->SetMarkerColor(0);
   h_frc->SetMarkerColor(0);
   h_frl->SetMarkerColor(0);

   h_frb->SetLineColor(0);
   h_frc->SetLineColor(0);
   h_frl->SetLineColor(0);
   
   h_frb->Draw("e1p");
   h_frc->Draw("e1p same");
   h_frl->Draw("e1p same");
	
   h_frb->GetXaxis()->SetMoreLogLabels();
   h_frb->GetXaxis()->SetNoExponent();
   h_frb->GetYaxis()->SetRangeUser(0.00,1.50);

   sysTot_FRB->Draw("fSAME");
   sysTot_FRC->Draw("fSAME");
   sysTot_FRL->Draw("fSAME");
   h_frb->Draw("e1p same");
   h_frc->Draw("e1p same");
   h_frl->Draw("e1p same");
   
   TLegend *leg2;
   leg2 = new TLegend(0.70,0.85,0.95,0.70);
   leg2->SetFillColor(253);
   leg2->SetBorderSize(0);
   
   TLatex *legl2 = new TLatex();
   legl2->SetNDC();
   legl2->SetTextAlign(22);
   legl2->SetTextFont(63);
   legl2->SetTextSizePixels(30);
//   legl2->DrawLatex(0.55,0.82,csv.c_str());
   legl2->DrawLatex(0.55,0.82,"Pre-tag");
   
   TH1D *h_frb_clone = (TH1D*)h_frb->Clone("h_frb_clone");
   TH1D *h_frc_clone = (TH1D*)h_frc->Clone("h_frc_clone");
   TH1D *h_frl_clone = (TH1D*)h_frl->Clone("h_frl_clone");
   
   h_frb_clone->SetMarkerColor(2);
   h_frc_clone->SetMarkerColor(3);
   h_frl_clone->SetMarkerColor(4);
  
   h_frb_clone->SetLineColor(2);
   h_frc_clone->SetLineColor(3);
   h_frl_clone->SetLineColor(4);

   leg2->AddEntry(h_frb_clone,"b-jets","lp");
   leg2->AddEntry(h_frc_clone,"c-jets","lp");
   leg2->AddEntry(h_frl_clone,"udsg-jets","lp");
   
   c2->RedrawAxis("g");
   
   leg2->Draw();
   
   c2->SetLogx(1);

   tex->Draw();
   tex2->Draw();
   text1->Draw();
   
   picname = "pics/Fr_noTag.eps";
   c2->Print(picname.c_str());
   c2->Clear();

   // draw fractions Tag
   TCanvas *c3 = new TCanvas("c3","c3",0,0,600,500);
   c3->SetGrid(1);

   // frb
   double xp_sysTot_FRB_TAG[np];
   double yp_sysTot_FRB_TAG[np];
   for(int k=0;k<nPT+2;k++)
     {
	float addw = h_frb_tag->GetBinWidth(k)/2.0;
	if( k == 0 ) addw = 0.0;
	if( k == nPT+1 ) addw = h_frb_tag->GetBinWidth(k-1);
	
	int ib = k+1;
	if( k > 0 ) ib--;
	if( k == nPT+1 ) ib--;
	
	xp_sysTot_FRB_TAG[k] = addw + h_frb_tag->GetXaxis()->GetBinLowEdge(ib);
	yp_sysTot_FRB_TAG[k] = h_frb_tag_TOTAL_UP->GetBinContent(ib);
	yp_sysTot_FRB_TAG[nPT+2+k] = h_frb_tag_TOTAL_DOWN->GetBinContent(nPT-(ib-1));
     }      
   for(int k=0;k<nPT+2;k++)
     {
	xp_sysTot_FRB_TAG[nPT+2+k] = xp_sysTot_FRB_TAG[nPT+2-k-1];
     }	
   xp_sysTot_FRB_TAG[np-1] = xp_sysTot_FRB_TAG[0];
   yp_sysTot_FRB_TAG[np-1] = yp_sysTot_FRB_TAG[0];
   
   TPolyLine *sysTot_FRB_TAG = new TPolyLine(np,xp_sysTot_FRB_TAG,yp_sysTot_FRB_TAG);
   sysTot_FRB_TAG->SetFillColor(kRed);
   sysTot_FRB_TAG->SetLineColor(kRed);
   
   // frc
   double xp_sysTot_FRC_TAG[np];
   double yp_sysTot_FRC_TAG[np];
   for(int k=0;k<nPT+2;k++)
     {
	float addw = h_frc_tag->GetBinWidth(k)/2.0;
	if( k == 0 ) addw = 0.0;
	if( k == nPT+1 ) addw = h_frc_tag->GetBinWidth(k-1);
	
	int ib = k+1;
	if( k > 0 ) ib--;
	if( k == nPT+1 ) ib--;
	
	xp_sysTot_FRC_TAG[k] = addw + h_frc_tag->GetXaxis()->GetBinLowEdge(ib);
	yp_sysTot_FRC_TAG[k] = h_frc_tag_TOTAL_UP->GetBinContent(ib);
	yp_sysTot_FRC_TAG[nPT+2+k] = h_frc_tag_TOTAL_DOWN->GetBinContent(nPT-(ib-1));
     }      
   for(int k=0;k<nPT+2;k++)
     {
	xp_sysTot_FRC_TAG[nPT+2+k] = xp_sysTot_FRC_TAG[nPT+2-k-1];
     }	
   xp_sysTot_FRC_TAG[np-1] = xp_sysTot_FRC_TAG[0];
   yp_sysTot_FRC_TAG[np-1] = yp_sysTot_FRC_TAG[0];
   
   TPolyLine *sysTot_FRC_TAG = new TPolyLine(np,xp_sysTot_FRC_TAG,yp_sysTot_FRC_TAG);
   sysTot_FRC_TAG->SetFillColor(kGreen);
   sysTot_FRC_TAG->SetLineColor(kGreen);

   // frl
   double xp_sysTot_FRL_TAG[np];
   double yp_sysTot_FRL_TAG[np];
   for(int k=0;k<nPT+2;k++)
     {
	float addw = h_frl_tag->GetBinWidth(k)/2.0;
	if( k == 0 ) addw = 0.0;
	if( k == nPT+1 ) addw = h_frl_tag->GetBinWidth(k-1);
	
	int ib = k+1;
	if( k > 0 ) ib--;
	if( k == nPT+1 ) ib--;
	
	xp_sysTot_FRL_TAG[k] = addw + h_frl_tag->GetXaxis()->GetBinLowEdge(ib);
	yp_sysTot_FRL_TAG[k] = h_frl_tag_TOTAL_UP->GetBinContent(ib);
	yp_sysTot_FRL_TAG[nPT+2+k] = h_frl_tag_TOTAL_DOWN->GetBinContent(nPT-(ib-1));
     }      
   for(int k=0;k<nPT+2;k++)
     {
	xp_sysTot_FRL_TAG[nPT+2+k] = xp_sysTot_FRL_TAG[nPT+2-k-1];
     }	
   xp_sysTot_FRL_TAG[np-1] = xp_sysTot_FRL_TAG[0];
   yp_sysTot_FRL_TAG[np-1] = yp_sysTot_FRL_TAG[0];
   
   TPolyLine *sysTot_FRL_TAG = new TPolyLine(np,xp_sysTot_FRL_TAG,yp_sysTot_FRL_TAG);
   sysTot_FRL_TAG->SetFillColor(kBlue);
   sysTot_FRL_TAG->SetLineColor(kBlue);
   
   h_frb_tag->GetYaxis()->SetTitle("Fit fraction");
   h_frb_tag->GetXaxis()->SetTitle("p_{T} [TeV]");
   
   h_frb_tag->SetMarkerSize(1.0);
   h_frc_tag->SetMarkerSize(1.0);
   h_frl_tag->SetMarkerSize(1.0);

   h_frb_tag->SetMarkerStyle(20);
   h_frc_tag->SetMarkerStyle(22);
   h_frl_tag->SetMarkerStyle(24);
   
   h_frb_tag->SetMarkerColor(0);
   h_frc_tag->SetMarkerColor(0);
   h_frl_tag->SetMarkerColor(0);

   h_frb_tag->SetLineColor(0);
   h_frc_tag->SetLineColor(0);
   h_frl_tag->SetLineColor(0);
   
   h_frb_tag->Draw("e1p");
   h_frc_tag->Draw("e1p same");
   h_frl_tag->Draw("e1p same");
	
   h_frb_tag->GetXaxis()->SetMoreLogLabels();
   h_frb_tag->GetXaxis()->SetNoExponent();
   h_frb_tag->GetYaxis()->SetRangeUser(0.00,1.50);

   sysTot_FRB_TAG->Draw("fSAME");
   sysTot_FRC_TAG->Draw("fSAME");
   sysTot_FRL_TAG->Draw("fSAME");
   h_frb_tag->Draw("e1p same");
   h_frc_tag->Draw("e1p same");
   h_frl_tag->Draw("e1p same");
   
   TLegend *leg3;
   leg3 = new TLegend(0.70,0.85,0.95,0.70);
   leg3->SetFillColor(253);
   leg3->SetBorderSize(0);
   
   TLatex *legl3 = new TLatex();
   legl3->SetNDC();
   legl3->SetTextAlign(22);
   legl3->SetTextFont(63);
   legl3->SetTextSizePixels(30);
   legl3->DrawLatex(0.55,0.82,csv.c_str());

   TH1D *h_frb_tag_clone = (TH1D*)h_frb_tag->Clone("h_frb_tag_clone");
   TH1D *h_frc_tag_clone = (TH1D*)h_frc_tag->Clone("h_frc_tag_clone");
   TH1D *h_frl_tag_clone = (TH1D*)h_frl_tag->Clone("h_frl_tag_clone");
   
   h_frb_tag_clone->SetMarkerColor(2);
   h_frc_tag_clone->SetMarkerColor(3);
   h_frl_tag_clone->SetMarkerColor(4);
  
   h_frb_tag_clone->SetLineColor(2);
   h_frc_tag_clone->SetLineColor(3);
   h_frl_tag_clone->SetLineColor(4);
   
   leg3->AddEntry(h_frb_tag_clone,"b-jets","lp");
   leg3->AddEntry(h_frc_tag_clone,"c-jets","lp");
   leg3->AddEntry(h_frl_tag_clone,"udsg-jets","lp");
   
   c3->RedrawAxis("g");
   
   leg3->Draw();
   
   c3->SetLogx(1);

   tex->Draw();
   tex2->Draw();
   text1->Draw();
   
   picname = "pics/Fr_"+tag+".eps";
   c3->Print(picname.c_str());
   c3->Clear();
   
   std::ofstream fsf("results/SFSYS.tex");

   std::string header = "\n \
\\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \n \
/*
 * Position device to end of medium (end of data)
 *
 * Returns: true  on succes
 *          false on error
 */
bool generic_tape_device::eod(DCR *dcr)
{
   struct mtop mt_com;
   bool ok = true;
   int32_t os_file;

   if (m_fd < 0) {
      dev_errno = EBADF;
      Mmsg1(errmsg, _("Bad call to eod. Device %s not open\n"), prt_name);
      return false;
   }

#if defined (__digital__) && defined (__unix__)
   return fsf(VolCatInfo.VolCatFiles);
#endif

   Dmsg0(100, "Enter eod\n");
   if (at_eot()) {
      return true;
   }

   clear_eof();         /* remove EOF flag */
   block_num = file = 0;
   file_size = 0;
   file_addr = 0;

#ifdef MTEOM
   if (has_cap(CAP_FASTFSF) && !has_cap(CAP_EOM)) {
      Dmsg0(100,"Using FAST FSF for EOM\n");
      /*
       * If unknown position, rewind
       */
      if (get_os_tape_file() < 0) {
        if (!rewind(NULL)) {
          Dmsg0(100, "Rewind error\n");
          return false;
        }
      }
      mt_com.mt_op = MTFSF;
      /*
       * ***FIXME*** fix code to handle case that INT16_MAX is not large enough.
       */
      mt_com.mt_count = INT16_MAX;    /* use big positive number */
      if (mt_com.mt_count < 0) {
         mt_com.mt_count = INT16_MAX; /* brain damaged system */
      }
   }

   if (has_cap(CAP_MTIOCGET) && (has_cap(CAP_FASTFSF) || has_cap(CAP_EOM))) {
      if (has_cap(CAP_EOM)) {
         Dmsg0(100,"Using EOM for EOM\n");
         mt_com.mt_op = MTEOM;
         mt_com.mt_count = 1;
      }

      if (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
         berrno be;
         clrerror(mt_com.mt_op);
         Dmsg1(50, "ioctl error: %s\n", be.bstrerror());
         update_pos(dcr);
         Mmsg2(errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"), prt_name, be.bstrerror());
         Dmsg0(100, errmsg);
         return false;
      }

      os_file = get_os_tape_file();
      if (os_file < 0) {
         berrno be;
         clrerror(-1);
         Mmsg2(errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"), prt_name, be.bstrerror());
         Dmsg0(100, errmsg);
         return false;
      }
      Dmsg1(100, "EOD file=%d\n", os_file);
      set_ateof();
      file = os_file;
   } else {
#endif
      /*
       * Rewind then use FSF until EOT reached
       */
      if (!rewind(NULL)) {
         Dmsg0(100, "Rewind error.\n");
         return false;
      }

      /*
       * Move file by file to the end of the tape
       */
      int file_num;
      for (file_num=file; !at_eot(); file_num++) {
         Dmsg0(200, "eod: doing fsf 1\n");
         if (!fsf(1)) {
            Dmsg0(100, "fsf error.\n");
            return false;
         }
         /*
          * Avoid infinite loop by ensuring we advance.
          */
         if (!at_eot() && file_num == (int)file) {
            Dmsg1(100, "fsf did not advance from file %d\n", file_num);
            set_ateof();
            os_file = get_os_tape_file();
            if (os_file >= 0) {
               Dmsg2(100, "Adjust file from %d to %d\n", file_num, os_file);
               file = os_file;
            }
            break;
         }
      }
#ifdef MTEOM
   }
#endif

   /*
    * Some drivers leave us after second EOF when doing MTEOM, so we must backup
    * so that appending overwrites the second EOF.
    */
   if (has_cap(CAP_BSFATEOM)) {
      /*
       * Backup over EOF
       */
      ok = bsf(1);

      /*
       * If BSF worked and fileno is known (not -1), set file
       */
      os_file = get_os_tape_file();
      if (os_file >= 0) {
         Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", file , os_file);
         file = os_file;
      } else {
         file++;                       /* wing it -- not correct on all OSes */
      }
   } else {
      update_pos(dcr);                 /* update position */
   }
   Dmsg1(200, "EOD dev->file=%d\n", file);

   return ok;
}