| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

MixingAlgorithm.cc

Go to the documentation of this file.
00001 #include "Mixing/MixingAlgorithm.h"
00002 #include "Event/GenHeader.h"
00003 #include "Event/SimHeader.h"
00004 #include "Event/ElecHeader.h"
00005 #include "Event/SimTrigHeader.h"
00006 #include "Event/RegistrationSequence.h"
00007 #include "Event/SimReadoutHeader.h"
00008 #include "RootIOSvc/IRootIOSvc.h"
00009 #include "RootIOSvc/RootIOAddress.h"
00010 #include "GaudiKernel/IDataManagerSvc.h"
00011 #include "PerReadoutEvent/PerSimReadout.h"
00012 
00013 using namespace std;
00014 using namespace DayaBay;
00015 
00016 MixingAlgorithm::MixingAlgorithm(const string& name, ISvcLocator* pSvcLocator) 
00017   :DybAlgorithm<ReadoutHeader>(name,pSvcLocator)
00018 {
00019 }
00020 
00021 StatusCode MixingAlgorithm::initialize()
00022 {
00023     StatusCode status= this->GaudiAlgorithm::initialize();
00024     if (status.isFailure()) 
00025     { 
00026          error() << "error when initializing  GaudiAlgorithm" << endreq;
00027          return status;
00028      }
00029    
00030      info() << "MixingAlgorithm ininalize()" << endreq; 
00031      IService* isvc=0;
00032      StatusCode sc = serviceLocator()->service("RootIOCnvSvc", isvc, false);
00033      if (sc.isFailure()) {
00034          error() << "Conversion service RootIOCnvSvc"<< " could not be retrieved" << endreq;
00035          return sc;
00036      }
00037      isvc->addRef();
00038      sc = isvc->queryInterface(IMixingSvc::interfaceID(), (void**)&m_mixSvc);
00039      if (sc.isFailure()) {
00040          error() << "Conversion service RootIOCnvSvc"  << " does not implement IRootIOCnvSvc" << endreq;
00041          
00042      }
00043   return sc;
00044 }
00045 
00046 StatusCode MixingAlgorithm::execute() 
00047 {
00048   debug()<< "Now into Algorithm executation!"<< endreq;
00049   MixHeader mh = m_mixSvc->fetchMixHeader();
00050                               
00051   if(&mh != NULL)
00052   {
00053     // Using some functions in RegistrationSequence
00054     RegistrationSequence* seq = get<RegistrationSequence>(evtSvc(), RegistrationSequenceLocation::Default);
00055     debug()<< "ATTENTION!===========> Size = "<< seq->size()<< endreq;
00056     seq->setEarliest(mh.hder->earliest);
00057     seq->setLatest(mh.hder->latest);
00058 
00059     //If the sample coming from MDC, the codes below needed
00060     IRegistrationSequence::Registrations& regs = const_cast<IRegistrationSequence::Registrations&>(seq->registrations());
00061     IRegistrationSequence::Registrations::iterator regit;
00062     for(regit = regs.begin(); regit != regs.end(); regit++)
00063     {
00064       debug()<< regit->path()<< endreq;
00065       if(regit->path() == "/Event/Sim/SimHeader")
00066       {
00067         DataObject* child = const_cast<DataObject*>(regit->object());   
00068         SimHeader*  sh  = dynamic_cast<SimHeader*>(child);
00069         debug()<< sh->timeStamp().GetSeconds()<< endreq;
00070         //regit->setStore(false);
00071         const SimHitHeader* chits = sh->hits();
00072         if(!chits)
00073         {
00074           debug()<< "No SimHitHeader, my job is already done"<< endreq;
00075           return StatusCode::SUCCESS;
00076         }
00077         SimHitHeader* shits = const_cast<SimHitHeader*>(chits);
00078         debug() << "Pruning " << shits->hitCollection().size() << " hit collections" << endreq;
00079         sh->setHits(0);
00080         delete shits; 
00081         //info()<< "Not Storing: "<< regit->path()<< endreq;
00082       }
00083       else if(regit->path() == "/Event/SimReadout/SimReadoutHeader")
00084       {
00085         DataObject* child       = const_cast<DataObject*>(regit->object());   
00086         SimReadoutHeader*  sroh = dynamic_cast<SimReadoutHeader*>(child);
00087         debug()<< sroh->timeStamp().GetSeconds()<< endreq;
00088         regit->setStore(false);
00089         debug()<< "Not Storing: "<< regit->path()<< endreq;
00090       }
00091       else continue;
00092     }
00093 
00094     // Create Readout and it's header in TES with SimReadoutHeader as its inputHeader
00095     ReadoutHeader* roHeader = MakeHeaderObject();
00096     debug()<< "The Address of ReadoutHeader is "<< roHeader << endreq;
00097     SimHeader* sh = get<SimHeader>(evtSvc(), SimHeaderLocation::Default);
00098     debug()<< "InputHeader in ReadoutHeader: "<< roHeader->inputHeaders().size()<< endreq;
00099     //roHeader->addInputHeader(sh);
00100     this->AppendInputHeader(sh);
00101     debug()<< "InputHeader in ReadoutHeader: "<< roHeader->inputHeaders().size()<< endreq;   
00102     Readout*       readout;
00103 
00104     // Conversion : Per to tran
00105     debug()<< "There is some information ."<< endreq;
00106     PerReadout* pro = mh.hder->readout;
00107 
00108     if(pro) 
00109     {
00110       debug()<< "detector id = "       << pro->detector<< endreq;
00111       debug()<< "trigger Type = "      << pro->triggerType<< endreq; 
00112       debug()<< "triggerNumber = "     << pro->triggerNumber<< endreq;
00113       debug()<< "triggerTimeSec = "    << pro->triggerTimeSec<< endreq; 
00114       debug()<< "triggerTimeNanoSec = "<< pro->triggerTimeNanoSec<< endreq;
00115        
00116       //Conversion is here!
00117       debug()<< "PerPmtChannelSize is: "<< (static_cast<PerReadoutPmtCrate*>(pro))->perChannelReadouts.size()<< endreq;
00118       readout = convert(*pro);
00119       debug()<< "TranPmtChannelSize is: "<< (static_cast<ReadoutPmtCrate*>(readout))->channelReadout().size()<< endreq;
00120       roHeader->setContext(mh.hder->context);
00121       roHeader->setTimeStamp(mh.hder->earliest);
00122       roHeader->setEarliest(mh.hder->earliest);
00123       roHeader->setLatest(mh.hder->latest);
00124     }
00125     debug()<< "DetectorId: "<< roHeader->context().GetDetId()
00126           << "("<< DetectorId::AsString(roHeader->context().GetDetId())<< ")"<< endreq;
00127     debug()<< "Earliest time "<< mh.hder->earliest<< endreq;
00128     debug()<< "Latest   time "<< mh.hder->latest<< endreq;     
00129     
00130     readout->setHeader(roHeader);
00131     roHeader->setReadout(readout);
00132    
00133     // Copy this Readout into SimReadout
00134     /*ReadoutHeader* RoHeader = new ReadoutHeader();
00135     debug()<< "The Address of ReadoutHeader is "<< RoHeader << endreq;
00136     Readout*       ro;
00137     ro = assign(*readout);
00138     debug()<< "Readout triggerTime: "<< ro->triggerTime().GetSec()<< "--"
00139           << ro->triggerTime().GetNanoSec()<< endreq;
00140     RoHeader->setContext(mh.hder->context);
00141     RoHeader->setTimeStamp(mh.hder->earliest);
00142     RoHeader->setEarliest(mh.hder->earliest);
00143     RoHeader->setLatest(mh.hder->latest);
00144     ro->setHeader(RoHeader);
00145     RoHeader->setReadout(ro);
00146  
00147     SimReadoutHeader* sroh = get<SimReadoutHeader>(evtSvc(), SimReadoutHeaderLocation::Default);
00148     vector<SimReadout*> sros = sroh->readouts();
00149     debug()<< "Size of sros is "<< sros.size()<< endreq;
00150     debug()<< sroh->earliest()<<": "<< sroh->latest()<< endreq;
00151     // Now we need to clear the vector
00152     vector<SimReadout*>::iterator simit = sros.begin();
00153     ++simit;
00154     for(; simit != sros.end();)
00155     {
00156       delete (*simit);
00157       simit = sros.erase(simit);
00158     }
00159     debug()<< "After change, the size of sros is "<< sros.size()<< endreq;
00160 
00161     for(vector<SimReadout*>::size_type i = 0 ; i != sros.size(); i++)
00162     {
00163       debug()<< "readout is "<< readout<< endreq;
00164       debug()<< "ro is "<< ro<< endreq;
00165       const Readout* roo = sros[i]->readout();
00166       delete roo;
00167       sros[i]->setReadout(ro);
00168       const Readout* Ro = sros[i]->readout();
00169       debug()<< "After reset, m_readout is "<< Ro<< endreq;
00170     }
00171     //sroh->setTimeStamp(mh.hder->earliest);
00172     //sroh->setEarliest(mh.hder->earliest);
00173     //sroh->setLatest(mh.hder->latest);
00174     sroh->setReadouts(sros);*/
00175    
00176     reSetTimeStamps(mh.hder);
00177   
00178     //info()<< "SimReadoutHeader===earlist is: "<< sroh->earliest()<< endreq;
00179     //info()<< "SimReadoutHeader===context is: "<< sroh->timeStamp()<< endreq;
00180     //info()<< "SimReadoutHeader===latest  is: "<< sroh->latest()<< endreq;
00181   }
00182 
00183   PerReadoutHeader* proh = mh.hder;
00184   delete proh;
00185   debug()<< "MixingAlgorithm execute() finalized!" << endreq;
00186   return StatusCode::SUCCESS;
00187 }
00188 
00189 StatusCode MixingAlgorithm::finalize() 
00190 {
00191   info() << "MixingAlgorithm finalize()" << endreq;
00192   return StatusCode::SUCCESS;
00193 }
00194  
00195 Readout* MixingAlgorithm::convert(const PerReadout& perRo)
00196 {
00197    Detector det(perRo.detector);
00198    if(det.detectorId() == DetectorId::kUnknown)  return 0; 
00199    else if(det.detectorId() != DetectorId::kRPC) return convert(static_cast<const PerReadoutPmtCrate&>(perRo));
00200    else return 0;   
00201    return 0;
00202 }
00203 
00204 ReadoutPmtCrate* MixingAlgorithm::convert(const PerReadoutPmtCrate& perRoPcr)
00205 {
00206   ReadoutPmtCrate *out_crate = new ReadoutPmtCrate();
00207   Detector det(perRoPcr.detector);
00208   out_crate->setDetector(det);
00209   out_crate->setTriggerType( Trigger::TriggerType_t(perRoPcr.triggerType));
00210   out_crate->setTriggerNumber(perRoPcr.triggerNumber);
00211   
00212   timespec value = {perRoPcr.triggerTimeSec, perRoPcr.triggerTimeNanoSec};
00213   TimeStamp tstamp(value);
00214   out_crate->setTriggerTime(tstamp); 
00215   
00216   ReadoutPmtCrate::PmtChannelReadouts out_channels;
00217   
00218   PerReadoutPmtCrate::PerPmtChannelReadouts in_channels = perRoPcr.perChannelReadouts;
00219   PerReadoutPmtCrate::PerPmtChannelReadouts::const_iterator it;
00220   
00221   for(it=in_channels.begin(); it!=in_channels.end(); ++it)
00222   {
00223     ReadoutPmtChannel out_channel = convert(**it);
00224     out_channel.setReadout(out_crate);
00225     out_channels[out_channel.channelId()]=out_channel;
00226   }  
00227   out_crate->setChannelReadout(out_channels);
00228   return out_crate;
00229 }
00230 
00231 ReadoutPmtChannel MixingAlgorithm::convert(const PerReadoutPmtChannel& perRoPch)
00232 {
00233   ReadoutPmtChannel out_ch;
00234   out_ch.setTdc(perRoPch.tdc);
00235   out_ch.setTdcHitCount(perRoPch.tdcHitCount);
00236   out_ch.setAdc(perRoPch.adc);
00237   out_ch.setAdcRange(perRoPch.adcRange);
00238   out_ch.setPedestal(perRoPch.pedestal);
00239   out_ch.setAdcCycle(perRoPch.adcCycle);
00240   FeeChannelId id(perRoPch.channelId);
00241   out_ch.setMode(perRoPch.mode);
00242   out_ch.setChannelId(id);
00243   out_ch.setWaveAdcLow(perRoPch.waveAdcLow);
00244   out_ch.setWaveAdcHigh(perRoPch.waveAdcHigh);
00245   out_ch.setWaveAdcCycle(perRoPch.waveAdcCycle);
00246   //if(perRoPch.isLow) out_ch.setAdcGain(FeeGain::kLow);
00247   //else out_ch.setAdcGain(FeeGain::kHigh);
00248   return out_ch;
00249 }
00250 
00251 Readout* MixingAlgorithm::assign(const Readout& Ro)
00252 {
00253   const Detector& det = Ro.detector();
00254   if(det.detectorId() == DetectorId::kUnknown)  return 0;
00255   else if(det.detectorId() != DetectorId::kRPC) return assign(static_cast<const ReadoutPmtCrate&>(Ro));
00256   else return 0;
00257 }
00258 
00259 ReadoutPmtCrate* MixingAlgorithm::assign(const ReadoutPmtCrate& RoPcr)
00260 {
00261   ReadoutPmtCrate *out_crate = new ReadoutPmtCrate();
00262 
00263   out_crate->setDetector(RoPcr.detector());
00264   out_crate->setTriggerType(RoPcr.triggerType());
00265   out_crate->setTriggerTime(RoPcr.triggerTime());
00266   out_crate->setTriggerNumber(RoPcr.triggerNumber());
00267   debug()<<"Old DetectorId is "<< RoPcr.detector()<<endreq;
00268   debug()<<"New DetectorId is "<< out_crate->detector()<<endreq;
00269 
00270   debug()<<"Old time is "<< RoPcr.triggerTime()<< endreq;
00271   debug()<<"New time is "<< out_crate->triggerTime()<< endreq;
00272   ReadoutPmtCrate::PmtChannelReadouts out_channels; 
00273   ReadoutPmtCrate::PmtChannelReadouts in_channels = RoPcr.channelReadout();
00274   ReadoutPmtCrate::PmtChannelReadouts::const_iterator it;  
00275   for(it=in_channels.begin(); it!=in_channels.end(); ++it)
00276   {
00277     ReadoutPmtChannel out_channel = assign(it->second);
00278     out_channel.setReadout(out_crate);
00279     out_channels[out_channel.channelId()]=out_channel;
00280   }  
00281   out_crate->setChannelReadout(out_channels);
00282   return out_crate;
00283 }
00284 
00285 ReadoutPmtChannel MixingAlgorithm::assign(const ReadoutPmtChannel& RoPch)
00286 {
00287   ReadoutPmtChannel out_ch;
00288   out_ch.setTdc(RoPch.tdc());
00289   out_ch.setTdcHitCount(RoPch.tdcHitCount());
00290   out_ch.setAdc(RoPch.adc());
00291   out_ch.setAdcRange(RoPch.adcRange());
00292   out_ch.setAdcCycle(RoPch.adcCycle());
00293   out_ch.setMode(RoPch.mode());
00294   out_ch.setChannelId(RoPch.channelId());
00295   out_ch.setWaveAdcLow(RoPch.waveAdcLow());
00296   out_ch.setWaveAdcHigh(RoPch.waveAdcHigh());
00297   out_ch.setWaveAdcCycle(RoPch.waveAdcCycle());
00298   return out_ch;
00299 }
00300 
00301 void MixingAlgorithm::reSetTimeStamps(const PerReadoutHeader* proh)
00302 {
00303   // Reset these Headers
00304   RegistrationSequence* seq = get<RegistrationSequence>(evtSvc(), RegistrationSequenceLocation::Default);
00305   debug()<< "Reset the Time info.: Time Window!"<< endreq;
00306 
00307   IRegistrationSequence::Registrations& regs = const_cast<IRegistrationSequence::Registrations&>(seq->registrations());
00308   IRegistrationSequence::Registrations::iterator regit;
00309   for(regit = regs.begin(); regit != regs.end(); regit++)
00310   {
00311     debug()<< regit->path()<< endreq;
00312     // Reset GenHeader time
00313     if(regit->path() == GenHeaderLocation::Default)
00314     {
00315       GenHeader*  gh        = get<GenHeader>(evtSvc(), GenHeaderLocation::Default);
00316       SimReadoutHeader* srh = get<SimReadoutHeader>(evtSvc(), SimReadoutHeaderLocation::Default);
00317       TimeStamp temp        = proh->earliest - srh->earliest();
00318       gh->setContext(proh->context);
00319       temp.Add(gh->earliest());
00320       gh->setTimeStamp(temp);
00321       gh->setEarliest(temp);
00322       temp = proh->earliest - srh->earliest();
00323       temp.Add(gh->latest());
00324       gh->setLatest(temp);
00325       debug()<< "GenHeader===earlist is: "<< gh->earliest()<< endreq;
00326       debug()<< "GenHeader===context is: "<< gh->timeStamp()<< endreq;
00327       debug()<< "GenHeader===latest  is: "<< gh->latest()<< endreq;
00328     }
00329 
00330     // Reset SimHeader time
00331     if(regit->path() == SimHeaderLocation::Default)
00332     {  
00333       SimHeader*  sh        = get<SimHeader>(evtSvc(), SimHeaderLocation::Default);
00334       SimReadoutHeader* srh = get<SimReadoutHeader>(evtSvc(), SimReadoutHeaderLocation::Default);
00335       TimeStamp temp        = proh->earliest - srh->earliest();
00336       sh->setContext(proh->context);
00337       temp.Add(sh->earliest());
00338       sh->setTimeStamp(temp);
00339       sh->setEarliest(temp);
00340       temp = proh->earliest - srh->earliest();
00341       temp.Add(sh->latest());
00342       sh->setLatest(temp);
00343       debug()<< "SimHeader===earlist is: "<< sh->earliest()<< endreq;
00344       debug()<< "SimHeader===context is: "<< sh->timeStamp()<< endreq;
00345       debug()<< "SimHeader===latest  is: "<< sh->latest()<< endreq;
00346     }
00347     
00348     // Reset SimTrigHeader time
00349     /* if(regit->path() == SimTrigHeaderLocation::Default)
00350     {
00351       SimTrigHeader* sth = get<SimTrigHeader>(evtSvc(), SimTrigHeaderLocation::Default);
00352       sth->setContext(proh->context);
00353       sth->setTimeStamp(proh->earliest);
00354       sth->setEarliest(proh->earliest);
00355       sth->setLatest(proh->latest);
00356       debug()<< "SimTrigHeader===earlist is: "<< sth->earliest()<< endreq;
00357       debug()<< "SimTrigHeader===context is: "<< sth->timeStamp()<< endreq;
00358       debug()<< "SimTrigHeader===latest  is: "<< sth->latest()<< endreq;
00359       }*/
00360     
00361     // Reset ElecHeader time
00362     /*if(regit->path() == ElecHeaderLocation::Default)
00363     {
00364       ElecHeader* eh = get<ElecHeader>(evtSvc(), ElecHeaderLocation::Default);
00365       eh->setContext(proh->context);
00366       eh->setTimeStamp(proh->earliest);
00367       eh->setEarliest(proh->earliest);
00368       eh->setLatest(proh->latest);
00369       debug()<< "ElecHeader===earlist is: "<< eh->earliest()<< endreq;
00370       debug()<< "ElecHeader===context is: "<< eh->timeStamp()<< endreq;
00371       debug()<< "ElecHeader===latest  is: "<< eh->latest()<< endreq;
00372       }*/
00373 
00374     // Reset SimReadoutHeader time
00375     /*if(regit->path() == SimReadoutHeaderLocation::Default)
00376     {
00377       SimReadoutHeader* srh = get<SimReadoutHeader>(evtSvc(), SimReadoutHeaderLocation::Default);
00378       srh->setContext(proh->context);
00379       srh->setTimeStamp(proh->earliest);
00380       srh->setEarliest(proh->earliest);
00381       srh->setLatest(proh->latest);
00382       debug()<< "SimReadoutHeader===earlist is: "<< srh->earliest()<< endreq;
00383       debug()<< "SimReadoutHeader===context is: "<< srh->timeStamp()<< endreq;
00384       debug()<< "SimReadoutHeader===latest  is: "<< srh->latest()<< endreq;
00385       }*/
00386   }
00387 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:45:52 2011 for Mixing by doxygen 1.4.7