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

OltEnds.cxx

Go to the documentation of this file.
00001 
00002 // $Id: OltEnds.cxx,v 1.2 2003/01/20 10:13:58 west Exp $
00003 //
00004 // OltEnds.cxx
00005 //
00006 // Block Scan
00007 //
00008 // Author: Phil Adamson 5/2002
00010 
00011 #include "JobControl/JobCModuleRegistry.h"
00012 #include "MinosObjectMap/MomNavigator.h"
00013 #include "OfflineTrigger/OltEnds.h"
00014 #include "MessageService/MsgService.h"
00015 #include "RawData/RawRecord.h"
00016 #include "RawData/RawHeader.h"
00017 #include "RawData/RawDataBlock.h"
00018 #include "RawData/RawDaqHeaderBlock.h"
00019 #include "RawData/RawSnarlHeaderBlock.h"
00020 #include "RawData/RawChannelId.h"
00021 #include "RawData/RawVaDigit.h"
00022 #include "RawData/RawQieDigit.h"
00023 #include "RawData/RawDigitDataBlock.h"
00024 #include "RawData/RawRunCommentBlock.h"
00025 
00026 #include "Persistency/PerOutputStreamManager.h"
00027 #include "Persistency/PerOutputStream.h"
00028 #include "Rotorooter/RotoObjectifier.h"
00029 #include "Plex/PlexHandle.h"
00030 #include "Plex/PlexSEIdAltL.h"
00031 #include "Plex/PlexStripEndId.h"
00032 #include "Validity/VldContext.h"
00033 
00034 #include "TString.h"
00035 #include "TFile.h"
00036 #include "TTree.h"
00037 #include "TH2.h"
00038 #include <string>
00039 
00040 #include <algorithm>
00041 #include <cstdio>
00042 #include <cstring>
00043 #include <iostream>
00044 #include <fstream>
00045 #include <map>
00046 #ifndef __CINT__
00047 #include "OnlineUtil/mdBlockDefinitions.h"
00048 #endif
00049 ClassImp(OltEnds)
00050 
00051   // ......
00052 
00053 CVSID("$Id: OltEnds.cxx,v 1.2 2003/01/20 10:13:58 west Exp $");
00054 JOBMODULE(OltEnds,"OltEnds","A Hack");
00055 
00056 
00057 OltEnds::OltEnds()
00058 {
00059   fRecord = 0;
00060   TDirectory *save = gDirectory;
00061   fFile = new TFile("/home/pa/ends.root","RECREATE");
00062   fBothEnds = new TH2F("bothends","ADC: Both Ends Hit",500,0,10000,500,0,10000);
00063   save->cd();
00064 }
00065 
00066 OltEnds::~OltEnds()
00067 {
00068   TDirectory *save = gDirectory;
00069   fFile->cd();
00070   fBothEnds->Write();
00071   fFile->Close();
00072   save->cd();
00073 }
00074 
00075 JobCResult OltEnds::Reco(MomNavigator* mom)
00076 {
00077   TIter iter = mom->FragmentIter();
00078   while (TObject *obj = iter.Next()) {
00079     RawRecord *rawrec = dynamic_cast<RawRecord *>(obj);
00080     if (rawrec) {
00081       ++fRecord;
00082       TIter recit = rawrec->GetRawBlockIter();
00083       while (TObject *obj = recit.Next()) {
00084         RawDataBlock *rawdata = dynamic_cast<RawDataBlock *>(obj);
00085         if (rawdata) {
00086           if (rawdata->InheritsFrom("RawSnarlHeaderBlock")) {
00087             RawSnarlHeaderBlock *rshb =dynamic_cast<RawSnarlHeaderBlock *>(rawdata);
00088             fTreeTF = rshb->GetTimeFrameNo();
00089             fVld = rshb->GetVldContext();
00090             MSG("Olt",Msg::kInfo)<<"Timeframe "<<fTreeTF<<endl;
00091           } 
00092           fTreeIndex = 0;
00093           RawDigitDataBlock *rddb = dynamic_cast<RawDigitDataBlock *>(rawdata);
00094           if (rddb) {
00095             multimap<int,RawDigit *> hitmap[2]; // map from (plane*25 + strip)
00096             map<int,int> adc[2];
00097             PlexHandle plex(fVld);
00098             TIter it = rddb->GetDatumIter();
00099             while (TObject *obj = it.Next()) {
00100               RawVaDigit *rvd = dynamic_cast<RawVaDigit *>(obj);
00101               if (rvd) {
00102                 //cout<<*rvd<<endl;
00103                 PlexSEIdAltL altl = plex.GetSEIdAltL(rvd->GetChannel());
00104                 if (altl.size()>0) {
00105                   PlexStripEndId seid = altl.GetBestSEId();
00106                   //cout<<seid<<endl;
00107                   int plane = seid.GetPlane();
00108                   int strip = seid.GetStrip();
00109                   int end = int(seid.GetEnd());
00110                   if (end>0 && end<3) {
00111                     cout<<seid.GetEnd()<<endl;
00112                     cout<<"V "<<end<<" "<<plane<<" "<<strip<<endl;
00113                     hitmap[end-1].insert(pair<int,RawDigit *>(plane*25 + strip,rvd));
00114                     adc[end-1][plane*25 + strip] +=rvd->GetADC();
00115                   }
00116                 }
00117               }
00118               RawQieDigit *rqd = dynamic_cast<RawQieDigit *>(obj);
00119               if (rqd) {
00120                 //cout<<*rqd<<endl;
00121                 PlexSEIdAltL altl = plex.GetSEIdAltL(rqd->GetChannel());
00122                 if (altl.size()>0) {
00123                   PlexStripEndId seid = altl.GetBestSEId();
00124                   //cout<<seid<<endl;
00125                   int plane = seid.GetPlane();
00126                   int strip = seid.GetStrip();
00127                   int end = int(seid.GetEnd());
00128                   if (end>0 && end<3) {
00129                     cout<<seid.GetEnd()<<endl;
00130                     cout<<"Q "<<end<<" "<<plane<<" "<<strip<<endl;
00131                     hitmap[end-1].insert(pair<int,RawDigit *>(plane*25 + strip,rqd));           
00132                     adc[end-1][plane*25 + strip] +=(rqd->GetADC()-50);
00133                   }
00134                 }
00135               }
00136             }
00137             // Now match up hits...
00138             map<int,int>::iterator mit[2];
00139             for (int i=0;i<2;i++) mit[i] = adc[i].begin();
00140             for (;;) {
00141              if (mit[0]==adc[0].end() && mit[1]==adc[1].end()) break;
00142              if (mit[0]==adc[0].end()) {
00143                 // Side 1 only left:
00144                 ++(mit[1]);
00145               }
00146               else if (mit[1] == adc[1].end()) {
00147                 ++(mit[0]);
00148               }
00149               else {
00150                 int ind0 = (*(mit[0])).first;
00151                 int ind1 = (*(mit[1])).first;
00152                 
00153                 if (ind0==ind1) {
00154                   //Matched hits
00155                   fBothEnds->Fill((*(mit[0])).second,(*(mit[1])).second);
00156                   cout<<"Matched a hit"<<endl;
00157                   ++(mit[0]); ++(mit[1]);
00158                 }
00159                 else if (ind0 < ind1 ) {
00160                   // only on side 0
00161                   ++(mit[0]);
00162                 }
00163                 else if (ind0 > ind1) {
00164                   // only on side 1
00165                   ++(mit[1]);
00166                 }
00167               }
00168              
00169             }
00170           }
00171           RawRunCommentBlock *rc = dynamic_cast<RawRunCommentBlock *>(rawdata);
00172           if (rc) cout<<rc->GetRunComment()<<endl;
00173         }
00174       }
00175     }
00176   }
00177   return JobCResult::kAOK;
00178 }
00179 
00180 
00181  
00182 const Registry& OltEnds::DefaultConfig() const
00183 {
00184 
00185   static Registry r; // Default configuration for module
00186 
00187 
00188   std::string name = this->JobCModule::GetName();
00189   name += ".config.default";
00190   r.SetName(name.c_str());
00191 
00192   // Set values in configuration
00193   r.UnLockValues();
00194   r.Set("DumpData", true);
00195   r.LockValues();
00196 
00197   return r;
00198 }
00199 
00200 //......................................................................
00201 
00202 void OltEnds::Config(const Registry& r)
00203 {
00204   int   tmpb;
00205   cout<<"Teapots\n";
00206   cout<<r<<endl;
00207   if (r.Get("DumpData",tmpb)) { cout<<"Hello "<<tmpb<<endl;fDump = bool(tmpb); }
00208 }
00209 

Generated on Mon Feb 15 11:07:17 2010 for loon by  doxygen 1.3.9.1