Download presentation
Presentation is loading. Please wait.
Published byJeffrey Bell Modified over 8 years ago
1
Software & Computing Jochen Markert
2
Where are we now? Full simulation chain Full DST chain New DST output formatNew DST output format Successfully run without problems on huge statisticsSuccessfully run without problems on huge statistics Calculation speed already better than estimatedCalculation speed already better than estimated New tools New code for alignment and calibration (see Vladimir’s & Olga’s Talk) ORACLE web interface restructured Improved software environment: fully 64bit approved Hydra2/HGeant2 fully 64bit approved Hydra2/HGeant2 Improved installation procedures Improved installation procedures Documentation: Hydra.pdf (~70 pages), part of the hydra2 repository Hydra.pdf (~70 pages), part of the hydra2 repository Html documentation: ROOT + doxygen Html documentation: ROOT + doxygen WIKI WIKI TODO: Switch to ROOT 5.30.02 soonSwitch to ROOT 5.30.02 soon Move remaining repositories to svnMove remaining repositories to svn Iterative track finding for off-vertex tracks, low momenta tracksIterative track finding for off-vertex tracks, low momenta tracks Global track fitting for the future: Kalman filter (see Erik’s Talk)Global track fitting for the future: Kalman filter (see Erik’s Talk) Speed optimization …. Yet another factor 2 ?Speed optimization …. Yet another factor 2 ?
3
Installation Procedure The new installation procedure installs on 32 or 64 bit systems 1 tar.gz file (150 Mb source code … needs some tiem to compile ) From tarballFrom tarball gsl ROOT Cernlib Garfield All admin scripts All environment scripts UrQmd UrQmd converter From SVNFrom SVN Hydra2 HGeant2 hzip Pluto (to be done) ORACLE client has to be installed separately
4
Installation Procedure Most problematic part: Cernlib: Cernlib official not supported anymoreCernlib official not supported anymore Current version taken from a patched version http://www-zeuthen.desy.de/linear_collider/cernlib/new/cernlib_2005.htmlCurrent version taken from a patched version http://www-zeuthen.desy.de/linear_collider/cernlib/new/cernlib_2005.html Runs 64bit with new gfortran 4.4 compilerRuns 64bit with new gfortran 4.4 compiler Own install scripts makes the installation more strait forwardOwn install scripts makes the installation more strait forward Some outdated tools needed, imake, gmake, edSome outdated tools needed, imake, gmake, ed Future of this software is uncertain, but we should be save for the next futureFuture of this software is uncertain, but we should be save for the next future Garfield: Depending on cernlibDepending on cernlib Runs 64bit with new gfortran 4.4 compilerRuns 64bit with new gfortran 4.4 compiler Own install scripts makes the installation more strait forwardOwn install scripts makes the installation more strait forward
5
Working from zip files : HZip A helper class to read/work with zip file containing many root files. root files will not be compressed, directory names ignored. It's a flat files structure.root files will not be compressed, directory names ignored. It's a flat files structure. Purpose of the zipping of many root files into on zip archive is to improve the handling of many small filesto improve the handling of many small files reduce the load on the file systemreduce the load on the file system Increase the CPU usage efficiencyIncrease the CPU usage efficiency Keep still separated files instead of using haddKeep still separated files instead of using hadd
6
Working from zip files : HZip To make the daily work more easy a command line executable hzip is provided to produce and work with those zip files: usage: hzip -o zipfile [-i filefilter] [-f filelist] [-u outputdir] [-msth] -f input ascii filelist (1 file per line) -h help -i input filefilter (like "be*.root") -l list file in zip files -m maxsize of file [bytes] (default = 2 Gbyte, will be splitted if larger) -o outputzip file name (required) -s save mode. do not override existing zip files (default is overwrite) -t test. show what would be done -u dir unzip zip files to dir -w print in which file membername is contained examples: test zip root files : hzip -t -o test.zip -i "/mydir/be*.root" zip root files : hzip -o test.zip -i "/mydir/be*.root" zip root files from list : hzip -o test.zip -f filelist unzip root files to dir : hzip -i "test_*.zip" -u /mydir list files in zip files : hzip -i "test_*.zip" -l from the terminal.
7
Working from zip files : HZip HZip provides the functionality to access, list and files from a root macro. Examples: TChain* chain = new TChain("myTree"); HZip::makeChain("my.zip",chain); // add all root files to chainTChain* chain = new TChain("myTree"); HZip::makeChain("my.zip",chain); // add all root files to chain add all root files of all matching zip files to chain HZip::makeChainGlob("my*.zip",chain);add all root files of all matching zip files to chain HZip::makeChainGlob("my*.zip",chain); add all root files of all zip files in filelist to chain HZip::makeChainList("filelist.txt",chain);add all root files of all zip files in filelist to chain HZip::makeChainList("filelist.txt",chain); chain->GetEntries(); // access all files and get number of entries chain->ls(); // list all files in chain with number of entries is my.root contained in my.zip? Bool_t HZip::isInside("my.zip","my.root");is my.root contained in my.zip? Bool_t HZip::isInside("my.zip","my.root"); list all files which match the pattern Int_t HZip::list("my.zip",".*");list all files which match the pattern Int_t HZip::list("my.zip",".*"); return to TList list all files which match the pattern Int_t HZip::getList("my.zip",list,".*");return to TList list all files which match the pattern Int_t HZip::getList("my.zip",list,".*"); unzip file to directory Bool_t HZip::unzip("my.zip","mydir");unzip file to directory Bool_t HZip::unzip("my.zip","mydir"); add this root file to the zip file Bool_t HZip::addFile("my.zip","my.root");add this root file to the zip file Bool_t HZip::addFile("my.zip","my.root"); add all root files from TList list to the zip file Bool_t HZip::addFiles("my.zip",list);add all root files from TList list to the zip file Bool_t HZip::addFiles("my.zip",list);
8
Fast looping tool : HLoop HLoop is a helper class to allow for fast looping of HADES DSTs. The categories are mapped directly from the Tree and allow partial reading to speed up. If Hades object exists, the current event structure will be replaced by the one defined by HLoop If Hades not exists, it can be created by HLoop constructor. The Hades event structure is important if one wants to access the data viaThe Hades event structure is important if one wants to access the data via gHades->getCurrentEvent()->getCategory(cattype)gHades->getCurrentEvent()->getCategory(cattype) or implicit by Classes like HParticleTrackSorter.or implicit by Classes like HParticleTrackSorter.
9
void myLoop() void myLoop() { //---------------LOOP CONFIG---------------------------------------------------------------- //---------------LOOP CONFIG---------------------------------------------------------------- Bool_t createHades = kTRUE; // kTRUE = create HADES new Bool_t createHades = kTRUE; // kTRUE = create HADES new HLoop* loop = new HLoop(createHades); // create HADES if needed HLoop* loop = new HLoop(createHades); // create HADES if needed // add files : Input sources may be combined // add files : Input sources may be combined loop->addFile ("myFile1.root"); loop->addFile ("myFile1.root"); loop->addFile ("myFile2.root"); //.... loop->addFile ("myFile2.root"); //.... loop->addFilesList("list.txt"); // add all files in ascii file list. list contains loop->addFilesList("list.txt"); // add all files in ascii file list. list contains // 1 root file per line (including path) // 1 root file per line (including path) loop->addFiles("myFiles*.root"); // add all files matching this expression loop->addFiles("myFiles*.root"); // add all files matching this expression HZip::makeChain("all_files.zip",loop->getChain()); // add all root files contained HZip::makeChain("all_files.zip",loop->getChain()); // add all root files contained // in zip file (this file has to // in zip file (this file has to // be produced by hzip) // be produced by hzip) if(!loop->setInput("-*,+HParticleCand")) // global disable "-*" has to be first in the list if(!loop->setInput("-*,+HParticleCand")) // global disable "-*" has to be first in the list { // read only one category from file (HEventHeader { // read only one category from file (HEventHeader // is always on) // is always on) exit(1); // Correct name for real data / sim data have to exit(1); // Correct name for real data / sim data have to // be used here // be used here } loop->printCategories(); // print status from all categories in event loop->printCategories(); // print status from all categories in event //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------
10
TIterator* iterCand = 0; TIterator* iterCand = 0; if(loop->getCategory("HParticleCand")) { if(loop->getCategory("HParticleCand")) { iterCand = loop->getCategory("HParticleCand")->MakeIterator(); iterCand = loop->getCategory("HParticleCand")->MakeIterator(); // standard HCategoryManager::getCategory(catParticleCand)->MakeIterator(); // standard HCategoryManager::getCategory(catParticleCand)->MakeIterator(); } HEventHeader* header = loop->getEventHeader(); HEventHeader* header = loop->getEventHeader(); // standard HEventHeader* header = gHades->getCurrentEvent()->getHeader(); // standard HEventHeader* header = gHades->getCurrentEvent()->getHeader(); //--------------------------CONFIGURATION------------------------------------- //--------------------------CONFIGURATION------------------------------------- //At begin of the program (outside the event loop) //At begin of the program (outside the event loop) HParticleTrackSorter sorter; HParticleTrackSorter sorter; //sorter.setDebug(); //sorter.setDebug(); //sorter.setPrintLevel(3); //sorter.setRICHMatching(HParticleTrackSorter::kUseRKRICHWindow,4.); //sorter.setIgnoreInnerMDC(); //sorter.setPrintLevel(3); //sorter.setRICHMatching(HParticleTrackSorter::kUseRKRICHWindow,4.); //sorter.setIgnoreInnerMDC(); //sorter.setIgnoreOuterMDC(); //sorter.setIgnoreOuterMDC(); //sorter.setIgnoreMETA(); //sorter.setIgnoreMETA(); //sorter.setIgnorePreviousIndex(); //sorter.setIgnorePreviousIndex(); sorter.init(); // get catgegory pointers etc... sorter.init(); // get catgegory pointers etc... //---------------------------------------------------------------------------- //----------------------------------------------------------------------------
11
Int_t nFile = 0; Int_t nFile = 0; for (Int_t i = 0; i < 10; i++) { for (Int_t i = 0; i < 10; i++) { if(loop->nextEvent(i) nextEvent(i) <= 0) break; // get next event. categories will be cleared before // if 0 (entry not found) or -1 (Io error) is // if 0 (entry not found) or -1 (Io error) is // returned stop the loop // returned stop the loop TString filename; TString filename; if(loop->isNewFile(filename)){ // new file opened from chain ? if(loop->isNewFile(filename)){ // new file opened from chain ? cout<<"new File found "<<filename.Data()<<endl; cout<<"new File found "<<filename.Data()<<endl; nFile++; nFile++; } sorter.cleanUp(); sorter.cleanUp(); sorter.resetFlags(kTRUE,kTRUE,kTRUE,kTRUE); // reset all flags sorter.resetFlags(kTRUE,kTRUE,kTRUE,kTRUE); // reset all flags Int_t nCandLep = sorter.fill(HParticleTrackSorter::selectLeptons); Int_t nCandLep = sorter.fill(HParticleTrackSorter::selectLeptons); Int_t nCandLepBest = sorter.selectBest(HParticleTrackSorter::kIsBestRKRKMETA,HParticleTrackSorter::kIsLepton); Int_t nCandLepBest = sorter.selectBest(HParticleTrackSorter::kIsBestRKRKMETA,HParticleTrackSorter::kIsLepton); Int_t nCandHad = sorter.fill(HParticleTrackSorter::selectHadrons); Int_t nCandHad = sorter.fill(HParticleTrackSorter::selectHadrons); Int_t nCandHadBest = sorter.selectBest(HParticleTrackSorter::kIsBestRKRKMETA,HParticleTrackSorter::kIsHadron); Int_t nCandHadBest = sorter.selectBest(HParticleTrackSorter::kIsBestRKRKMETA,HParticleTrackSorter::kIsHadron); if(iterCand){ if(iterCand){ iterCand->Reset(); iterCand->Reset(); HParticleCand* cand; HParticleCand* cand; while ( (cand = (HParticleCand*)iterCand->Next()) != 0 ){ while ( (cand = (HParticleCand*)iterCand->Next()) != 0 ){ // do some work.... // do some work.... } } } sorter.finalize(); // clean up stuff sorter.finalize(); // clean up stuff }
12
Flexible extension of DST output For special tasks additional objects can be stored in the same order in the DST output Objects can be easily accessed by index Even T->Draw(….) commands will work since objects are stored exactly parallel DST output can be setup for example like: Do 10% of files with Calibration info for monitoringDo 10% of files with Calibration info for monitoring Parallel output files needed in Future ?Parallel output files needed in Future ?HParticleCandHParticleDebug HParticleCalHParticleCandHParticleDebug HParticleCalHParticleCandHParticleDebug HParticleCal 1st object 2nd object 3rd object …
13
Helper functions static TObjArray* HParticleTool::getMdcCal1Cluster(Int_t segind) static TObjArray* HParticleTool::getMdcCal1Seg(Int_t segind) static HMdcClus* HParticleTool::getMdcClus(Int_t segind) static HMdcClusFit* HParticleTool::getMdcClusFit(Int_t segind) static HMdcClusInf* HParticleTool::getMdcClusInf(Int_t segind, Int_t nhit = 0) static HMdcHit* HParticleTool::getMdcHit(Int_t segind, Int_t nhit = 0) static HMdcSeg* HParticleTool::getMdcSeg(Int_t segind) static HMdcTrkCand* HParticleTool::getMdcTrkCand(Int_t metaind) static TObjArray* HParticleTool::getMdcWireFitSeg(Int_t segind) static HMetaMatch2* HParticleTool::getMetaMatch(Int_t metaind) static HRichHit* HParticleTool::getRichHit(Int_t richind) static HRpcCluster* HParticleTool::getRpcCluster(Int_t rpcind) static HShowerHit* HParticleTool::getShowerHit(Int_t showerind) static HTofCluster* HParticleTool::getTofCluster(Int_t tofind) static HTofHit* HParticleTool::getTofHit(Int_t tofind)
14
Things which are obvious how to use... HMdcSeg HMdcHit HMdcClusInf HMdcClusFit HMdcWireFit TObjArray* HParticleTool::getMdcWireFitSeg(Int_t segind)
15
Extended Event Display Based on TEve of ROOT OpenGLOpenGL Display Detector geometry taken from ROOT TGeomModellerDisplay Detector geometry taken from ROOT TGeomModeller Helper classes implemented in libEventdisplay User can easily modify displayed content by changing macros Full event display for REAL and SIM Data Display of HGEANT particles Runge-Kutta tracking trough Detector using a magnetic Field map. Fit to reference points given by HGeantRunge-Kutta tracking trough Detector using a magnetic Field map. Fit to reference points given by HGeant TODO: Pluto particlesPluto particles ??? Requests welcome??? Requests welcome
16
As easy as this …edit nextEvent.C HParticleCandSim* cand; HParticleCandSim* cand; Int_t size = particleCandCat->getEntries(); Int_t size = particleCandCat->getEntries(); for(Int_t i = 0; i < size; i ++){ for(Int_t i = 0; i < size; i ++){ cand = HCategoryManager::getObject(cand,particleCandCat,i); cand = HCategoryManager::getObject(cand,particleCandCat,i); if(cand){ if(cand){ HEDParticleCand* edcand = 0; HEDParticleCand* edcand = 0; Int_t s = cand->getSector(); Int_t s = cand->getSector(); // Fill all objects. Group them into different lists // Fill all objects. Group them into different lists // Groups get different colors or line styles // Groups get different colors or line styles //--------------------------------------------------------- //--------------------------------------------------------- // Candidates accepted as leptons by HParticleTrackSorter // Candidates accepted as leptons by HParticleTrackSorter // Full tracks with RICH and accepted after sorting // Full tracks with RICH and accepted after sorting if(cand->isFlagBit(kIsLepton)){ if(cand->isFlagBit(kIsLepton)){ edcand = new HEDParticleCand(cand); edcand = new HEDParticleCand(cand); edcand->SetLineColor(kRed); edcand->SetLineColor(kRed); particlecandLep->AddElement(s,edcand); particlecandLep->AddElement(s,edcand); } //--------------------------------------------------------- //--------------------------------------------------------- // Ghost tracks get dashed lines // Ghost tracks get dashed lines if(edcand && cand->isGhostTrack()) edcand->SetLineStyle(7); if(edcand && cand->isGhostTrack()) edcand->SetLineStyle(7); //--------------------------------------------------------- //--------------------------------------------------------- } } // end loop particlecand } // end loop particlecand
20
Geometry display options can be modified via GUI The event scene of the event display is defined inside a macro an be easily adopted to the user needs by non experts
21
Thanks to the flexible event scene the user can easily modify the displayed contents
22
New Batch farm In spring 2012 a new batch farm will go into operation (see Walter’s talk) The new farm will have new features The operating system will be 64bitThe operating system will be 64bit 32bit execution is not supported any more32bit execution is not supported any more No user file systems will be mounted, only /lustre stability reasonNo user file systems will be mounted, only /lustre stability reason The user have to copy their scripts, parameter files etc to /lustre before submitting the jobThe user have to copy their scripts, parameter files etc to /lustre before submitting the job The software will be distributed experiment specific using CVMFS avoid bottle neck of parallel accessThe software will be distributed experiment specific using CVMFS avoid bottle neck of parallel access LSF will be replaced by Sun grid engine (SGE): batch scripts have to be adaptedLSF will be replaced by Sun grid engine (SGE): batch scripts have to be adapted
23
New Batch farm Installation of the HADES software: The software is build on lxbuild02.gsi.de and stored local /cvmfs/hades.gsi.deThe software is build on lxbuild02.gsi.de and stored local /cvmfs/hades.gsi.de After installation the software has to be published to enable the user access itAfter installation the software has to be published to enable the user access it The publish command runs basically a rsync to the cvmfs serverThe publish command runs basically a rsync to the cvmfs server From the server the software will be distributed to all hosts and seen as /cvmfs/hades.gsi.deFrom the server the software will be distributed to all hosts and seen as /cvmfs/hades.gsi.de lxbuild02.gsi.de /cvmfs/hades.gsi.de Cvmfs server lxb320.gsi.de lxb321.gsi.de lxb322.gsi.de lxb323.gsi.de lxb324.gsi.de publish distribute
24
Old Batch farm Debian etch (current system) Very oldVery old Out of support security issueOut of support security issue Will be switched off at GSI January 2012Will be switched off at GSI January 2012 Our situation: Hydra2/HGeant2 will run on any new systemHydra2/HGeant2 will run on any new system Old analyses of data taken 2005 and before requires old software versionsOld analyses of data taken 2005 and before requires old software versions Solution: Old batch farm will be switched to lenny64Old batch farm will be switched to lenny64 Old binaries (32bit compiled) will run without changeOld binaries (32bit compiled) will run without change Programs can be recompiled under lenny32 (lennylust32.gsi.de)Programs can be recompiled under lenny32 (lennylust32.gsi.de) Tests have been successful we are ready to switchTests have been successful we are ready to switch
25
Replacement of Desktop machines For the future the desktops should decoupled from the batch farm: the system installed does not any longer need to be the same What about the machines which we use for our daily interactive work? HADES needs interactive “batch type” machines which see the same software as the farm, but Have the user file systems mountedHave the user file systems mounted Standard ssh login with X supportStandard ssh login with X support Enough network IO capacityEnough network IO capacity Enough graphics powerEnough graphics power Are not part of the batch queueAre not part of the batch queue Are assigned to HADES exclusivelyAre assigned to HADES exclusively No desktop features like KDE etcNo desktop features like KDE etc Our Desktops will become “X-terms” only Last step: what about /misc user systems ? Not needed to decide nowNot needed to decide now
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.