00001
00002
00003
00004 #define TPC_DATABASE_PARAMETERS
00005
00006
00007
00009
00010 #include <stdio.h>
00011 #include <string.h>
00012 #include <sys/types.h>
00013 #include <sys/stat.h>
00014 #include <fcntl.h>
00015
00016 #include "Stiostream.h"
00017 #include <unistd.h>
00018 #include <math.h>
00019 #include <string>
00020 #include <algorithm>
00021 #include <vector>
00022 #include <list>
00023 #include <utility>
00024 #include <algorithm>
00025 #include <ctime>
00026
00027 #include "StMixerMaker.h"
00028
00029
00030 #include "StGlobals.hh"
00031 #include "Randomize.h"
00032 #include "TDataSetIter.h"
00033 #include "TObjectSet.h"
00034
00035
00036
00037 #include "StTpcDb/StTpcDb.h"
00038 #include "StTrsMaker/include/StTpcDbGeometry.hh"
00039 #include "StTrsMaker/include/StTpcDbSlowControl.hh"
00040 #include "StTrsMaker/include/StTpcDbElectronics.hh"
00041 #include "StTrsMaker/include/StTrsFastDigitalSignalGenerator.hh"
00042
00043
00044
00045 #include "StTrsMaker/include/StTrsDigitalSignalGenerator.hh"
00046
00047
00048 #include "StTrsMaker/include/StTrsAnalogSignal.hh"
00049 #include "StTrsMaker/include/StTrsSector.hh"
00050 #include "StTrsMaker/include/StTpcElectronics.hh"
00051
00052
00053 #include "StTrsMaker/include/StTrsDetectorReader.hh"
00054 #include "StTrsMaker/include/StTrsZeroSuppressedReader.hh"
00055
00056 #include "StSequence.hh"
00057
00058 #include "StDAQMaker/StDAQReader.h"
00059
00060 #include "StDaqLib/TPC/trans_table.hh"
00061
00062 ClassImp(StMixerMaker)
00063
00064
00065 StMixerMaker::StMixerMaker(const char *name,const char *kind1,const char *kind2):StMaker(name),
00066 mMergeSequences(1),mFirstSector(1),mLastSector(24)
00067 { gConfig[0]=kind1; gConfig[1]=kind2; mAllTheDataMixer=0; }
00068
00069
00070
00071 StMixerMaker::~StMixerMaker() { }
00072
00073
00074
00075 int StMixerMaker::writeFile(const char* file, int numEvents)
00076 {
00077 mOutputFileName = file;
00078 mNumberOfEvents = numEvents;
00079 return kStOK;
00080 }
00081
00082
00083 Int_t StMixerMaker::InitRun(int RunId) {
00084
00085
00086 mGeometryDb = StTpcDbGeometry::instance();
00087 mElectronicsDb = StTpcDbElectronics::instance();
00088 mSlowControlDb = StTpcDbSlowControl::instance();
00089
00090 mSector = new StTrsSector(mGeometryDb);
00091 mDigitalSignalGenerator = new StTrsFastDigitalSignalGenerator(mElectronicsDb, mSector,-1);
00092
00093
00094
00095
00096
00097
00098 mAllTheDataMixer = new StTrsRawDataEvent(mGeometryDb->numberOfSectors());
00099 TObjectSet *set = new TObjectSet("MixerEvent" , mAllTheDataMixer, kFALSE);
00100 AddConst(set);
00101 return kStOk;
00102 }
00103
00104
00105
00106 Int_t StMixerMaker::Make() {
00107
00108
00109 static const char *input[2] = {"Input1","Input2"};
00110 for (int ir=0;ir<2;ir++) {
00111 TDataSet *dataset = GetDataSet(input[ir]); assert(dataset);
00112 if(strcmp(gConfig[ir],"daq")==0) {
00113
00114 StDAQReader* daqReader =(StDAQReader*)(dataset->GetObject()); assert(daqReader);
00115 StTPCReader *tpcReader = daqReader->getTPCReader();
00116 if(!tpcReader) return kStWarn;
00117 tpcReader->SetSequenceMerging(mMergeSequences);
00118 mReader[ir].Set(tpcReader);
00119 } else {
00120 if (strcmp(gConfig[ir],"trs")==0) {
00121 StTpcRawDataEvent* trsEvent = (StTpcRawDataEvent*)dataset->GetObject();
00122 string version = "TrsDatav1.0";
00123 StTrsDetectorReader *trsDetReader = new StTrsDetectorReader(trsEvent, version);
00124 mReader[ir].Set(trsDetReader);
00125 }
00126 }
00127 }
00128
00129 int numberOfRows = mSector->numberOfRows();
00130 for(int sector=mFirstSector; sector<=mLastSector; sector++) {
00131 mSector->clear();
00132 for (int ir=0;ir<2;ir++) {
00133 if (! (mReader[ir].TpcReader() || mReader[ir].TrsDetectorReader())) continue;
00134 for(int irow=0; irow<numberOfRows; irow++) {
00135 unsigned char* padList;
00136 int numberOfPads = mReader[ir].getPadList(sector,irow+1,&padList);
00137
00138 for(int ipad=0; ipad<numberOfPads; ipad++) {
00139 int pad=padList[ipad];
00140 assert(pad);
00141 int nseq=0;
00142 StSequence* listOfSequences=0;
00143 UShort_t **listIdTruth =0;
00144 mReader[ir].getSequences(sector,irow+1,pad,&nseq,&listOfSequences,&listIdTruth);
00145
00146
00147
00148 for(int iseq=0;iseq<nseq;iseq++) {
00149 int startTimeBin=listOfSequences[iseq].startTimeBin;
00150 assert(startTimeBin>=0 && startTimeBin<=511);
00151 int seqLen=listOfSequences[iseq].length;
00152 unsigned char *pointerToAdc=listOfSequences[iseq].firstAdc;
00153 for(int jbin=0;jbin<seqLen;jbin++) {
00154 int idt = (listIdTruth)? listIdTruth[iseq][jbin]:0;
00155 float conversion=log8to10_table[pointerToAdc[jbin]];
00156 StTrsAnalogSignal padSignal(startTimeBin+jbin,conversion,idt);
00157 mSector->addEntry(irow+1,pad,padSignal);
00158 }
00159 }
00160 }
00161 }
00162 }
00163
00164 mSector->sort();
00165
00166
00167
00168
00169 StTrsDigitalSector *aDigitalSector = new StTrsDigitalSector(mGeometryDb);
00170
00171
00172
00173 mDigitalSignalGenerator->fillSector(aDigitalSector);
00174
00175
00176
00177
00178 mDigitalSignalGenerator->digitizeSignal();
00179
00180
00181
00182
00183
00184 mAllTheDataMixer->setSector(sector,aDigitalSector);
00185
00186
00187 }
00188
00189 return kStOK;
00190 }
00191
00192
00193 void StMixerMaker::Clear(Option_t *opt)
00194 {
00195 if (mAllTheDataMixer) mAllTheDataMixer->clear();
00196 mReader[0].Clear();
00197 mReader[1].Clear();
00198 StMaker::Clear();
00199 }
00200
00201
00202 Int_t StMixerMaker::Finish()
00203 {
00204
00205
00206
00207 delete mSector; mSector = 0;
00208 delete mAllTheDataMixer; mAllTheDataMixer = 0;
00209 delete mDigitalSignalGenerator; mDigitalSignalGenerator = 0;
00210 return kStOK;
00211 }
00212
00213
00215 char StMixerMaker::SetSequenceMerging(char mergeSequences)
00216 {
00217 mMergeSequences=mergeSequences;
00218 return mMergeSequences;
00219 }
00220
00221
00222
00223
00224
00225
00226 StMixerReader::StMixerReader()
00227 {
00228 mTpcReader=0;mTrsReader=0;
00229 mTrsDetectorReader=0; mSector=-1;
00230 }
00231
00232 void StMixerReader::Set(StTPCReader *r)
00233 {
00234 mSector=-1; mTrsReader=0;mTpcReader=r;
00235 }
00236
00237 void StMixerReader::Set(StTrsDetectorReader *r)
00238 {
00239 mSector=-1; mTrsReader=0;mTpcReader=0;mTrsDetectorReader=r;
00240 }
00241
00242 void StMixerReader::SetSector(int sector)
00243 {
00244 if (mSector==sector) return;
00245 mSector=sector;
00246 mTrsReader = mTrsDetectorReader->getZeroSuppressedReader(sector);
00247 }
00248
00249 int StMixerReader::getSequences(int sector,int row,int pad,int *nseq,StSequence **listOfSequences, UShort_t ***listIdTruth)
00250 {
00251 if (mTrsDetectorReader) {
00252 SetSector(sector);
00253 return mTrsReader->getSequences(row,pad,nseq,listOfSequences,listIdTruth);
00254 } else {
00255 TPCSequence **liztOfSequences = (TPCSequence**)listOfSequences;
00256 if (listIdTruth) *listIdTruth=0;
00257 return mTpcReader->getSequences(sector,row,pad,*nseq,*liztOfSequences);
00258 }
00259 }
00260
00261 int StMixerReader::getPadList(int sector,int row, unsigned char **padList)
00262 {
00263 *padList=0;
00264 if (mTrsDetectorReader) {
00265 SetSector(sector);
00266 if (!mTrsReader) return 0;
00267 return mTrsReader->getPadList(row,padList);
00268 }
00269 if (mTpcReader) {
00270 return mTpcReader->getPadList(sector,row,*padList);
00271 }
00272 return 1;
00273 }
00274
00275
00276 void StMixerReader::Clear()
00277 {
00278 delete mTrsDetectorReader; mTrsDetectorReader=0;
00279 }
00280