jdbrice
2/4/2016 - 7:49 AM

VPD Channel Life (and mapping )

VPD Channel Life (and mapping )


#include <iostream>
#include <algorithm>    // std::sort
#include <vector>       // std::vector

using namespace std;

bool found( vector<int> vec, int val ){

	for ( int i = 0; i < vec.size(); i++){
		if ( val == vec[ i ] )
			return true;
	}
	return false;

}


void channelLife( string filename = "cLife.xml" ){


	gStyle->SetOptStat( 0 );

	// get the config file
	// has data location
	// reporter output file
	// HistoBook output file etc.
	XmlConfig * cfg = new XmlConfig( filename );

	
	/**
	 * Setup the logger, reporter, and HistoBook - make all histograms
	 */
	Logger::setGlobalLogLevel( Logger::llAll );

	Logger logger;

	Reporter rp( cfg, "Reporter." );

	HistoBook book( "hbChannelLife.root", cfg );
	book.makeAll( "histograms" );

	string det=cfg->getString( "Detector" , "West" );
	int detOff = 0;
	if ( "East" == det )
		detOff = 19;


	/*
	 * Setup the chain
	 */
	//TChain * chain = new TChain( cfg->getString( "input.dst:treeName" ).c_str() );
	//ChainLoader::load( chain, cfg->getString( "input.dst:url" ), cfg->getInt( "input.dst:maxFiles", -1 ) );
	//TreeMap ds( chain );
	DataSource ds( cfg, "DataSource" );

	int nEvents = ds.getEntries();

	return;

	logger.info() << "nEvents = " << nEvents << endl;
	TaskTimer tt;
	tt.start();

	/**
	 * Loop through events to make a list of run numbers
	 */
	vector<int> runNumbers;
	vector<int> sortedRunNumbers;
	for ( int i = 0; i < nEvents; i++ ){

		ds.getEntry( i );
		int run = ds.get( "run" );
		if ( 16009013 == run ) // this run was marked as junk but i accidentally included it
			continue;
		
		if ( !found( runNumbers, run ) ){
			runNumbers.push_back( run );
			logger.trace() << "Run# " << ts( run ) << endl;
		}
	}

	while( runNumbers.size() > 0 ){

		int minRun = 100000000;
		int index = -1;
		for ( int i = 0; i < runNumbers.size(); i++ ){
			if ( runNumbers[ i ] < minRun ){
				minRun = runNumbers[ i ];
				index = i;
			}
		}

		if ( index >= 0 ){
			sortedRunNumbers.push_back( minRun );
			runNumbers.erase( runNumbers.begin()+index );	
		}
	}

	vector<string> histos = cfg->childrenOf( "histograms" );
	for ( int i = 0; i < histos.size(); i++ ){
		string hName = cfg->getString( histos[ i ] + ":name" );
		for ( int j = 0; j < sortedRunNumbers.size(); j ++ ){
			string rn = ts( sortedRunNumbers[ j ] );
			book.clone( hName, hName + "_" + rn );
		}
		
	}

	book.make2D( "offline", det+" Offline (HPTDC);Run Number;PMT Channel", sortedRunNumbers.size(), 0, sortedRunNumbers.size(), 19, detOff, 19+detOff );
	book.make2D( "online", det + " Online (Bbq);Run Number;PMT Channel", sortedRunNumbers.size(), 0, sortedRunNumbers.size(), 16, 0, 16 );

	book.get2D( "offline" )->SetBit( TH1::kCanRebin );
	book.get2D( "online" )->SetBit( TH1::kCanRebin );

	/**
	 * Loop through events
	 */
	
	for ( int i = 0; i < nEvents; i++ ){

		ds.getEntry( i );
		int run = ds.get( "run" );
		string rn = "_"+ts(run);

		for ( int j= 0; j < 19; j ++ ){

			if ( j < 16 ){
				book.fill( "bbqAdc", j, ds.get( "vpdBbqAdc"+det, j ) );
				book.fill( "bbqTdc", j, ds.get( "vpdBbqTdc"+det, j ) );
			}

			book.fill( "le", j, ds.get( "vpdLe"+det, j ) );
			book.fill( "tot", j, ds.get( "vpdTot"+det, j ) );

			if ( j < 16 ){
				book.fill( "bbqAdc"+rn, j, ds.get( "vpdBbqAdc"+det, j ) );
				book.fill( "bbqTdc"+rn, j, ds.get( "vpdBbqTdc"+det, j ) );
			}

			book.fill( "le"+rn, j, ds.get( "vpdLe"+det, j ) );
			book.fill( "tot"+rn, j, ds.get( "vpdTot"+det, j ) );


		}
	}

	int threshold = 1;
	for ( int j = 0; j < sortedRunNumbers.size(); j ++ ){
		string rn = "_"+ts( sortedRunNumbers[ j ] );

		//cout << "Run " << rn << endl;
		for ( int i = 0; i < 19; i++ ){
			int hits = book.get2D( "tot" + rn )->ProjectionY( "_py", i+1, i+1 )->Integral( 2, -1);

			if ( 5 == i || 13 == i || 14 == i )
				hits = 0;
			if ( hits > threshold ){
				char * binLabel = ts(sortedRunNumbers[ j ]).c_str();
				book.get2D( "offline" )->Fill( binLabel, (int)i+detOff, 1 );
			}

		}
	}

	book.get2D( "offline" )->LabelsDeflate("X");

	for ( int j = 0; j < sortedRunNumbers.size(); j ++ ){
		string rn = "_"+ts( sortedRunNumbers[ j ] );

		//cout << "Run " << rn << endl;
		for ( int i = 0; i < 16; i++ ){
			int hits = book.get2D( "bbqTdc" + rn )->ProjectionY( "_py", i+1, i+1 )->Integral( 10, -1);

			if ( hits > threshold ){
				char * binLabel = ts(sortedRunNumbers[ j ]).c_str();
				book.get2D( "online" )->Fill( binLabel, i, 1 );
			}

		}
	}



	rp.newPage( 1, 2 );
	book.style( "offline" )->set("draw", "colz")->draw();
	rp.next();
	book.style( "online" )->set("draw", "colz")->draw();
	rp.savePage();
	/**
	 * Print out a little report showing each channel's total activity
	 */
	rp.newPage( 1, 2 );
	book.style( "le" )->set( "draw", "colz" )->set( "logZ", 1 )->draw();
	rp.next();
	book.style( "tot" )->set( "draw", "colz" )->set( "logZ", 1 )->draw();
	rp.savePage();

	rp.newPage( 1, 2 );
	book.style( "bbqAdc" )->set( "draw", "colz" )->set( "logZ", 1 )->draw();
	rp.next();
	book.style( "bbqTdc" )->set( "draw", "colz" )->set( "logZ", 1 )->draw();
	rp.savePage();


	for ( int j = 0; j < sortedRunNumbers.size(); j ++ ){
		string rn = "_"+ts( sortedRunNumbers[ j ] );
		

		rp.newPage( 1, 2 );
		book.style( "le"+rn )->set( "draw", "colz" )->set( "logZ", 1 )->
		set("title", ts( sortedRunNumbers[ j ] ) + " le" )->draw();
		rp.next();
		book.style( "tot"+rn )->set( "draw", "colz" )->set( "logZ", 1 )->
		set("title", ts( sortedRunNumbers[ j ] ) + " tot" )->draw();
		rp.savePage();

		rp.newPage( 1, 2 );
		book.style( "bbqAdc"+rn )->set( "draw", "colz" )->set( "logZ", 1 )->
		set("title", ts( sortedRunNumbers[ j ] ) + " bbq Adc" )->draw();
		rp.next();
		book.style( "bbqTdc"+rn )->set( "draw", "colz" )->set( "logZ", 1 )->
		set("title", ts( sortedRunNumbers[ j ] ) + " bbq Tdc" )->draw();
		rp.savePage();


	}


	logger.info() << "Finished in " << tt.elapsedTime() << endl;



}
<?xml version="1.0" encoding="UTF-8"?>

<!-- A root node is required -->
<!--  It can be anything <root></root>, it just has to exist -->
<config>
			
	<input>
		<dst treeName="tof" maxFiles="2" nEvents="10000" url="/Users/danielbrandenburg/bnl/local/"/>
	</input>
	
	<Logger>
		<logLevel>all</logLevel>
	</Logger>

	<Detector>West</Detector>


	<Reporter>
		<output url="rpChannelLife.pdf"/>
	</Reporter>

	<histograms>
		<Histo name="bbqAdc" title="bbqAdc" nBinsX="16" minX="0" maxX="16" nBinsY="50" minY="1" maxY="500" />
		<Histo name="bbqTdc" title="bbqTdc" nBinsX="16" minX="0" maxX="16" nBinsY="100" minY="1" maxY="3000" />

		<Histo name="le" title="le" nBinsX="19" minX="0" maxX="19" nBinsY="50" minY="1" maxY="50000" />
		<Histo name="tot" title="tot" nBinsX="19" minX="0" maxX="19" nBinsY="20" minY="5" maxY="50" />

	</histograms>


</config>