// InROOTProducer.cc // Contact person: P G Jones // See InROOTProducer.hh for more details. //—————————————————————---------------------------------------------——// #include #include #include #include #include #include #include #include #include #include #include #include using namespace RAT; #include #include #include #include InROOTProducer::InROOTProducer() : fDSTree("T"), fRunTree("runT") { fMainBlock = NULL; Init(); } InROOTProducer::InROOTProducer( ProcBlock* block ) : fDSTree("T"), fRunTree("runT") { SetMainBlock(block); Init(); } void InROOTProducer::Init() { // Build commands G4UIdirectory* inrootDir = new G4UIdirectory( "/rat/inroot/" ); inrootDir->SetGuidance( "Read Events from ROOT file" ); fReadCmd = new G4UIcommand( "/rat/inroot/read", this ); fReadCmd->SetGuidance( "Start reading in the root file" ); fReadCmd->AvailableForStates( G4State_Idle ); fLoadDefaultCmd = new G4UIcommand( "/rat/inroot/load_default", this ); fLoadDefaultCmd->SetGuidance( "Load the default filename" ); fLoadDefaultCmd->AvailableForStates( G4State_PreInit ); fLoadCmd = new G4UIcmdWithAString( "/rat/inroot/load", this ); fLoadCmd->SetParameterName( "filename", false ); fLoadCmd->SetGuidance( "Load the filename" ); fLoadCmd->AvailableForStates( G4State_PreInit ); } G4String InROOTProducer::GetCurrentValue( G4UIcommand* ) { Log::Die( "InROOTProducer::GetCurrentValue:invalid inroot \"get\" command" ); return G4String( "You win! How did you manage to see this?." ); } void InROOTProducer::SetNewValue( G4UIcommand* command, G4String newValue ) { if( command == fLoadCmd ) LoadFile( newValue ); else if( command == fLoadDefaultCmd ) { std::vector default_files =DB::Get()->GetLink( "IO" )->GetSArray( "default_input_filename" ); for (size_t i = 0; i < default_files.size(); ++i) { LoadFile( default_files.at(i)); } } else if( command == fReadCmd ) ReadEntries(); else Log::Die( "InROOTProducer::SetNewValue: Invalid command" ); } void InROOTProducer::LoadFile( const std::string& fileName ) { // First of all check that the file actually exists TFile *testFile = TFile::Open( fileName.c_str() ); Log::Assert( testFile != NULL, "InROOTProducer::LoadFile: File seems to be invalid!" ); Log::Assert( testFile->IsZombie() != true, "InROOTProducer::LoadFile: File seems to be invalid!" ); testFile->Close(); delete testFile; info << "InROOTProducer::LoadFile : Loading file :: " << fileName << newline; fDSTree.Add( fileName.c_str() ); fRunTree.Add( fileName.c_str() ); // Load the Meta information DS::Meta *meta = NULL; fDSTree.GetFile()->GetObject("meta",meta); if(meta){ MetaInformation::Get()->Initialise(meta); } else{ warn<<"*** InROOTProducer::LoadEvents: WARNING ***"<Initialise(); } DBCommandLoader::LoadCommands( MetaInformation::Get()->GetDSMeta() ); } void InROOTProducer::ReadEntries() { Log::Assert( fMainBlock != NULL, "InROOTProducer::ReadEvents: No main block declared. (Place this command after processors)." ); const Long64_t dsEntries = fDSTree.GetEntries(); Log::Assert( dsEntries > 0 && fRunTree.GetEntries() > 0,"InROOTProducer::ReadEvents: Cannot load the T or runT in the file." ); info << "InROOTProducer::ReadEvents:" << (int)dsEntries << " entries found. " << (int)fRunTree.GetEntries() << " runs found." << newline; // Load the branches DS::Entry* dsBranch = new DS::Entry(); fDSTree.SetBranchAddress( "ds", &dsBranch ); DS::Run* runBranch = new DS::Run(); fRunTree.SetBranchAddress( "run", &runBranch ); Long64_t iRun = 0; fRunTree.GetEntry( iRun ); long long defaultNumEvents = DB::Get()->GetLink( "IO" )->GetI( "default_num_events" ); long long nEntries; //number of entries to loop over //How many events to run over if (defaultNumEvents >= 0) nEntries = defaultNumEvents; else nEntries = fDSTree.GetEntries(); for( Long64_t iEvent = 0; iEvent < nEntries && !SignalHandler::IsTermRequested(); iEvent++ ) { fDSTree.GetEntry( iEvent ); if( iEvent == 0 ) BeginOfRun( *runBranch ); else if( dsBranch->GetRunID() != runBranch->GetRunID() ) { fMainBlock->EndOfRun( *runBranch ); //Get the next run with same RunID than the DS entry while(dsBranch->GetRunID() != runBranch->GetRunID() && ++iRun < fRunTree.GetEntries()){ fRunTree.GetEntry( iRun ); } Log::Assert( dsBranch->GetRunID() == runBranch->GetRunID(), "InROOTProducer::ReadEvents: Missing run or run out of order in run tree, corrupt file." ); BeginOfRun( *runBranch ); } // Create new data cleaning flags for this pass const size_t pass = MetaInformation::Get()->GetCurrentPass(); for( size_t iEV = 0; iEV < dsBranch->GetEVCount(); iEV++ ) { dsBranch->GetEV( iEV ).GetDataCleaningFlags().SetFlags( pass, DS::BitMask() ); dsBranch->GetEV( iEV ).GetDataCleaningFlags().SetApplied( pass, DS::BitMask() ); } // Now run the processors fMainBlock->DSEvent( *runBranch, *dsBranch ); } // Finished, end the run fMainBlock->EndOfRun( *runBranch ); // Cleanup delete dsBranch; delete runBranch; } void InROOTProducer::BeginOfRun( DS::Run& run ) { // Create new data quality flags for this pass const size_t pass = MetaInformation::Get()->GetCurrentPass(); run.GetDataQualityFlags().SetFlags( pass, DS::BitMask() ); run.GetDataQualityFlags().SetApplied( pass, DS::BitMask() ); Producer::BeginOfRun( run ); fMainBlock->BeginOfRun( run ); }