ROOT logo
//__________________________________________________[C++ CLASS IMPLEMENTATION]
//////////////////////////////////////////////////////////////////////////////
// Name:           xiadgf/src/TMrbLofDGFs.cxx
// Purpose:        Methods to operate a module XIA DGF-4C
// Description:    Implements class methods for lists of DGF modules
// Header files:   TMrbDGF.h          -- class defs
// Keywords:
// Author:         R. Lutter
// Mailto:         <a href=mailto:rudi.lutter@physik.uni-muenchen.de>R. Lutter</a>
// Revision:       $Id: TMrbLofDGFs.cxx,v 1.8 2004-09-28 13:51:41 rudi Exp $
// Date:           
//////////////////////////////////////////////////////////////////////////////

namespace std {} using namespace std;

#include <cstdlib>
#include <time.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>

#include "Rtypes.h"
#include "TEnv.h"
#include "TRegexp.h"
#include "TFile.h"
#include "TDatime.h"
#include "TROOT.h"

#include "TMrbLogger.h"

#include "TMrbDGFData.h"
#include "TMrbDGF.h"
#include "TMrbDGFCommon.h"

#include "TMrbLofDGFs.h"

#include "SetColor.h"

extern TMrbLogger * gMrbLog;
extern TMrbDGFData * gMrbDGFData;

ClassImp(TMrbLofDGFs)

Bool_t TMrbLofDGFs::AddModule(TMrbDGF * Module, Bool_t MultiCrate) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::AddModule
// Purpose:        Add a DGF module to list
// Arguments:      TMrbDGF * Module   -- module to be added
//                 Bool_t MultiCrate  -- kTRUE if modules from different crates
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Adds a DGF module to this list.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	UInt_t stationBit;
	
	if (this->FindObject(Module->GetName())) {
		gMrbLog->Err()	<< "Module " << Module->GetName() << " (C" << Module->GetCrate() << ".N" << Module->GetStation()
						<< ") - already in list" << endl;
		gMrbLog->Flush(this->ClassName(), "AddModule");
		return(kFALSE);
	}
	
	if (fCamac == NULL) {
		fCamac = Module->Camac();
		fCrate = Module->GetCrate();
		fDGFData = Module->Data();
	}
		
	if (!MultiCrate) {
		stationBit = 1 << (Module->GetStation() - 1);
		if (fStationMask & stationBit) {
			gMrbLog->Err()	<< "Module " << Module->GetName() << " (C" << Module->GetCrate() << ".N" << Module->GetStation()
							<< ") - station N already occupied" << endl;
			gMrbLog->Flush(this->ClassName(), "AddModule");
			return(kFALSE);
		}

		if (fCrate != Module->GetCrate()) {
			gMrbLog->Err()	<< "Module " << Module->GetName() << " (C" << Module->GetCrate() << ".N" << Module->GetStation()
							<< ") - different crate" << endl;
			gMrbLog->Flush(this->ClassName(), "AddModule");
			return(kFALSE);
		}
		fStationMask |= stationBit;
	}

	if (MultiCrate) fMultiCrate = kTRUE;

	this->Add(Module);
	return(kTRUE);
}

Bool_t TMrbLofDGFs::DownloadFPGACode(TMrbDGFData::EMrbFPGAType FPGAType) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::DownloadFPGACode
// Purpose:        Download FPGA data
// Arguments:      EMrbFPGAType FPGAType   -- fpga type (system or fippi)
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Loads code down to FPGA.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	TMrbDGF * dgf;
	Bool_t ok;
			
	UInt_t sts;
	Int_t size;
	UShort_t * dp;

	TString sysfip;
	UInt_t csrBits;
	Int_t subAddr;
	TString cnaf;

	TArrayI cData;

	UInt_t sysBits, fippiDbits, fippiEbits;

	if (!this->CheckModules("DownLoadFPGACode")) return(kFALSE);
	if (!this->CheckConnect("DownLoadFPGACode")) return(kFALSE);

	if (fMultiCrate) {
		gMrbLog->Err()	<< "[" << sysfip
						<< " FPGA] List contains modules from different crates - looping over list members ..." << endl;
		gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
		ok = kTRUE;
		dgf = (TMrbDGF *) this->First();
		while (dgf) {
			if (!dgf->DownloadFPGACode(FPGAType)) ok = kFALSE;
			dgf = (TMrbDGF *) this->After(dgf);
		}
		return(ok);
	}

	fBroadCast = fCamac->HasBroadCast(fNsetMask, fNexecCmd);
	if (!fBroadCast) {								// no broadcast available - use normal loop
		gMrbLog->Err()	<< "[" << sysfip
						<< " FPGA] No BROADCAST mode available - looping over list members instead ..." << endl;
		gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
		ok = kTRUE;
		dgf = (TMrbDGF *) this->First();
		while (dgf) {
			if (!dgf->DownloadFPGACode(FPGAType)) ok = kFALSE;
			dgf = (TMrbDGF *) this->After(dgf);
		}
		return(ok);
	}
	
	sysBits = 0;
	fippiDbits = 0;
	fippiEbits = 0;

	if (FPGAType == TMrbDGFData::kSystemFPGA) {
		if (!fDGFData->FPGACodeRead(TMrbDGFData::kSystemFPGA)) {
			gMrbLog->Err() << "[System FPGA] No FPGA data" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
			return(kFALSE);
		}
		csrBits = TMrbDGFData::kSystemFPGAReset;								// address system fpga
		subAddr = A(10);														// exec A10.F17
		cnaf = ".A10.F17";
		sysfip = "System";
		sysBits = fStationMask;
	} else {
		dgf = (TMrbDGF *) this->First();
		while (dgf) {
			if (dgf->GetRevision()->GetIndex() == TMrbDGFData::kRevD)	fippiDbits |= (1 << (dgf->GetStation() - 1));
			else														fippiEbits |= (1 << (dgf->GetStation() - 1));	
			dgf = (TMrbDGF *) this->After(dgf);
		}
		if (fippiDbits && !fDGFData->FPGACodeRead(TMrbDGFData::kFippiFPGA, TMrbDGFData::kRevD)) {
			gMrbLog->Err() << "[Fippi(D) FPGA] No FPGA data" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
			return(kFALSE);
		}
		if (fippiEbits && !fDGFData->FPGACodeRead(TMrbDGFData::kFippiFPGA, TMrbDGFData::kRevE)) {
			gMrbLog->Err() << "[Fippi(E) FPGA] No FPGA data" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
			return(kFALSE);
		}
		csrBits = TMrbDGFData::kFippiFPGAReset; 							// address fippi fpga
		subAddr = A(9);														// exec A9.F17
		cnaf = ".A9.F17";
		sysfip = "Fippi";
	}

	fCamac->SetBroadCast(fCrate, fStationMask); 							// set broadcast register
	if (!this->WriteICSR(csrBits)) return(kFALSE);							// reset FPGA
	this->Wait();															// wait for reset to complete

	if (sysBits != 0) {
		size = fDGFData->GetFPGACodeSize(TMrbDGFData::kSystemFPGA); 			// size of FPGA data
		dp = (UShort_t *) fDGFData->GetFPGACodeAddr(TMrbDGFData::kSystemFPGA);	// addr of FPGA data
		cData.Set(size);
		this->CopyData(cData, dp, size);												// copy FPGA data to camac buffer
		if (gMrbDGFData->IsVerbose()) {
			gMrbLog->Out()	<< "[System FPGA] Setting broadcast mask for crate C" << fCrate << ": 0x"
							<< setbase(16) << sysBits << setbase(10) << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode", setblue);
		}
		fCamac->SetBroadCast(fCrate, sysBits); 									// set broadcast register
		if (fCamac->BlockXfer(fCrate, fNexecCmd, subAddr, F(17), cData, 0, size, kTRUE) == -1) {		// start block xfer, 16 bit
			gMrbLog->Err()	<< "[System FPGA] "
							<< "C" << fCrate << ".N" << fNexecCmd
							<< cnaf << " (pattern=0x" << setbase(16) << sysBits << setbase(10)
							<< "): Block xfer failed" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
			return(kFALSE);
		}
	}
	if (fippiDbits != 0) {
		size = fDGFData->GetFPGACodeSize(TMrbDGFData::kFippiFPGA, TMrbDGFData::kRevD); 	// size of FPGA data
		dp = (UShort_t *) fDGFData->GetFPGACodeAddr(TMrbDGFData::kFippiFPGA, TMrbDGFData::kRevD);	// addr of FPGA data
		cData.Set(size);
		this->CopyData(cData, dp, size);												// copy FPGA data to camac buffer
		if (gMrbDGFData->IsVerbose()) {
			gMrbLog->Out()	<< "[Fippi(D) FPGA] Setting broadcast mask for crate C" << fCrate << ": 0x"
							<< setbase(16) << fippiDbits << setbase(10) << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode", setblue);
		}
		fCamac->SetBroadCast(fCrate, fippiDbits); 									// set broadcast register
		if (fCamac->BlockXfer(fCrate, fNexecCmd, subAddr, F(17), cData, 0, size, kTRUE) == -1) {		// start block xfer, 16 bit
			gMrbLog->Err()	<< "[Fippi(D) FPGA] "
							<< "C" << fCrate << ".N" << fNexecCmd
							<< cnaf << " (pattern=0x" << setbase(16) << fippiDbits << setbase(10)
							<< "): Block xfer failed - ActionCount=-1" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
			return(kFALSE);
		}
	}
	if (fippiEbits != 0) {
		size = fDGFData->GetFPGACodeSize(TMrbDGFData::kFippiFPGA, TMrbDGFData::kRevE); 	// size of FPGA data
		dp = (UShort_t *) fDGFData->GetFPGACodeAddr(TMrbDGFData::kFippiFPGA, TMrbDGFData::kRevE);	// addr of FPGA data
		cData.Set(size);
		this->CopyData(cData, dp, size);												// copy FPGA data to camac buffer
		if (gMrbDGFData->IsVerbose()) {
			gMrbLog->Out()	<< "[Fippi(E) FPGA] Setting broadcast mask for crate C" << fCrate << ": 0x"
							<< setbase(16) << fippiEbits << setbase(10) << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode", setblue);
		}
		fCamac->SetBroadCast(fCrate, fippiEbits); 									// set broadcast register
		if (fCamac->BlockXfer(fCrate, fNexecCmd, subAddr, F(17), cData, 0, size, kTRUE) == -1) {		// start block xfer, 16 bit
			gMrbLog->Err()	<< "[Fippi(E) FPGA] "
							<< "C" << fCrate << ".N" << fNexecCmd
							<< cnaf << " (pattern=0x" << setbase(16) << fippiEbits << setbase(10)
							<< "): Block xfer failed - ActionCount=-1" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
			return(kFALSE);
		}
	}

	this->Wait();															// wait for download to complete

	dgf = (TMrbDGF *) this->First();										// read status
	ok = kTRUE;
	while (dgf) {
		sts = dgf->ReadICSR() & csrBits;
		if (sts != 0) { 											// error?
			gMrbLog->Err()	<< "[" << sysfip << " FPGA] "
							<< dgf->GetName() << " in C" << dgf->GetCrate() << ".N" << dgf->GetStation()
							<< ": Data xfer failed - error 0x" << setbase(16) << sts << setbase(10) << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
			ok = kFALSE;
		}
		sts = dgf->GetStatus();
		if (FPGAType == TMrbDGFData::kSystemFPGA)	sts |= TMrbDGF::kSystemFPGACodeLoaded;
		else										sts |= TMrbDGF::kFippiFPGACodeLoaded;
		dgf->SetStatus(sts);
		dgf = (TMrbDGF *) this->After(dgf);
	}

	if (gMrbDGFData->IsVerbose()) {
		if (ok) {
			gMrbLog->Out()	<< "[" << sysfip << " FPGA] " << "C" << fCrate << ".N" << fNexecCmd
							<< ": Code successfully loaded via broadcast" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode", setblue);
		} else {
			gMrbLog->Err()	<< "[" << sysfip << " FPGA] " << "C" << fCrate << ".N" << fNexecCmd
							<< ": error(s) during FPGA download via broadcast" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
		}
	}
	return(ok);
}

Bool_t TMrbLofDGFs::DownloadFPGACode(const Char_t * FPGAType) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::DownloadFPGACode
// Purpose:        Download FPGA data
// Arguments:      Char_t * FPGAType   -- fpga type (system or fippi)
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Loads code down to FPGA.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	TMrbNamedX * sysfip;

	sysfip = gMrbDGFData->fLofFPGATypes.FindByName(FPGAType, TMrbLofNamedX::kFindUnique | TMrbLofNamedX::kFindIgnoreCase);
	if (sysfip == NULL) {
		gMrbLog->Err() << "Illegal FPGA type - " << FPGAType << endl;
		gMrbLog->Flush(this->ClassName(), "DownloadFPGACode");
		return(kFALSE);
	}
	return(this->DownloadFPGACode((TMrbDGFData::EMrbFPGAType) sysfip->GetIndex()));
}

Bool_t TMrbLofDGFs::DownloadDSPCode(Int_t Retry) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::DownloadDSPCode
// Purpose:        Download DSP data
// Arguments:      Int_t Retry  -- number of retries on error
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Loads code down to DSP.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	TMrbDGF * dgf;
	Bool_t ok;
			
	Int_t size;
	UShort_t * dp;
	UInt_t sts;
	
	TArrayI cData;

	if (!this->CheckModules("DownLoadDSPCode")) return(kFALSE);
	if (!this->CheckConnect("DownLoadDSPCode")) return(kFALSE);

	if (fMultiCrate) {									// no broadcast available - use normal loop
		gMrbLog->Err()	<< "List contains modules from different crates - looping over list members ..." << endl;
		gMrbLog->Flush(this->ClassName(), "DownloadDSPCode");
		ok = kTRUE;
		dgf = (TMrbDGF *) this->First();
		while (dgf) {
			if (!dgf->DownloadDSPCode()) ok = kFALSE;
			dgf = (TMrbDGF *) this->After(dgf);
		}
		return(ok);
	}
	
	fBroadCast = fCamac->HasBroadCast(fNsetMask, fNexecCmd);
	if (!fBroadCast) {								// no broadcast available - use normal loop
		gMrbLog->Err()	<< "No BROADCAST mode available - looping over list members instead ..." << endl;
		gMrbLog->Flush(this->ClassName(), "DownloadDSPCode");
		ok = kTRUE;
		dgf = (TMrbDGF *) this->First();
		while (dgf) {
			if (!dgf->DownloadDSPCode()) ok = kFALSE;
			dgf = (TMrbDGF *) this->After(dgf);
		}
		return(ok);
	}
	
	if (gMrbDGFData->IsVerbose()) {
		gMrbLog->Out()	<< "Setting broadcast mask for crate C" << fCrate << ": 0x"
						<< setbase(16) << fStationMask << setbase(10) << endl;
		gMrbLog->Flush(this->ClassName(), "DownloadDSPCode", setblue);
	}
	fCamac->SetBroadCast(fCrate, fStationMask); 				// set broadcast register
	
	if (fDGFData->DSPCodeRead()) {
		if (!this->WriteCSR(TMrbDGFData::kDSPReset)) return(kFALSE);
		this->Wait();													// wait for reset to complete
		
		size = fDGFData->GetDSPCodeSize();									// size of DSP data
		dp = (UShort_t *) fDGFData->GetDSPCodeAddr();	 					// addr of DSP data
		cData.Set(size);
		this->CopyData(cData, dp, size);
		if (!this->WriteTSAR(1)) return(kFALSE); 							// start with addr 1
		if (fCamac->BlockXfer(fCrate, fNexecCmd, A(0), F(16), cData, 2, size - 2, kTRUE) == -1) {	// start block xfer, 16 bit
			gMrbLog->Err()	<< "C" << fCrate << ".N" << fNexecCmd
							<< ".A0.F16 failed - DSPAddr=1, wc=" << size - 2 << ", ActionCount=-1" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadDSPCode");
			return(kFALSE);
		}

		if (!this->WriteTSAR(0)) return(kFALSE); 							// writing to addr 0 will start DSP pgm
		if (fCamac->BlockXfer(fCrate, fNexecCmd, A(0), F(16), cData, 0, 2, kTRUE) == -1) {	// start block xfer
			gMrbLog->Err()	<< fName << " in C" << fCrate << ".N" << fNexecCmd
							<< ".A0.F16 failed - DSPAddr=0, wc=2, ActionCount=-1" << endl;
			gMrbLog->Flush(this->ClassName(), "DownloadDSPCode");
			return(kFALSE);
		}

		this->Wait();														// wait to settle down

		dgf = (TMrbDGF *) this->First();									// test if download ok
		ok = kTRUE;
		while (dgf) {
			if (dgf->ReadCSR() & TMrbDGFData::kDSPError) { 					// error?
				if (!dgf->DownloadDSPCode(Retry, kTRUE)) ok = kFALSE;
			}
			sts = dgf->GetStatus();
			sts |= TMrbDGF::kDSPCodeLoaded;
			dgf->SetStatus(sts);
			dgf = (TMrbDGF *) this->After(dgf);
		}
				
		if (gMrbDGFData->IsVerbose()) {
			if (ok) {
				gMrbLog->Out()	<< "C" << fCrate << ".N" << fNexecCmd
								<< ": DSP code successfully loaded via broadcast (" << size << " words)" << endl;
				gMrbLog->Flush(this->ClassName(), "DownloadDSPCode", setblue);
			} else {
				gMrbLog->Err()	<< "C" << fCrate << ".N" << fNexecCmd
								<< ": error(s) during DSP download via broadcast" << endl;
				gMrbLog->Flush(this->ClassName(), "DownloadDSPCode");
			}
		}
		return(ok);
	} else {
		gMrbLog->Err() << "No DSP data" << endl;
		gMrbLog->Flush(this->ClassName(), "DownloadDSPCode");
		return(kFALSE);
	}
}

Bool_t TMrbLofDGFs::FPGACodeLoaded(TMrbDGFData::EMrbFPGAType FPGAType) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::FGPACodeLoaded
// Purpose:        Test if FPGA code is loaded
// Arguments:      EMrbFPGAType FPGAType    -- fpga type (system or fippi)
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Tests if FPGA code has been downloaded to all modules.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	TMrbDGF * dgf;

	UInt_t bit = (FPGAType == TMrbDGFData::kSystemFPGA) ?
								TMrbDGF::kSystemFPGACodeLoaded :
								TMrbDGF::kFippiFPGACodeLoaded;

	dgf = (TMrbDGF *) this->First();
	while (dgf) {	
		if ((dgf->GetStatus() & bit) == 0) return(kFALSE);
		dgf = (TMrbDGF *) this->After(dgf);
	}
	return(kTRUE);
}

Bool_t TMrbLofDGFs::FPGACodeLoaded(const Char_t * FPGAType) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbDGF::FGPACodeLoaded
// Purpose:        Test if FPGA code is loaded
// Arguments:      Char_t * FPGAType    -- fpga type (system or fippi)
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Tests if FPGA code has been downloaded to all modules.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	TMrbNamedX * sysfip;

	sysfip = gMrbDGFData->fLofFPGATypes.FindByName(FPGAType, TMrbLofNamedX::kFindUnique | TMrbLofNamedX::kFindIgnoreCase);
	if (sysfip == NULL) {
		gMrbLog->Err() << "Illegal FPGA type - " << FPGAType << endl;
		gMrbLog->Flush(this->ClassName(), "FPGACodeLoaded");
		return(kFALSE);
	}
	return(this->FPGACodeLoaded((TMrbDGFData::EMrbFPGAType) sysfip->GetIndex()));
}

Bool_t TMrbLofDGFs::DSPCodeLoaded() {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::DSPCodeLoaded
// Purpose:        Test if DSP code is loaded
// Arguments:      --
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Tests if DSP code has been downloaded to all modules.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	TMrbDGF * dgf;

	dgf = (TMrbDGF *) this->First();
	while (dgf) {	
		if ((dgf->GetStatus() & TMrbDGF::kDSPCodeLoaded) == 0) return(kFALSE);
		dgf = (TMrbDGF *) this->After(dgf);
	}
	return(kTRUE);
}

Bool_t TMrbLofDGFs::CheckConnect(const Char_t * Method) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::CheckConnect
// Purpose:        Check if connected to CAMAC
// Arguments:      Char_t * Method      -- calling method
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Checks connection to CAMAC, outputs error message if not connected.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	TMrbDGF * dgf;
	Bool_t ok;
		
	dgf = (TMrbDGF *) this->First();
	ok = kTRUE;
	while (dgf) {
		if (!dgf->IsConnected()) {
			gMrbLog->Err() << dgf->GetTitle() << " - assigned to host " << dgf->GetCamacHost() << ", but NOT connected" << endl;
			gMrbLog->Flush(this->ClassName(), Method);
			ok = kFALSE;
		}
		dgf = (TMrbDGF *) this->After(dgf);
	}
	return(ok);
}

Bool_t TMrbLofDGFs::CheckModules(const Char_t * Method) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLofDGFs::CheckModules
// Purpose:        Check if any modules in list
// Arguments:      Char_t * Method      -- calling method
// Results:        kTRUE/kFALSE
// Exceptions:
// Description:    Checks if there is at least 1 module in list.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	if (fStationMask == 0) {
		gMrbLog->Err() << "List of DGF modules is empty" << endl;
		gMrbLog->Flush(this->ClassName(), Method);
		return(kFALSE);
	}
	return(kTRUE);
}

TMrbDGF::EMrbWaitStatus TMrbLofDGFs::WaitActive(Int_t Timeout) {
//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbDGF::WaitActive
// Purpose:        Wait for active bit to drop
// Arguments:      Int_t Timeout    -- timeout in seconds
// Results:        Status: error, timeout, abort, ok
// Exceptions:
// Description:    Waits until bit TMrbDGFData::kActive disapears in the csr.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

	UInt_t csr;
	time_t start;

	start = time(NULL);
	sleep(1);

	while ((time(NULL) - start) < Timeout) {
		TMrbDGF * dgf = (TMrbDGF *) this->First();
		Bool_t ok = kTRUE;
		while (dgf) {
			csr = dgf->ReadCSR();
			if (csr == 0xffffffff || (csr & TMrbDGFData::kActive) != 0) ok = kFALSE;
			gSystem->ProcessEvents();
			if (this->IsAborted() || dgf->IsAborted()) {
			gMrbLog->Err()	<< "Aborted after " << (time(NULL) - start) << " secs. Stopping current run." << endl;
				gMrbLog->Flush(this->ClassName(), "WaitActive");
				return(TMrbDGF::kWaitAborted);
			}
			dgf = (TMrbDGF *) this->After(dgf);
		}
		if (ok) return(TMrbDGF::kWaitOk);
	}

	gMrbLog->Err()	<< "Timed out after " << Timeout << " secs" << endl;
	gMrbLog->Flush(this->ClassName(), "WaitActive");
	TMrbDGF * dgf = (TMrbDGF *) this->First();
	while (dgf) {
		csr = dgf->ReadCSR();
		if (csr == 0xffffffff) {
			gMrbLog->Err()	<< dgf->GetName() << " in C" << dgf->GetCrate() << ".N" << dgf->GetStation()
							<< ": Unexpected error." << endl;
			gMrbLog->Flush(this->ClassName(), "WaitActive");
		} else if ((csr & TMrbDGFData::kActive) != 0) {
			gMrbLog->Err()	<< dgf->GetName() << " in C" << dgf->GetCrate() << ".N" << dgf->GetStation()
							<< ": Still active." << endl;
			gMrbLog->Flush(this->ClassName(), "WaitActive");
		}
		dgf = (TMrbDGF *) this->After(dgf);
	}
	return(TMrbDGF::kWaitTimedOut);
}

//________________________________________________________________[C++ METHOD]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbDGF::WriteICSR
//                 TMrbDGF::WriteCSR
//                 TMrbDGF::WriteTSAR
//                 TMrbDGF::WriteWCR
// Purpose:        Camac I/O from/to DGF regs
// Arguments:      UInt_t Data   -- data to be written to DGF reg
// Results:        
// Exceptions:
// Description:    
// Keywords:
//////////////////////////////////////////////////////////////////////////////

Bool_t TMrbLofDGFs::WriteICSR(UInt_t Data) {
// Write DGF Control Status Reg
	Int_t cVal = (Int_t) Data;
	if (!fCamac->ExecCnaf(fCrate, fNexecCmd, A(8), F(17), cVal, kTRUE)) {
		gMrbLog->Err()	<< fName << " in C" << fCrate << ".N" << fNexecCmd << ".A8.F17 failed" << endl;
		gMrbLog->Flush(this->ClassName(), "WriteICSR");
		return(kFALSE);
	}
	return(kTRUE);
}

Bool_t TMrbLofDGFs::WriteCSR(UInt_t Data) {
// Write DGF Control Status Reg
	Int_t cVal = (Int_t) Data;
	if (!fCamac->ExecCnaf(fCrate, fNexecCmd, A(0), F(17), cVal, kTRUE)) {
		gMrbLog->Err()	<< fName << " in C" << fCrate << ".N" << fNexecCmd << ".A0.F17 failed" << endl;
		gMrbLog->Flush(this->ClassName(), "WriteCSR");
		return(kFALSE);
	}
	return(kTRUE);
}

Bool_t TMrbLofDGFs::WriteTSAR(UInt_t Addr) {
// Write DGF Transfer Start Addr Reg
	Int_t cVal = (Int_t) Addr;
	if (!fCamac->ExecCnaf(fCrate, fNexecCmd, A(1), F(17), cVal, kTRUE)) {
		gMrbLog->Err()	<< fName << " in C" << fCrate << ".N" << fNexecCmd
						<< ".A1.F17 failed - DSPAddr=0x" << setbase(16) << Addr << setbase(10) << endl;
		gMrbLog->Flush(this->ClassName(), "WriteTSAR");
		return(kFALSE);
	}
	return(kTRUE);
}

Bool_t TMrbLofDGFs::WriteWCR(Int_t Data) {
// Write DGF Word Count Reg
	Int_t cVal = Data;
	if (!fCamac->ExecCnaf(fCrate, fNexecCmd, A(2), F(17), cVal, kTRUE)) {
		gMrbLog->Err()	<< fName << " in C" << fCrate << ".N" << fNexecCmd << ".A2.F17 failed" << endl;
		gMrbLog->Flush(this->ClassName(), "WriteWCR");
		return(kFALSE);
	}
	return(kTRUE);
}



 TMrbLofDGFs.cxx:1
 TMrbLofDGFs.cxx:2
 TMrbLofDGFs.cxx:3
 TMrbLofDGFs.cxx:4
 TMrbLofDGFs.cxx:5
 TMrbLofDGFs.cxx:6
 TMrbLofDGFs.cxx:7
 TMrbLofDGFs.cxx:8
 TMrbLofDGFs.cxx:9
 TMrbLofDGFs.cxx:10
 TMrbLofDGFs.cxx:11
 TMrbLofDGFs.cxx:12
 TMrbLofDGFs.cxx:13
 TMrbLofDGFs.cxx:14
 TMrbLofDGFs.cxx:15
 TMrbLofDGFs.cxx:16
 TMrbLofDGFs.cxx:17
 TMrbLofDGFs.cxx:18
 TMrbLofDGFs.cxx:19
 TMrbLofDGFs.cxx:20
 TMrbLofDGFs.cxx:21
 TMrbLofDGFs.cxx:22
 TMrbLofDGFs.cxx:23
 TMrbLofDGFs.cxx:24
 TMrbLofDGFs.cxx:25
 TMrbLofDGFs.cxx:26
 TMrbLofDGFs.cxx:27
 TMrbLofDGFs.cxx:28
 TMrbLofDGFs.cxx:29
 TMrbLofDGFs.cxx:30
 TMrbLofDGFs.cxx:31
 TMrbLofDGFs.cxx:32
 TMrbLofDGFs.cxx:33
 TMrbLofDGFs.cxx:34
 TMrbLofDGFs.cxx:35
 TMrbLofDGFs.cxx:36
 TMrbLofDGFs.cxx:37
 TMrbLofDGFs.cxx:38
 TMrbLofDGFs.cxx:39
 TMrbLofDGFs.cxx:40
 TMrbLofDGFs.cxx:41
 TMrbLofDGFs.cxx:42
 TMrbLofDGFs.cxx:43
 TMrbLofDGFs.cxx:44
 TMrbLofDGFs.cxx:45
 TMrbLofDGFs.cxx:46
 TMrbLofDGFs.cxx:47
 TMrbLofDGFs.cxx:48
 TMrbLofDGFs.cxx:49
 TMrbLofDGFs.cxx:50
 TMrbLofDGFs.cxx:51
 TMrbLofDGFs.cxx:52
 TMrbLofDGFs.cxx:53
 TMrbLofDGFs.cxx:54
 TMrbLofDGFs.cxx:55
 TMrbLofDGFs.cxx:56
 TMrbLofDGFs.cxx:57
 TMrbLofDGFs.cxx:58
 TMrbLofDGFs.cxx:59
 TMrbLofDGFs.cxx:60
 TMrbLofDGFs.cxx:61
 TMrbLofDGFs.cxx:62
 TMrbLofDGFs.cxx:63
 TMrbLofDGFs.cxx:64
 TMrbLofDGFs.cxx:65
 TMrbLofDGFs.cxx:66
 TMrbLofDGFs.cxx:67
 TMrbLofDGFs.cxx:68
 TMrbLofDGFs.cxx:69
 TMrbLofDGFs.cxx:70
 TMrbLofDGFs.cxx:71
 TMrbLofDGFs.cxx:72
 TMrbLofDGFs.cxx:73
 TMrbLofDGFs.cxx:74
 TMrbLofDGFs.cxx:75
 TMrbLofDGFs.cxx:76
 TMrbLofDGFs.cxx:77
 TMrbLofDGFs.cxx:78
 TMrbLofDGFs.cxx:79
 TMrbLofDGFs.cxx:80
 TMrbLofDGFs.cxx:81
 TMrbLofDGFs.cxx:82
 TMrbLofDGFs.cxx:83
 TMrbLofDGFs.cxx:84
 TMrbLofDGFs.cxx:85
 TMrbLofDGFs.cxx:86
 TMrbLofDGFs.cxx:87
 TMrbLofDGFs.cxx:88
 TMrbLofDGFs.cxx:89
 TMrbLofDGFs.cxx:90
 TMrbLofDGFs.cxx:91
 TMrbLofDGFs.cxx:92
 TMrbLofDGFs.cxx:93
 TMrbLofDGFs.cxx:94
 TMrbLofDGFs.cxx:95
 TMrbLofDGFs.cxx:96
 TMrbLofDGFs.cxx:97
 TMrbLofDGFs.cxx:98
 TMrbLofDGFs.cxx:99
 TMrbLofDGFs.cxx:100
 TMrbLofDGFs.cxx:101
 TMrbLofDGFs.cxx:102
 TMrbLofDGFs.cxx:103
 TMrbLofDGFs.cxx:104
 TMrbLofDGFs.cxx:105
 TMrbLofDGFs.cxx:106
 TMrbLofDGFs.cxx:107
 TMrbLofDGFs.cxx:108
 TMrbLofDGFs.cxx:109
 TMrbLofDGFs.cxx:110
 TMrbLofDGFs.cxx:111
 TMrbLofDGFs.cxx:112
 TMrbLofDGFs.cxx:113
 TMrbLofDGFs.cxx:114
 TMrbLofDGFs.cxx:115
 TMrbLofDGFs.cxx:116
 TMrbLofDGFs.cxx:117
 TMrbLofDGFs.cxx:118
 TMrbLofDGFs.cxx:119
 TMrbLofDGFs.cxx:120
 TMrbLofDGFs.cxx:121
 TMrbLofDGFs.cxx:122
 TMrbLofDGFs.cxx:123
 TMrbLofDGFs.cxx:124
 TMrbLofDGFs.cxx:125
 TMrbLofDGFs.cxx:126
 TMrbLofDGFs.cxx:127
 TMrbLofDGFs.cxx:128
 TMrbLofDGFs.cxx:129
 TMrbLofDGFs.cxx:130
 TMrbLofDGFs.cxx:131
 TMrbLofDGFs.cxx:132
 TMrbLofDGFs.cxx:133
 TMrbLofDGFs.cxx:134
 TMrbLofDGFs.cxx:135
 TMrbLofDGFs.cxx:136
 TMrbLofDGFs.cxx:137
 TMrbLofDGFs.cxx:138
 TMrbLofDGFs.cxx:139
 TMrbLofDGFs.cxx:140
 TMrbLofDGFs.cxx:141
 TMrbLofDGFs.cxx:142
 TMrbLofDGFs.cxx:143
 TMrbLofDGFs.cxx:144
 TMrbLofDGFs.cxx:145
 TMrbLofDGFs.cxx:146
 TMrbLofDGFs.cxx:147
 TMrbLofDGFs.cxx:148
 TMrbLofDGFs.cxx:149
 TMrbLofDGFs.cxx:150
 TMrbLofDGFs.cxx:151
 TMrbLofDGFs.cxx:152
 TMrbLofDGFs.cxx:153
 TMrbLofDGFs.cxx:154
 TMrbLofDGFs.cxx:155
 TMrbLofDGFs.cxx:156
 TMrbLofDGFs.cxx:157
 TMrbLofDGFs.cxx:158
 TMrbLofDGFs.cxx:159
 TMrbLofDGFs.cxx:160
 TMrbLofDGFs.cxx:161
 TMrbLofDGFs.cxx:162
 TMrbLofDGFs.cxx:163
 TMrbLofDGFs.cxx:164
 TMrbLofDGFs.cxx:165
 TMrbLofDGFs.cxx:166
 TMrbLofDGFs.cxx:167
 TMrbLofDGFs.cxx:168
 TMrbLofDGFs.cxx:169
 TMrbLofDGFs.cxx:170
 TMrbLofDGFs.cxx:171
 TMrbLofDGFs.cxx:172
 TMrbLofDGFs.cxx:173
 TMrbLofDGFs.cxx:174
 TMrbLofDGFs.cxx:175
 TMrbLofDGFs.cxx:176
 TMrbLofDGFs.cxx:177
 TMrbLofDGFs.cxx:178
 TMrbLofDGFs.cxx:179
 TMrbLofDGFs.cxx:180
 TMrbLofDGFs.cxx:181
 TMrbLofDGFs.cxx:182
 TMrbLofDGFs.cxx:183
 TMrbLofDGFs.cxx:184
 TMrbLofDGFs.cxx:185
 TMrbLofDGFs.cxx:186
 TMrbLofDGFs.cxx:187
 TMrbLofDGFs.cxx:188
 TMrbLofDGFs.cxx:189
 TMrbLofDGFs.cxx:190
 TMrbLofDGFs.cxx:191
 TMrbLofDGFs.cxx:192
 TMrbLofDGFs.cxx:193
 TMrbLofDGFs.cxx:194
 TMrbLofDGFs.cxx:195
 TMrbLofDGFs.cxx:196
 TMrbLofDGFs.cxx:197
 TMrbLofDGFs.cxx:198
 TMrbLofDGFs.cxx:199
 TMrbLofDGFs.cxx:200
 TMrbLofDGFs.cxx:201
 TMrbLofDGFs.cxx:202
 TMrbLofDGFs.cxx:203
 TMrbLofDGFs.cxx:204
 TMrbLofDGFs.cxx:205
 TMrbLofDGFs.cxx:206
 TMrbLofDGFs.cxx:207
 TMrbLofDGFs.cxx:208
 TMrbLofDGFs.cxx:209
 TMrbLofDGFs.cxx:210
 TMrbLofDGFs.cxx:211
 TMrbLofDGFs.cxx:212
 TMrbLofDGFs.cxx:213
 TMrbLofDGFs.cxx:214
 TMrbLofDGFs.cxx:215
 TMrbLofDGFs.cxx:216
 TMrbLofDGFs.cxx:217
 TMrbLofDGFs.cxx:218
 TMrbLofDGFs.cxx:219
 TMrbLofDGFs.cxx:220
 TMrbLofDGFs.cxx:221
 TMrbLofDGFs.cxx:222
 TMrbLofDGFs.cxx:223
 TMrbLofDGFs.cxx:224
 TMrbLofDGFs.cxx:225
 TMrbLofDGFs.cxx:226
 TMrbLofDGFs.cxx:227
 TMrbLofDGFs.cxx:228
 TMrbLofDGFs.cxx:229
 TMrbLofDGFs.cxx:230
 TMrbLofDGFs.cxx:231
 TMrbLofDGFs.cxx:232
 TMrbLofDGFs.cxx:233
 TMrbLofDGFs.cxx:234
 TMrbLofDGFs.cxx:235
 TMrbLofDGFs.cxx:236
 TMrbLofDGFs.cxx:237
 TMrbLofDGFs.cxx:238
 TMrbLofDGFs.cxx:239
 TMrbLofDGFs.cxx:240
 TMrbLofDGFs.cxx:241
 TMrbLofDGFs.cxx:242
 TMrbLofDGFs.cxx:243
 TMrbLofDGFs.cxx:244
 TMrbLofDGFs.cxx:245
 TMrbLofDGFs.cxx:246
 TMrbLofDGFs.cxx:247
 TMrbLofDGFs.cxx:248
 TMrbLofDGFs.cxx:249
 TMrbLofDGFs.cxx:250
 TMrbLofDGFs.cxx:251
 TMrbLofDGFs.cxx:252
 TMrbLofDGFs.cxx:253
 TMrbLofDGFs.cxx:254
 TMrbLofDGFs.cxx:255
 TMrbLofDGFs.cxx:256
 TMrbLofDGFs.cxx:257
 TMrbLofDGFs.cxx:258
 TMrbLofDGFs.cxx:259
 TMrbLofDGFs.cxx:260
 TMrbLofDGFs.cxx:261
 TMrbLofDGFs.cxx:262
 TMrbLofDGFs.cxx:263
 TMrbLofDGFs.cxx:264
 TMrbLofDGFs.cxx:265
 TMrbLofDGFs.cxx:266
 TMrbLofDGFs.cxx:267
 TMrbLofDGFs.cxx:268
 TMrbLofDGFs.cxx:269
 TMrbLofDGFs.cxx:270
 TMrbLofDGFs.cxx:271
 TMrbLofDGFs.cxx:272
 TMrbLofDGFs.cxx:273
 TMrbLofDGFs.cxx:274
 TMrbLofDGFs.cxx:275
 TMrbLofDGFs.cxx:276
 TMrbLofDGFs.cxx:277
 TMrbLofDGFs.cxx:278
 TMrbLofDGFs.cxx:279
 TMrbLofDGFs.cxx:280
 TMrbLofDGFs.cxx:281
 TMrbLofDGFs.cxx:282
 TMrbLofDGFs.cxx:283
 TMrbLofDGFs.cxx:284
 TMrbLofDGFs.cxx:285
 TMrbLofDGFs.cxx:286
 TMrbLofDGFs.cxx:287
 TMrbLofDGFs.cxx:288
 TMrbLofDGFs.cxx:289
 TMrbLofDGFs.cxx:290
 TMrbLofDGFs.cxx:291
 TMrbLofDGFs.cxx:292
 TMrbLofDGFs.cxx:293
 TMrbLofDGFs.cxx:294
 TMrbLofDGFs.cxx:295
 TMrbLofDGFs.cxx:296
 TMrbLofDGFs.cxx:297
 TMrbLofDGFs.cxx:298
 TMrbLofDGFs.cxx:299
 TMrbLofDGFs.cxx:300
 TMrbLofDGFs.cxx:301
 TMrbLofDGFs.cxx:302
 TMrbLofDGFs.cxx:303
 TMrbLofDGFs.cxx:304
 TMrbLofDGFs.cxx:305
 TMrbLofDGFs.cxx:306
 TMrbLofDGFs.cxx:307
 TMrbLofDGFs.cxx:308
 TMrbLofDGFs.cxx:309
 TMrbLofDGFs.cxx:310
 TMrbLofDGFs.cxx:311
 TMrbLofDGFs.cxx:312
 TMrbLofDGFs.cxx:313
 TMrbLofDGFs.cxx:314
 TMrbLofDGFs.cxx:315
 TMrbLofDGFs.cxx:316
 TMrbLofDGFs.cxx:317
 TMrbLofDGFs.cxx:318
 TMrbLofDGFs.cxx:319
 TMrbLofDGFs.cxx:320
 TMrbLofDGFs.cxx:321
 TMrbLofDGFs.cxx:322
 TMrbLofDGFs.cxx:323
 TMrbLofDGFs.cxx:324
 TMrbLofDGFs.cxx:325
 TMrbLofDGFs.cxx:326
 TMrbLofDGFs.cxx:327
 TMrbLofDGFs.cxx:328
 TMrbLofDGFs.cxx:329
 TMrbLofDGFs.cxx:330
 TMrbLofDGFs.cxx:331
 TMrbLofDGFs.cxx:332
 TMrbLofDGFs.cxx:333
 TMrbLofDGFs.cxx:334
 TMrbLofDGFs.cxx:335
 TMrbLofDGFs.cxx:336
 TMrbLofDGFs.cxx:337
 TMrbLofDGFs.cxx:338
 TMrbLofDGFs.cxx:339
 TMrbLofDGFs.cxx:340
 TMrbLofDGFs.cxx:341
 TMrbLofDGFs.cxx:342
 TMrbLofDGFs.cxx:343
 TMrbLofDGFs.cxx:344
 TMrbLofDGFs.cxx:345
 TMrbLofDGFs.cxx:346
 TMrbLofDGFs.cxx:347
 TMrbLofDGFs.cxx:348
 TMrbLofDGFs.cxx:349
 TMrbLofDGFs.cxx:350
 TMrbLofDGFs.cxx:351
 TMrbLofDGFs.cxx:352
 TMrbLofDGFs.cxx:353
 TMrbLofDGFs.cxx:354
 TMrbLofDGFs.cxx:355
 TMrbLofDGFs.cxx:356
 TMrbLofDGFs.cxx:357
 TMrbLofDGFs.cxx:358
 TMrbLofDGFs.cxx:359
 TMrbLofDGFs.cxx:360
 TMrbLofDGFs.cxx:361
 TMrbLofDGFs.cxx:362
 TMrbLofDGFs.cxx:363
 TMrbLofDGFs.cxx:364
 TMrbLofDGFs.cxx:365
 TMrbLofDGFs.cxx:366
 TMrbLofDGFs.cxx:367
 TMrbLofDGFs.cxx:368
 TMrbLofDGFs.cxx:369
 TMrbLofDGFs.cxx:370
 TMrbLofDGFs.cxx:371
 TMrbLofDGFs.cxx:372
 TMrbLofDGFs.cxx:373
 TMrbLofDGFs.cxx:374
 TMrbLofDGFs.cxx:375
 TMrbLofDGFs.cxx:376
 TMrbLofDGFs.cxx:377
 TMrbLofDGFs.cxx:378
 TMrbLofDGFs.cxx:379
 TMrbLofDGFs.cxx:380
 TMrbLofDGFs.cxx:381
 TMrbLofDGFs.cxx:382
 TMrbLofDGFs.cxx:383
 TMrbLofDGFs.cxx:384
 TMrbLofDGFs.cxx:385
 TMrbLofDGFs.cxx:386
 TMrbLofDGFs.cxx:387
 TMrbLofDGFs.cxx:388
 TMrbLofDGFs.cxx:389
 TMrbLofDGFs.cxx:390
 TMrbLofDGFs.cxx:391
 TMrbLofDGFs.cxx:392
 TMrbLofDGFs.cxx:393
 TMrbLofDGFs.cxx:394
 TMrbLofDGFs.cxx:395
 TMrbLofDGFs.cxx:396
 TMrbLofDGFs.cxx:397
 TMrbLofDGFs.cxx:398
 TMrbLofDGFs.cxx:399
 TMrbLofDGFs.cxx:400
 TMrbLofDGFs.cxx:401
 TMrbLofDGFs.cxx:402
 TMrbLofDGFs.cxx:403
 TMrbLofDGFs.cxx:404
 TMrbLofDGFs.cxx:405
 TMrbLofDGFs.cxx:406
 TMrbLofDGFs.cxx:407
 TMrbLofDGFs.cxx:408
 TMrbLofDGFs.cxx:409
 TMrbLofDGFs.cxx:410
 TMrbLofDGFs.cxx:411
 TMrbLofDGFs.cxx:412
 TMrbLofDGFs.cxx:413
 TMrbLofDGFs.cxx:414
 TMrbLofDGFs.cxx:415
 TMrbLofDGFs.cxx:416
 TMrbLofDGFs.cxx:417
 TMrbLofDGFs.cxx:418
 TMrbLofDGFs.cxx:419
 TMrbLofDGFs.cxx:420
 TMrbLofDGFs.cxx:421
 TMrbLofDGFs.cxx:422
 TMrbLofDGFs.cxx:423
 TMrbLofDGFs.cxx:424
 TMrbLofDGFs.cxx:425
 TMrbLofDGFs.cxx:426
 TMrbLofDGFs.cxx:427
 TMrbLofDGFs.cxx:428
 TMrbLofDGFs.cxx:429
 TMrbLofDGFs.cxx:430
 TMrbLofDGFs.cxx:431
 TMrbLofDGFs.cxx:432
 TMrbLofDGFs.cxx:433
 TMrbLofDGFs.cxx:434
 TMrbLofDGFs.cxx:435
 TMrbLofDGFs.cxx:436
 TMrbLofDGFs.cxx:437
 TMrbLofDGFs.cxx:438
 TMrbLofDGFs.cxx:439
 TMrbLofDGFs.cxx:440
 TMrbLofDGFs.cxx:441
 TMrbLofDGFs.cxx:442
 TMrbLofDGFs.cxx:443
 TMrbLofDGFs.cxx:444
 TMrbLofDGFs.cxx:445
 TMrbLofDGFs.cxx:446
 TMrbLofDGFs.cxx:447
 TMrbLofDGFs.cxx:448
 TMrbLofDGFs.cxx:449
 TMrbLofDGFs.cxx:450
 TMrbLofDGFs.cxx:451
 TMrbLofDGFs.cxx:452
 TMrbLofDGFs.cxx:453
 TMrbLofDGFs.cxx:454
 TMrbLofDGFs.cxx:455
 TMrbLofDGFs.cxx:456
 TMrbLofDGFs.cxx:457
 TMrbLofDGFs.cxx:458
 TMrbLofDGFs.cxx:459
 TMrbLofDGFs.cxx:460
 TMrbLofDGFs.cxx:461
 TMrbLofDGFs.cxx:462
 TMrbLofDGFs.cxx:463
 TMrbLofDGFs.cxx:464
 TMrbLofDGFs.cxx:465
 TMrbLofDGFs.cxx:466
 TMrbLofDGFs.cxx:467
 TMrbLofDGFs.cxx:468
 TMrbLofDGFs.cxx:469
 TMrbLofDGFs.cxx:470
 TMrbLofDGFs.cxx:471
 TMrbLofDGFs.cxx:472
 TMrbLofDGFs.cxx:473
 TMrbLofDGFs.cxx:474
 TMrbLofDGFs.cxx:475
 TMrbLofDGFs.cxx:476
 TMrbLofDGFs.cxx:477
 TMrbLofDGFs.cxx:478
 TMrbLofDGFs.cxx:479
 TMrbLofDGFs.cxx:480
 TMrbLofDGFs.cxx:481
 TMrbLofDGFs.cxx:482
 TMrbLofDGFs.cxx:483
 TMrbLofDGFs.cxx:484
 TMrbLofDGFs.cxx:485
 TMrbLofDGFs.cxx:486
 TMrbLofDGFs.cxx:487
 TMrbLofDGFs.cxx:488
 TMrbLofDGFs.cxx:489
 TMrbLofDGFs.cxx:490
 TMrbLofDGFs.cxx:491
 TMrbLofDGFs.cxx:492
 TMrbLofDGFs.cxx:493
 TMrbLofDGFs.cxx:494
 TMrbLofDGFs.cxx:495
 TMrbLofDGFs.cxx:496
 TMrbLofDGFs.cxx:497
 TMrbLofDGFs.cxx:498
 TMrbLofDGFs.cxx:499
 TMrbLofDGFs.cxx:500
 TMrbLofDGFs.cxx:501
 TMrbLofDGFs.cxx:502
 TMrbLofDGFs.cxx:503
 TMrbLofDGFs.cxx:504
 TMrbLofDGFs.cxx:505
 TMrbLofDGFs.cxx:506
 TMrbLofDGFs.cxx:507
 TMrbLofDGFs.cxx:508
 TMrbLofDGFs.cxx:509
 TMrbLofDGFs.cxx:510
 TMrbLofDGFs.cxx:511
 TMrbLofDGFs.cxx:512
 TMrbLofDGFs.cxx:513
 TMrbLofDGFs.cxx:514
 TMrbLofDGFs.cxx:515
 TMrbLofDGFs.cxx:516
 TMrbLofDGFs.cxx:517
 TMrbLofDGFs.cxx:518
 TMrbLofDGFs.cxx:519
 TMrbLofDGFs.cxx:520
 TMrbLofDGFs.cxx:521
 TMrbLofDGFs.cxx:522
 TMrbLofDGFs.cxx:523
 TMrbLofDGFs.cxx:524
 TMrbLofDGFs.cxx:525
 TMrbLofDGFs.cxx:526
 TMrbLofDGFs.cxx:527
 TMrbLofDGFs.cxx:528
 TMrbLofDGFs.cxx:529
 TMrbLofDGFs.cxx:530
 TMrbLofDGFs.cxx:531
 TMrbLofDGFs.cxx:532
 TMrbLofDGFs.cxx:533
 TMrbLofDGFs.cxx:534
 TMrbLofDGFs.cxx:535
 TMrbLofDGFs.cxx:536
 TMrbLofDGFs.cxx:537
 TMrbLofDGFs.cxx:538
 TMrbLofDGFs.cxx:539
 TMrbLofDGFs.cxx:540
 TMrbLofDGFs.cxx:541
 TMrbLofDGFs.cxx:542
 TMrbLofDGFs.cxx:543
 TMrbLofDGFs.cxx:544
 TMrbLofDGFs.cxx:545
 TMrbLofDGFs.cxx:546
 TMrbLofDGFs.cxx:547
 TMrbLofDGFs.cxx:548
 TMrbLofDGFs.cxx:549
 TMrbLofDGFs.cxx:550
 TMrbLofDGFs.cxx:551
 TMrbLofDGFs.cxx:552
 TMrbLofDGFs.cxx:553
 TMrbLofDGFs.cxx:554
 TMrbLofDGFs.cxx:555
 TMrbLofDGFs.cxx:556
 TMrbLofDGFs.cxx:557
 TMrbLofDGFs.cxx:558
 TMrbLofDGFs.cxx:559
 TMrbLofDGFs.cxx:560
 TMrbLofDGFs.cxx:561
 TMrbLofDGFs.cxx:562
 TMrbLofDGFs.cxx:563
 TMrbLofDGFs.cxx:564
 TMrbLofDGFs.cxx:565
 TMrbLofDGFs.cxx:566
 TMrbLofDGFs.cxx:567
 TMrbLofDGFs.cxx:568
 TMrbLofDGFs.cxx:569
 TMrbLofDGFs.cxx:570
 TMrbLofDGFs.cxx:571
 TMrbLofDGFs.cxx:572
 TMrbLofDGFs.cxx:573
 TMrbLofDGFs.cxx:574
 TMrbLofDGFs.cxx:575
 TMrbLofDGFs.cxx:576
 TMrbLofDGFs.cxx:577
 TMrbLofDGFs.cxx:578
 TMrbLofDGFs.cxx:579
 TMrbLofDGFs.cxx:580
 TMrbLofDGFs.cxx:581
 TMrbLofDGFs.cxx:582
 TMrbLofDGFs.cxx:583
 TMrbLofDGFs.cxx:584
 TMrbLofDGFs.cxx:585
 TMrbLofDGFs.cxx:586
 TMrbLofDGFs.cxx:587
 TMrbLofDGFs.cxx:588
 TMrbLofDGFs.cxx:589
 TMrbLofDGFs.cxx:590
 TMrbLofDGFs.cxx:591
 TMrbLofDGFs.cxx:592
 TMrbLofDGFs.cxx:593
 TMrbLofDGFs.cxx:594
 TMrbLofDGFs.cxx:595
 TMrbLofDGFs.cxx:596
 TMrbLofDGFs.cxx:597
 TMrbLofDGFs.cxx:598
 TMrbLofDGFs.cxx:599
 TMrbLofDGFs.cxx:600
 TMrbLofDGFs.cxx:601
 TMrbLofDGFs.cxx:602
 TMrbLofDGFs.cxx:603
 TMrbLofDGFs.cxx:604
 TMrbLofDGFs.cxx:605
 TMrbLofDGFs.cxx:606
 TMrbLofDGFs.cxx:607
 TMrbLofDGFs.cxx:608
 TMrbLofDGFs.cxx:609
 TMrbLofDGFs.cxx:610
 TMrbLofDGFs.cxx:611
 TMrbLofDGFs.cxx:612
 TMrbLofDGFs.cxx:613
 TMrbLofDGFs.cxx:614
 TMrbLofDGFs.cxx:615
 TMrbLofDGFs.cxx:616
 TMrbLofDGFs.cxx:617
 TMrbLofDGFs.cxx:618
 TMrbLofDGFs.cxx:619
 TMrbLofDGFs.cxx:620
 TMrbLofDGFs.cxx:621
 TMrbLofDGFs.cxx:622
 TMrbLofDGFs.cxx:623
 TMrbLofDGFs.cxx:624
 TMrbLofDGFs.cxx:625
 TMrbLofDGFs.cxx:626
 TMrbLofDGFs.cxx:627
 TMrbLofDGFs.cxx:628
 TMrbLofDGFs.cxx:629
 TMrbLofDGFs.cxx:630
 TMrbLofDGFs.cxx:631
 TMrbLofDGFs.cxx:632
 TMrbLofDGFs.cxx:633
 TMrbLofDGFs.cxx:634
 TMrbLofDGFs.cxx:635
 TMrbLofDGFs.cxx:636
 TMrbLofDGFs.cxx:637
 TMrbLofDGFs.cxx:638
 TMrbLofDGFs.cxx:639
 TMrbLofDGFs.cxx:640
 TMrbLofDGFs.cxx:641
 TMrbLofDGFs.cxx:642
 TMrbLofDGFs.cxx:643
 TMrbLofDGFs.cxx:644
 TMrbLofDGFs.cxx:645
 TMrbLofDGFs.cxx:646
 TMrbLofDGFs.cxx:647
 TMrbLofDGFs.cxx:648
 TMrbLofDGFs.cxx:649
 TMrbLofDGFs.cxx:650
 TMrbLofDGFs.cxx:651
 TMrbLofDGFs.cxx:652
 TMrbLofDGFs.cxx:653
 TMrbLofDGFs.cxx:654
 TMrbLofDGFs.cxx:655
 TMrbLofDGFs.cxx:656
 TMrbLofDGFs.cxx:657
 TMrbLofDGFs.cxx:658
 TMrbLofDGFs.cxx:659
 TMrbLofDGFs.cxx:660
 TMrbLofDGFs.cxx:661