00001
00002
00003
00004
00005
00006
00007
00008
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];
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
00103 PlexSEIdAltL altl = plex.GetSEIdAltL(rvd->GetChannel());
00104 if (altl.size()>0) {
00105 PlexStripEndId seid = altl.GetBestSEId();
00106
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
00121 PlexSEIdAltL altl = plex.GetSEIdAltL(rqd->GetChannel());
00122 if (altl.size()>0) {
00123 PlexStripEndId seid = altl.GetBestSEId();
00124
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
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
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
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
00161 ++(mit[0]);
00162 }
00163 else if (ind0 > ind1) {
00164
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;
00186
00187
00188 std::string name = this->JobCModule::GetName();
00189 name += ".config.default";
00190 r.SetName(name.c_str());
00191
00192
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