mEmcRecoModuleSimulationYear3.C

Go to the documentation of this file.
00001 #include "mEmcRecoModuleSimulationYear3.h"
00002 
00003 #include "PHCompositeNode.h"
00004 #include "PHFlag.h"
00005 
00006 // Table wrappers
00007 #include "dEmcRawDataWrapper.h"
00008 #include "dEmcFEMDataWrapper.h"
00009 #include "dEmcDCMDataWrapper.h"
00010 #include "dEmcGeaTrackTowerWrapper.h"
00011 #include "dEmcGeaTrackWrapper.h"
00012 #include "dEmcGeaTowerTrackWrapper.h"
00013 #include "dEmcGeaClusterTrackWrapper.h"
00014 #include "dEmcGeaTrackClusterWrapper.h"
00015 #include "dEmcGeaParamsWrapper.h"
00016 #include "dEmcGeaHitWrapper.h"
00017 #include "dEmcRespParWrapper.h"
00018 #include "dEmcGeometryWrapper.h"
00019 #include "emcparWrapper.h"
00020 
00021 // Modules
00022 #include "mEmcApplyQAToSimu.h"
00023 #include "mEmcClusterizerv0.h"
00024 #include "mEmcDCMToRawModule.h"  
00025 #include "mEmcDefGeomModule.h"    
00026 #include "mEmcFEMToDCMModule.h"
00027 #include "mEmcGeaEventModule.h"  
00028 #include "mEmcGeaGetHits.h"
00029 #include "mEmcGeaMakeCalibTower.h"
00030 #include "mEmcGeaMakeClusterEvaluation.h"
00031 #include "mEmcGeaParamsModule.h"  
00032 #include "mEmcGeaMakeRawModule.h"
00033 #include "mEmcGeaPatchSimulatedCluster.h"
00034 #include "mEmcGeaTrackModule.h"  
00035 #include "mEmcGeometryModule.h"
00036 #include "mEmcGetDCMModule.h"
00037 #include "mEmcPRDFToRawModule.h"
00038 #include "mEmcPutDCMLongModule.h"
00039 #include "mEmcRawToFEMModule.h"
00040 #include "mEmcRawToLongModulev1.h"
00041 #include "mEmcToolsModule.h"
00042 #include "mEmcMaskDeadTowers.h"
00043 
00044 // Somehow related to database(s)
00045 #include "emcBadModulesv1.h"
00046 #include "emcDataManager.h"
00047 #include "emcTimeStamp.h"
00048 
00049 #include "emcNodeHelper.h"
00050 #include "emcClusterContainerv1S.h"
00051 #include "emcTowerContainerv1S.h"
00052 #include "recoConsts.h"
00053 #include "emcDBMS.h"
00054 
00055 #include <cassert>
00056 #include <cstdlib>
00057 #include <iostream>
00058 #include <memory>
00059 
00060 using namespace std;
00061 
00062 const float mEmcRecoModuleSimulationYear3::fgTowerThresholdPbSc = 0.010;
00063 const float mEmcRecoModuleSimulationYear3::fgTowerThresholdPbGl = 0.014;  
00064 const float mEmcRecoModuleSimulationYear3::fgMinClusterEnergyPbSc = 0.015;
00065 const float mEmcRecoModuleSimulationYear3::fgMinClusterEnergyPbGl = 0.060;
00066 
00067 //_____________________________________________________________________________
00068 mEmcRecoModuleSimulationYear3::mEmcRecoModuleSimulationYear3
00069 (const PHFlag& flags)
00070 { 
00071   const recoConsts* rc = dynamic_cast<const recoConsts*>(&flags);
00072   assert(rc!=0);
00073 
00074   if ( flags.FlagExist("EVALUATIONFLAG") && 
00075        flags.get_IntFlag("EVALUATIONFLAG") ) 
00076     {
00077       fEvaluation = true;
00078     }
00079   else
00080     {
00081       fEvaluation = false;
00082     }
00083 
00084   fSimulationFlag = flags.get_IntFlag("SIMULATIONFLAG");
00085   
00086   assert(fSimulationFlag==2);
00087 
00088   int runnumber = 0;
00089 
00090   if ( flags.FlagExist("RUNNUMBER") )
00091     {
00092       runnumber = flags.get_IntFlag("RUNNUMBER");
00093     }
00094 
00095   fDataSource = emcDBMS::get();
00096 
00097   if ( flags.FlagExist("EMCDATASOURCE") )
00098     {
00099       emcManageable::EStorage ds = 
00100         emcManageable::GetStorage(flags.get_CharFlag("EMCDATASOURCE"));
00101       if ( ds == emcManageable::kNone )
00102         {
00103           cerr << "mEmcRecoModuleSimulationYear3::"
00104                << "mEmcRecoModuleSimulationYear3 "
00105                << "Flag EMCDATASOURCE=" << flags.get_CharFlag("EMCDATASOURCE")
00106                << " is not valid. Using default=" 
00107                << emcManageable::GetStorageName(fDataSource)
00108                << endl;
00109         }
00110       else
00111         {
00112           fDataSource = ds;
00113         }
00114     }      
00115 
00116   emcTimeStamp ets;
00117   ets.SetSource(fDataSource);
00118 
00119   emcDataManager* dm = emcDataManager::GetInstance();
00120 
00121   bool ok = dm->Read(ets,runnumber);
00122 
00123   assert(ok==true);
00124 
00125   fTimeStamp = ets.getTimeStamp();
00126 
00127   std::cout << "<I> mEmcRecoModuleSimulationYear3 : Using TimeStamp: ";
00128   fTimeStamp.print();
00129   std::cout << std::endl;
00130 
00131   PHTimeStamp y1999(1999,1,1,0,0,0);
00132 
00133   assert( fTimeStamp > y1999 );
00134 
00135   fModules = new emcModuleHelper;
00136 }
00137 
00138 //_____________________________________________________________________________
00139 mEmcRecoModuleSimulationYear3::~mEmcRecoModuleSimulationYear3()
00140 {
00141   delete fModules;
00142 }
00143 
00144 //_____________________________________________________________________________
00145 int
00146 mEmcRecoModuleSimulationYear3::ana(PHCompositeNode* topNode)
00147 {
00148   return fModules->event(topNode);
00149 }
00150 
00151 //_____________________________________________________________________________
00152 int
00153 mEmcRecoModuleSimulationYear3::end(PHCompositeNode* topNode)
00154 {
00155   return 0;
00156 }
00157 
00158 //_____________________________________________________________________________
00159 int
00160 mEmcRecoModuleSimulationYear3::setup(PHCompositeNode* topNode)
00161 {
00162   //---- First thing is to check that we do have all our nodes there.
00163 
00164   const int N = 1;
00165 
00166   const char* nodes[] = { "EMC" } ; //{"DST","PAR","DCM","EVA","GEA","EMC" };
00167 
00168   for ( int i = 0; i < N; ++i )
00169     {
00170       if ( !emcNodeHelper::makeCompositeNode(topNode,nodes[i],"-p") )
00171         {
00172           return i+1;
00173         }
00174     }
00175 
00176   //---- Then make our tables/objects
00177 
00178   PHCompositeNode* emcNode = emcNodeHelper::findCompositeNode(topNode,"EMC");
00179   PHCompositeNode* dcmNode = emcNodeHelper::findCompositeNode(topNode,"DCM");
00180   PHCompositeNode* evaNode = emcNodeHelper::findCompositeNode(topNode,"EVA");
00181   PHCompositeNode* parNode = emcNodeHelper::findCompositeNode(topNode,"PAR");
00182   PHCompositeNode* geaNode = emcNodeHelper::findCompositeNode(topNode,"GEA");
00183   PHCompositeNode* dstNode = emcNodeHelper::findCompositeNode(topNode,"DST");
00184 
00185   assert(emcNode!=0);
00186   assert(dcmNode!=0);
00187   assert(evaNode!=0);
00188   assert(parNode!=0);
00189   assert(dstNode!=0);
00190 
00191   // Raw PISA Data
00192   emcNodeHelper::addTable<dEmcRawDataWrapper>(emcNode,"dEmcRawData",25000);
00193   // Simulated FEM Data
00194   emcNodeHelper::addTable<dEmcFEMDataWrapper>(emcNode,"dEmcFEMData",500);
00195 
00196   // Simulated DCM Data
00197   emcNodeHelper::addTable<dEmcDCMDataWrapper>(dcmNode,"dEmcDCMData",500);
00198 
00199   // Geant Track Tower
00200   emcNodeHelper::addTable<dEmcGeaTrackTowerWrapper>
00201     (evaNode,"dEmcGeaTrackTower",15000);
00202   // Geant Tower Track
00203   emcNodeHelper::addTable<dEmcGeaTowerTrackWrapper>
00204     (evaNode,"dEmcGeaTowerTrack",15000);
00205   // Geant Track
00206   emcNodeHelper::addTable<dEmcGeaTrackWrapper>(evaNode,"dEmcGeaTrack",7500);
00207 
00208   // Geant Parameters
00209   emcNodeHelper::addTable<dEmcGeaParamsWrapper>(parNode,"dEmcGeaParams",8);
00210   // Response parameters
00211   dEmcRespParWrapper* dEmcRespPar = 
00212     emcNodeHelper::addTable<dEmcRespParWrapper>(parNode,"dEmcRespPar",1);
00213   setupResponse(dEmcRespPar);
00214 
00215   // Geometry
00216   emcNodeHelper::addTable<dEmcGeometryWrapper>(parNode,"dEmcGeometry",30000);
00217   // Emc Parameters
00218   emcNodeHelper::addTable<emcparWrapper>(parNode,"emcpar",8);
00219 
00220   // Geant Hits
00221   bool transient = true;
00222   emcNodeHelper::addTable<dEmcGeaHitWrapper>
00223     (geaNode,"dEmcGeaHit",525000,transient);
00224 
00225   // Output objects (see also setupClustering)
00226 
00227   emcNodeHelper::addObject<emcTowerContainerv1S>(dstNode,"emcTowerContainer");
00228 
00229   // Don't forget evaluation if requested...
00230   if ( fEvaluation ) 
00231     {
00232       setupEvaluation(topNode);
00233     }
00234 
00235   // Collect Q&A information to be applied to simulated data
00236 
00237   setupBadModules(topNode);
00238 
00239   // Then go to setup the modules needed.
00240 
00241   setupAna(topNode);
00242 
00243   topNode->print();
00244 
00245   return 0;
00246 }
00247 
00248 //_____________________________________________________________________________
00249 void
00250 mEmcRecoModuleSimulationYear3::setupAna(PHCompositeNode* topNode)
00251 {
00252   assert(fSimulationFlag==2);
00253 
00254   // PISA to DST
00255   fModules->add(new mEmcGeaGetHits);
00256   fModules->add(new mEmcGeaParamsModule,emcModuleHelper::kFirstEventOnly); 
00257   fModules->add(new mEmcGeaEventModule);
00258   fModules->add(new mEmcGeaMakeRawModule);
00259   fModules->add(new mEmcGeaTrackModule);
00260   
00261   // LVL2 Simulations requires this
00262   // Level 2 needs DCM tables to be filled
00263   // fModules->add(new mEmcRawToLongModule);
00264   // fModules->add(new mEmcPutDCMLongModule("dEmcRawDataReCal","dEmcDCMLongDataReCal"));
00265   // fModules->add(new EmcSimuRawDataRecal);
00266   // fModules->add(new mEmcPutDCMLongReCalModule);
00267   
00268   // The "fake" calibrator module
00269   fModules->add(new mEmcGeaMakeCalibTower);
00270 
00271   // Apply the real (corresponding to RUNNUMBER) deadmap to simulated towers.
00272   fModules->add(new mEmcApplyQAToSimu);
00273 
00274   // Apply additional deadmap from file to simulated towers if called by the macro. Cesar
00275   recoConsts *rc = recoConsts::instance();
00276   if (rc->FlagExist("EMCDEADRECALDATASOURCE"))
00277     fModules->add(new mEmcMaskDeadTowers);
00278 
00279   setupClustering(topNode);
00280 
00281   // Little module to patch the clusters, e.g. to indicate that SimFrac=1
00282   // (i.e. 100%), or any other simulation specific thing you'd like
00283   // to do
00284   fModules->add(new mEmcGeaPatchSimulatedCluster);
00285 
00286   if ( fEvaluation ) 
00287     {
00288       fModules->add(new mEmcGeaMakeClusterEvaluation);
00289     }
00290 
00291   cout << "mEmcRecoModuleSimulationYear3::setupAna : module list : "
00292        << endl;
00293 
00294   fModules->print();
00295 }
00296 
00297 //_____________________________________________________________________________
00298 void
00299 mEmcRecoModuleSimulationYear3::setupBadModules(PHCompositeNode* topNode)
00300 {
00301   bool init = true; // init all bad modules now.
00302   emcBadModules::EInformationOrigin origin = emcBadModules::kAll; // read both online QA & offline rejectlist.
00303 
00304   emcBadModules* bm = new emcBadModulesv1(fTimeStamp,origin,
00305                                           fDataSource,init);
00306 
00307   PHCompositeNode* emcNode = 
00308     emcNodeHelper::findCompositeNode(topNode,"EMC");  
00309   
00310   assert(emcNode!=0);
00311   emcNodeHelper::insertObject<emcBadModules>(emcNode,bm,"emcBadModules");
00312 }
00313 
00314 //_____________________________________________________________________________
00315 void
00316 mEmcRecoModuleSimulationYear3::setupClustering(PHCompositeNode* topNode)
00317 {
00318   emcNodeHelper nh;
00319 
00320   PHCompositeNode* dstNode = nh.findCompositeNode(topNode,"DST");
00321 
00322   nh.addObject<emcClusterContainerv1S>(dstNode,"emcClusterContainer");
00323 
00324   PHCompositeNode* parNode = nh.findCompositeNode(topNode,"PAR");
00325 
00326   mEmcGeometryModule* geometryModule = 
00327     new mEmcGeometryModule(mEmcGeometryModule::kPISA);
00328   PHIODataNode<TObject>* geometryNode 
00329     = new PHIODataNode<TObject>(geometryModule, "mEmcGeometry");
00330   parNode->addNode(geometryNode);
00331 
00332   mEmcClusterizerv0* clusterizer = new mEmcClusterizerv0(geometryModule);
00333   
00334   clusterizer->SetTowerThresholdPbSc(fgTowerThresholdPbSc);
00335   clusterizer->SetTowerThresholdPbGl(fgTowerThresholdPbGl);
00336   clusterizer->SetMinClusterEnergyPbSc(fgMinClusterEnergyPbSc);
00337   clusterizer->SetMinClusterEnergyPbGl(fgMinClusterEnergyPbGl);
00338 
00339   fModules->add(clusterizer);
00340 }
00341 
00342 //_____________________________________________________________________________
00343 void
00344 mEmcRecoModuleSimulationYear3::setupEvaluation(PHCompositeNode* topNode)
00345 {
00346   PHCompositeNode* evaNode = emcNodeHelper::findCompositeNode(topNode,"EVA");
00347   assert(evaNode!=0);
00348 
00349   emcNodeHelper::addTable<dEmcGeaTrackClusterWrapper>
00350     (evaNode,"dEmcGeaTrackCluster",7500);
00351   emcNodeHelper::addTable<dEmcGeaClusterTrackWrapper>
00352     (evaNode,"dEmcGeaClusterTrack",7500);
00353 }
00354 
00355 //_____________________________________________________________________________
00356 void
00357 mEmcRecoModuleSimulationYear3::setupResponse(dEmcRespParWrapper* respPar)
00358 {
00359   respPar->SetRowCount(1);
00360   respPar->set_anyset(0,1);
00361   respPar->set_sim_timing(0,0);  // reset to LED timing  May 23, 2001
00362   respPar->set_pbgl_response(0,3);
00363 }