00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <Stiostream.h>
00018 #include <unistd.h>
00019
00020
00021 #include <string>
00022 #include <vector>
00023 #include <utility>
00024 #include <algorithm>
00025
00026
00027 #include "Randomize.h"
00028 #include "StHbook.hh"
00029
00030
00031 #include "StCoordinates.hh"
00032 #include "StTpcCoordinateTransform.hh"
00033
00034
00035
00036 #include "StTpcSimpleGeometry.hh"
00037 #include "StTpcSimpleSlowControl.hh"
00038 #include "StTpcSimpleElectronics.hh"
00039 #include "StSimpleMagneticField.hh"
00040 #include "StTrsDeDx.hh"
00041
00042
00043 #include "StTrsFastChargeTransporter.hh"
00044 #include "StTrsSlowAnalogSignalGenerator.hh"
00045 #include "StTrsFastDigitalSignalGenerator.hh"
00046
00047
00048 #include "StTrsAnalogSignal.hh"
00049 #include "StTrsWireBinEntry.hh"
00050 #include "StTrsWireHistogram.hh"
00051
00052 #include "StTrsSector.hh"
00053
00054
00055 #define VERBOSE 1
00056 #define ivb if(VERBOSE)
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 void printPad(StTrsSector *a)
00068 {
00069 ostream_iterator<StTrsAnalogSignal> out(cout,",");
00070
00071 for(int irow=0; irow<a->size(); irow++)
00072 cout << irow << " " << "<" << a[irow].size() << "> ";
00073
00074
00075
00076
00077
00078
00079 }
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 int main (int argc,char* argv[])
00095 {
00096 const int tupleSize = 4;
00097 StHbookFile hbookFile("hbook");
00098 StHbookTuple theTuple("signal", tupleSize);
00099 float tuple[tupleSize];
00100 theTuple << "row" << "pad" << "time" << "sig" << book;
00101
00102
00103 int irow, ipad, itbin;
00104
00105
00106
00107
00108
00109
00110
00111 string geoFile("../run/TPCgeo.conf");
00112 if (access(geoFile.c_str(),R_OK)) {
00113 cerr << "ERROR:\n" << geoFile << " cannot be opened" << endl;
00114
00115 cerr << "Exitting..." << endl;
00116 exit(1);
00117 }
00118
00119 string scFile("../run/sc.conf");
00120 if (access(scFile.c_str(),R_OK)) {
00121 cerr << "ERROR:\n" << scFile << " cannot be opened" << endl;
00122 cerr << "Exitting..." << endl;
00123 exit(1);
00124 }
00125
00126 string electronicsFile("../run/electronics.conf");
00127 if (access(electronicsFile.c_str(),R_OK)) {
00128 cerr << "ERROR:\n" << electronicsFile << " cannot be opened" << endl;
00129 cerr << "Exitting..." << endl;
00130 exit(1);
00131 }
00132
00133
00134
00135
00136 StTpcGeometry *geomDb =
00137 StTpcSimpleGeometry::instance(geoFile.c_str());
00138
00139 StTpcSlowControl *scDb =
00140 StTpcSimpleSlowControl::instance(scFile.c_str());
00141 scDb->print();
00142
00143 StMagneticField *magDb =
00144 StSimpleMagneticField::instance(scFile.c_str());
00145
00146 StTpcElectronics *electronicsDb =
00147 StTpcSimpleElectronics::instance(electronicsFile.c_str());
00148
00149
00150 string gas("Ar");
00151 StTrsDeDx myEloss(gas);
00152
00153
00154
00155
00156
00157 StTrsSector *sector = new StTrsSector(geomDb);
00158
00159
00160
00161
00162 StTrsChargeTransporter *trsTransporter =
00163 StTrsFastChargeTransporter::instance(geomDb, scDb, &myEloss, magDb);
00164
00165
00166
00167
00168
00169
00170
00171 StTrsWireHistogram *myWireHistogram =
00172 StTrsWireHistogram::instance(geomDb, scDb);
00173
00174
00175
00176
00177 StTrsAnalogSignalGenerator *trsAnalogSignalGenerator =
00178 StTrsSlowAnalogSignalGenerator::instance(geomDb, scDb, electronicsDb, sector);
00179
00180
00181
00182
00183
00184
00185 StTrsDigitalSignalGenerator *trsDigitalSignalGenerator =
00186 StTrsFastDigitalSignalGenerator::instance(electronicsDb, sector);
00187
00188
00189
00190
00191
00192 float maxDistance = geomDb->lastOuterSectorAnodeWire();
00193 PR(maxDistance);
00194 float zPosition = 1.*meter;
00195 float position = 52.*centimeter;
00196 float dS;
00197 do {
00198 dS = 500.*myEloss.nextInteraction();
00199
00200 position += dS;
00201
00202 if(position>maxDistance) break;
00203
00204 double primaryEnergyDistribution;
00205 int totalElectrons = myEloss.secondary(&primaryEnergyDistribution) + 1;
00206 PR(totalElectrons);
00207
00208
00209 StTrsMiniChargeSegment
00210 aMiniSegment(StThreeVector<double>(0, position, zPosition),
00211 totalElectrons,
00212 0);
00213 PR(aMiniSegment);
00214
00215
00216
00217
00218 trsTransporter->transportToWire(aMiniSegment);
00219 PR(aMiniSegment);
00220
00221
00222
00223
00224 StTrsWireBinEntry anEntry(aMiniSegment.position(), aMiniSegment.charge());
00225 PR(anEntry);
00226 myWireHistogram->addEntry(anEntry);
00227
00228 }while(true);
00229
00230 cout << "\a***************************\a\n" << endl;
00231
00232
00233
00234
00235 trsAnalogSignalGenerator->inducedChargeOnPad(myWireHistogram);
00236
00237 trsAnalogSignalGenerator->sampleAnalogSignal();
00238
00239
00240
00241
00242
00243 trsDigitalSignalGenerator->digitizeSignal();
00244
00245
00246
00247
00248
00249 cout << "Write out the Sector " << endl;
00250 for(irow=0; irow<sector->numberOfRows(); irow++) {
00251 PR(irow);
00252 for(ipad=0; ipad<sector->numberOfPadsInRow(irow); ipad++) {
00253 tpcTimeBins currentTimeBins = sector->timeBinsOfRowAndPad(irow, ipad);
00254 for(itbin=0; itbin<currentTimeBins.size(); itbin++) {
00255 if(currentTimeBins[itbin].amplitude() > 1.)
00256 PR(currentTimeBins[itbin]);
00257 }
00258 }
00259 }
00260
00261 return 0;
00262 }