Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CDTrackerModule.cxx

Go to the documentation of this file.
00001 
00002 
00003 // Program name: CDTrackerModule.cxx
00004 //
00005 // Package: CalDetTracker
00006 //
00007 // Purpose: 
00008 //
00009 // Contact: Chris Smith, Ryan Nichol, Leo Jenner or Jeff Hartnell
00011 
00012 #include <fstream>
00013 
00014 #include "TClonesArray.h"
00015 #include "TFile.h"
00016 #include "TTree.h"
00017 
00018 #include "CalDetPID/CalDetBeamMomentum.h"
00019 #include "CalDetPID/CalDetParticleType.h"
00020 #include "Calibrator/Calibrator.h"
00021 #include "CalDetPID/CandCalDetPIDHandle.h"
00022 #include "CalDetSI/CandCalDetSIHandle.h"
00023 #include "CandData/CandRecord.h"
00024 #include "CandDigit/CandDigitListHandle.h"
00025 #include "RecoBase/CandStripListHandle.h"
00026 #include "DatabaseInterface/DbiResultPtr.h"
00027 #include "DatabaseUpdater/DbuSubRunSummary.h"
00028 #include "JobControl/JobCommand.h"
00029 #include "JobControl/JobCModuleRegistry.h"
00030 #include "MinosObjectMap/MomNavigator.h"
00031 #include "RawData/RawRecord.h"
00032 #include "RawData/RawDaqSnarlHeader.h"
00033 #include "RawData/RawDeadChipBlock.h"
00034 #include "RawData/RawDigitDataBlock.h"
00035 #include "RawData/RawChannelId.h"
00036 #include "RawData/RawVaDigit.h"
00037 #include "Validity/VldContext.h"
00038 #include "Validity/VldTimeStamp.h"
00039 #include "MessageService/MsgService.h"
00040 
00041 #include "CalDetTracker/CDTrackerModule.h"
00042 #include "CalDetTracker/CDMapMaker.h"
00043 #include "CalDetTracker/CDCrossTalker.h"
00044 #include "CalDetTracker/CDBeamMuTracker.h"
00045 #include "CalDetTracker/CDCosmicTracker.h"
00046 #include "CalDetTracker/CDTrackedHits.h"
00047 #include "CalDetTracker/CDUnidentifiedHits.h"
00048 #include "CalDetTracker/CDTrackInfo.h"
00049 #include "CalDetTracker/CDTrackedHitInfo.h"
00050 #include "CalDetTracker/CDXTalkHitInfo.h"
00051 #include "CalDetTracker/CDPIDInfo.h"
00052 #include "CalDetTracker/CDTruthifier.h"
00053 #include "CalDetTracker/CDTrackedHitInfo.h"
00054 #include "CalDetTracker/CDTrackInfo.h"
00055 #include "CalDetTracker/CDTrackerOptions.h"
00056 #include "CalDetTracker/CDPIDInfo.h"
00057 
00058 using std::endl;
00059 using std::cout;
00060 
00061 CVSID("$Id: CDTrackerModule.cxx,v 1.25 2005/08/28 01:41:37 rhatcher Exp $");
00062 
00063 JOBMODULE(CDTrackerModule,"CDTrackerModule",
00064           "Track Muons in CalDet");
00065 
00066 //......................................................................
00067 
00068 CDTrackerModule::CDTrackerModule()
00069 {
00070   ffirstrecord=true;
00071 
00072   fBeamMomentum=0;
00073   fNumDeadChips=-1;
00074   fTemperature=-1;
00075   fSimFlag=SimFlag::kUnknown;
00076   frun=0;
00077   fsubrun=0;
00078   fsnarl=0;
00079   fSec=-1;
00080   fStartSnarl=0;
00081   fEndSnarl=0;
00082   fStartTime=0;
00083   fEndTime=0;
00084   fsavefile=0;
00085   fJustWriteTracks=0;
00086   fOverwriteFile=0;
00087   fWritePID=0;
00088   sprintf(ftag,"SetFileIDToMakeThisShorter");
00089   fWriteTruth=0;
00090 
00091   //initialise pointers
00092   fTrkInfo=0;
00093   ftree=0;
00094   fPID=0;
00095 
00096   //"beam" tracked hits
00097   fTrkHits=new TClonesArray("CDTrackedHitInfo",1000);
00098   //cosmic counter hits
00099   fCCHits=new TClonesArray("CDTrackedHitInfo",1000); 
00100   //"cosmic" tracked hits
00101   fStTrkHits=new TClonesArray("CDTrackedHitInfo",1000);
00102   //xtalk hits 
00103   fXTalkHits=new TClonesArray("CDXTalkHitInfo",1000);
00104   //unidentified hits
00105   fUnTrkHits=new TClonesArray("CDTrackedHitInfo",1000);
00106   //the truth of the hits
00107   fTruthHits=new TClonesArray("CDTruthHitInfo",1000);
00108 
00109   //tracker options
00110   fTrkOpt=new CDTrackerOptions();
00111 }
00112 
00113 //......................................................................
00114 
00115 JobCResult CDTrackerModule::Ana(const MomNavigator *mom) 
00116 {
00117   //set the default result to passed
00118   JobCResult result(JobCResult::kPassed);
00119 
00120   CandRecord* candrec=dynamic_cast<CandRecord*>
00121     (mom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00122   if (candrec==0) {
00123     MSG("CDTrackerModule",Msg::kWarning) 
00124       <<"No PrimaryCandidateRecord in MOM." << endl;
00125     result.SetFailed();
00126     return result;
00127   }
00128 
00129   RawRecord *rr=dynamic_cast<RawRecord *>
00130     (mom->GetFragment("RawRecord"));
00131   if (rr==0) {
00132     MSG("CDTrackerModule",Msg::kWarning) 
00133       <<"No RawRecord in MOM." << endl;
00134     result.SetFailed();
00135     return result;
00136   }
00137 
00138   const RawDeadChipBlock* dcb=dynamic_cast<const RawDeadChipBlock*>
00139     (rr->FindRawBlock("RawDeadChipBlock"));
00140   if(dcb) {
00141     fNumDeadChips=dcb->GetNumberOfEntries();
00142     if (fNumDeadChips>0) {
00143       MAXMSG("CDTrackerModule",Msg::kDebug,100)
00144         <<"Found dead chips="<<fNumDeadChips<<endl;
00145     }
00146   }
00147   else {
00148     MAXMSG("CDTrackerModule",Msg::kWarning,10)
00149       <<"No RawDeadChipBlock present"<<endl;
00150   }
00151 
00152   const RawDaqSnarlHeader* snarlHdr =
00153     dynamic_cast<const RawDaqSnarlHeader*>(rr->GetRawHeader());
00154   if(snarlHdr){
00155     fsnarl=snarlHdr->GetSnarl();
00156     fSec=snarlHdr->GetVldContext().GetTimeStamp().GetSec();
00157     fEndSnarl=fsnarl;
00158     fEndTime=fSec;
00159 
00160     if(ffirstrecord) {
00161       fSimFlag=snarlHdr->GetVldContext().GetSimFlag();
00162       fStartTime=snarlHdr->GetVldContext().GetTimeStamp().GetSec();
00163       fStartSnarl=snarlHdr->GetSnarl();
00164       frun=snarlHdr->GetRun();
00165       fsubrun=snarlHdr->GetSubRun();//this isn't always right!
00166 
00167       /*
00168       DbiResultPtr<DbuSubRunSummary> dsrs(snarlHdr->GetVldContext(),
00169                                           Dbi::kDefaultTask,
00170                                           Dbi::kDisabled);
00171       MSG("CDTrackerModule",Msg::kInfo)
00172         <<"Number of rows in DbuSubRunSummary="<<dsrs.GetNumRows()
00173         <<endl;
00174       
00175       //get the database row
00176       if(dsrs.GetNumRows()==1) {
00177         fsubrun=dsrs.GetRow(0)->fSubRun;
00178         MSG("CDTrackerModule",Msg::kInfo)
00179           <<"Found subrun in database="<<fsubrun
00180           <<", run="<<dsrs.GetRow(0)->fRun<<endl
00181           <<"Start time="<<dsrs.GetRow(0)->fStartTime.GetSec()<<endl
00182           <<"End time  ="<<dsrs.GetRow(0)->fEndTime.GetSec()<<endl;
00183       }
00184       else{
00185         MSG("CDTrackerModule",Msg::kWarning)
00186           <<"Can't find subrun in database, #rows="<<dsrs.GetNumRows()
00187           <<", fsubrun="<<fsubrun<<endl;
00188       }
00189       */
00190       MSG("CDTrackerModule",Msg::kVerbose)<<"Subrun="<<fsubrun<<endl;
00191     }
00192   }
00193   else{
00194     MSG("CDTrackerModule",Msg::kWarning) 
00195       <<"No RawDaqSnarlHeader in MOM."<<endl;
00196     result.SetFailed();
00197     return result;
00198   }
00199 
00200   //get the temperature from the calibrator
00201   Calibrator& cal=Calibrator::Instance();
00202   cal.Reset(snarlHdr->GetVldContext());
00203   fTemperature=cal.GetTemperature();
00204   MAXMSG("CDTrackerModule",Msg::kDebug,20) 
00205     <<"Used Calibrator to get temperature="<<fTemperature<<" C"<<endl;
00206 
00207   int ExtTrigTime=0;//stores external trigger time of specific channel
00208   const RawDigitDataBlock *rddb=dynamic_cast<const RawDigitDataBlock *>
00209     (rr->FindRawBlock("RawDigitDataBlock"));
00210 
00211   //looping to find particular channel
00212   if (rddb) {
00213     RawChannelId id(Detector::kCalDet,ElecType::kVA,0,0x1602);
00214     id.SetModeBits(true,true,true);
00215     TIter it=rddb->GetDatumIter();
00216     while (TObject *obj=it.Next()) {
00217       RawVaDigit *rvd=dynamic_cast<RawVaDigit *>(obj);
00218       if (rvd) {
00219         RawChannelId rcid=rvd->GetChannel();
00220         if (rcid.IsSameChannel(id)) ExtTrigTime=rvd->GetTDC();
00221       }
00222     }
00223   }
00224     
00225   //work out the directory to write to
00226   if(ffirstrecord) {
00227     MSG("CDTrackerModule",Msg::kDebug)
00228       <<"Opening file..."<<endl;
00229     //open the output file
00230     fsavefile=this->OpenFile(frun,fsubrun);
00231     
00232     //create tree and initialise branches
00233     this->InitialiseTree();
00234     ffirstrecord=false;
00235     MSG("CDTrackerModule",Msg::kDebug) 
00236       <<"... file opened and tree initialised"<<endl;
00237 
00238     if (fSimFlag==SimFlag::kData){
00239       //note that only beam momentum for data is set here
00240       //for MC it is the largest stdhep TParticle momentum
00241       DbiResultPtr<CalDetBeamMomentum> cdbm(snarlHdr->GetVldContext(),
00242                                             Dbi::kDefaultTask,
00243                                             Dbi::kDisabled);
00244       
00245       MSG("CDTrackerModule",Msg::kDebug)
00246         <<"Number of rows in CalDetBeamMomentum="<<cdbm.GetNumRows()
00247         <<endl;
00248       
00249       //get the database row
00250       if(cdbm.GetNumRows()==1) {
00251         fBeamMomentum=cdbm.GetRow(0)->GetMomentum();
00252         MSG("CDTrackerModule",Msg::kInfo)
00253           <<"Found beam momentum in database="<<fBeamMomentum<<endl;
00254       }
00255       else{
00256         MSG("CDTrackerModule",Msg::kInfo)
00257           <<"Problem with beam momentum in database"
00258           <<", #rows="<<cdbm.GetNumRows()
00259           <<", beamMomentum="<<fBeamMomentum<<endl;
00260       }
00261     }
00262   }
00263   static Bool_t firstSnarl=true;
00264   if (firstSnarl){
00265     MSG("CDTrackerModule",Msg::kInfo)
00266       <<"Started tracking... (first snarl number="<<fsnarl
00267       <<", second="<<fSec<<")"<<endl;
00268     firstSnarl=false;
00269   }
00270 
00271   if (fWritePID){
00272     //make PID Info object
00273     fPID=new CDPIDInfo();
00274 
00275     //Get CandCalDetSIHandle and pass it to CDPIDInfo constructor
00276     CandCalDetSIHandle* cdsi=dynamic_cast<CandCalDetSIHandle*>
00277       (candrec->FindCandHandle("CandCalDetSIHandle"));
00278     
00279     //now fill CDPIDInfo with SI info object
00280     if(cdsi) {
00281       this->FillPID(cdsi);
00282     }
00283     else{      
00284       if (fSimFlag==SimFlag::kData){
00285         MSG("CDTrackerModule",Msg::kError)
00286           <<"No caldet SI handle; not filling CDPIDInfo!"<<endl;
00287       }
00288       //else simflag=MC and you don't expect to find such a handle
00289     }
00290 
00291     CandCalDetPIDHandle* cdpid=dynamic_cast<CandCalDetPIDHandle*>
00292       (candrec->FindCandHandle("CandCalDetPIDHandle"));
00293 
00294     //now fill CDPIDInfo object from cdpid
00295     if (cdpid){
00296       MSG("CalDetPID",Msg::kDebug) 
00297         <<"Tracker::particle="<<cdpid->GetPIDType()
00298         <<", nooverlap="<<cdpid->NoOverlap()
00299         <<", inckvtime="<<cdpid->InCERTime()
00300         <<", ol chi2="<<cdpid->GetOLChi2()
00301         <<endl;
00302       this->FillPID(cdpid);
00303     }
00304     else{
00305       if (fSimFlag==SimFlag::kData){
00306       MAXMSG("CDTrackerModule",Msg::kWarning,5) 
00307         <<"No caldet pid handle; not filling CDPIDInfo!"<<endl;
00308       }
00309       //else simflag=MC and you don't expect to find such a handle
00310     }
00311   }
00312 
00313   //Get CandDigitList
00314   CandDigitListHandle *digitlist=dynamic_cast<CandDigitListHandle*>
00315     (candrec->FindCandHandle("CandDigitListHandle"));
00316   if(digitlist==0) {
00317     MSG("CDTrackerModule", Msg::kFatal) 
00318       << "No CandDigitList in MOM." << endl;
00319     result.SetFailed();
00320     return result;
00321   }
00322 
00323   //Get CandStripList
00324   CandStripListHandle *striplist=dynamic_cast<CandStripListHandle*>
00325     (candrec->FindCandHandle("CandStripListHandle"));
00326   if(striplist==0) {
00327     MSG("CDTrackerModule", Msg::kFatal) 
00328       << "No CandStripList in MOM." << endl;
00329     result.SetFailed();
00330     return result;
00331   }
00332 
00334   //Write the truth information
00336   if (fWriteTruth){
00337     //check if the input file is not data
00338     if (fSimFlag!=SimFlag::kData){
00339       MAXMSG("CDTrackerModule", Msg::kVerbose,5)
00340         <<"fSimFlag="<<SimFlag::AsString(fSimFlag)
00341         <<". Accessing truth info..."<<endl; 
00342       //create a CDTruthifier
00343       CDTruthifier cdTruthifier;
00344       cdTruthifier.GetTruthHitInfo(mom,fTruthHits);
00345 
00346       Float_t beamP=0;
00347 
00348       //get the particle momentum
00349       //note that for kData the beam momentum is obtained 
00350       //from the caldet database table
00351       if (fWritePID && fPID){
00352         cdTruthifier.RecoStdHep(mom,fPID);
00353         beamP=fPID->GetTrueParticleMomentum();
00354       }
00355       else if (!fPID){
00356         //still want to get the beam momentum
00357         //even if not writing the whole CDPIDInfo object
00358         beamP=cdTruthifier.ParticleMomentum(mom);
00359       }
00360 
00361       //calculate the average beam momentum
00362       static Float_t count=0;
00363       MAXMSG("CDTrackerModule",Msg::kVerbose,200)
00364         <<"beamP="<<beamP<<", fBeamMomentum="<<fBeamMomentum
00365         <<", count="<<count<<endl;
00366       fBeamMomentum=fBeamMomentum*(count/(count+1))+beamP*(1/(count+1));
00367       count++;
00368     }
00369   }
00370 
00371   //make a map of the strips
00372   CDMapMaker *mpmkrStrips = new CDMapMaker(striplist);
00373 
00374   //cross talk removal code:
00375   CDCrossTalker xtalker(mpmkrStrips->GetStripMap(),0.9,
00376                         fTrkOpt->Cosmic());
00377   xtalker.GetXTalkStripInfo(fXTalkHits);
00378 
00379   //create tracker object
00380   CDTracker *tracker;
00381 
00382   //pass crosstalk removed map to the tracker:
00383   //if cosmic option set, use cosmic tracker otherwise beam tracker
00384   if(fTrkOpt->Cosmic()){
00385     tracker=new CDCosmicTracker(xtalker.GetCleanStripMap(),fTrkOpt);
00386   }
00387   else{
00388     tracker=new CDBeamMuTracker(xtalker.GetCleanStripMap(),fTrkOpt);
00389   }
00390   
00391   //Get track info from the tracker
00392   fTrkInfo=tracker->GetTrackInfo();
00393   
00394   //Set a few things that can't be set in the CDTracker objects:
00395   fTrkInfo->SetAbsTime(digitlist->GetAbsTime());//leave as digit
00396   fTrkInfo->SetTriggerTime(ExtTrigTime);
00397   
00398   //calculate pathlengths etc. for each hit in a track:
00399   CDTrackedHits trkHits(tracker->GetTrackedStripMap(PlaneView::kX),
00400                         tracker->GetTrackedStripMap(PlaneView::kY),
00401                         tracker->GetCCStripMap());
00402   
00403   //Use angles from the track info class to calculate track quantities:
00404   trkHits.GetTrackedStripInfo(fStTrkHits,fTrkInfo->GetAngle(0),
00405                               fTrkInfo->GetAngle(1));
00406   
00407   //Get Cosmic counter hit info
00408   trkHits.GetCCStripInfo(fCCHits);
00409   
00410   //Set trk range in TrackInfo object
00411   fTrkInfo->SetRange(trkHits.GetTrkRange());
00412   
00413   //alternative way to calculate pathlengths
00414   //only necessary for beam muons
00415   if(!fTrkOpt->Cosmic()){
00416     trkHits.GetTrackedStripInfo(fTrkHits);  
00417     //overwrite trk range if BeamTracker used
00418     fTrkInfo->SetRange(trkHits.GetTrkRange());
00419   }
00420 
00421   //Find unidentified hits in event
00422   //need to change the cross talker
00423   CDUnidentifiedHits uihStrips
00424     (mpmkrStrips->GetStripMap(),
00425      tracker->GetTrackedStripMap(PlaneView::kX),
00426      tracker->GetTrackedStripMap(PlaneView::kY),
00427      tracker->GetCCStripMap(),
00428      xtalker.GetXTalkStripMap());
00429 
00430   //get the unidentified strips
00431   uihStrips.GetUnidentifiedStripInfo(fUnTrkHits);
00432   
00433   //fill tree with info:
00434   if(fTrkInfo->GetResult(0)==1 && fTrkInfo->GetResult(1)==1){
00435     ftree->Fill();
00436   }
00437   else {
00438     result.SetFailed();
00439     if(!fJustWriteTracks)
00440       ftree->Fill();
00441   }
00442   
00443   //delete objects pointed to by local pointers
00444   delete tracker;
00445   delete mpmkrStrips;
00446 
00447   //clear the TClonesArrays and delete objects
00448   this->CleanDataMembers();
00449 
00450   return result;
00451 }
00452 //......................................................................
00453 
00454 void CDTrackerModule::CleanDataMembers()
00455 {
00456   //Clear TClonesArrays for next event
00457   //Note: This used to use Delete but that is slower and only 
00458   //necessary for objects (stored in the TClonesArray) that 
00459   //allocate their own memory
00460   fTrkHits->Clear();
00461   fStTrkHits->Clear();
00462   fCCHits->Clear();
00463   fXTalkHits->Clear();
00464   fUnTrkHits->Clear();
00465   fTruthHits->Clear();
00466   
00467   //delete objects 
00468   if (fTrkInfo) delete fTrkInfo;
00469   if (fPID) delete fPID;
00470 
00471   //reinitialise pointers
00472   fTrkInfo=0;
00473   fPID=0;
00474 
00475   //Note: Don't delete the fTrkOpt, it is only created once
00476 }
00477 
00478 //......................................................................
00479 
00480 void CDTrackerModule::HandleCommand(JobCommand* cmd)
00481 {
00482 
00483   if (cmd->HaveCmd()) {                      // If we have a command...
00484     string sc = cmd->PopCmd();               // Get the command
00485     
00486     if (sc == "TrackOpt") {
00487       string st(cmd->PopOpt());
00488       fTrkOpt->SetTrackerOptions(st);
00489       return;
00490     }
00491 
00492     else if (sc == "ADCThreshold") {
00493       fTrkOpt->SetThresh(cmd->PopFloatOpt());
00494       return;
00495     }
00496 
00497     else if (sc == "MinNHits") {
00498       fTrkOpt->SetMinHit(cmd->PopIntOpt());
00499       return;
00500     }
00501     
00502     else if (sc == "MinTrkLen") {
00503       fTrkOpt->SetTrkLenCut(cmd->PopIntOpt());
00504       return;
00505     }
00506     
00507     else if (sc == "MaxAngle") {
00508       fTrkOpt->SetAngleLimit(cmd->PopFloatOpt());
00509       return;
00510     }
00511     
00512     else if (sc == "MinAngle") {
00513       fTrkOpt->SetMinAngle(cmd->PopFloatOpt());
00514       return;
00515     }
00516 
00517     else if (sc == "MinVertAngle") {
00518       fTrkOpt->SetMinVertAngle(cmd->PopFloatOpt());
00519       return;
00520     }
00521 
00522     else if (sc == "SearchRange") {
00523       fTrkOpt->SetAcceptance(cmd->PopIntOpt());
00524       return;
00525     }
00526 
00527     else if (sc == "HitsPerPlane") {
00528       fTrkOpt->SetHitsPerPlane(cmd->PopIntOpt());
00529       return;
00530     }
00531 
00532     else if (sc == "MaxHotPlanes") {
00533       fTrkOpt->SetMaxHotPlanes(cmd->PopIntOpt());
00534       return;
00535     }
00536 
00537     else if (sc == "FileID") {
00538       sprintf(ftag,"%s",cmd->PopOpt());
00539       return;      
00540     }
00541 
00542     else if (sc == "JustWriteTracks") {
00543       int tempNum=cmd->PopIntOpt();
00544       if(tempNum==0)
00545         fJustWriteTracks=0;
00546       if(tempNum>0) 
00547         fJustWriteTracks=1;
00548       return;      
00549     }
00550 
00551     else if (sc == "OverwriteFile") {
00552       int tempNum=cmd->PopIntOpt();
00553       if(tempNum==0)
00554         fOverwriteFile=0;
00555       if(tempNum>0) 
00556         fOverwriteFile=1;
00557       return;      
00558     }
00559 
00560     else if (sc == "WritePID") {
00561       int tempNum=cmd->PopIntOpt();
00562       if(tempNum==0)
00563         fWritePID=0;
00564       if(tempNum>0) 
00565         fWritePID=1;
00566       return;      
00567     }
00568     else if (sc == "WriteTruth") {
00569       int tempNum=cmd->PopIntOpt();
00570       if(tempNum==0)
00571         fWriteTruth=0;
00572       if(tempNum>0) 
00573         fWriteTruth=1;
00574       return; 
00575     }
00576     else MSG("CDTrackerModule",Msg::kWarning) 
00577       << "Don't understand '" << sc.c_str() << "'\n";
00578   }
00579 }
00580 
00581 //......................................................................
00582 
00583 void CDTrackerModule::EndJob()
00584 {
00585   MSG("CDTrackerModule",Msg::kDebug)<<"Running EndJob()"<<endl;  
00586   
00587   if (fsavefile!=0 && fsavefile->IsWritable()){
00588     fsavefile->cd();
00589     
00590     MSG("CDTrackerModule",Msg::kInfo)
00591       <<"Writing to file... "<<endl;
00592     //print where tree will be written
00593     fsavefile->pwd();
00594     ftree->Write();
00595     
00596     MSG("CDTrackerModule",Msg::kDebug)
00597       <<"Creating options tree..."<<endl;
00598     TTree opt_tree("TrackerOptions","Tracker Options");
00599     opt_tree.Branch("SimFlag",&fSimFlag,"SimFlag/I",32000);
00600     opt_tree.Branch("StartTime",&fStartTime,"StartTime/I",32000);
00601     opt_tree.Branch("EndTime",&fEndTime,"EndTime/I",32000);
00602     opt_tree.Branch("StartSnarl",&fStartSnarl,"StartSnarl/I",32000);
00603     opt_tree.Branch("EndSnarl",&fEndSnarl,"EndSnarl/I",32000);
00604     opt_tree.Branch("BeamMomentum",&fBeamMomentum,
00605                     "BeamMomentum/F",32000);
00606     opt_tree.Branch("Run",&frun,"run/I",32000);
00607     opt_tree.Branch("SubRun",&fsubrun,"subrun/I",32000);
00608     opt_tree.Branch("TrackerOptions","CDTrackerOptions",
00609                      &fTrkOpt,8000,1);
00610     
00611     MSG("CDTrackerModule",Msg::kInfo)
00612       <<"Time="<<fStartTime<<"->"<<fEndTime<<endl
00613       <<"Snarl="<<fStartSnarl<<"->"<<fEndSnarl<<endl;
00614 
00615     MSG("CDTrackerModule",Msg::kDebug)<<"Filling tree..."<<endl;
00616     opt_tree.Fill();
00617     opt_tree.Write();
00618     MSG("CDTrackerModule",Msg::kInfo)<<"Closing file..."<<endl;
00619     fsavefile->Close();
00620   }
00621   else {
00622     MSG("CDTrackerModule",Msg::kWarning)
00623       <<"File not writable!"<<endl;
00624   }
00625 
00626   delete fTrkHits;
00627   delete fCCHits;
00628   delete fStTrkHits;
00629   delete fXTalkHits;
00630   delete fUnTrkHits;
00631   delete fTruthHits;
00632 
00633   MSG("CDTrackerModule",Msg::kDebug)
00634     <<"End of CDTrackerModule::EndJob() reached"<<endl;
00635 }
00636 
00637 //......................................................................
00638 
00639 TFile* CDTrackerModule::OpenFile(Int_t runNumber,
00640                                        Int_t runNumberSub)
00641 {
00642   //create the tfile pointer to be returned
00643   TFile* outputFile=0;
00644   
00645   //get the environmental variable
00646   char *trackerdir=getenv("TRACKER_DIR");
00647   
00648   //use a string to hold env instead 
00649   string sTrackerDir="";
00650   
00651   if (trackerdir!=NULL) {
00652     sTrackerDir=trackerdir;
00653   }
00654   else {
00655     MSG("CDTrackerModule",Msg::kInfo) 
00656       <<"Environmental variable $TRACKER_DIR not set." 
00657       <<" Writing file(s) to current directory"<<endl;
00658     sTrackerDir=".";
00659   }
00660   
00661   //convert varaibles to string
00662   string sRunNumber=Form("%d",runNumber);
00663   string sRunNumberSub=Form("%d",runNumberSub);
00664   MSG("CDTrackerModule",Msg::kVerbose) 
00665     <<"srunnumbersub="<<sRunNumberSub<<endl;
00666   //string sDetector="";
00667   string sTag=ftag;
00668   string sBase=sTrackerDir+"/Tracker"+sRunNumber+"_"+
00669     sRunNumberSub+"_"+sTag;
00670   string sFileName=sBase+".root";
00671   
00672   //test if file already exists
00673   ifstream Test(sFileName.c_str());
00674   
00675   //open the appropriate file
00676   if(!Test || fOverwriteFile){
00677     outputFile=new TFile(sFileName.c_str(),"RECREATE");
00678     if(fOverwriteFile) {
00679        if(Test) Test.close();
00680     }
00681   }
00682   else {
00683     //Need new filename
00684     Int_t fred=1;
00685     while(Test) {
00686       Test.close();
00687       string sAppendage=Form("%d",fred);
00688       sFileName=sBase+"_"+sAppendage+".root";
00689       Test.open(sFileName.c_str());
00690       fred++;
00691     }
00692     outputFile = new TFile(sFileName.c_str(),"NEW");
00693     outputFile->SetCompressionLevel(9);
00694   }
00695   
00696   MSG("CDTrackerModule",Msg::kInfo) 
00697     <<"Output file opened: "<<sFileName<<endl;
00698   return outputFile;
00699 }
00700 
00701 //......................................................................
00702 
00703 void CDTrackerModule::InitialiseTree()
00704 {
00705   //create the tree
00706   ftree=new TTree("TrackerTree","Tracker Tree");
00707   
00708   //set tree branches  
00709   ftree->Branch("Snarl",&fsnarl,"snarl/I",32000);
00710   ftree->Branch("NumDeadChips",&fNumDeadChips,"NumDeadChips/I",32000);
00711   ftree->Branch("Sec",&fSec,"Sec/I",32000);
00712   ftree->Branch("Temperature",&fTemperature,"Temperature/F",32000);
00713   if(fWritePID==1) ftree->Branch("PIDInfo","CDPIDInfo",&fPID,8000,1);
00714   ftree->Branch("TrackInfo","CDTrackInfo",&fTrkInfo,8000,1);
00715   ftree->Branch("TrackedHitInfo","TClonesArray",&fTrkHits,8000,1);
00716   ftree->Branch("StraightTrackedHitInfo","TClonesArray",
00717                 &fStTrkHits,8000,1);
00718   ftree->Branch("CCHitInfo","TClonesArray",&fCCHits,8000,1);
00719   ftree->Branch("XTalkHitInfo","TClonesArray",&fXTalkHits,8000,1);
00720   ftree->Branch("UnTrackedHitInfo","TClonesArray",&fUnTrkHits,8000,1);
00721   if (fWriteTruth) ftree->Branch("TruthHitInfo","TClonesArray",
00722                                  &fTruthHits,8000,1);
00723 }
00724 
00725 //......................................................................
00726 
00727 void CDTrackerModule::FillPID(const CandCalDetPIDHandle* cdpid)
00728 {
00729   //check handle exists and fill
00730   if(cdpid) {
00731     MSG("CDTrackerModule",Msg::kVerbose)
00732       <<"Filling CDPIDInfo object with CalDetPID info"<<endl;
00733     fPID->SetPIDType(cdpid->GetPIDType());
00734     fPID->SetNoOverlap(cdpid->NoOverlap());
00735     fPID->SetInCERTime(cdpid->InCERTime());
00736     fPID->SetNoOverlapBits(cdpid->GetNoOverlapBits());
00737     fPID->SetInCERTimeBits(cdpid->GetInCERTimeBits());
00738     fPID->SetOLChi2(cdpid->GetOLChi2());
00739   }
00740 }
00741 
00742 //......................................................................
00743 
00744 void CDTrackerModule::FillPID(CandCalDetSIHandle *cdsi)
00745 {
00746   //check handle exists and fill
00747   if(cdsi) {
00748     fPID->SetIsEmpty(true);
00749     fPID->SetTriggerPMT(cdsi->GetTriggerPMT());
00750     fPID->SetFafErr(cdsi->GetFafErr());
00751     fPID->SetSparseErr(cdsi->GetSparseErr());
00752     fPID->SetTrigSource(cdsi->GetTrigSource());
00753     fPID->SetKovADC1(cdsi->GetKovADC1());
00754     fPID->SetKovADC2(cdsi->GetKovADC2());
00755     fPID->SetKovADC3(cdsi->GetKovADC3());
00756     fPID->SetKovTimeStamp1(cdsi->GetKovTimeStamp1());
00757     fPID->SetKovTimeStamp2(cdsi->GetKovTimeStamp2());
00758     fPID->SetKovTimeStamp3(cdsi->GetKovTimeStamp3());
00759     fPID->SetSnarlTimeFrame(cdsi->GetSnarlTimeFrame());
00760     fPID->SetSnarlMinTimeStamp(cdsi->GetSnarlMinTimeStamp());
00761     fPID->SetSnarlMaxTimeStamp(cdsi->GetSnarlMaxTimeStamp());
00762     fPID->SetTofTDC0(cdsi->GetTofTDC0());
00763     fPID->SetTofTDC1(cdsi->GetTofTDC1());
00764     fPID->SetTofTDC2(cdsi->GetTofTDC2());    
00765     fPID->SetTofADC0(cdsi->GetTofADC0());
00766     fPID->SetTofADC1(cdsi->GetTofADC1());
00767     fPID->SetTofADC2(cdsi->GetTofADC2());
00768     fPID->SetTofADCTimeStamp0(cdsi->GetTofADCTimeStamp0());
00769     fPID->SetTofADCTimeStamp1(cdsi->GetTofADCTimeStamp1());
00770     fPID->SetTofADCTimeStamp2(cdsi->GetTofADCTimeStamp2());
00771     fPID->SetTofTimeStamp(cdsi->GetTofTimeStamp());
00772     fPID->SetTickSinceLast(cdsi->GetTickSinceLast());
00773   }
00774 }
00775 
00776 //......................................................................

Generated on Sat Nov 21 22:45:44 2009 for loon by  doxygen 1.3.9.1